From 1871a0b4c92bb9d339741fbdb36b0512f5f3548a Mon Sep 17 00:00:00 2001 From: Joe Date: Sat, 7 Mar 2026 13:42:56 -0600 Subject: [PATCH] update-rules --- .cursor/commands/luau-optimize.md | 623 - .cursor/commands/shared | 1 + .cursor/docs/shared | 1 + .cursor/logs/.gitignore | 1 - .../ambiguous_path_handling_f2eaef11.plan.md | 425 - ...biguous_paths_audit_fixes_9d3ed6da.plan.md | 310 - .../atlas_daemon_python_bot_be6b0651.plan.md | 646 - .../atlas_fork_isolation_ef1d08fd.plan.md | 206 - ...t_ambiguous_path_handling_30e99d9a.plan.md | 212 - .../audit_ambiguous_paths_d9495fcc.plan.md | 280 - ..._ambiguous_paths_followup_00831072.plan.md | 231 - .../audit_ref_path_system_c21fc130.plan.md | 185 - .../audit_ref_two-way_sync_9e8ce7a8.plan.md | 420 - .../audit_slugify_branch_e913b7dc.plan.md | 298 - .../audit_slugify_pass_3_b11f65a1.plan.md | 162 - ...bump_sync_logging_to_info_3e39ff81.plan.md | 119 - ...cargo_dependency_upgrades_9b14d945.plan.md | 162 - ...ngebatcher_encoding_audit_bade61c8.plan.md | 211 - .../compact_json5_arrays_36a8cfab.plan.md | 328 - ...omprehensive_plugin_tests_bdd5b47c.plan.md | 525 - ...ected_mode_test_expansion_5b0c39a3.plan.md | 489 - ...idate_filesystem_name_for_f2bdef69.plan.md | 96 - .../dedup_suffix_start_at_2_89e66bf2.plan.md | 89 - ...destructive_syncback_mode_acb8cb54.plan.md | 250 - .../extension-free_ref_paths_b9a68637.plan.md | 284 - .../plans/fix_audit_findings_ca70f773.plan.md | 266 - .../plans/fix_audit_pass_2_c72b80c5.plan.md | 334 - .../fix_infinity_comparison_71fd9057.plan.md | 68 - ...ncback_service_properties_d7c2c927.plan.md | 235 - .../fix_ref_audit_issues_746c0c25.plan.md | 380 - .../fix_ref_audit_round_2_07d615d1.plan.md | 304 - .../fix_ref_audit_round_3_f8ae0e39.plan.md | 335 - .../fix_stale_tree_desync_9e74f718.plan.md | 130 - .../fix_stem-level_dedup_8fa9a015.plan.md | 124 - .../fix_sync_system_issues_e569840d.plan.md | 276 - .../fix_test_port_toctou_86726cb4.plan.md | 104 - .../git-based_sync_defaults_be6371b6.plan.md | 329 - ...git-style_change_metadata_9d8c8345.plan.md | 242 - .../git_sync_defaults_audit_557237e0.plan.md | 272 - ...live_syncback_audit_fixes_561d17c7.plan.md | 373 - ..._syncback_float_precision_1be79350.plan.md | 195 - ...u-optimize_cursor_command_ce1448a8.plan.md | 743 - .../luau-style_ref_paths_845083e1.plan.md | 1034 - ...matching_algorithm_parity_01524d4c.plan.md | 275 - .../matching_cost_semantics_376e45e2.plan.md | 324 - .../matching_session_caching_cbfa7bda.plan.md | 609 - .../mcp_get_script_endpoint_4c4e80af.plan.md | 269 - ...sync_endpoint_enhancement_20ff55ce.plan.md | 379 - ...ge_plugin_upload_workflow_0943cf6c.plan.md | 161 - .../merge_ui_button_changes_6608afe8.plan.md | 132 - ...e_path_encoding_migration_7dfffc4d.plan.md | 310 - .../parallel_filesystem_io_39399341.plan.md | 343 - .../parallel_io_audit_fixes_35f49f83.plan.md | 267 - .../port_mcp_studio_tools_5135a181.plan.md | 458 - ...l_removed_scripts_feature_dd790311.plan.md | 365 - ...ciler_robustness_overhaul_2f440e06.plan.md | 286 - .../ref_audit_round_4_test_coverage.plan.md | 216 - ...ath_and_dedup_integration_81a47dfe.plan.md | 88 - .../remove_plugin_animations_f4a43647.plan.md | 101 - ...ewrite_matching_algorithm_df45bbe1.plan.md | 156 - ...syncback_architecture_fix_bc0c13ab.plan.md | 441 - ...rokit_install_audit_fixes_e465275a.plan.md | 390 - .../schema_struct_refactor_6dddb54b.plan.md | 277 - .../script_index_pruning_999b5d04.plan.md | 371 - .../script_naming_refactor_424e3277.plan.md | 272 - ...stress_tests_two-way_sync_baeda112.plan.md | 463 - ...edup_suffix_automatically_3d35c847.plan.md | 117 - .../sync_vscode-rojo_schemas_6f3a7b26.plan.md | 169 - .../syncback_auto-downloader_0508b4bb.plan.md | 276 - .../syncback_roundtrip_tests_f980a65b.plan.md | 747 - .../plans/syncback_via_rbxm_ad0231a7.plan.md | 394 - ...ay_sync_integration_tests_0e4e4dfc.plan.md | 156 - .../plans/two-way_sync_refs_6e154eef.plan.md | 222 - .../update_audit_and_rules_0625423a.plan.md | 110 - ...s_staleness_test_fixtures_dcde048f.plan.md | 275 - .cursor/prompts/Ambiguous Path Handling.txt | 350 - .cursor/rules/luau-rfcs/CNAME | 1 - .cursor/rules/luau-rfcs/_config.yml | 5 - ...abstract-module-paths-and-init-dot-luau.md | 144 - .../luau-rfcs/amended-require-resolution.md | 243 - .../rules/luau-rfcs/behavior-eq-metamethod.md | 59 - .../behavior-stricter-utf8-library.md | 48 - .../rules/luau-rfcs/change-global-version.md | 21 - .cursor/rules/luau-rfcs/config-luauconfig.md | 146 - .cursor/rules/luau-rfcs/config-luaurc.md | 68 - .cursor/rules/luau-rfcs/const-keyword.md | 152 - .../luau-rfcs/deprecate-getfenv-setfenv.md | 38 - .../luau-rfcs/deprecate-table-getn-foreach.md | 31 - ...oposals-leading-to-ambiguity-in-grammar.md | 129 - .../explicit-type-parameter-instantiation.md | 208 - .../luau-rfcs/function-bit32-byteswap.md | 48 - .../function-bit32-countlz-countrz.md | 52 - .../rules/luau-rfcs/function-buffer-bits.md | 62 - .../luau-rfcs/function-coroutine-close.md | 36 - .../rules/luau-rfcs/function-debug-info.md | 109 - .cursor/rules/luau-rfcs/function-inlining.md | 91 - .cursor/rules/luau-rfcs/function-math-lerp.md | 106 - .cursor/rules/luau-rfcs/function-math-map.md | 37 - .../luau-rfcs/function-string-pack-unpack.md | 71 - .../rules/luau-rfcs/function-table-clear.md | 21 - .../rules/luau-rfcs/function-table-clone.md | 66 - .../luau-rfcs/function-table-create-find.md | 28 - .../rules/luau-rfcs/function-table-freeze.md | 55 - .../rules/luau-rfcs/function-vector-lerp.md | 35 - .../rules/luau-rfcs/generalized-iteration.md | 126 - .../luau-rfcs/generic-function-subtyping.md | 211 - .cursor/rules/luau-rfcs/generic-functions.md | 155 - .../rules/luau-rfcs/index-type-operator.md | 139 - .cursor/rules/luau-rfcs/index.md | 21 - .../rules/luau-rfcs/keyof-type-operator.md | 128 - .../rules/luau-rfcs/len-metamethod-rawlen.md | 45 - .../rules/luau-rfcs/local-type-inference.md | 180 - .../luau-rfcs/lower-bounds-calculation.md | 219 - .cursor/rules/luau-rfcs/luau-mascot.md | 61 - .cursor/rules/luau-rfcs/mascot.png | Bin 17066 -> 0 bytes .cursor/rules/luau-rfcs/math-constants.md | 56 - .../luau-rfcs/math-isnan-isfinite-isinf.md | 96 - .../luau-rfcs/metatable-type-functions.md | 90 - .../luau-rfcs/method-type-issubtypeof.md | 116 - .cursor/rules/luau-rfcs/negation-types.md | 86 - .../luau-rfcs/never-and-unknown-types.md | 146 - .cursor/rules/luau-rfcs/new-nonstrict.md | 340 - .../new-require-by-string-semantics.md | 196 - .cursor/rules/luau-rfcs/property-readonly.md | 148 - .cursor/rules/luau-rfcs/property-writeonly.md | 179 - .../rules/luau-rfcs/rawget-type-operator.md | 53 - .../luau-rfcs/recursive-type-restriction.md | 65 - .../relax-recursive-type-restriction.md | 80 - .../luau-rfcs/require-by-string-aliases.md | 275 - .../rules/luau-rfcs/reserve-dollar-sign.md | 34 - .../rules/luau-rfcs/sealed-table-subtyping.md | 106 - .cursor/rules/luau-rfcs/shared-self-types.md | 367 - ...on-types-in-user-defined-type-functions.md | 124 - ...er-types-in-user-defined-type-functions.md | 36 - .../syntax-array-like-table-types.md | 65 - .../syntax-attribute-functions-deprecated.md | 93 - .../syntax-attribute-functions-native.md | 51 - .../syntax-attributes-functions-parameters.md | 75 - .../luau-rfcs/syntax-attributes-functions.md | 98 - .../luau-rfcs/syntax-compound-assignment.md | 49 - .../luau-rfcs/syntax-continue-statement.md | 98 - ...ntax-default-type-alias-type-parameters.md | 97 - .../syntax-floor-division-operator.md | 64 - .../rules/luau-rfcs/syntax-if-expression.md | 108 - .../syntax-leading-bar-and-ampersand.md | 84 - .../syntax-named-function-type-args.md | 58 - .../rules/luau-rfcs/syntax-number-literals.md | 14 - .../syntax-property-access-modifiers.md | 197 - .../rules/luau-rfcs/syntax-singleton-types.md | 91 - .../luau-rfcs/syntax-string-interpolation.md | 175 - .../luau-rfcs/syntax-type-alias-type-packs.md | 218 - .../luau-rfcs/syntax-type-ascription-bidi.md | 36 - .../rules/luau-rfcs/syntax-type-ascription.md | 68 - .../rules/luau-rfcs/syntax-typed-variadics.md | 45 - .../type-ascription-by-inhabitance.md | 71 - .cursor/rules/luau-rfcs/type-byte-buffer.md | 187 - .../rules/luau-rfcs/type-error-suppression.md | 132 - .cursor/rules/luau-rfcs/type-long-integer.md | 393 - .../rules/luau-rfcs/types-library-optional.md | 21 - .cursor/rules/luau-rfcs/udtf-is-extern.md | 36 - ...unsealed-table-assign-optional-property.md | 60 - .../luau-rfcs/unsealed-table-literals.md | 78 - ...le-subtyping-strips-optional-properties.md | 67 - .../luau-rfcs/user-defined-type-functions.md | 238 - .../vector-library-vector2-constructor.md | 33 - .cursor/rules/luau-rfcs/vector-library.md | 136 - .cursor/rules/luau.mdc | 809 - .../luau/getting-started/compatibility.md | 133 - .cursor/rules/luau/getting-started/intro.md | 147 - .cursor/rules/luau/getting-started/lint.md | 387 - .cursor/rules/luau/getting-started/syntax.md | 318 - .cursor/rules/luau/getting-started/why.md | 28 - .cursor/rules/luau/guides/performance.md | 212 - .cursor/rules/luau/guides/profile.md | 60 - .cursor/rules/luau/guides/sandbox.md | 77 - .cursor/rules/luau/index.mdx | 62 - .cursor/rules/luau/reference/grammar.md | 109 - .cursor/rules/luau/reference/library.md | 1097 - .cursor/rules/luau/reference/types-library.md | 368 - .cursor/rules/luau/types/basic-types.md | 240 - .cursor/rules/luau/types/considerations.md | 42 - .cursor/rules/luau/types/generics.md | 71 - .../luau/types/object-oriented-programs.md | 84 - .cursor/rules/luau/types/overview.md | 160 - .cursor/rules/luau/types/refinements.md | 82 - .cursor/rules/luau/types/roblox-types.md | 34 - .cursor/rules/luau/types/tables.md | 87 - .cursor/rules/luau/types/type-functions.md | 53 - .../luau/types/unions-and-intersections.md | 92 - .cursor/rules/persona.mdc | 41 - .cursor/rules/python.mdc | 46 - .cursor/rules/roblox-api/Full-API-Dump.json | 206475 --------------- .cursor/rules/roblox.mdc | 223 - .../roblox/common/navigation/analytics.yaml | 51 - .../roblox/common/navigation/assets.yaml | 79 - .../common/navigation/avatar/guides.yaml | 155 - .../avatar/tutorials-accessories.yaml | 23 - .../navigation/avatar/tutorials-bodies.yaml | 52 - .../navigation/avatar/tutorials-clothing.yaml | 46 - .../common/navigation/avatar/tutorials.yaml | 37 - .../common/navigation/cloud/guides.yaml | 37 - .../common/navigation/cloud/reference.yaml | 467 - .../common/navigation/documentation.yaml | 43 - .../roblox/common/navigation/education.yaml | 81 - .../common/navigation/engine/guides.yaml | 591 - .../common/navigation/engine/reference.yaml | 6233 - .../common/navigation/engine/resources.yaml | 121 - .../common/navigation/engine/studio.yaml | 62 - .../navigation/engine/tutorials-animator.yaml | 17 - .../navigation/engine/tutorials-artist.yaml | 15 - .../navigation/engine/tutorials-building.yaml | 17 - .../navigation/engine/tutorials-coding.yaml | 17 - .../navigation/engine/tutorials-core.yaml | 30 - .../navigation/engine/tutorials-ea.yaml | 17 - .../engine/tutorials-fundamentals.yaml | 79 - .../navigation/engine/tutorials-gs.yaml | 17 - .../navigation/engine/tutorials-studio.yaml | 15 - .../navigation/engine/tutorials-ui.yaml | 13 - .../common/navigation/engine/tutorials.yaml | 173 - .../roblox/common/navigation/monetize.yaml | 60 - .../roblox/common/navigation/platform.yaml | 43 - .../roblox/common/navigation/programs.yaml | 34 - .../rules/roblox/common/navigation/scale.yaml | 119 - .cursor/rules/roblox/en-us/affiliates.md | 19 - .cursor/rules/roblox/en-us/ai-data-sharing.md | 88 - .../rules/roblox/en-us/animation/capture.md | 67 - .../roblox/en-us/animation/curve-editor.md | 164 - .../rules/roblox/en-us/animation/editor.md | 597 - .../rules/roblox/en-us/animation/events.md | 135 - .cursor/rules/roblox/en-us/animation/index.md | 34 - .../en-us/animation/inverse-kinematics.md | 199 - .cursor/rules/roblox/en-us/animation/using.md | 538 - .../art/accessories/accessory-fitting-tool.md | 277 - .../automatic-skinning-transfer.md | 184 - .../en-us/art/accessories/body-scale.md | 62 - .../art/accessories/caging-best-practices.md | 276 - .../accessories/clothing-export-settings.md | 91 - .../accessories/clothing-specifications.md | 215 - .../accessories/creating-rigid/converting.md | 42 - .../accessories/creating-rigid/exporting.md | 32 - .../accessories/creating-rigid/importing.md | 39 - .../art/accessories/creating-rigid/index.md | 37 - .../creating-rigid/modeling-setup.md | 139 - .../accessories/creating-rigid/publishing.md | 46 - .../accessories/creating-rigid/texturing.md | 81 - .../accessories/creating/armature-setup.md | 65 - .../art/accessories/creating/caging-setup.md | 40 - .../art/accessories/creating/converting.md | 35 - .../art/accessories/creating/exporting.md | 34 - .../art/accessories/creating/importing.md | 16 - .../en-us/art/accessories/creating/index.md | 38 - .../accessories/creating/modeling-setup.md | 71 - .../art/accessories/creating/modify-cage.md | 33 - .../art/accessories/creating/sculpting.md | 37 - .../art/accessories/creating/test-poses.md | 41 - .../art/accessories/creating/texture-map.md | 25 - .../accessories/creating/texture-painting.md | 22 - .../art/accessories/creating/trimming.md | 72 - .../art/accessories/creating/unwrapping.md | 61 - .../art/accessories/creating/watertight.md | 41 - .../en-us/art/accessories/export-settings.md | 57 - .../en-us/art/accessories/from-existing.md | 205 - .../en-us/art/accessories/import-clothing.md | 92 - .../roblox/en-us/art/accessories/importing.md | 100 - .../roblox/en-us/art/accessories/index.md | 164 - .../en-us/art/accessories/layered-clothing.md | 201 - .../en-us/art/accessories/project-files.md | 136 - .../accessories/publish-eyebrows-eyelashes.md | 62 - .../rig-and-cage-existing-models.md | 136 - .../en-us/art/accessories/specifications.md | 356 - .../en-us/art/accessories/validation-tool.md | 157 - .cursor/rules/roblox/en-us/art/blender.md | 865 - .../creating/blender-configurations.md | 130 - .../en-us/art/characters/creating/caging.md | 60 - .../creating/combine-head-geometry.md | 41 - .../characters/creating/export-character.md | 37 - .../characters/creating/export-textures.md | 54 - .../art/characters/creating/final-checks.md | 12 - .../art/characters/creating/head-objects.md | 52 - .../en-us/art/characters/creating/index.md | 28 - .../creating/modeling-best-practices.md | 99 - .../art/characters/creating/modeling-tips.md | 27 - .../characters/creating/remove-extra-bones.md | 26 - .../art/characters/creating/sculpting.md | 57 - .../art/characters/creating/template-files.md | 109 - .../art/characters/creating/texturing-eyes.md | 72 - .../art/characters/creating/texturing-face.md | 48 - .../art/characters/creating/texturing-pbr.md | 16 - .../characters/creating/texturing-setup.md | 44 - .../characters/creating/verify-attachments.md | 30 - .../export-avatar-animations-from-maya.md | 152 - .../en-us/art/characters/export-settings.md | 101 - .../characters/face-caging-best-practices.md | 190 - .../facial-animation/animate-heads.md | 106 - .../facial-animation/create-basic-heads.md | 463 - .../create-face-accessories.md | 181 - .../facial-animation/facs-poses-reference.md | 539 - .../art/characters/facial-animation/index.md | 47 - .../art/characters/facial-animation/moods.md | 130 - .../facial-animation/use-heads-in-studio.md | 224 - .../en-us/art/characters/head-comparison.md | 572 - .../art/characters/head-specifications.md | 144 - .../en-us/art/characters/head-validation.md | 221 - .../roblox/en-us/art/characters/import.md | 88 - .../roblox/en-us/art/characters/index.md | 187 - .../manually-update-catalog-heads.md | 157 - .../en-us/art/characters/project-files.md | 216 - .../en-us/art/characters/specifications.md | 721 - .../en-us/art/characters/testing/blender.md | 80 - .../en-us/art/characters/testing/index.md | 96 - .../en-us/art/characters/testing/studio.md | 272 - .../en-us/art/characters/validation-tool.md | 125 - .../roblox/en-us/art/classic-clothing.md | 152 - .../en-us/art/emotes/export-settings.md | 56 - .../rules/roblox/en-us/art/emotes/import.md | 93 - .../rules/roblox/en-us/art/emotes/index.md | 57 - .../roblox/en-us/art/emotes/specifications.md | 31 - .cursor/rules/roblox/en-us/art/index.md | 442 - .../roblox/en-us/art/modeling/3d-importer.md | 398 - .../en-us/art/modeling/assign-textures.md | 70 - .../en-us/art/modeling/calisthenics-tool.md | 146 - .../en-us/art/modeling/export-requirements.md | 62 - .../roblox/en-us/art/modeling/gltf-export.md | 85 - .../rules/roblox/en-us/art/modeling/index.md | 142 - .../en-us/art/modeling/material-reference.md | 181 - .../en-us/art/modeling/project-files.md | 590 - .../roblox/en-us/art/modeling/reimport.md | 116 - .../art/modeling/rig-a-humanoid-model.md | 155 - .../en-us/art/modeling/rig-a-simple-mesh.md | 158 - .../roblox/en-us/art/modeling/rigging.md | 68 - .../art/modeling/roblox-blender-plugin.md | 10 - .../art/modeling/skin-a-humanoid-model.md | 224 - .../en-us/art/modeling/skin-a-simple-mesh.md | 301 - .../en-us/art/modeling/specifications.md | 88 - .../en-us/art/modeling/surface-appearance.md | 450 - .../art/modeling/texture-specifications.md | 215 - .../rules/roblox/en-us/art/overview-dcc.md | 54 - .../rules/roblox/en-us/art/overview-studio.md | 222 - .cursor/rules/roblox/en-us/art/reaper.md | 395 - .../roblox/en-us/art/test-classic-clothing.md | 71 - .../en-us/art/upload-classic-clothing.md | 40 - .../roblox/en-us/art/validation-errors.md | 780 - .cursor/rules/roblox/en-us/assets.md | 134 - .../accessories/1_lc-blender-unhide-cages.mp4 | 3 - .../2_lc-blender-import-tshirt.mp4 | 3 - .../3_lc-blender-parenting-a-mesh.mp4 | 3 - .../4_lc-blender-outliner-cleanup.mp4 | 3 - ...lc-blender-adjusting-viewport-settings.mp4 | 3 - ...-blender-adjusting-outer-cage-vertices.mp4 | 3 - .../7_lc-adjusting-multiple-vertices.mp4 | 3 - .../8_lc-blender-finished-outer-cage.mp4 | 3 - .../accessories/Avatar-Item-Creation.png | 3 - .../accessories/Layered-Clothing-Banner.jpg | 3 - .../accessories/Layered-Clothing-Banner2.png | 3 - .../Accessory-Setup-Menu.png | 3 - .../Animation-Example-1.png | 3 - .../Animation-Example-2.png | 3 - .../Asset-Type-Dropdown.png | 3 - .../accessory-fitting-tool/Autoskin-Icon.png | 3 - .../accessory-fitting-tool/Body-Example-1.png | 3 - .../accessory-fitting-tool/Body-Example-2.png | 3 - .../Bounding-Box-Example-1.png | 3 - .../Bounding-Box-Example-2.png | 3 - .../Cage-Editing-Example.png | 3 - .../Cage-Editing-Icon.png | 3 - .../Center-Mannequin.png | 3 - .../Clothing-Example-1.png | 3 - .../Clothing-Example-2.png | 3 - .../Custom-Asset-Icon.png | 3 - .../accessory-fitting-tool/Custom-Asset.png | 3 - .../Edit-Vertex-Example.png | 3 - .../accessory-fitting-tool/Expand-Button.png | 3 - .../Generate-Legacy-Accessory.png | 3 - .../accessory-fitting-tool/LC-Hierarchy.png | 3 - .../Layered-Example.png | 3 - .../MeshPart-Selected.png | 3 - .../Preview-Display.png | 3 - .../accessory-fitting-tool/Rigid-Example.png | 3 - .../Rigid-Hierarchy.png | 3 - .../caging-best-practices/1-Uneven-Cage-A.png | 3 - .../caging-best-practices/1-Uneven-Cage-B.png | 3 - .../10-Even-Spacing-A.png | 3 - .../10-Even-Spacing-B.png | 3 - .../11-Positioning-Along-Joints.png | 3 - .../caging-best-practices/12-Protusions-A.png | 3 - .../caging-best-practices/12-Protusions-B.png | 3 - .../caging-best-practices/12-Protusions-C.png | 3 - .../13-Cage-Missing-Parts.png | 3 - .../14-Outer-Inside-Inner.png | 3 - .../15-Orbitting-Accessory-A.png | 3 - .../15-Orbitting-Accessory-B.png | 3 - .../2-Inner-Outer-Identical-A.png | 3 - .../2-Inner-Outer-Identical-B.png | 3 - .../2-Inner-Outer-Identical.png | 3 - .../3-Clothing-Under-Inner-A.png | 3 - .../3-Clothing-Under-Inner-B.png | 3 - .../4-Outer-Not-Fully-Covering-A.png | 3 - .../4-Outer-Not-Fully-Covering-B.png | 3 - .../6-Oversized-Cage.png | 3 - .../7-Typical-Caging-Example-A.png | 3 - .../7-Typical-Caging-Example-B.png | 3 - .../7-Typical-Caging-Example-C.png | 3 - .../7-Typical-Caging-Example-D.png | 3 - .../caging-best-practices/8-Symmetry.png | 3 - .../9-Stacking-Vertices.png | 3 - .../classic-clothing/Block-Avatar-Default.jpg | 3 - .../classic-clothing/Block-Avatar-Dressed.jpg | 3 - .../Classic-Clothing-Templates.zip | 3 - .../classic-clothing/Pants-Template-Bad.jpg | 3 - .../classic-clothing/Pants-Template-Good.jpg | 3 - .../classic-clothing/Template-Pants-R15.png | 3 - .../classic-clothing/Template-Shirts-R15.png | 3 - .../Types-of-classic-clothing.png | 3 - .../accessories/lc-blender-append-cages.png | 3 - .../assets/accessories/lc-blender-append.png | 3 - .../accessories/lc-blender-hide-symbol.png | 3 - .../lc-blender-selecting-cage-in-outlier.png | 3 - .../lc-blender-template-opened.png | 3 - .../lc-blender-workspace-cages.png | 3 - .../lc-requirements-innercage-outliner.png | 3 - .../accessories/lc-requirements-innercage.png | 3 - ...uirements-maya-settings-with-animation.png | 3 - .../lc-requirements-maya-settings.png | 3 - .../lc-requirements-outercage-outliner.png | 3 - .../accessories/lc-requirements-outercage.png | 3 - .../reference-files/Additional-FBX-assets.zip | 3 - .../reference-files/Bow-rigid.rbxm | 3 - .../reference-files/Caging-examples.zip | 3 - .../reference-files/Tshirt-caged.fbx | 3 - .../reference-files/Tshirt-model.fbx | 3 - .../Blender-Add-On-Preferences.png | 3 - .../validation-tool/Blender-Enable-Add-On.png | 3 - .../Blender-Failed-Check-Example.png | 3 - .../Blender-Failed-Check-Viewport.png | 3 - .../Blender-Sidebar-Indicator.png | 3 - .../Blender-Validation-Tool-Opened.png | 3 - .../Blender-Validation-Tool.png | 3 - .../Mac-Right-Click-Install.png | 3 - .../Maya-Command-Prompt-Success.png | 3 - .../validation-tool/Maya-Install-Prompt-1.png | 3 - .../Maya-Install-Python-Settings.png | 3 - .../Maya-Script-Editor-Menu.png | 3 - .../validation-tool/Maya-Script-Editor.png | 3 - .../validation-tool/Maya-Shortcut.png | 3 - .../Maya-Validation-Tool-Opened.png | 3 - .../ValidationTool_Blender.zip | 3 - .../validation-tool/ValidationTool_Maya.zip | 3 - .../acquisition/New-Users-Funnel.png | 3 - .../Qualified-Play-Through-Rate.png | 3 - .../Share-Link-Acquisition-Dashboard.png | 3 - .../acquisition/Unique-Users-by-Source.png | 3 - .../analytics/acquisition/conversion.png | 3 - .../qualified-playthrough-rate.png | 3 - .../analytics/acquisition/traffic-sources.png | 3 - .../Explore-Mode-Preview.png | 3 - .../analytics-dashboard/Explore-Mode.png | 3 - .../Metrics-Unavailable.png | 3 - .../benchmark-similar-exp.png | 3 - .../benchmark-transition.png | 3 - .../assets/analytics/bans/bans-overview.png | 3 - .../analytics/configs/configs-history.png | 3 - .../analytics/configs/configs-overview.png | 3 - .../analytics/configs/configs-publish.png | 3 - .../analytics/configs/configs-studio.png | 3 - .../configs/experiment-confidence.png | 3 - .../analytics/configs/experiment-details.png | 3 - .../analytics/configs/experiment-mde.png | 3 - .../analytics/configs/experiment-overview.png | 3 - .../analytics/configs/experiment-results.png | 3 - .../configs/experiment-variant-place.png | 3 - .../analytics/configs/experiment-variant.png | 3 - .../demographics/analytics-demographics.png | 3 - .../developer-stats/Chart-Visits.png | 3 - .../analytics/developer-stats/Live-Stats.png | 3 - .../discovery/Below-Benchmark-Charts.png | 3 - .../discovery/Daily-Benchmark-Graphs.png | 3 - .../discovery/Experience-Overview-Graph.png | 3 - .../discovery/Explore-And-Expand-Graph.png | 3 - .../Home-Recommendation-Impressions.png | 3 - .../Qualified-Play-Through-Impressions.png | 3 - .../discovery/Qualified-Play-Through-Rate.png | 3 - .../Retrieval-And-Ranking-Diagram.png | 3 - .../discovery/Similar-Experiences.png | 3 - .../error-report/error-report-graph.png | 3 - .../error-report/error-report-table.png | 3 - .../event-types/All-Sources-Sinks.png | 3 - .../analytics/event-types/Average-Wallet.png | 3 - .../event-types/Custom-Event-Aggregations.png | 3 - .../event-types/Custom-Event-Breakdown.png | 3 - .../event-types/Custom-Event-Graph.png | 3 - .../analytics/event-types/Event-Tracking.png | 3 - .../event-types/Overview-Economy-Funnels.png | 3 - .../event-types/Plant-Game-Funnel.png | 3 - .../event-types/Plant-Game-Prompts.png | 3 - .../event-types/Plant-Game-Warning.png | 3 - .../event-types/Top-Sources-Sinks.png | 3 - .../event-types/Total-Sources-Sinks.png | 3 - .../AnalyticsAssistantFeedbackReport.png | 3 - .../feedback/AnalyticsFeedbackAssistant.png | 3 - .../feedback/Date-Range-Selector.png | 3 - .../analytics/feedback/Detailed-View.png | 3 - .../analytics/feedback/Export-Chart-Data.png | 3 - .../feedback/Export-Detailed-Data.png | 3 - .../analytics/feedback/Feedback-Breakdown.png | 3 - .../feedback/Feedback-Options-Button.png | 3 - .../analytics/feedback/Feedback-Widget.png | 3 - .../feedback/Relative-Percentage.png | 3 - .../monetization/monetization-overview.png | 3 - .../analytics/overview/Achievements.png | 3 - .../overview/AnalyticsAssistantInsights.png | 3 - .../overview/AnalyticsAssistantReport.png | 3 - .../analytics/overview/AnalyticsInsights.png | 3 - .../analytics/overview/Benchmarks-Similar.png | 3 - .../assets/analytics/overview/Insights.png | 3 - .../overview/Roblox_Analytics_Insights.png | 3 - .../overview/avatar-sales-and-revenue.png | 3 - .../en-us/assets/analytics/overview/step1.png | 3 - .../en-us/assets/analytics/overview/step2.png | 3 - .../en-us/assets/analytics/overview/step3.png | 3 - .../assets/analytics/overview/watchlist.png | 3 - .../performance/client-api-calls.png | 3 - .../performance/client-performance.png | 3 - .../performance/perf-client-crashes.png | 3 - .../analytics/performance/perf-dash-dev.png | 3 - .../performance/perf-dash-drilldown.png | 3 - .../performance/perf-dash-filter.png | 3 - .../analytics/performance/perf-dash-micro.png | 3 - .../performance/perf-dash-overview.png | 3 - .../analytics/performance/perf-dash-ui.png | 3 - .../performance/perf-place-version-filter.png | 3 - .../analytics/performance/server-stats.png | 3 - .../retention/AnalyticsRetentionChart.png | 3 - .../analytics/retention/CohortAnalysis.png | 3 - .../analytics/retention/CohortAnalysis2.png | 3 - .../assets/analytics/sales-data-calendar.png | 3 - .../en-us/assets/analytics/sales-of-good.png | 3 - .../Add-Multiple-Keyframes.png | 3 - .../Animation-Events-Add-Event.png | 3 - .../animation-editor/Animation-Events-Bar.png | 3 - .../Animation-Events-Edit-Button.png | 3 - .../Animation-Events-Marker-In-Timeline.png | 3 - .../Animation-Events-Marker-Pasted.png | 3 - .../Animation-Events-Marker-Selected.png | 3 - .../animation-editor/Animation-Poses.mp4 | 3 - .../Controls-Animation-Name.png | 3 - .../animation-editor/Controls-File-Menu.png | 3 - .../animation-editor/Controls-First-Key.png | 3 - .../animation-editor/Controls-Last-Key.png | 3 - .../animation-editor/Controls-Looping.png | 3 - .../animation-editor/Controls-Next-Key.png | 3 - .../animation-editor/Controls-Pause.png | 3 - .../Controls-Position-Indicator.png | 3 - .../Controls-Preview-Reverse.png | 3 - .../animation-editor/Controls-Preview.png | 3 - .../Controls-Previous-Key.png | 3 - .../Create-Animation-Dialog.png | 3 - .../animation-editor/Easing-Cubic.mp4 | 3 - .../animation-editor/Easing-Linear.mp4 | 3 - .../Editor-Sections-Labeled.png | 3 - .../animation-editor/Migrate-Animations.png | 3 - .../animation-editor/Optimization-Preview.png | 3 - .../animation-editor/Optimization-Slider.png | 3 - .../animation-editor/Optimize-Keyframes.png | 3 - .../animation-editor/Saved-Animation.png | 3 - .../animation-editor/Scrubber-0-15.png | 3 - .../Select-Final-Keyframe.png | 3 - .../Select-Multiple-Keyframes.png | 3 - .../Select-Single-Keyframe.png | 3 - .../Timeline-Expand-Contract.png | 3 - .../animation-editor/Timeline-Keyframe.png | 3 - .../Timeline-Options-Menu.png | 3 - .../Timeline-Scrubber-Bar.png | 3 - .../animation-editor/Timeline-Time-Units.png | 3 - .../animation-editor/Track-Keyframe-Added.png | 3 - .../Track-List-Add-Tracks.png | 3 - .../animation-editor/Track-List-IK-Button.png | 3 - .../animation-editor/Track-List-Rig-Name.png | 3 - .../Track-List-Track-Name.png | 3 - .../Track-List-Track-Options.png | 3 - .../curve-editor/Convert-Euler-Angles.png | 3 - .../Convert-Quaternion-Angles.png | 3 - .../curve-editor/Curve-Editor-Example.png | 3 - .../curve-editor/Dope-Sheet-Editor.png | 3 - .../Euler-Angle-Curve-Tangents.png | 3 - .../curve-editor/Euler-Angle-Curve.png | 3 - .../animation/curve-editor/Gear-Icon.png | 3 - .../curve-editor/Interpolation-Mode.png | 3 - .../curve-editor/Opening-Curve-Editor.png | 3 - .../Quaternion-Curve-Interpolation.png | 3 - .../Quaternion-Curve-Tangents.png | 3 - .../assets/animation/curve-editor/Tangent.png | 3 - .../animation/curve-editor/UI-Overview.png | 3 - .../Bake-Animation.jpg | 3 - .../Export-All.png | 3 - .../FBX-File-Format.jpg | 3 - .../Importing-From-FBX-Animation.jpg | 3 - .../Loaded-and-AutoLoad-Radio-Buttons.jpg | 3 - .../Moving-Rig.mp4 | 3 - .../Mute-Selected.jpg | 3 - .../Muted-TranslateZ.jpg | 3 - .../Opening-GraphEditor-and-TimeSlider.jpg | 3 - .../Overview-Mannequin.jpg | 3 - .../Plugin-Manager.jpg | 3 - .../R15-Mannequin-Rig.ma | 3 - .../Time-Marker.jpg | 3 - .../face-recorder/Countdown-Button.jpg | 3 - .../face-recorder/Face-Recorder-Button.jpg | 3 - .../animation/face-recorder/Face-Recorder.mp4 | 3 - .../animation/face-recorder/Ready-Button.jpg | 3 - .../Birdcaller-Imported.jpeg | 3 - .../Rig-Custom-Puffer-Blender.png | 3 - ...Rig-Hierarchy-Birdcaller-Blender-Bones.png | 3 - .../Rig-Hierarchy-Custom-Blender-Bones.png | 3 - .../inverse-kinematics/IK-Add-Attachment.png | 3 - .../inverse-kinematics/IK-Body-Part.mp4 | 3 - .../inverse-kinematics/IK-Drag-Accessory.mp4 | 3 - .../inverse-kinematics/IK-Drag-Hand.mp4 | 3 - .../IK-Explorer-Humanoid.png | 3 - .../inverse-kinematics/IK-Humanoid-Add.png | 3 - .../IK-IKControl-Property.png | 3 - .../inverse-kinematics/IK-Move-Attachment.png | 3 - .../inverse-kinematics/IK-Place-Hand.mp4 | 3 - .../inverse-kinematics/IK-Uneven-Surfaces.mp4 | 3 - .../ball-socket-constraint.mp4 | 3 - .../inverse-kinematics/elbow-natural-pose.png | 3 - .../inverse-kinematics/elbow-primary-axis.png | 3 - .../elbow-unnatural-pose.png | 3 - .../inverse-kinematics/hinge-constraint.mp4 | 3 - .../inverse-kinematics/wrist-cone.png | 3 - .../inverse-kinematics/wrist-primary-axis.png | 3 - .../wrist-unnatural-pose.png | 3 - .../Live-Animation-Creator.mp4 | 3 - .../Media-Playback-Controls.jpg | 3 - .../art/3p-software/blender/After-Unwrap.png | 3 - .../art/3p-software/blender/Before-Unwrap.png | 3 - .../blender/BlenderFileView-Export.png | 3 - .../blender/BlenderFileView-Import.png | 3 - .../3p-software/blender/ColorAttribute.png | 3 - .../art/3p-software/blender/CubeMap.png | 3 - .../3p-software/blender/CubeProjection.png | 3 - .../assets/art/3p-software/blender/Edge.png | 3 - .../3p-software/blender/ExampleTexture.png | 3 - .../assets/art/3p-software/blender/Face.png | 3 - .../3p-software/blender/FollowActiveQuads.mp4 | 3 - .../3p-software/blender/Layout_Workspace.png | 3 - .../art/3p-software/blender/MM-Tool.mp4 | 3 - .../art/3p-software/blender/MS-Seams-Gun.png | 3 - .../art/3p-software/blender/MS-UVMap-Gun.png | 3 - .../blender/Modeling_Workspace.png | 3 - .../3p-software/blender/NavigationGizmo.jpg | 3 - .../art/3p-software/blender/NoTexture.png | 3 - .../blender/Sculpting_Workspace.png | 3 - .../3p-software/blender/SmartUVProject.png | 3 - .../art/3p-software/blender/Snapping.png | 3 - .../art/3p-software/blender/Studio-Import.png | 3 - .../3p-software/blender/Subdivide-Panel.png | 3 - .../blender/TexturePaint_Workspace.png | 3 - .../art/3p-software/blender/UV-Cube.png | 3 - .../blender/UVEditing_Workspace.png | 3 - .../art/3p-software/blender/VP-NoColor.png | 3 - .../art/3p-software/blender/VP-WithColor.png | 3 - .../3p-software/blender/VP-WithTexture.png | 3 - .../assets/art/3p-software/blender/Vertex.png | 3 - .../art/3p-software/blender/ViewSelector.jpg | 3 - .../art/3p-software/blender/WithTexture.png | 3 - .../art/3p-software/blender/bel-tool.mp4 | 3 - .../art/3p-software/blender/delete-tool.mp4 | 3 - .../art/3p-software/blender/dissolve-tool.mp4 | 3 - .../art/3p-software/blender/extrude-tool.mp4 | 3 - .../art/3p-software/blender/fill-tool.mp4 | 3 - .../art/3p-software/blender/grab-tool.mp4 | 3 - .../art/3p-software/blender/inset-tool.mp4 | 3 - .../art/3p-software/blender/nffe-tool.mp4 | 3 - .../art/3p-software/blender/snap-tool.mp4 | 3 - .../3p-software/blender/subdivide-tool.mp4 | 3 - .../art/3p-software/reaper/ArrangeArea.png | 3 - .../reaper/Compress-CompressionBar.png | 3 - .../3p-software/reaper/Compress-ReaComp.png | 3 - .../3p-software/reaper/Compress-Threshold.png | 3 - .../art/3p-software/reaper/Compression.mp3 | 3 - .../assets/art/3p-software/reaper/EQ.ogg | 3 - .../art/3p-software/reaper/Equalize-ReaEQ.png | 3 - .../art/3p-software/reaper/Equalize-Type.png | 3 - .../art/3p-software/reaper/FXPlugins.png | 3 - .../art/3p-software/reaper/Fades-Crop.mp4 | 3 - .../3p-software/reaper/Fades-CurveType.mp4 | 3 - .../3p-software/reaper/Fades-Transition.mp4 | 3 - .../art/3p-software/reaper/FileRender.png | 3 - .../art/3p-software/reaper/Loop-LoopPoint.png | 3 - .../art/3p-software/reaper/Loop-MoveClips.mp4 | 3 - .../art/3p-software/reaper/Loop-Play.mp4 | 3 - .../art/3p-software/reaper/Loop-Split.png | 3 - .../assets/art/3p-software/reaper/Loops.ogg | 3 - .../3p-software/reaper/MixerControlPanel.png | 3 - .../art/3p-software/reaper/NoCompression.mp3 | 3 - .../assets/art/3p-software/reaper/NoEQ.ogg | 3 - .../assets/art/3p-software/reaper/NoLoops.ogg | 3 - .../3p-software/reaper/NoNoiseReduction.ogg | 3 - .../art/3p-software/reaper/NoTransitions.ogg | 3 - .../art/3p-software/reaper/NoVariations.ogg | 3 - .../art/3p-software/reaper/Noise-ReaFir.png | 3 - .../art/3p-software/reaper/Noise-Subtract.png | 3 - .../art/3p-software/reaper/NoiseReduction.ogg | 3 - .../reaper/RenderToFileSettings.png | 3 - .../art/3p-software/reaper/Timeline.png | 3 - .../assets/art/3p-software/reaper/Toolbar.png | 3 - .../3p-software/reaper/TrackControlPanel.png | 3 - .../art/3p-software/reaper/Transitions.ogg | 3 - .../art/3p-software/reaper/TransportBar.png | 3 - .../3p-software/reaper/Variations-Copies.png | 3 - .../reaper/Variations-ItemProperties.png | 3 - .../art/3p-software/reaper/Variations.ogg | 3 - .../assets/art/Additional-Caging-Examples.png | 3 - .../art/Basic-Mesh-Combined-Example.png | 3 - .../en-us/assets/art/Basic-Mesh-Example.png | 3 - .../assets/art/Basic-Texture-Example.png | 3 - .../en-us/assets/art/Body-Scale-Diagram.png | 3 - .../rules/roblox/en-us/assets/art/Cap-A.png | 3 - .../rules/roblox/en-us/assets/art/Cap-B.png | 3 - .../rules/roblox/en-us/assets/art/Cap-C.png | 3 - .../rules/roblox/en-us/assets/art/Cap-D.png | 3 - .../roblox/en-us/assets/art/Generic-Icon.png | 3 - .../roblox/en-us/assets/art/Helmet-A.png | 3 - .../roblox/en-us/assets/art/Helmet-B.png | 3 - .../roblox/en-us/assets/art/Helmet-C.png | 3 - .../roblox/en-us/assets/art/Helmet-D.png | 3 - .../roblox/en-us/assets/art/Helmet-E.png | 3 - .../assets/art/RobloxBlenderPluginDemo.mp4 | 3 - .../en-us/assets/art/Shrine-Detailed.jpg | 3 - .../en-us/assets/art/Thumbnail-Buttes.jpeg | 3 - .../en-us/assets/art/Thumbnail-Looping.png | 3 - .../en-us/assets/art/Thumbnail-Radial.png | 3 - .../en-us/assets/art/Thumbnail-Shrine.png | 3 - .../en-us/assets/art/Thumbnail-Tinting.jpeg | 3 - .../roblox/en-us/assets/art/Traffic-Cone.png | 3 - .../en-us/assets/art/ValidationTool_V2.zip | 3 - .../art/accessories/AFT-Eyebrows-Example.png | 3 - .../Anime-Girl-Eyebrows-Example.png | 3 - .../Attachment-Data-Model-Example.png | 3 - .../art/accessories/Attachment-Example.png | 3 - .../accessories/Eyebrows-Eyelashes-Only.png | 3 - .../accessories/Face-Accessory-Hierarchy.png | 3 - .../art/accessories/Inner-Cage-Example.png | 3 - .../art/accessories/Mesh-Bow-Example.png | 3 - .../assets/art/accessories/Mesh-Example.png | 3 - .../Nature-Girl-No-Accessories.png | 3 - .../Nature-Girl-With-Face-Accessories.png | 3 - .../art/accessories/Outer-Cage-Example.png | 3 - .../art/accessories/Rigging-Example.png | 3 - .../art/accessories/Rigging-Pose-Example.png | 3 - .../accessories/Texture-Applied-Example.png | 3 - .../art/accessories/Texture-Example.png | 3 - .../art/accessories/Workflow-Layered.png | 3 - .../assets/art/accessories/Workflow-Rigid.png | 3 - .../creating-rigid/3D-Importer.png | 3 - .../creating-rigid/AFT-Add-Avatar-Panel.png | 3 - .../creating-rigid/AFT-Select-Mesh.png | 3 - .../creating-rigid/AFT-Select-Type.png | 3 - .../creating-rigid/Adding-New-Material.mp4 | 3 - .../accessories/creating-rigid/Adding-PBR.mp4 | 3 - .../Adding-Surface-Appearance.png | 3 - .../creating-rigid/Albedo-Node.png | 3 - .../Blender-Apply-Transforms.png | 3 - .../creating-rigid/Blender-Empty-Node.png | 3 - .../creating-rigid/Blender-Mask-Preview.png | 3 - .../creating-rigid/Blender-New-Material.png | 3 - .../creating-rigid/Blender-Scale-1.png | 3 - .../creating-rigid/Chest-Blender.png | 3 - .../Chest-Modeling-Complete.blend | 3 - .../creating-rigid/Chest-Studio.png | 3 - .../Chest-Texturing-Complete.blend | 3 - .../Chest-Texturing-Complete.fbx | 3 - .../creating-rigid/Complete-Border.mp4 | 3 - .../accessories/creating-rigid/Converting.mp4 | 3 - .../creating-rigid/Copy-Marketplace-URL.png | 3 - .../accessories/creating-rigid/Exporting.mp4 | 3 - .../creating-rigid/Fitting-Mask.mp4 | 3 - .../creating-rigid/General-Shape.mp4 | 3 - .../creating-rigid/Horizontal-Loop-Cuts.mp4 | 3 - .../accessories/creating-rigid/Importing.mp4 | 3 - .../creating-rigid/Marketplace-Listing.png | 3 - .../creating-rigid/Marking-3d-Object.mp4 | 3 - .../accessories/creating-rigid/Metal-Node.png | 3 - .../creating-rigid/Modeling-Complete.png | 3 - .../creating-rigid/Normal-Node.png | 3 - .../Outliner-Save-To-Roblox.png | 3 - .../creating-rigid/Painting-2d-Map.mp4 | 3 - .../Publishing-Moderation-Pending.png | 3 - .../Publishing-Ready-For-Sale.png | 3 - .../accessories/creating-rigid/Publishing.mp4 | 3 - .../creating-rigid/Rigid_Mask_Export.fbx | 3 - .../creating-rigid/Rigid_Mask_Model-Only.fbx | 3 - .../creating-rigid/Rigid_Mask_Textures.zip | 3 - .../Rigid_Mask_Texturing-Completed.blend | 3 - .../accessories/creating-rigid/Rough-Node.png | 3 - .../creating-rigid/Rounded-Lid.mp4 | 3 - .../creating-rigid/Scaling-FBX-Import.mp4 | 3 - .../creating-rigid/Side-Insets.mp4 | 3 - .../Studio-Mask-Preview-Cropped.png | 3 - .../creating-rigid/Studio-Mask-Preview.png | 3 - .../Surface-Appearance-Asset-Dropdown.png | 3 - .../creating-rigid/TXT_Rigid_Mask_ALB.png | 3 - .../creating-rigid/TXT_Rigid_Mask_MET.png | 3 - .../creating-rigid/TXT_Rigid_Mask_NOR.png | 3 - .../creating-rigid/TXT_Rigid_Mask_RGH.png | 3 - .../accessories/creating-rigid/Testing.mp4 | 3 - .../creating-rigid/Texturing-Complete.png | 3 - .../creating-rigid/UV-Projecting.mp4 | 3 - .../creating-rigid/Validation-Successful.png | 3 - .../creating-rigid/Vertical-Loop-Cuts.mp4 | 3 - .../accessories/creating/Caging-Complete.png | 3 - .../creating/Caging-Outer-Cage-Properties.png | 3 - .../creating/Caging-Outliner-Setup.png | 3 - .../art/accessories/creating/Caging_01.mp4 | 3 - .../art/accessories/creating/Caging_02.mp4 | 3 - .../art/accessories/creating/Caging_03.mp4 | 3 - .../accessories/creating/Example-Product.png | 3 - .../creating/Exporting-Accessory-Explorer.png | 3 - .../creating/Exporting-Clothing-In-Studio.png | 3 - ...Exporting-Clothing-in-Studio-Highlight.png | 3 - .../creating/Long_Sleeve_Export.fbx | 3 - .../creating/Modeling-Cage-Copied.png | 3 - .../creating/Modeling-Cages-Selected.png | 3 - .../creating/Modeling-Clear-Vertex-Colors.png | 3 - .../creating/Modeling-Complete-2.png | 3 - .../creating/Modeling-Mannequin-Start.png | 3 - .../creating/Modeling-No-Modifier.png | 3 - .../Modeling-Positioning-and-Scaling.png | 3 - .../creating/Modeling-SubDiv-Modifier.png | 3 - .../creating/Modeling-Wireframe-View.png | 3 - .../art/accessories/creating/Modeling_00.mp4 | 3 - .../art/accessories/creating/Modeling_01.mp4 | 3 - .../art/accessories/creating/Modeling_02.mp4 | 3 - .../art/accessories/creating/Modeling_03.mp4 | 3 - .../art/accessories/creating/Modeling_04.mp4 | 3 - .../art/accessories/creating/Modeling_05.mp4 | 3 - .../art/accessories/creating/Modeling_06.mp4 | 3 - .../art/accessories/creating/Modeling_07.mp4 | 3 - .../art/accessories/creating/Modeling_08.mp4 | 3 - .../creating/Rigging-Append-Browser.png | 3 - .../creating/Rigging-Armature-Appended.png | 3 - .../creating/Rigging-Auto-Weights.png | 3 - .../creating/Rigging-Bones-In-Front.png | 3 - .../creating/Rigging-Freeze-Transforms.png | 3 - .../creating/Rigging-Pose-Tests.png | 3 - .../art/accessories/creating/Rigging_01.mp4 | 3 - .../art/accessories/creating/Rigging_02.mp4 | 3 - .../art/accessories/creating/Rigging_03.mp4 | 3 - .../creating/Texturing-Add-Base.png | 3 - .../creating/Texturing-Add-Image.png | 3 - .../creating/Texturing-Complete-3.png | 3 - .../creating/Texturing-Complete.png | 3 - .../accessories/creating/Texturing-Start.png | 3 - .../creating/Texturing-UV-Maps.png | 3 - .../art/accessories/creating/Texturing_01.mp4 | 3 - .../art/accessories/creating/Texturing_02.mp4 | 3 - .../art/accessories/creating/Texturing_03.mp4 | 3 - .../art/accessories/creating/Texturing_04.mp4 | 3 - .../creating/Watertight-Bottom.png | 3 - .../accessories/creating/Watertight-Top.png | 3 - .../en-us/assets/art/avatar/Acc-Antenna.png | 3 - .../en-us/assets/art/avatar/Acc-Antlers-A.png | 3 - .../en-us/assets/art/avatar/Acc-Antlers-B.png | 3 - .../assets/art/avatar/Acc-Demon-Horns-A.png | 3 - .../assets/art/avatar/Acc-Demon-Horns-B.png | 3 - .../en-us/assets/art/avatar/Acc-Feathers.png | 3 - .../en-us/assets/art/avatar/Acc-Glasses.png | 3 - .../en-us/assets/art/avatar/Acc-Horn-A.png | 3 - .../en-us/assets/art/avatar/Acc-Horn-B.png | 3 - .../assets/art/avatar/Acc-Robot-Arms.png | 3 - .../assets/art/avatar/Acc-Skin-Example.png | 3 - .../assets/art/avatar/Acc-Sunglasses.png | 3 - .../en-us/assets/art/avatar/Acc-Tail-A.png | 3 - .../en-us/assets/art/avatar/Acc-Tail-B.png | 3 - .../en-us/assets/art/avatar/Acc-Tattoos.png | 3 - .../en-us/assets/art/avatar/Acc-Whiskers.png | 3 - .../en-us/assets/art/avatar/Acc-Wings-A.png | 3 - .../en-us/assets/art/avatar/Acc-Wings-B.png | 3 - .../art/avatar/Attachments-Data-Model.png | 3 - .../assets/art/avatar/Attachments-Visual.png | 3 - .../assets/art/avatar/Avatar-3D-Importer.png | 3 - .../assets/art/avatar/Avatar-Data-Model.png | 3 - .../art/avatar/Avatar-Item-Creation.png | 3 - .../assets/art/avatar/Avatar-Rig-Scale.png | 3 - .../art/avatar/Avatar-Roughness-Map.png | 3 - .../art/avatar/Avatar-Studio-Example.png | 3 - .../art/avatar/Avatar-Surface-Appearance.png | 3 - .../assets/art/avatar/Avatar-Thumbnail.png | 3 - .../avatar/Blender-Save-Image-Workaround.png | 3 - .../en-us/assets/art/avatar/Blocky-All.png | 3 - .../en-us/assets/art/avatar/Blocky-Cage.png | 3 - .../en-us/assets/art/avatar/Blocky-Head.png | 3 - .../assets/art/avatar/Bodies-Thumbnail.png | 3 - .../assets/art/avatar/Bodies-Tutorial.png | 3 - .../art/avatar/Body-Parts-Data-Model.png | 3 - .../assets/art/avatar/Body-Parts-Visual.png | 3 - .../assets/art/avatar/Cage-Face-Offset.png | 3 - .../assets/art/avatar/Cage-Landmark-A.png | 3 - .../assets/art/avatar/Cage-Landmark-B.png | 3 - .../assets/art/avatar/Cage-Landmark-C.png | 3 - .../assets/art/avatar/Cage-Landmarks.png | 3 - .../art/avatar/Cage-Mesh-Data-Model.png | 3 - .../assets/art/avatar/Cage-Mesh-Visual.png | 3 - .../assets/art/avatar/Cage-Reference-A.png | 3 - .../assets/art/avatar/Cage-Reference-B.png | 3 - .../art/avatar/Cage-Template-Lineup.png | 3 - .../assets/art/avatar/Cage-With-Landmarks.png | 3 - .../art/avatar/Character-Data-Model-Cages.png | 3 - .../avatar/Character-Data-Model-Collapsed.png | 3 - .../avatar/Character-Data-Model-Joints.png | 3 - .../assets/art/avatar/Classic-Thumbnail.png | 3 - .../assets/art/avatar/Clothing-Thumbnail.png | 3 - .../art/avatar/Clothing-Tutorial-Blender.png | 3 - .../art/avatar/Clothing-Tutorial-Studio.png | 3 - .../art/avatar/Component-Attachments.png | 3 - .../art/avatar/Component-Body-Parts.png | 3 - .../assets/art/avatar/Component-Cage-Mesh.png | 3 - .../Component-Facial-Animation-Data.png | 3 - .../assets/art/avatar/Component-Rigging.png | 3 - .../art/avatar/Component-Texture-Map.png | 3 - .../en-us/assets/art/avatar/DCC-Thumbnail.png | 3 - .../art/avatar/Delete-Vertex-Colors.png | 3 - .../assets/art/avatar/Eye-Closed-Success.png | 3 - .../en-us/assets/art/avatar/Face-Default.png | 3 - .../assets/art/avatar/Face-Landmarks-Poor.png | 3 - .../assets/art/avatar/Face-Landmarks.png | 3 - .../art/avatar/Facial-Animation-Timeline.png | 3 - .../assets/art/avatar/Facial-Properties.png | 3 - .../assets/art/avatar/Facial-Rig-Visual.png | 3 - .../en-us/assets/art/avatar/Horn-All.png | 3 - .../en-us/assets/art/avatar/Horn-Cage.png | 3 - .../en-us/assets/art/avatar/Horn-Head.png | 3 - .../assets/art/avatar/Invalid-Visibility.png | 3 - .../assets/art/avatar/Landmarks-Fail-A.png | 3 - .../assets/art/avatar/Landmarks-Fail-B.png | 3 - .../assets/art/avatar/Makeup-Example-A.png | 3 - .../assets/art/avatar/Makeup-Example-B.png | 3 - .../assets/art/avatar/Makeup-Example-C.png | 3 - .../assets/art/avatar/Makeup-Example-D.png | 3 - .../assets/art/avatar/Makeup-Example-E.png | 3 - .../assets/art/avatar/Makeup-Example-F.png | 3 - .../assets/art/avatar/Missing-Landmarks-A.png | 3 - .../assets/art/avatar/Missing-Landmarks-B.png | 3 - .../art/avatar/Modesty-Layer-Example-A.png | 3 - .../art/avatar/Modesty-Layer-Example-B.png | 3 - .../avatar/Modesty-Layer-Example-C-Cyber.png | 3 - .../avatar/Modesty-Layer-Example-C-Giga.png | 3 - .../avatar/Modesty-Layer-Example-Claire.png | 3 - ...Modesty-Layer-Example-Clawed-Companion.png | 3 - .../Modesty-Layer-Example-D-Greaser.png | 3 - .../avatar/Modesty-Layer-Example-D-Tela.png | 3 - .../Modesty-Layer-Example-E-Great-Bear.png | 3 - .../avatar/Modesty-Layer-Example-E-Polar.png | 3 - .../avatar/Modesty-Layer-Example-F-Scare.png | 3 - .../Modesty-Layer-Example-F-Scarlett.png | 3 - .../avatar/Modesty-Layer-Example-G-Dragon.png | 3 - .../avatar/Modesty-Layer-Example-G-Teddy.png | 3 - .../Modesty-Layer-Example-Gang-O-Fries.png | 3 - .../Modesty-Layer-Example-H-Bungling.png | 3 - .../Modesty-Layer-Example-H-Pumpkin.png | 3 - .../avatar/Modesty-Layer-Example-Ivory.png | 3 - .../Modesty-Layer-Example-Mr-Toilet.png | 3 - .../avatar/Modesty-Layer-Example-Skeleton.png | 3 - .../avatar/Modesty-Layer-Upper-Torso-Back.png | 3 - .../art/avatar/Modesty-Layer-Variations.png | 3 - .../art/avatar/Mouth-Vertices-Warning.png | 3 - .../assets/art/avatar/Projection-Side.png | 3 - .../assets/art/avatar/Rigging-Data-Model.png | 3 - .../assets/art/avatar/Rigging-Visual.png | 3 - .../assets/art/avatar/Rigid-Thumbnail.png | 3 - .../en-us/assets/art/avatar/Tattoo-Samy-A.png | 3 - .../en-us/assets/art/avatar/Tattoo-Samy-B.png | 3 - .../en-us/assets/art/avatar/Textures-Blue.png | 3 - .../assets/art/avatar/Textures-Brown.png | 3 - .../assets/art/avatar/Tutorial-Thumbnail.png | 3 - .../assets/art/avatar/Valid-Visibility.png | 3 - .../art/avatar/Validation-Tool-Preview.png | 3 - .../art/avatar/Validation-Tool-Test.mp4 | 3 - .../assets/art/avatar/Validation-Tool.png | 3 - .../art/avatar/Workflow-Bodies-Templates.png | 3 - .../avatar/Workflow-Bodies-Traditional.png | 3 - .../Blender-Animation-Start-End.png | 3 - .../Caging-Outer-Cage-Objects.png | 3 - .../Caging-Symmetry-Settings.png | 3 - .../art/avatar/basic-creation/Caging_01.mp4 | 3 - .../art/avatar/basic-creation/Caging_02.mp4 | 3 - .../art/avatar/basic-creation/Caging_03.mp4 | 3 - .../art/avatar/basic-creation/Caging_04.mp4 | 3 - .../Cleanup-Disconnect-Node.png | 3 - .../basic-creation/Cleanup-Mix-Node.png | 3 - .../avatar/basic-creation/Cleanup-Node-B.png | 3 - .../basic-creation/Cleanup-Object-Select.png | 3 - .../avatar/basic-creation/Cleanup_01-1.mp4 | 3 - .../art/avatar/basic-creation/Cleanup_01.mp4 | 3 - .../art/avatar/basic-creation/Cleanup_02.mp4 | 3 - .../avatar/basic-creation/Color_Picker_01.mp4 | 3 - .../basic-creation/Edge-Flow-Eyebrow-A.png | 3 - .../basic-creation/Edge-Flow-Eyebrow-B.png | 3 - .../basic-creation/Edge-Flow-Eyes-A.png | 3 - .../basic-creation/Edge-Flow-Eyes-B.png | 3 - .../basic-creation/Edge-Flow-Mouth-A.png | 3 - .../basic-creation/Edge-Flow-Mouth-B.png | 3 - .../basic-creation/Edge-Flow-Nasolabial-A.png | 3 - .../basic-creation/Edge-Flow-Nasolabial-B.png | 3 - .../avatar/basic-creation/Export-Settings.png | 3 - .../Exporting-Pack-Resources.png | 3 - .../avatar/basic-creation/Exporting_01.mp4 | 3 - .../avatar/basic-creation/Post-Attachment.png | 3 - .../art/avatar/basic-creation/Post-Caging.png | 3 - .../avatar/basic-creation/Post-Sculpting.png | 3 - .../basic-creation/Post-Texturing-A.png | 3 - .../basic-creation/Post-Texturing-B.png | 3 - .../basic-creation/Post-Texturing-C.png | 3 - .../avatar/basic-creation/Post-Texturing.png | 3 - .../avatar/basic-creation/Post-Tutorial.png | 3 - .../avatar/basic-creation/Pre-Attachment.png | 3 - .../art/avatar/basic-creation/Pre-Caging.png | 3 - .../avatar/basic-creation/Pre-Sculpting.png | 3 - .../avatar/basic-creation/Pre-Texturing.png | 3 - .../avatar/basic-creation/Pre-Tutorial.png | 3 - .../Sculpting-Crash-Example.png | 3 - .../avatar/basic-creation/Sculpting_01.mp4 | 3 - .../avatar/basic-creation/Sculpting_02.mp4 | 3 - .../avatar/basic-creation/Sculpting_03.mp4 | 3 - .../avatar/basic-creation/Sculpting_04.mp4 | 3 - .../avatar/basic-creation/Sculpting_06.mp4 | 3 - .../avatar/basic-creation/Sculpting_07.mp4 | 3 - .../basic-creation/Select-Bone-Objects.png | 3 - .../basic-creation/Select-Joint-Objects.png | 3 - .../basic-creation/Template-Face-Objects.png | 3 - .../basic-creation/Testing-3d-Importer.png | 3 - .../Testing-Animation-Timeline.png | 3 - .../basic-creation/Testing-Asset-Upload.png | 3 - .../Testing-Avatar-Test-Place.png | 3 - .../Testing-Clothing-Try-On.png | 3 - .../basic-creation/Testing-Clothing.png | 3 - .../Testing-Custom-Properties.png | 3 - .../avatar/basic-creation/Testing-Emotes.png | 3 - .../basic-creation/Testing-Face-Animation.png | 3 - .../basic-creation/Testing-Lighting.png | 3 - .../Testing-Outdoor-Environment.png | 3 - .../avatar/basic-creation/Testing-Ramps.png | 3 - .../basic-creation/Testing-Rig-Type.png | 3 - .../basic-creation/Testing-Skin-Tone.png | 3 - .../basic-creation/Testing-StarterPlayer.png | 3 - .../avatar/basic-creation/Testing-Studio.png | 3 - .../Testing-Surface-Appearance-Applied.png | 3 - .../Testing-Surface-Appearance.png | 3 - .../basic-creation/Testing-UI-Clothing.png | 3 - .../basic-creation/Testing-UI-Emote.png | 3 - .../avatar/basic-creation/Testing-UI-Face.png | 3 - .../basic-creation/Testing-UI-Lighting.png | 3 - .../basic-creation/Testing-UI-Movement.png | 3 - .../basic-creation/Testing-UI-Settings.png | 3 - .../basic-creation/Testing-UI-Skin-Tone.png | 3 - .../avatar/basic-creation/Testing-Water.png | 3 - .../art/avatar/basic-creation/Testing_01.mp4 | 3 - .../art/avatar/basic-creation/Testing_02.mp4 | 3 - .../art/avatar/basic-creation/Testing_03.mp4 | 3 - .../basic-creation/Texture-Resolution-A.png | 3 - .../basic-creation/Texture-Resolution-B.png | 3 - .../Texture-Symmetry-Tool-Setting.png | 3 - .../basic-creation/Texturing-Inner-Eye.png | 3 - .../Texturing-Outer-Brush-Settings.png | 3 - .../Texturing-Pupil-Brush-Settings.png | 3 - .../Texturing-Shadow-Settings.png | 3 - .../Texturing-Wireframe-Toggle.png | 3 - .../basic-creation/Texturing-X-Symmetry.png | 3 - .../avatar/basic-creation/Texturing_01.mp4 | 3 - .../avatar/basic-creation/Texturing_02.mp4 | 3 - .../avatar/basic-creation/Texturing_03.mp4 | 3 - .../avatar/basic-creation/Texturing_04.mp4 | 3 - .../avatar/basic-creation/Texturing_05.mp4 | 3 - .../avatar/basic-creation/Texturing_06.mp4 | 3 - .../avatar/basic-creation/Texturing_07.mp4 | 3 - .../avatar/basic-creation/Texturing_08.mp4 | 3 - .../avatar/basic-creation/Texturing_09.mp4 | 3 - .../avatar/basic-creation/Texturing_10.mp4 | 3 - .../avatar/basic-creation/Texturing_11.mp4 | 3 - .../art/avatar/classic-head/20_406000958.png | 3 - .../classic-head/8bitHeartFace_2568799765.png | 3 - .../classic-head/AdorablePuppy_11389372.png | 3 - .../classic-head/Adoration_28878297.png | 3 - .../avatar/classic-head/Aghast_9250633.png | 3 - .../AlexandraNinniflipFace_2553655919.png | 3 - .../classic-head/AlienAmbassador_11913700.png | 3 - .../avatar/classic-head/Alien_31317701.png | 3 - .../avatar/classic-head/Alright_7131541.png | 3 - .../classic-head/AmeliaFace_293302465.png | 3 - .../AndThenWellTakeOverTheWorld_12732366.png | 3 - .../avatar/classic-head/Angelic_45084008.png | 3 - .../classic-head/AngryZombie_173789114.png | 3 - .../avatar/classic-head/Anguished_8560975.png | 3 - .../classic-head/AnimeSurprise_416846300.png | 3 - ...lIsleClanWindsorTheBlueFace_2627730985.png | 3 - .../AtlanteanWarriorFace_3241221587.png | 3 - .../AuroraSparkFace_2979703241.png | 3 - .../classic-head/AwesomeFace_30394850.png | 3 - .../classic-head/AwkwardEyeroll_150182378.png | 3 - .../classic-head/AwkwardGrin_150182501.png | 3 - .../avatar/classic-head/BadDog_10678423.png | 3 - .../classic-head/BadNewsFace_268603331.png | 3 - .../classic-head/Bakonette_7243836687.png | 3 - .../classic-head/BallerinaFace_2571850406.png | 3 - .../avatar/classic-head/Bandage_20418682.png | 3 - .../BattleReadyKenjiFace_3116216863.png | 3 - .../classic-head/BeastMode_128992838.png | 3 - .../classic-head/BeekeeperFace_2553407112.png | 3 - .../BigGrinTaiVerdes_7987180607.png | 3 - .../classic-head/BigSadEyes_391496223.png | 3 - ...BiohazardFirstResponderFace_4927805902.png | 3 - .../classic-head/BirdOfPrey_10907547.png | 3 - .../classic-head/Biteymcface_743690770.png | 3 - .../avatar/classic-head/Blerg_12777646.png | 3 - .../avatar/classic-head/Bling_25975243.png | 3 - .../avatar/classic-head/Blinky_7506135.png | 3 - .../BlizzardBeastMode_209995252.png | 3 - .../classic-head/BlueAmazeface_835095003.png | 3 - .../BlueBubbleTrouble_330296924.png | 3 - .../classic-head/BlueEyeroll_323191979.png | 3 - .../classic-head/BlueGalaxyGaze_440739518.png | 3 - .../classic-head/BlueGoof_1191162013.png | 3 - .../classic-head/BlueMoonstruck_878941449.png | 3 - .../BlueRockStarSmile_1428409936.png | 3 - .../classic-head/BlueStarface_119812715.png | 3 - .../BlueStarrySight_2222775067.png | 3 - .../classic-head/BlueTrance_244160970.png | 3 - .../BlueUltimateDragonFace_1772529256.png | 3 - .../BlueWistfulWink_583721561.png | 3 - .../BlueeyedAwesomeFace_386188363.png | 3 - .../classic-head/Bluffing_147144673.png | 3 - .../avatar/classic-head/Bored_66330106.png | 3 - .../avatar/classic-head/Braces_30394484.png | 3 - .../classic-head/BubbleTrouble_19264845.png | 3 - .../classic-head/Butterfly_24727929.png | 3 - .../avatar/classic-head/Camoface_24441888.png | 3 - .../CaretUnderscoreCaret_15366173.png | 3 - .../classic-head/CaseysFace_301827157.png | 3 - .../CatEyeZaraLarsson_7893455671.png | 3 - .../CatchingSnowflakes_1213472762.png | 3 - .../ChampionOfTheTideFace_3381167752.png | 3 - .../classic-head/CheerfulGrin_33321848.png | 3 - .../classic-head/CheerfulHello_362051644.png | 3 - .../ChesterFinkletonFace_2648884861.png | 3 - .../ChichiriTheWiseYoukaiFace_3210252812.png | 3 - .../classic-head/ChillMccool_376813144.png | 3 - .../art/avatar/classic-head/Chill_7074764.png | 3 - .../classic-head/ChippyMctooth_7317769.png | 3 - .../art/avatar/classic-head/Chubs_7076110.png | 3 - .../CityLifeManFace_2490662812.png | 3 - .../CityLifeWomanFace_2492678267.png | 3 - .../classic-head/ClairesFace_301827089.png | 3 - .../ClassicAlienFace_159199178.png | 3 - .../ClassicFemaleFace_4018627046.png | 3 - .../ClassicFemaleV2Face_4637266368.png | 3 - .../classic-head/ClassicGoof_7074661.png | 3 - .../ClassicMaleFace_4018617474.png | 3 - .../classic-head/ClassicVampire_7074836.png | 3 - .../classic-head/ClownFace_23644960.png | 3 - .../ClownSchoolDropout_21392863.png | 3 - ...lonApostropheCloseParenthesis_15133453.png | 3 - .../ColonDashBackslash_15471035.png | 3 - .../classic-head/ColonDashO_7317773.png | 3 - .../ColonDashQuestionMark_15858152.png | 3 - .../classic-head/ColonDashSlash_7075469.png | 3 - .../ColonOpenBracket_15470193.png | 3 - .../avatar/classic-head/Commando_10527010.png | 3 - .../avatar/classic-head/Concerned_9250660.png | 3 - .../classic-head/CountryMorning_51241522.png | 3 - .../CrankAndZapMechFace_5885801791.png | 3 - .../CrazyAbstractArtist_10907546.png | 3 - .../classic-head/CrazyHappy_45515121.png | 3 - .../classic-head/Crazybot10000_554650579.png | 3 - .../CrimsonEvilEye_1016184756.png | 3 - .../CrimsonLaserVision_45514606.png | 3 - .../CrimsonStarface_162200633.png | 3 - .../classic-head/Crybaby_2620506513.png | 3 - .../Cuckookrazybot10000_554663025.png | 3 - .../classic-head/CuteKitty_11389441.png | 3 - .../classic-head/Cutiemouse_15885121.png | 3 - .../classic-head/Cyanskeleface_2845815452.png | 3 - .../classic-head/CyndiFace_2535415411.png | 3 - .../art/avatar/classic-head/D1_16132514.png | 3 - .../art/avatar/classic-head/D_14812981.png | 3 - .../classic-head/DaringBeard_110288809.png | 3 - .../DaringBlondeBeardFace_323191430.png | 3 - .../avatar/classic-head/Daring_8329690.png | 3 - .../DarkAgeApprenticeFace_2510119972.png | 3 - .../DashUnderscoreDash_15637848.png | 3 - .../classic-head/Daydreaming_29296146.png | 3 - .../classic-head/DdottySmile_667681953.png | 3 - .../classic-head/DeathsGrin_880471415.png | 3 - .../classic-head/DementedMouse_12188176.png | 3 - .../avatar/classic-head/Dequal_17138027.png | 3 - .../classic-head/DesertCommando_323191683.png | 3 - .../DevilNasXLilNasXLNX_7657657626.png | 3 - .../DevilishSmile24kGoldn_9156271739.png | 3 - .../classic-head/DexsFace_807335973.png | 3 - .../DiamondGrillLilNasXLNX_7657627637.png | 3 - .../DigitalArtistFace_2936946480.png | 3 - .../DigitalShockArtistFace_2936946480.png | 3 - .../DisapprovingUnibrow_66330360.png | 3 - .../classic-head/DisbeliefFace_34186804.png | 3 - .../classic-head/Disbelief_20337343.png | 3 - .../DistaughtAlienInvader_11913668.png | 3 - .../DiyCardboardKnightFace_2517411290.png | 3 - .../classic-head/DizzyFace_10907551.png | 3 - .../DjDatabazeFace_3091071034.png | 3 - .../classic-head/DollarDotDollar_10831558.png | 3 - .../DominoDeckardFace_6653133806.png | 3 - .../classic-head/DontWakeMeUp_343619993.png | 3 - .../avatar/classic-head/Downcast_21352013.png | 3 - .../Dr.FiaTyfoidFace_3410486318.png | 3 - .../DrBuntonMadmindFace_2807218396.png | 3 - ...LaurenArtifactExcavatorFace_2510140104.png | 3 - .../classic-head/Dragonface_12908359.png | 3 - .../classic-head/DrillSergeant_141728899.png | 3 - .../classic-head/DroolingNoob_24067718.png | 3 - .../DruidOfTheStagFace_3131093524.png | 3 - .../classic-head/EggCrazed_233616117.png | 3 - .../classic-head/EggOnYourFace_110207471.png | 3 - .../EitaTheEnviousYoukaiFace_3210252000.png | 3 - .../ElegantEveningDressFace_4916129740.png | 3 - ...dianOfTheNorthernBorderFace_2510329394.png | 3 - .../classic-head/Embarrassed_21272995.png | 3 - .../EmeraldAmbassador_66330060.png | 3 - .../EmeraldArchfeyVisage_2830499980.png | 3 - .../EmeraldEvilEye_1016185535.png | 3 - .../EmeraldLaserVision_66330165.png | 3 - .../EmotionallyDistressedZombie_7506136.png | 3 - .../avatar/classic-head/Emperor_25267538.png | 3 - .../avatar/classic-head/EpicFace_42070576.png | 3 - .../EpicVampireFace_181651981.png | 3 - .../EqualCloseParenthesis_14817393.png | 3 - .../classic-head/ErisyphiaFace_3141356565.png | 3 - .../art/avatar/classic-head/Err_20418658.png | 3 - .../classic-head/EvilSkeptic_110336757.png | 3 - .../classic-head/ExclamationFace_35168581.png | 3 - .../classic-head/ExistentialAngst_7074814.png | 3 - .../avatar/classic-head/Extreme_10831454.png | 3 - .../EyesOfEverflame_362051773.png | 3 - .../classic-head/EyesOfEverfrost_22972723.png | 3 - .../classic-head/EzebelFace_293303927.png | 3 - .../avatar/classic-head/Facepalm_30394594.png | 3 - .../FancifulLeprechaunFace_2907641479.png | 3 - .../art/avatar/classic-head/Fang_7075142.png | 3 - .../classic-head/FashionFace_2274764091.png | 3 - .../avatar/classic-head/FastCar_22587894.png | 3 - .../classic-head/FawkesFace_134522901.png | 3 - .../FearlessOceanDiverFace_5238862364.png | 3 - .../avatar/classic-head/Fearless_7074991.png | 3 - .../FestiveBeekeeperFace_2553407112.png | 3 - .../classic-head/FinnMcCool_10907549.png | 3 - .../FootballPlayerFace_2773409880.png | 3 - .../classic-head/FreckledCheeks_25556219.png | 3 - .../avatar/classic-head/Freckles_12145366.png | 3 - .../classic-head/FriendlyCyclops_30394438.png | 3 - .../classic-head/FriendlyGrin_25321961.png | 3 - .../classic-head/FriendlyPirate_19366445.png | 3 - .../classic-head/FriendlyPuppy_27725434.png | 3 - .../classic-head/FriendlySmile_616381207.png | 3 - .../FriendlyTrustingSmile_402304145.png | 3 - .../FrighteningUnibrow_8560985.png | 3 - .../avatar/classic-head/Frightful_7699193.png | 3 - .../FuriousFinnFace_295492723.png | 3 - .../classic-head/FuriousGeorge_277950647.png | 3 - .../FutureglamBountyHunterFace_3013806177.png | 3 - ...nniTheSnailKnighterrantFace_2628039027.png | 3 - .../classic-head/Ghostface_12467159.png | 3 - .../classic-head/Gigglypuff_35397243.png | 3 - .../art/avatar/classic-head/Glee_7074729.png | 3 - .../GlidedDiverFace_5238862364.png | 3 - .../GloryOnTheGridiron_21802396.png | 3 - .../GoldenBlingBraces_1191136166.png | 3 - .../classic-head/GoldenEvilEye_1016185809.png | 3 - .../GoldenEyes24kGoldn_9156275069.png | 3 - .../GoldenLightningSpeaker_66330231.png | 3 - .../GoldenShinyTeeth_66319941.png | 3 - .../classic-head/GoodIntentioned_7317793.png | 3 - .../avatar/classic-head/Goofball_27134344.png | 3 - .../GrandmasLipstick_51241480.png | 3 - ...GreaterThanUnderScoreLessThan_15324577.png | 3 - ...aterThanUnderscoreGreaterThan_16387711.png | 3 - .../classic-head/GreenAmazeface_835094544.png | 3 - .../GreenBubbleTrouble_380754227.png | 3 - .../GreenDroolAngryZombie_406001532.png | 3 - .../GreenGalaxyGaze_440739783.png | 3 - .../GreenGlowingEyes_398676450.png | 3 - .../classic-head/GreenGoof_1191162539.png | 3 - .../classic-head/GreenStarface_119812738.png | 3 - .../GreenSuperHappyJoy_323191596.png | 3 - .../classic-head/GreenTrance_260303894.png | 3 - .../GreenUltimateDragonFace_1772531407.png | 3 - .../GreenWhatchooTalkinBout_323191787.png | 3 - .../GreenWistfulWink_583722932.png | 3 - .../GreeneyedAwesomeFace_66330144.png | 3 - .../classic-head/GrittyBombo_406000562.png | 3 - .../classic-head/GrumpyBlox_173789498.png | 3 - .../GwenAxeAngelRosewoodFace_2859557339.png | 3 - .../classic-head/HappyGirlFace_293226229.png | 3 - .../classic-head/HappyWink_236399287.png | 3 - .../HeartGazeZaraLarsson_7893468574.png | 3 - .../avatar/classic-head/Heeeeeey_21635565.png | 3 - .../classic-head/Hilarious_27861352.png | 3 - .../art/avatar/classic-head/Hmmm_7076076.png | 3 - .../classic-head/HockeyFace_142464206.png | 3 - .../classic-head/HoldItIn_2222771916.png | 3 - .../art/avatar/classic-head/Huh_150182466.png | 3 - .../classic-head/HutHutHike_15470849.png | 3 - .../classic-head/Hypnoface_10770436.png | 3 - .../classic-head/I3NewSiteTheme_32723404.png | 3 - .../classic-head/IAmNotAmused_7131886.png | 3 - .../IDidntEatThatCookie_116042990.png | 3 - .../classic-head/IHateNoobs_14030577.png | 3 - .../ILackPersonalConfidence_7506144.png | 3 - .../avatar/classic-head/IWuvU_10907545.png | 3 - .../avatar/classic-head/Iface_100290429.png | 3 - .../classic-head/Ilovefootboll_15470861.png | 3 - .../avatar/classic-head/Imagine_30394316.png | 3 - .../classic-head/Isabella_7243933492.png | 3 - .../avatar/classic-head/ItsGoTime_7506141.png | 3 - .../classic-head/ItsSoBeautiful_26674400.png | 3 - .../classic-head/JackFrostFace_19396123.png | 3 - .../JacobTheStormBreakerFace_599913343.png | 3 - .../JesterEquinoxFace_2962660233.png | 3 - .../classic-head/JohnsFace_301827199.png | 3 - .../classic-head/JoyfulSmile_209995366.png | 3 - .../classic-head/JoyousSurprise_28999228.png | 3 - .../classic-head/JungleCommando_16678138.png | 3 - .../classic-head/JustTrouble_244160766.png | 3 - .../KandisSprinkleFace_8666865667.png | 3 - .../KnightOfChivalryFace_2510299324.png | 3 - ...plinteredSkiesAscendantFace_2506721000.png | 3 - .../KnightofCourageFace_2535711033.png | 3 - .../classic-head/KnowitallGrin_26424808.png | 3 - .../classic-head/KrezakFace_293309580.png | 3 - .../KromaBlitzFace_2979689790.png | 3 - .../LadyDarkshadeFace_2807183388.png | 3 - .../classic-head/LadyLashes_29348122.png | 3 - .../classic-head/LaughingFun_226217449.png | 3 - .../LavenderAmazeface_835095306.png | 3 - .../avatar/classic-head/LazyEye_7075502.png | 3 - .../LightningSpeaker_22588801.png | 3 - .../classic-head/LinsFace_301826803.png | 3 - .../art/avatar/classic-head/Lion_11956548.png | 3 - .../classic-head/LookAtMyNose_23311761.png | 3 - .../classic-head/LynnFace_2610492664.png | 3 - .../classic-head/Madbot10000_554658475.png | 3 - .../classic-head/MagicalDragon_34871168.png | 3 - .../avatar/classic-head/ManFace_86487700.png | 3 - .../classic-head/Manicbot10000_554663566.png | 3 - .../classic-head/ManlierFace_76383151.png | 3 - .../avatar/classic-head/Masque_22432782.png | 3 - .../MclarenBigGrin_9062637857.png | 3 - .../classic-head/MclarenSmile_9062620353.png | 3 - .../avatar/classic-head/Meanie_9250643.png | 3 - .../art/avatar/classic-head/Meow_10907529.png | 3 - .../MercilessNinjaFace_6652985701.png | 3 - .../MermaidMystique_8664096393.png | 3 - .../classic-head/MickMccann_23264604.png | 3 - .../MildlyIrritatedFace_280988393.png | 3 - .../MinervaBrightFace_2608317303.png | 3 - .../classic-head/Mischievous_9250654.png | 3 - .../classic-head/MissScarlet_334656210.png | 3 - .../MixologistsSmile_4645966393.png | 3 - .../classic-head/MonCheriFace_7243931574.png | 3 - .../MonarchButterflySmile_383607653.png | 3 - .../classic-head/MonsterFace_49045351.png | 3 - .../MonsterGrumpyFace_7243924005.png | 3 - .../classic-head/MonsterSmile_398675917.png | 3 - .../classic-head/MrBubbles_31616411.png | 3 - .../classic-head/MrChuckles_10907541.png | 3 - .../classic-head/MrOinkers_11123827.png | 3 - .../classic-head/MrToiletFace_4416933495.png | 3 - .../avatar/classic-head/Muttdawg_11647324.png | 3 - .../classic-head/Mysterious_7132035.png | 3 - .../NegationUnderscoreNegation_13038375.png | 3 - .../NeoclassicFemaleV2Face_4637166178.png | 3 - .../avatar/classic-head/Nervous_23219981.png | 3 - .../classic-head/NethackAddict_16357383.png | 3 - .../NibblesDevourerOfWorlds_11913734.png | 3 - .../avatar/classic-head/Ninja_11453609.png | 3 - .../art/avatar/classic-head/NoZ_14405720.png | 3 - .../NorikoTheGentleYoukaiFace_3210253450.png | 3 - .../avatar/classic-head/NotAgain_28119051.png | 3 - .../NotSoFriendlyEviscerator_66330204.png | 3 - .../classic-head/Notsureif_173789324.png | 3 - .../avatar/classic-head/Nowai_51241862.png | 3 - .../classic-head/OakleysFace_301827237.png | 3 - .../classic-head/Obvious_Wink_51241537.png | 3 - .../classic-head/OchreOgre_16723499.png | 3 - ...taviaTheIvorySpiderGirlFace_2986536321.png | 3 - .../classic-head/OgreFace_391495894.png | 3 - .../avatar/classic-head/OhDeer_12145328.png | 3 - .../OhNoesAnotherDog_13038397.png | 3 - .../classic-head/OldManJenkins_13335647.png | 3 - .../avatar/classic-head/OldTimer_27003636.png | 3 - .../classic-head/OliZigzagFace_2979331491.png | 3 - .../art/avatar/classic-head/Oo1_7074595.png | 3 - .../art/avatar/classic-head/Oo_66330265.png | 3 - .../avatar/classic-head/Optimist_21024661.png | 3 - .../classic-head/OrangeStarface_162200666.png | 3 - .../classic-head/OrangeTrance_260303960.png | 3 - .../classic-head/Otakufaic_1665638148.png | 3 - .../OverjoyedSmile_1428416217.png | 3 - .../OverseerAssassinFace_2761366151.png | 3 - .../OverseerProphetFace_3040321462.png | 3 - .../art/avatar/classic-head/Owl_11123805.png | 3 - .../art/avatar/classic-head/P_14861743.png | 3 - .../PaintballEnthusiast_23310997.png | 3 - .../PerformingMime_5122343618.png | 3 - .../PersephonesGirlGlam_7243865988.png | 3 - .../PiefaceJellyfreckles_19381787.png | 3 - .../classic-head/PinkGalaxyGaze_440738448.png | 3 - .../PinkMermaidPrincess_1428418448.png | 3 - .../classic-head/PinkMoonstruck_878940145.png | 3 - .../PinkShadesMccool_323192138.png | 3 - .../PinkWistfulWink_583721990.png | 3 - .../classic-head/PizzaFace_2845812591.png | 3 - .../PlayfulVampire_2409285794.png | 3 - .../PoisonousBeastMode_2606177838.png | 3 - .../PoliceOfficerNashFace_2506787960.png | 3 - .../avatar/classic-head/PonyFace_13656095.png | 3 - .../avatar/classic-head/PoorMan_7699183.png | 3 - ...QueenSmilestarSpectacusmile_2274754557.png | 3 - .../classic-head/Prankster_20052135.png | 3 - .../classic-head/PridefulSmile_3267564334.png | 3 - .../PrincessAlexis_6590375198.png | 3 - .../art/avatar/classic-head/Puck_20298988.png | 3 - .../classic-head/PunkFace_119812659.png | 3 - .../classic-head/PurpleAlien_323192193.png | 3 - .../PurpleBubbleTrouble_362051999.png | 3 - .../PurpleButterflySmile_238983270.png | 3 - .../PurpleGalaxyGaze_440739240.png | 3 - .../PurpleMermaidPrincess_1428424821.png | 3 - .../PurpleMoonstruck_878942257.png | 3 - .../classic-head/PurpleStarface_119812765.png | 3 - .../PurpleSuperHappyJoy_376812961.png | 3 - .../classic-head/PurpleTrance_260304187.png | 3 - .../PurpleWistfulWink_583722710.png | 3 - .../classic-head/PwndaFace_28281786.png | 3 - .../classic-head/QuackfaceMcgraw_11647296.png | 3 - .../avatar/classic-head/Quijibo_10907532.png | 3 - .../avatar/classic-head/ROAR_406001167.png | 3 - .../avatar/classic-head/Raccoon_27052537.png | 3 - .../classic-head/RachFace_2608325060.png | 3 - .../RadioactiveBeastMode_2225761296.png | 3 - .../classic-head/RaigFace_209994783.png | 3 - .../RainbowBarfFace_1665629400.png | 3 - .../RainbowSpiritFace_8666744565.png | 3 - .../art/avatar/classic-head/Rawr_7076224.png | 3 - .../ReallyEmbarrassed_376812736.png | 3 - .../avatar/classic-head/RedFang_16722419.png | 3 - .../classic-head/RedGlowingEyes_180660043.png | 3 - .../classic-head/RedGoof_1191125008.png | 3 - .../RedLipTateMcRae_9650713776.png | 3 - .../avatar/classic-head/RedRawr_66330295.png | 3 - .../RedRockStarSmile_376809691.png | 3 - .../RedSeriousScarFace_406000421.png | 3 - .../avatar/classic-head/RedTango_16652251.png | 3 - .../RedUltimateDragonFace_1772530315.png | 3 - .../RedWhiteAndStarface_445117183.png | 3 - .../classic-head/Redonkulous_10907534.png | 3 - .../classic-head/RetroSmiley_10770432.png | 3 - .../RobloxMadnessFace_130213380.png | 3 - .../RockStarSingerFace_2517188619.png | 3 - .../RodeoVampireLilNasXlnx_5917448278.png | 3 - .../RogueEraMagusFace_2499710871.png | 3 - .../RogueishGoodLooks_1665511048.png | 3 - .../classic-head/RoseAmazeface_835095880.png | 3 - .../classic-head/RoseySmile_116043052.png | 3 - .../RoyalEyeOfHorusFace_2803774919.png | 3 - .../RubyArchfeyVisage_2830505884.png | 3 - .../avatar/classic-head/Rudolph_19397594.png | 3 - .../classic-head/SadClown_250654457.png | 3 - .../avatar/classic-head/SadZombie_7131361.png | 3 - .../art/avatar/classic-head/Sad_7699177.png | 3 - .../avatar/classic-head/Sadfaic_117522793.png | 3 - ...eTylerJosephTwentyOnePilots_7389910081.png | 3 - .../classic-head/SamanthaFace_2535487974.png | 3 - .../SammySlickWitterFace_2907754927.png | 3 - .../SapphireArchfeyVisage_2830502330.png | 3 - .../SapphireEvilEye_1016184964.png | 3 - .../SapphireLaserVision_209994074.png | 3 - .../classic-head/ScarecrowFace_14721869.png | 3 - .../classic-head/Scarecrow_26260927.png | 3 - .../classic-head/SecretService_20612949.png | 3 - .../classic-head/SeeingStars_27599954.png | 3 - .../SemiColonOpenParen_16179646.png | 3 - .../classic-head/SerenasFace_301826957.png | 3 - .../classic-head/SeriousCat_10678414.png | 3 - .../classic-head/SeriousDog_10678418.png | 3 - .../SeriousRedEyeScar_494299198.png | 3 - .../SeriousScarFace_255827175.png | 3 - .../classic-head/SharkbaitFace_3258567315.png | 3 - ...arpninesFaceOfDisappointment_209994270.png | 3 - .../SharpninesFaceOfJoy_406002032.png | 3 - .../SheriffBuffingtonFace_2761348544.png | 3 - .../art/avatar/classic-head/Shhh_7076159.png | 3 - .../classic-head/ShinyTeeth_20722130.png | 3 - .../avatar/classic-head/Shocked_147144644.png | 3 - .../ShutterShadesTheFace_34673712.png | 3 - .../avatar/classic-head/ShyLady_10831438.png | 3 - .../avatar/classic-head/SickDay_26619096.png | 3 - .../avatar/classic-head/Silence_10860397.png | 3 - .../avatar/classic-head/SillyFun_7699174.png | 3 - .../classic-head/SilverPunkFace_387256603.png | 3 - .../avatar/classic-head/Singing_66330310.png | 3 - .../SirRichMcmoneystonIII_10831390.png | 3 - .../classic-head/SkaterBoiFace_2739812348.png | 3 - .../SkaterGurlFace_2739787309.png | 3 - .../avatar/classic-head/Skeletar_10770395.png | 3 - .../avatar/classic-head/Skeptic_31117267.png | 3 - .../avatar/classic-head/Slickfang_7317765.png | 3 - .../Slithering_Smile_2830646491.png | 3 - .../classic-head/SlobberyVillain_10907536.png | 3 - .../avatar/classic-head/SlyCat_10678407.png | 3 - .../classic-head/SlyGuyFace_238983378.png | 3 - .../SmilNasXLilNasXLNX_5917459717.png | 3 - .../avatar/classic-head/Smile_144075659.png | 3 - .../classic-head/SmilingGirl_209994875.png | 3 - .../classic-head/SmithMccool_27412825.png | 3 - .../SneakyGreeneyedSnake_334656353.png | 3 - .../classic-head/SneakySteve_823012694.png | 3 - .../avatar/classic-head/Sniffles_14516578.png | 3 - .../SnowQueenSmile_2569005011.png | 3 - .../SnowSamuraiFace_5762596362.png | 3 - .../SnowflakeEyes_76233968067050.png | 3 - .../classic-head/SnowmanFace_19396550.png | 3 - .../avatar/classic-head/SoFunny_32058239.png | 3 - .../SoSuperExcitedBlue_2569001052.png | 3 - .../SoSuperExcitedPink_2568801198.png | 3 - .../SoSuperExcitedPurple_2568804274.png | 3 - .../SophisticatedSpectacles_25930613.png | 3 - .../SororityStarFace_3690515434.png | 3 - .../SparkleTimeSparkleEyes_2620507161.png | 3 - .../SparklingsFriendlyWink_6532619915.png | 3 - .../SpecterInformantFace_2608277633.png | 3 - .../classic-head/SpringBunny_110207437.png | 3 - ...quadGhoulsZoeSaberhagenFace_2517100778.png | 3 - .../classic-head/SquareEyes_22119034.png | 3 - .../classic-head/SquiggleMouth_25166274.png | 3 - .../SquintyAssassinFace_880474146.png | 3 - .../art/avatar/classic-head/Stare_8560971.png | 3 - .../avatar/classic-head/Starface_32873408.png | 3 - .../classic-head/StarryEyed_19959140.png | 3 - .../StarryEyesSparkling_7243903012.png | 3 - .../SteampunkInventorFace_5762596362.png | 3 - .../classic-head/StinkEye_416846143.png | 3 - .../classic-head/Stitchface_8329679.png | 3 - .../avatar/classic-head/SunnyFun_51241171.png | 3 - .../SunriseEyesTaiVerdes_7987201392.png | 3 - .../classic-head/SunstarFace_2506403983.png | 3 - .../classic-head/SuperHappyJoy_280988698.png | 3 - .../SuperPinkHeartMakeup_6590371677.png | 3 - .../SuperSuperHappyFace_494291269.png | 3 - .../avatar/classic-head/Surprise_23261769.png | 3 - .../classic-head/Suspicious_209994929.png | 3 - .../classic-head/SweatItOut_20909103.png | 3 - .../avatar/classic-head/Tango_16101765.png | 3 - .../classic-head/Tattletale_26343188.png | 3 - .../TealMermaidQueen_1428417334.png | 3 - .../TealRockStarSmile_334656546.png | 3 - .../classic-head/TearsOfSorrow_5122309127.png | 3 - ...errainAssaultSpecialistFace_2573925976.png | 3 - .../classic-head/TheBigDog_10860384.png | 3 - .../TheBirdcallerFace_2884418268.png | 3 - .../classic-head/TheDogWhisperer_34764447.png | 3 - ...TheFirstTimeIEverPlayedRoblox_22070623.png | 3 - .../TheFriendlyEviscerator_22500129.png | 3 - ...ePhantomPhalanxCygnus34Face_2628025496.png | 3 - .../classic-head/TheSoupIsDry_2845990750.png | 3 - .../TheWinningSmile_616380929.png | 3 - .../TigerChaseFearFace_258198928.png | 3 - .../classic-head/TimmyMcpwnage_22023062.png | 3 - .../classic-head/TiredFace_141728790.png | 3 - .../classic-head/TixVision_385889916.png | 3 - .../classic-head/TooMuchCandy_295763789.png | 3 - .../classic-head/Toothless_19399752.png | 3 - .../classic-head/ToothyDrool_8560980.png | 3 - .../classic-head/ToothyGrin_7075434.png | 3 - .../TorqueTheBlueOrc_2830496106.png | 3 - .../TorqueTheGreenOrc_2830497827.png | 3 - .../TorqueTheRedOrc_2830493868.png | 3 - .../avatar/classic-head/Trance_29109681.png | 3 - .../classic-head/Troublemaker_22920501.png | 3 - .../classic-head/TrueLoveSmile_362051405.png | 3 - .../TsundereExpression_4645952767.png | 3 - .../classic-head/TwoGuysOnABoat_14127171.png | 3 - .../art/avatar/classic-head/UhOh_7074944.png | 3 - .../classic-head/UpToSomething_1016186364.png | 3 - .../UpsideDownFace_1772578399.png | 3 - ...rieOfTheSplinteredSkiesFace_2907632781.png | 3 - .../ValorousKnightFace_3258576172.png | 3 - .../avatar/classic-head/Vampire_29532363.png | 3 - .../VansCheckerboardBlueEyes_8247356154.png | 3 - .../classic-head/VioletFang_362051899.png | 3 - .../VioletStarrySight_2222775930.png | 3 - ...udioSeizedUpFor45SecondsAgain_14083380.png | 3 - .../WalkThePlankYouScurvyDogs_13478124.png | 3 - ...paintJoshDunTwentyOnePilots_7389923463.png | 3 - .../avatar/classic-head/Whaaaaaa_14127194.png | 3 - .../WhatchooTalkinBout_7075089.png | 3 - .../classic-head/WhereAreTheEggs_24975496.png | 3 - .../avatar/classic-head/Whistle_22877700.png | 3 - .../avatar/classic-head/Whuut_274338458.png | 3 - .../WickedWebbedBerserkerFace_3993282075.png | 3 - .../WilliamBigBillConnerFace_2833509821.png | 3 - .../classic-head/Winkblink_22828351.png | 3 - .../classic-head/WinningSmile_880469676.png | 3 - .../avatar/classic-head/Winter_22587828.png | 3 - .../classic-head/Woebegone_21755022.png | 3 - .../classic-head/WomanFace_86487766.png | 3 - ...er_Womans_Golden_Armor_Face_6029816756.png | 3 - .../WweSethRollinsFace_3016138770.png | 3 - .../WyldfireFairyFace_2517242922.png | 3 - .../avatar/classic-head/Xd20_406001052.png | 3 - .../art/avatar/classic-head/Xd_15054426.png | 3 - .../classic-head/XtremeHappy_20644021.png | 3 - .../art/avatar/classic-head/Xx_15395327.png | 3 - .../avatar/classic-head/Yaaawwn_162068415.png | 3 - .../art/avatar/classic-head/Yawn_20010377.png | 3 - .../YellowGlowingEyes_416846000.png | 3 - .../classic-head/YellowStarface_162200696.png | 3 - .../classic-head/YouAtedMyCaik_21635583.png | 3 - .../art/avatar/classic-head/Yuck_10907531.png | 3 - .../classic-head/ZedFace_5122355742.png | 3 - .../avatar/classic-head/ZipIt_24126147.png | 3 - .../classic-head/ZoeyFace_807339121.png | 3 - .../classic-head/ZombieFace_133360789.png | 3 - .../classic-head/ZomgHatSelling_16413496.png | 3 - .../art/avatar/classic-head/Zomg_8329682.png | 3 - .../art/avatar/templates/Anime-Templates.png | 3 - .../avatar/templates/Caricature-Templates.png | 3 - .../avatar/templates/Custom-Skin-Tones.png | 3 - .../art/avatar/templates/Muzzle-Concepts.png | 3 - .../templates/Muzzle-Head-Templates.png | 3 - .../art/avatar/templates/Muzzle-Prototype.png | 3 - .../art/avatar/templates/Round-Concepts.png | 3 - .../avatar/templates/Round-Head-Templates.png | 3 - .../art/avatar/templates/Round-Prototype.png | 3 - .../templates/SemiRealistic-Templates.png | 3 - .../templates/Square-Head-Templates.png | 3 - .../avatar/templates/Stylized-Templates.png | 3 - .../art/avatar/templates/Texture-Map.png | 3 - .../en-us/assets/art/blender-ui/3DCursor.png | 3 - .../assets/art/blender-ui/3DViewport.png | 3 - .../assets/art/blender-ui/ActiveSwatch.png | 3 - .../blender-ui/Blender-Project-Objects.png | 3 - .../en-us/assets/art/blender-ui/Data-Tab.png | 3 - .../assets/art/blender-ui/Disabled-Icon.png | 3 - .../en-us/assets/art/blender-ui/Edit-Mode.jpg | 3 - .../assets/art/blender-ui/Face-Bones.png | 3 - .../assets/art/blender-ui/Face-Objects.png | 3 - .../en-us/assets/art/blender-ui/Modes.png | 3 - .../assets/art/blender-ui/Modifiers-Tab.png | 3 - .../assets/art/blender-ui/Object-Mode.jpg | 3 - .../art/blender-ui/Object-Select-Icon.png | 3 - .../blender-ui/Outliner-Disabled-Enabled.png | 3 - .../assets/art/blender-ui/Outliner-Filter.png | 3 - .../assets/art/blender-ui/Outliner-Menu.png | 3 - .../assets/art/blender-ui/Scene-Options.png | 3 - .../assets/art/blender-ui/Sculpt-Mode.jpg | 3 - .../art/blender-ui/TexturePaint-Mode.jpg | 3 - .../assets/art/blender-ui/Timeline-Frames.png | 3 - .../en-us/assets/art/blender-ui/Toolbar.png | 3 - .../art/blender-ui/VertexPaint-Mode.jpg | 3 - .../blender-ui/Viewport-Shading-Setting.png | 3 - .../art/blender-ui/ViewportShading-Solid.png | 3 - .../assets/art/blender-ui/Visibility-Icon.png | 3 - .../art/blender-ui/WeightPaint-Mode.jpg | 3 - .../assets/art/blender-ui/Workspaces.png | 3 - .../en-us/assets/art/blender-ui/scene-tab.jpg | 3 - .../AnimeFemale-Studio-Ready.fbx | 3 - .../art/reference-files/AnimeFemale.zip | 3 - .../assets/art/reference-files/AnimeMale.zip | 3 - .../assets/art/reference-files/Caricature.zip | 3 - .../art/reference-files/ClassicMannequin.fbx | 3 - .../ClassicMannequin_With-Cages.fbx | 3 - .../assets/art/reference-files/Eyebrows.fbx | 3 - .../assets/art/reference-files/Eyelashes.fbx | 3 - .../assets/art/reference-files/HeadCages.zip | 3 - .../art/reference-files/MuzzleFemale.zip | 3 - .../assets/art/reference-files/MuzzleMale.zip | 3 - .../NatureArcherGirl-AutoSetup.zip | 3 - .../art/reference-files/NatureArcherGirl.zip | 3 - .../art/reference-files/RoundFemale.zip | 3 - .../assets/art/reference-files/RoundMale.zip | 3 - .../art/reference-files/RthroMannequin.fbx | 3 - .../RthroMannequin_With-Cages.fbx | 3 - .../reference-files/RthroSlenderMannequin.fbx | 3 - .../RthroSlenderMannequin_With-Cages.fbx | 3 - .../reference-files/SemiRealisticFemale.zip | 3 - .../art/reference-files/SemiRealisticMale.zip | 3 - .../en-us/assets/art/reference-files/Snow.fbx | 3 - .../art/reference-files/SquareFemale.zip | 3 - .../assets/art/reference-files/SquareMale.zip | 3 - .../art/reference-files/StylizedHuman.zip | 3 - .../StylizedMale-AutoSetup.zip | 3 - .../StylizedMaleWithClothing.zip | 3 - .../checkpoint/1_Goblin-sculpted.blend | 3 - .../1_LongSleeve-Modeling-Complete.blend | 3 - .../checkpoint/2_Goblin-textured.blend | 3 - .../2_LongSleeve-Texturing-Complete.blend | 3 - .../checkpoint/3_Goblin-caged.blend | 3 - .../3_LongSleeve-Rigging-Complete.blend | 3 - .../4_LongSleeve-Caging-Complete.blend | 3 - .../art/resources/Archer-Girl-Preview.png | 3 - .../assets/art/resources/Blocky-Resource.png | 3 - .../art/resources/Body-Cages-Resource.png | 3 - .../art/resources/Body-Scale-Classic.png | 3 - .../art/resources/Body-Scale-Rthro-Normal.png | 3 - .../resources/Body-Scale-Rthro-Slender.png | 3 - .../art/resources/Clothing-Cage-Resource.png | 3 - .../art/resources/Creature-Resource.png | 3 - .../art/resources/Fish-Person-Resource.png | 3 - .../assets/art/resources/Goblin-Resource.png | 3 - .../assets/art/resources/Lola-Resource.png | 3 - .../Rig-And-Attachments-Resource.png | 3 - .../assets/art/resources/Shoebot-Resource.png | 3 - .../art/resources/StylizedMale-Preview.png | 3 - .../assets/art/resources/Tree-Resource.png | 3 - .../assets/art/resources/Tshirt-Resource.png | 3 - .../PBR-Textures-Substance-Painter.zip | 3 - .../PBR-Textures-Substance-Sampler.zip | 3 - .../Rock-Sculpting-References.zip | 3 - .../Tileable_Textures_Photoshop_Sampler.zip | 3 - .../Transparency_Maps_Substance_Sampler.zip | 3 - .../ZBrushProject_Radial_Symmetry.zip | 3 - .../assistant/AssistantDocumentationSite.png | 3 - .../assistant/AssistantStudioExample.png | 3 - .../roblox/en-us/assets/assistant/BYOK.png | 3 - .../assets/assistant/Documentation-Button.png | 3 - .../assistant/Documentation-Options.png | 3 - .../assistant/Documentation-Prompts.png | 3 - .../assets/assistant/Studio-Explain-Code.png | 3 - .../assets/assistant/Studio-General-UI.png | 3 - .../Studio-Generated-Green-Dragon.jpg | 3 - .../assets/assistant/Studio-Object-Insert.png | 3 - .../Studio-Quick-Styling-Material.png | 3 - .../assets/assistant/Studio-Script-Insert.png | 3 - .../en-us/assets/assistant/prompt1.webm | 3 - .../en-us/assets/assistant/prompt10.png | 3 - .../en-us/assets/assistant/prompt11.webm | 3 - .../en-us/assets/assistant/prompt12.png | 3 - .../en-us/assets/assistant/prompt13.webm | 3 - .../en-us/assets/assistant/prompt14.webm | 3 - .../en-us/assets/assistant/prompt15.webm | 3 - .../en-us/assets/assistant/prompt16.webm | 3 - .../en-us/assets/assistant/prompt17.webm | 3 - .../en-us/assets/assistant/prompt18.webm | 3 - .../en-us/assets/assistant/prompt19.webm | 3 - .../en-us/assets/assistant/prompt2.webm | 3 - .../en-us/assets/assistant/prompt20.webm | 3 - .../en-us/assets/assistant/prompt21.webm | 3 - .../en-us/assets/assistant/prompt3.webm | 3 - .../en-us/assets/assistant/prompt4.webm | 3 - .../en-us/assets/assistant/prompt5.webm | 3 - .../roblox/en-us/assets/assistant/prompt6.png | 3 - .../en-us/assets/assistant/prompt7.webm | 3 - .../en-us/assets/assistant/prompt8.webm | 3 - .../en-us/assets/assistant/prompt9.webm | 3 - .../audio/audio-objects/2D-Audio-Diagram.png | 3 - .../audio/audio-objects/3D-Audio-Diagram.png | 3 - .../audio-objects/Australian-Female-Voice.wav | 3 - .../audio-objects/Australian-Male-Voice.wav | 3 - .../audio-objects/British-Female-Voice.wav | 3 - .../audio-objects/British-Male-Voice.wav | 3 - .../audio-objects/DistanceAttenuation.png | 3 - .../audio-objects/French-Female-Voice.wav | 3 - .../audio/audio-objects/French-Male-Voice.wav | 3 - .../audio-objects/German-Female-Voice.wav | 3 - .../audio/audio-objects/German-Male-Voice.wav | 3 - .../audio-objects/Italian-Female-Voice.wav | 3 - .../audio-objects/Italian-Male-Voice.wav | 3 - .../audio/audio-objects/Narrator-Voice.wav | 3 - .../audio/audio-objects/Retro-Voice-1.wav | 3 - .../audio/audio-objects/Retro-Voice-2.wav | 3 - .../audio/audio-objects/STT-Audio-Diagram.png | 3 - .../audio-objects/Spanish-Female-Voice.wav | 3 - .../audio-objects/Spanish-Male-Voice.wav | 3 - .../audio-objects/TTS2D-Audio-Diagram.png | 3 - .../audio-objects/TTS3D-Audio-Diagram.png | 3 - .../audio/audio-objects/US-Female-Voice-1.wav | 3 - .../audio/audio-objects/US-Female-Voice-2.wav | 3 - .../audio/audio-objects/US-Male-Voice-1.wav | 3 - .../audio/audio-objects/US-Male-Voice-2.wav | 3 - .../assets/audio/dynamic-effects/chorus.mp3 | 3 - .../audio/dynamic-effects/compressor.mp3 | 3 - .../audio/dynamic-effects/distortion.mp3 | 3 - .../assets/audio/dynamic-effects/echo.mp3 | 3 - .../audio/dynamic-effects/equalizer.mp3 | 3 - .../assets/audio/dynamic-effects/flange.mp3 | 3 - .../audio/dynamic-effects/no-effect.mp3 | 3 - .../audio/dynamic-effects/pitch-shift.mp3 | 3 - .../assets/audio/dynamic-effects/reverb.mp3 | 3 - .../assets/audio/dynamic-effects/tremolo.mp3 | 3 - .../audio/effects/AudioEffect-Layered.png | 3 - .../audio/effects/AudioEffect-Multiple.png | 3 - .../audio/effects/AudioEffect-Single.png | 3 - .../Dynamic-Effect-Properties.png | 3 - .../assets/audio/sound-groups/Mix-Tree.png | 3 - .../sound-objects/CarHorn_DoubleSpeed.mp3 | 3 - .../audio/sound-objects/CarHorn_HalfSpeed.mp3 | 3 - .../sound-objects/CarHorn_NormalSpeed.mp3 | 3 - .../audio/sound-objects/RollOffMode-Chart.png | 3 - .../sound-objects/Sound-Point-RollOff.jpg | 3 - .../sound-objects/Sound-Point-Source.mp4 | 3 - .../Sound-Volumetric-RollOff.jpg | 3 - .../audio/sound-objects/Volumetric-Demo.mp4 | 3 - .../Volumetric-Sound-Diagram.jpg | 3 - .../assets/avatar/2k-Texture-Renders.zip | 3 - .../en-us/assets/avatar/AvatarSample.png | 3 - .../adaptive-animation/Assign-Joints-A.png | 3 - .../adaptive-animation/Assign-Joints-B.png | 3 - .../avatar/adaptive-animation/HRD-Select.png | 3 - .../Import-Custom-Humanoid.png | 3 - .../adaptive-animation/Test-Animation.png | 3 - .../avatar/adaptive-animation/Tool-Select.png | 3 - .../avatar/adaptive-animation/Toolbar.png | 3 - .../adaptive-animation/Tpose-Display.png | 3 - .../adaptive-animation/Tpose-Rotation-A.png | 3 - .../adaptive-animation/Tpose-Rotation-B.png | 3 - .../Avatar-Editor-Access-Items.png | 3 - .../Avatar-Editor-Equip-Items.png | 3 - .../Avatar-Editor-Example.jpg | 3 - .../Avatar-Editor-Save-Outfit.png | 3 - .../Animation-Editor-Curve-Animation-Icon.png | 3 - .../Animation-Editor-Curve-Prompt.png | 3 - .../Animation-Editor-Import-From-Roblox.png | 3 - .../avatar-emotes/Animation-Editor-Import.png | 3 - .../Animation-Editor-Publish.png | 3 - .../avatar-emotes/Animation-Explorer.png | 3 - .../avatar-emotes/Animation-Properties.png | 3 - .../avatar/avatar-emotes/Avatar-Emotes.mp4 | 3 - .../avatar/avatar-emotes/Explorer-Upload.png | 3 - .../Generate-Asset-ID-Success.png | 3 - .../Avatar-Creation-Attribution.png | 3 - .../Avatar-Creation-Confirmation.png | 3 - .../avatar-iec/Avatar-Creation-Format.png | 3 - .../avatar-iec/Avatar-Creation-Prompt.png | 3 - .../avatar-iec/Avatar-Token-Creation.png | 3 - .../avatar/avatar-iec/Avatar-Token-Id.png | 3 - .../assets/avatar/avatar-setup/Add-Object.png | 3 - .../assets/avatar/avatar-setup/Assymetry.png | 3 - .../avatar-setup/Auto-Setup-Scaling.png | 3 - .../avatar/avatar-setup/Auto-Setup-Start.png | 3 - .../avatar-setup/Avatar-Setup-Example-A.png | 3 - .../avatar-setup/Avatar-Setup-Example-B.png | 3 - .../avatar/avatar-setup/Cage-Edit-Panel.png | 3 - .../avatar/avatar-setup/Folder-Hierarchy.png | 3 - .../assets/avatar/avatar-setup/I-pose.png | 3 - .../avatar/avatar-setup/Inorganic-Model.png | 3 - .../assets/avatar/avatar-setup/Long-Neck.png | 3 - .../avatar/avatar-setup/Mouthparts-1.png | 3 - .../avatar/avatar-setup/Mouthparts-2.png | 3 - .../avatar/avatar-setup/Mouthparts-3.png | 3 - .../avatar/avatar-setup/Mouthparts-4.png | 3 - .../assets/avatar/avatar-setup/No-Neck.png | 3 - .../avatar/avatar-setup/Non-Contiguous.png | 3 - .../avatar/avatar-setup/Non-Humanoid-1.png | 3 - .../avatar-setup/Non-Proportional-Limbs.png | 3 - .../Partial-Inputs-All-Rigged.png | 3 - .../Partial-Inputs-Body-Rigged.png | 3 - .../Partial-Inputs-Head-Rigged.png | 3 - .../Partial-Inputs-None-Rigged.png | 3 - .../avatar-setup/Skin-Tone-Selector.png | 3 - .../avatar/avatar-setup/Supported-Model.png | 3 - .../avatar/avatar-setup/Test-Face-1.png | 3 - .../avatar/avatar-setup/Test-Face-2.png | 3 - .../avatar/avatar-setup/Testing-Interface.png | 3 - .../character-customization/Avatar-Banner.jpg | 3 - .../Avatar-Character-Model-Data.png | 3 - .../Avatar-In-Editor-Window.jpg | 3 - .../Basic-Character-Model-Data.png | 3 - .../character-customization/R15-Example.jpg | 3 - .../character-customization/R6-Example.jpg | 3 - .../context-menu/ACM-Sections-Labeled.png | 3 - .../avatar/context-menu/ACM-User-Selector.png | 3 - .../assets/avatar/context-menu/Custom-ACM.png | 3 - .../avatar/dynamic-heads/Blocky-Reference.jpg | 3 - .../Blocky_And_Goblin_Dynamic_Heads.mp4 | 3 - .../avatar/dynamic-heads/Goblin-Reference.jpg | 3 - .../Animation-Track-Values-Input.jpg | 3 - .../animating-dynamic-heads/FACS-Popup.jpg | 3 - .../animating-dynamic-heads/Face-Button.jpg | 3 - .../animating-dynamic-heads/Overview.png | 3 - .../videos/1-Face-Controls-Example.mp4 | 3 - .../videos/2-Face-Controls-Example-Goblin.mp4 | 3 - .../Animation-Frame-Range.png | 3 - .../Animation-Offset-Importing.png | 3 - .../Animation-Timeline.png | 3 - .../Custom-Properties-Example.png | 3 - .../creating-dynamic-heads/Eyelid-Naming.png | 3 - .../Mapping-New-Button.png | 3 - .../creating-dynamic-heads/Mapping-Popup.png | 3 - .../creating-dynamic-heads/Open-Project.png | 3 - .../reference-files/Cubie-Complete.fbx | 3 - .../reference-files/Cubie-Complete.ma | 3 - .../Cubie-Eye-Bones-Skinned.blend | 3 - .../Cubie-Eye-Poses-Mapped.blend | 3 - .../reference-files/Cubie-Model-Only.blend | 3 - .../reference-files/Cubie_Head_ALB.png | 3 - .../videos/10_Skinning_Eyelids.mp4 | 3 - .../videos/11_Testing_Eyelids.mp4 | 3 - .../videos/12_Creating_Controller_Bones.mp4 | 3 - .../videos/13_Creating_Bone_Constraints.mp4 | 3 - .../videos/14_Assigning_Custom_Shapes.mp4 | 3 - .../videos/15_Coloring_Control_bones.mp4 | 3 - .../videos/16_Testing_Controllers.mp4 | 3 - .../videos/17-Posing.mp4 | 3 - .../videos/18_Mapping.mp4 | 3 - .../videos/1_Adding_RootFaceJoint.mp4 | 3 - .../videos/2_Mapping_RootFaceJoint.mp4 | 3 - .../videos/3_Adding_Eye_Bones.mp4 | 3 - .../videos/4_Positioning_Eye_Bones.mp4 | 3 - .../videos/5_Parenting_Eye_Bones.mp4 | 3 - .../6_Adding_And_Positioning_Eyelids.mp4 | 3 - .../videos/7_Skinning_LeftEye.mp4 | 3 - .../videos/8_Testing_LeftEye.mp4 | 3 - .../9_Skinning_and_Testing_RightEye.mp4 | 3 - .../videos/Combination_Example1.mp4 | 3 - .../videos/Combination_Example2.mp4 | 3 - .../videos/Combination_Example3.mp4 | 3 - .../videos/Combination_Example4.mp4 | 3 - .../videos/Combination_Example5.mp4 | 3 - .../videos/Combination_Example6.mp4 | 3 - .../Automatic-Skinning-Transfer-Intro.jpg | 3 - .../Beard-Humanoid-Cage.jpg | 3 - .../Eyebrows-Follower-Vertices.png | 3 - .../Eyebrows-Leader-Vertices.png | 3 - .../Full-Body-Cage.png | 3 - .../Head-Cage-Only.png | 3 - .../Importing-Cage.png | 3 - .../Importing-Cubie.png | 3 - .../Importing-Eyebrows.png | 3 - .../Jacket-Cage-Comparison.jpg | 3 - .../Vertices-Group-Assign.png | 3 - .../Vertices-Group-Follower.png | 3 - .../Vertices-Group-Leader.png | 3 - .../Vertices-Transfer-Off.mov | 3 - .../Vertices-Transfer-On.mov | 3 - ...ating-Face-Accessories-Reference-Files.zip | 3 - .../reference-files/Cubie-Cage-Only.fbx | 3 - .../Cubie-Eyebrow-Rigged-And-Caged.fbx | 3 - .../reference-files/CubieEyebrow_Geo.fbx | 3 - .../reference-files/CubieHawkHair_Geo.fbx | 3 - .../videos/AutoSkin-With-Full-Cage.mp4 | 3 - .../videos/AutoSkin-With-Specific-Cage.mp4 | 3 - .../videos/Editing-Outer-Cage.mp4 | 3 - .../videos/Jacket-Collar-Issue.mp4 | 3 - .../videos/Parent-Armature.mp4 | 3 - .../videos/Removing-Character-Cage.mp4 | 3 - .../videos/Removing-Extra-Objects.mp4 | 3 - .../facs-pose-reference/ChinRaiserA.mp4 | 3 - .../facs-pose-reference/ChinRaiserB.mp4 | 3 - .../ChinRaiserUpperLipA.mp4 | 3 - .../ChinRaiserUpperLipB.mp4 | 3 - .../facs-pose-reference/CorrugatorA.mp4 | 3 - .../facs-pose-reference/CorrugatorB.mp4 | 3 - .../facs-pose-reference/EyesLookDownA.mp4 | 3 - .../facs-pose-reference/EyesLookDownB.mp4 | 3 - .../facs-pose-reference/EyesLookLeftA.mp4 | 3 - .../facs-pose-reference/EyesLookLeftB.mp4 | 3 - .../facs-pose-reference/EyesLookRightA.mp4 | 3 - .../facs-pose-reference/EyesLookRightB.mp4 | 3 - .../facs-pose-reference/EyesLookUpA.mp4 | 3 - .../facs-pose-reference/EyesLookUpB.mp4 | 3 - .../facs-pose-reference/FlatPuckerA.mp4 | 3 - .../facs-pose-reference/FlatPuckerB.mp4 | 3 - .../facs-pose-reference/FunnelerA.mp4 | 3 - .../facs-pose-reference/FunnelerB.mp4 | 3 - .../facs-pose-reference/JawDropA.mp4 | 3 - .../facs-pose-reference/JawDropB.mp4 | 3 - .../facs-pose-reference/JawLeftA.mp4 | 3 - .../facs-pose-reference/JawLeftB.mp4 | 3 - .../facs-pose-reference/JawRightA.mp4 | 3 - .../facs-pose-reference/JawRightB.mp4 | 3 - .../facs-pose-reference/LeftBrowLowererA.mp4 | 3 - .../facs-pose-reference/LeftBrowLowererB.mp4 | 3 - .../facs-pose-reference/LeftCheekPuffA.mp4 | 3 - .../facs-pose-reference/LeftCheekPuffB.mp4 | 3 - .../facs-pose-reference/LeftCheekRaiserA.mp4 | 3 - .../facs-pose-reference/LeftCheekRaiserB.mp4 | 3 - .../facs-pose-reference/LeftDimplerA.mp4 | 3 - .../facs-pose-reference/LeftDimplerB.mp4 | 3 - .../facs-pose-reference/LeftEyeClosedA.mp4 | 3 - .../facs-pose-reference/LeftEyeClosedB.mp4 | 3 - .../LeftEyeUpperLidRaiserA.mp4 | 3 - .../LeftEyeUpperLidRaiserB.mp4 | 3 - .../LeftInnerBrowRaiserA.mp4 | 3 - .../LeftInnerBrowRaiserB.mp4 | 3 - .../LeftLipCornerDownA.mp4 | 3 - .../LeftLipCornerDownB.mp4 | 3 - .../LeftLipCornerPullerA.mp4 | 3 - .../LeftLipCornerPullerB.mp4 | 3 - .../facs-pose-reference/LeftLipStretcherA.mp4 | 3 - .../facs-pose-reference/LeftLipStretcherB.mp4 | 3 - .../LeftLowerLipDepressorA.mp4 | 3 - .../LeftLowerLipDepressorB.mp4 | 3 - .../facs-pose-reference/LeftNoseWrinklerA.mp4 | 3 - .../facs-pose-reference/LeftNoseWrinklerB.mp4 | 3 - .../LeftOuterBrowRaiserA.mp4 | 3 - .../LeftOuterBrowRaiserB.mp4 | 3 - .../LeftUpperLipRaiserA.mp4 | 3 - .../LeftUpperLipRaiserB.mp4 | 3 - .../facs-pose-reference/LipPresserA.mp4 | 3 - .../facs-pose-reference/LipPresserB.mp4 | 3 - .../facs-pose-reference/LipsTogetherA-1.mp4 | 3 - .../facs-pose-reference/LipsTogetherA-2.mp4 | 3 - .../facs-pose-reference/LipsTogetherA-3.mp4 | 3 - .../facs-pose-reference/LipsTogetherB-1.mp4 | 3 - .../facs-pose-reference/LipsTogetherB-2.mp4 | 3 - .../facs-pose-reference/LipsTogetherB-3.mp4 | 3 - .../facs-pose-reference/LowerLipSuckA.mp4 | 3 - .../facs-pose-reference/LowerLipSuckB.mp4 | 3 - .../facs-pose-reference/MouthLeftA.mp4 | 3 - .../facs-pose-reference/MouthLeftB.mp4 | 3 - .../facs-pose-reference/MouthRightA.mp4 | 3 - .../facs-pose-reference/MouthRightB.mp4 | 3 - .../facs-pose-reference/PuckerA.mp4 | 3 - .../facs-pose-reference/PuckerB.mp4 | 3 - .../facs-pose-reference/RightBrowLowererA.mp4 | 3 - .../facs-pose-reference/RightBrowLowererB.mp4 | 3 - .../facs-pose-reference/RightCheekPuffA.mp4 | 3 - .../facs-pose-reference/RightCheekPuffB.mp4 | 3 - .../facs-pose-reference/RightCheekRaiserA.mp4 | 3 - .../facs-pose-reference/RightCheekRaiserB.mp4 | 3 - .../facs-pose-reference/RightDimplerA.mp4 | 3 - .../facs-pose-reference/RightDimplerB.mp4 | 3 - .../facs-pose-reference/RightEyeClosedA.mp4 | 3 - .../facs-pose-reference/RightEyeClosedB.mp4 | 3 - .../RightEyeUpperLidRaiserA.mp4 | 3 - .../RightEyeUpperLidRaiserB.mp4 | 3 - .../RightInnerBrowRaiserA.mp4 | 3 - .../RightInnerBrowRaiserB.mp4 | 3 - .../RightLipCornerDownA.mp4 | 3 - .../RightLipCornerDownB.mp4 | 3 - .../RightLipCornerPullerA.mp4 | 3 - .../RightLipCornerPullerB.mp4 | 3 - .../RightLipStretcherA.mp4 | 3 - .../RightLipStretcherB.mp4 | 3 - .../RightLowerLipDepressorA.mp4 | 3 - .../RightLowerLipDepressorB.mp4 | 3 - .../RightNoseWrinklerA.mp4 | 3 - .../RightNoseWrinklerB.mp4 | 3 - .../RightOuterBrowRaiserA.mp4 | 3 - .../RightOuterBrowRaiserB.mp4 | 3 - .../RightUpperLipRaiserA.mp4 | 3 - .../RightUpperLipRaiserB.mp4 | 3 - .../facs-pose-reference/TongueDown.mp4 | 3 - .../facs-pose-reference/TongueOut.mp4 | 3 - .../facs-pose-reference/TongueUp.mp4 | 3 - .../facs-pose-reference/UpperLipSuckA.mp4 | 3 - .../facs-pose-reference/UpperLipSuckB.mp4 | 3 - .../dynamic-heads/moods/Animation-ID.png | 3 - .../avatar/dynamic-heads/moods/HappyMood.png | 3 - .../moods/Overview-Default-Mood.mp4 | 3 - .../moods/Overview-Open-Mouth-Mood.mp4 | 3 - .../moods/animate-localscript-hierarchy.jpg | 3 - .../Blocky-Face-Accessories.zip | 3 - .../reference-files/BlockyCharacter.fbx | 3 - .../reference-files/BlockyCharacter.zip | 3 - .../reference-files/Dynamic-Head-Editor.rbxl | 3 - .../reference-files/Dynamic-Head-Schema.rbxl | 3 - .../reference-files/Fish-Person.zip | 3 - .../reference-files/GoblinCharacter.zip | 3 - .../FaceControls-In-Explorer.jpg | 3 - .../FaceControls-In-Property-Panel.jpg | 3 - .../Facial-Accessory-In-Property-Panel.jpg | 3 - .../Facial-Accessory-In-Viewport.jpg | 3 - ...mporting-Facial-Accessory-Final-Result.jpg | 3 - .../name-health-display/Customize-NPC.jpg | 3 - .../name-health-display/Display-Indicated.jpg | 3 - .../DisplayDistanceType-None.jpg | 3 - .../DisplayDistanceType-Subject.jpg | 3 - .../DisplayDistanceType-Viewer.jpg | 3 - .../HealthDisplayType-AlwaysOff.jpg | 3 - .../HealthDisplayType-AlwaysOn.jpg | 3 - .../HealthDisplayType-DisplayWhenDamaged.jpg | 3 - .../Humanoid-Properties.png | 3 - .../NameOcclusion-EnemyOcclusion.jpg | 3 - .../NameOcclusion-NoOcclusion.jpg | 3 - .../NameOcclusion-OccludeAll.jpg | 3 - .../assets/avatar/pathfinding/Boat-Path.mp4 | 3 - .../assets/avatar/pathfinding/Bridge-Path.mp4 | 3 - .../pathfinding/DoorPassThrough-Block.jpg | 3 - ...hrough-PathfindingModifier-PassThrough.png | 3 - .../pathfinding/GeyserBlocker-Block.jpg | 3 - .../avatar/pathfinding/GeyserBlocker-Path.mp4 | 3 - ...eyserBlocker-PathfindingModifier-Label.png | 3 - .../avatar/pathfinding/Navigation-Labels.jpg | 3 - .../avatar/pathfinding/Navigation-Mesh.jpg | 3 - .../avatar/pathfinding/Path-Start-End.jpg | 3 - .../avatar/pathfinding/Path-TrussPart.jpg | 3 - ...PathfindingLink-Attachments-Properties.png | 3 - .../PathfindingLink-Attachments.jpg | 3 - .../pathfinding/PathfindingLink-In-World.jpg | 3 - .../pathfinding/PathfindingLink-Label.png | 3 - .../pathfinding/PathfindingLink-Path.jpg | 3 - .../pathfinding/Paths-Shortest-Best.jpg | 3 - .../assets/avatar/pathfinding/Showcase.mp4 | 3 - .../assets/avatar/pathfinding/Simple-Path.mp4 | 3 - .../assets/avatar/pathfinding/Waypoints.jpg | 3 - .../avatar/pathfinding/Zombie-Full-Path.jpg | 3 - .../creator-dashboard/Add-Collaborators.png | 3 - .../creator-dashboard/Add-Experiences.png | 3 - .../Asset-Avatar-Restricted.png | 3 - .../Asset-Avatar-Success.png | 3 - .../Asset-Decals-Warning.png | 3 - .../creator-dashboard/Asset-Make-OpenUse.png | 3 - .../creator-dashboard/Asset-OpenUse.png | 3 - .../creator-dashboard/Asset-Privacy-Beta.png | 3 - .../assets/creator-dashboard/Asset-Toggle.png | 3 - .../Creations-Events-Example.png | 3 - .../Edit-Button-Experience.png | 3 - ...nt-Context-Menu-Copy-Event-Details-URL.png | 3 - .../Event-Context-Menu-Delete-Event.png | 3 - .../Experience-Change-Start-Place.png | 3 - .../Group-Create-Group-Button.png | 3 - .../Group-Members-Assign-Role.png | 3 - .../Group-Members-Invite-Button.png | 3 - .../Group-Members-Remove-Member.png | 3 - .../Group-Members-Unassign-Role.png | 3 - .../Group-Payouts-One-Time.png | 3 - .../Group-Payouts-Split-Options.png | 3 - .../Group-Payouts-Splits-Example.png | 3 - .../Group-Roles-Add-Members.png | 3 - .../Group-Roles-Permissions-Tab.png | 3 - .../Group-Roles-Role-Color.png | 3 - .../Group-Roles-Settings-Tab.png | 3 - .../creator-dashboard/Manage-Thumbnails.png | 3 - .../Options-Button-Asset.png | 3 - .../Options-Button-Badge.png | 3 - .../Options-Button-Developer-Product.png | 3 - .../Options-Button-Experience-Private.png | 3 - .../Options-Button-Experience-Public.png | 3 - .../creator-dashboard/Options-Button-Pass.png | 3 - .../Permissions-Collaborators.png | 3 - .../Permissions-Experiences.png | 3 - .../Places-Start-Place-Icon.png | 3 - .../Places-Start-Place-No-Icon.png | 3 - .../creator-programs/partner-program.png | 3 - .../data/data-store/Data-Store-API-Status.png | 3 - .../assets/data/data-store/Data-Store-API.png | 3 - .../data/data-store/Data-Store-Status.png | 3 - .../Data-Stores-Manager-Compare-Versions.png | 3 - .../Data-Stores-Manager-Key-Entry.png | 3 - .../data-store/Data-Stores-Manager-Page.png | 3 - .../memory-store/Memory-Usage-Critical.png | 3 - .../memory-store/Memory-Usage-Warning.png | 3 - .../memory-store/Per-Partition-Limits-1.png | 3 - .../memory-store/Per-Partition-Limits-2.png | 3 - .../memory-store/Per-Partition-Limits-3.png | 3 - .../memory-store/Per-Partition-Limits-4.png | 3 - .../memory-store/Priority-Queue-Diagram.png | 3 - .../memory-store/Regular-Queue-Diagram.png | 3 - .../memory-store/Request-Failure-Critical.png | 3 - .../Request-Throttled-Critical.png | 3 - .../Sample-Hierarchy.png | 3 - .../data-load-diagram.png | 3 - .../data-save-diagram.png | 3 - .../player-data-purchasing/data-warning.png | 3 - .../player-data-purchasing/retry-diagram.png | 3 - .../sample-architecture.png | 3 - .../session-lock-diagram.png | 3 - .../data/secrets-store/LocalSecrets.png | 3 - .../data/secrets-store/LocalSecrets_Edit.png | 3 - .../data/secrets-store/local-secrets.png | 3 - .../assets/developer-jumpstart/image1.png | 3 - .../assets/developer-jumpstart/image10.png | 3 - .../assets/developer-jumpstart/image11.png | 3 - .../assets/developer-jumpstart/image12.png | 3 - .../assets/developer-jumpstart/image13.png | 3 - .../assets/developer-jumpstart/image14.png | 3 - .../assets/developer-jumpstart/image15.jpg | 3 - .../assets/developer-jumpstart/image16.jpg | 3 - .../assets/developer-jumpstart/image17.png | 3 - .../assets/developer-jumpstart/image18.png | 3 - .../assets/developer-jumpstart/image19.png | 3 - .../assets/developer-jumpstart/image2.jpg | 3 - .../assets/developer-jumpstart/image20.png | 3 - .../assets/developer-jumpstart/image21.png | 3 - .../assets/developer-jumpstart/image22.png | 3 - .../assets/developer-jumpstart/image23.gif | 3 - .../assets/developer-jumpstart/image24.png | 3 - .../assets/developer-jumpstart/image25.png | 3 - .../assets/developer-jumpstart/image26.png | 3 - .../assets/developer-jumpstart/image27.png | 3 - .../assets/developer-jumpstart/image28.png | 3 - .../assets/developer-jumpstart/image29.gif | 3 - .../assets/developer-jumpstart/image3.png | 3 - .../assets/developer-jumpstart/image30.png | 3 - .../assets/developer-jumpstart/image31.png | 3 - .../assets/developer-jumpstart/image32.png | 3 - .../assets/developer-jumpstart/image33.gif | 3 - .../assets/developer-jumpstart/image34.png | 3 - .../assets/developer-jumpstart/image35.png | 3 - .../assets/developer-jumpstart/image36.png | 3 - .../assets/developer-jumpstart/image37.png | 3 - .../assets/developer-jumpstart/image38.png | 3 - .../assets/developer-jumpstart/image39.png | 3 - .../assets/developer-jumpstart/image4.png | 3 - .../assets/developer-jumpstart/image40.png | 3 - .../assets/developer-jumpstart/image41.png | 3 - .../assets/developer-jumpstart/image42.png | 3 - .../assets/developer-jumpstart/image43.png | 3 - .../assets/developer-jumpstart/image44.png | 3 - .../assets/developer-jumpstart/image45.png | 3 - .../assets/developer-jumpstart/image46.png | 3 - .../assets/developer-jumpstart/image47.png | 3 - .../assets/developer-jumpstart/image48.png | 3 - .../assets/developer-jumpstart/image49.png | 3 - .../assets/developer-jumpstart/image5.png | 3 - .../assets/developer-jumpstart/image50.png | 3 - .../assets/developer-jumpstart/image51.png | 3 - .../assets/developer-jumpstart/image6.png | 3 - .../assets/developer-jumpstart/image7.png | 3 - .../assets/developer-jumpstart/image8.png | 3 - .../assets/developer-jumpstart/image9.png | 3 - .../emote-bar/Mega-Emote.jpg | 3 - .../emote-bar/Script-ConfigureEmotes.png | 3 - .../emote-bar/Showcase-SM.mp4 | 3 - .../developer-modules/emote-bar/Showcase.mp4 | 3 - .../emote-bar/Toolbox-Icon.png | 3 - .../event-sequencer/BlankScene-Folder.png | 3 - .../event-sequencer/Edit-Concert-Template.png | 3 - .../Inline-BoolValue-Enabled.png | 3 - .../event-sequencer/Inline-BoolValue.png | 3 - .../Lighting-Service-Instances.png | 3 - .../ReplicatedStorage-BlankScene-Folder.png | 3 - .../Saved-Lighting-Attributes.png | 3 - .../Saved-Lighting-Instances.png | 3 - .../Saved-Terrain-TerrainRegion.png | 3 - .../Scene-Attribute-TimeLength.png | 3 - .../event-sequencer/Seek-Bar-SM.mp4 | 3 - .../event-sequencer/Seek-Bar.mp4 | 3 - .../event-sequencer/Terrain-Class.png | 3 - .../event-sequencer/Toolbox-Icon.png | 3 - .../friends-locator/Custom-UI-Example.jpg | 3 - .../Custom-UI-Objects-In-Frame.png | 3 - .../Custom-UI-Portrait-DisplayName.png | 3 - .../Custom-UI-ScreenGui-Disabled.png | 3 - .../LocalScript-ConfigureFriendsLocator.png | 3 - .../friends-locator/Showcase-SM.mp4 | 3 - .../friends-locator/Showcase.mp4 | 3 - .../friends-locator/Testing-On-Client.jpg | 3 - .../friends-locator/Toolbox-Icon.png | 3 - .../merch-booth/Item-URL-Asset-ID.png | 3 - .../LocalScript-ConfigureMerchBooth.png | 3 - .../LocalScript-In-StarterPlayerScripts.png | 3 - .../merch-booth/Proximity-Prompts.mp4 | 3 - .../Shoppable-Region-Collision.png | 3 - .../merch-booth/Shoppable-Region-Part.jpg | 3 - .../Shoppable-Region-Transparency.png | 3 - .../merch-booth/Shoppable-Regions.mp4 | 3 - .../merch-booth/Showcase-SM.mp4 | 3 - .../merch-booth/Showcase.mp4 | 3 - .../merch-booth/Toolbox-Icon.png | 3 - .../merch-booth/UI-Catalog-Button.jpg | 3 - .../merch-booth/UI-Visual-Customization.jpg | 3 - .../photo-booth/Bundled-Mesh-Explorer.png | 3 - .../photo-booth/Bundled-Mesh-Workspace.jpg | 3 - .../photo-booth/Changed-Message.jpg | 3 - .../LocalScript-ConfigurePhotoBooth.png | 3 - .../photo-booth/Showcase-SM.mp4 | 3 - .../photo-booth/Showcase.mp4 | 3 - .../photo-booth/Toolbox-Icon.png | 3 - .../profile-card/Other-Card-Status-Empty.png | 3 - .../profile-card/Other-Card-Status-Set.png | 3 - .../profile-card/Player-Card-Status-Empty.png | 3 - .../Player-Card-Status-Entering.png | 3 - .../Player-Card-Status-Invalid.png | 3 - .../profile-card/Player-Card-Status-Set.png | 3 - .../profile-card/Player-Icon.jpg | 3 - .../profile-card/Showcase-SM.mp4 | 3 - .../profile-card/Showcase.mp4 | 3 - .../profile-card/Toolbox-Icon.png | 3 - .../scavenger-hunt/Region-Structure.png | 3 - .../scavenger-hunt/Showcase-SM.mp4 | 3 - .../scavenger-hunt/Showcase.mp4 | 3 - .../Token-BasePart-Structure.png | 3 - .../scavenger-hunt/Token-Model-Structure.png | 3 - .../scavenger-hunt/Token1-Explorer.png | 3 - .../scavenger-hunt/Toolbox-Icon.png | 3 - .../selfie-mode/Depth-Of-Field-Off.jpg | 3 - .../selfie-mode/Depth-Of-Field-On.jpg | 3 - .../selfie-mode/Filters-Dramatic.jpg | 3 - .../selfie-mode/Filters-Monochrome.jpg | 3 - .../selfie-mode/Filters-Soft.jpg | 3 - .../selfie-mode/Poses-Flossing.jpg | 3 - .../selfie-mode/Poses-Louder.jpg | 3 - .../selfie-mode/Poses-Twirl.jpg | 3 - .../selfie-mode/Showcase-SM.mp4 | 3 - .../selfie-mode/Showcase.mp4 | 3 - .../selfie-mode/Toolbox-Icon.png | 3 - ...ocalScript-ConfigureSocialInteractions.png | 3 - .../social-interactions/Showcase-SM.mp4 | 3 - .../social-interactions/Showcase.mp4 | 3 - .../social-interactions/Toolbox-Icon.png | 3 - .../spawn-with-friends/Restricted-Block.jpg | 3 - .../spawn-with-friends/Showcase-SM.mp4 | 3 - .../spawn-with-friends/Showcase.mp4 | 3 - .../spawn-with-friends/Toolbox-Icon.png | 3 - .../surface-art/Bundled-Mesh-Explorer.png | 3 - .../surface-art/Canvas-Attribute.png | 3 - .../surface-art/Position-Canvas.jpg | 3 - .../surface-art/Showcase-SM.mp4 | 3 - .../surface-art/Showcase.mp4 | 3 - .../surface-art/SurfaceArt-UI.jpg | 3 - .../surface-art/Toolbox-Icon.png | 3 - .../adventure-game-series/addToolExample.gif | 3 - .../adventure-addToolScript.png | 3 - .../adventure-game-examplevideo.mp4 | 3 - .../adventure-gameThumbnail.jpg | 3 - .../adventure-harvestItemFull.mp4 | 3 - .../adventure-harvestItemShort.mp4 | 3 - .../adventure-item-example.jpg | 3 - .../adventure-leaderboard-empty.jpg | 3 - .../adventure-leaderboard-finished.jpg | 3 - .../adventure-leaderboard-withItem.jpg | 3 - .../adventure-sellItems.mp4 | 3 - .../adventure-sellPlatform.jpg | 3 - .../adventure-sellingItemsHero.jpg | 3 - .../adventure-show-boolTrue.png | 3 - .../adventure-show-group.png | 3 - .../adventure-showClickDetector.jpg | 3 - .../adventure-showSellScript.png | 3 - .../adventure-showUpgradePurchase.mp4 | 3 - .../adventure-testedTool.jpg | 3 - .../adventure-toolWithPlayer.jpg | 3 - .../adventureGameTerrain02.jpg | 3 - ...e_leaderboard_addtoServerScriptService.png | 3 - .../createdBoolValue.png | 3 - .../adventure-game-series/crystalPart.rbxm | 3 - .../heroBanner_titlePage.jpg | 3 - .../adventure-game-series/map-crystals.jpg | 3 - .../paintToolOptimized.gif | 3 - .../adventure-game-series/starterTool.rbxm | 3 - .../subtractToolExample.gif | 3 - .../tools_starterPackClick.png | 3 - ...upgrade_TextLabelCreate_setAnchorPoint.jpg | 3 - .../upgrade_TextLabelCreate_setOffset.png | 3 - .../upgrade_TextLabelCreate_setPos.png | 3 - .../upgrade_TextLabelCreate_setScale.png | 3 - .../upgrade_addClickDetector.png | 3 - .../upgrade_addScript.png | 3 - .../upgrade_addSurfaceGUI.png | 3 - .../upgrade_changeGUIFace.jpg | 3 - .../upgrade_partCreate.jpg | 3 - .../upgrade_showTextLabelAlt.jpg | 3 - .../Strucid_thumbnail.jpg | 3 - .../arenaExample_circle.jpg | 3 - .../arenaExample_square.jpg | 3 - .../arenaExample_terrain.jpg | 3 - .../battle-royale-series/arenaIntro_lobby.jpg | 3 - .../arenaObstacles_advanced_topDown.jpg | 3 - .../arenaObstacles_sideBySide.png | 3 - ...arena_2_showClientServerWindows_client.png | 3 - ...arena_2_showClientServerWindows_server.png | 3 - .../arena_2_showFinishedOutput.png | 3 - .../arena_2_showGameManagerCreated.png | 3 - .../arena_2_showGameSettingsCreated.png | 3 - .../arena_3_showFinalResult.mp4 | 3 - .../arena_3_showRepeatArena.mp4 | 3 - .../arena_3_showSendToMatch.png | 3 - .../arena_4_outputFinished.png | 3 - .../arena_4_showBindableEvents.png | 3 - .../arena_5_addLocalScript.png | 3 - .../arena_5_showFinalizedGameLoop.mp4 | 3 - .../arena_5_showGUITest.png | 3 - .../arena_5_showIntValuesCreated.png | 3 - .../arena_5_showLabelCreated.png | 3 - .../arena_5_showMovingScaleGUI.mp4 | 3 - .../arena_5_showReadyDisplay.jpg | 3 - .../arena_5_showTimerDisplay.jpg | 3 - .../arena_6_showEndGame.png | 3 - .../arena_6_showGameEndFoundWinner.png | 3 - .../arena_6_showGameTimerError.png | 3 - .../arena_6_showPlayersDefeated_inLobby.jpg | 3 - ...showPlayersDefeated_showPlayerAttacked.jpg | 3 - .../arena_6_showStatusCreated.png | 3 - .../arena_7_showDifferentGUI_foundWinner.jpg | 3 - .../arena_7_showDifferentGUI_timeOut.jpg | 3 - .../arena_7_showPlayerWeapons_withWeapon.jpg | 3 - ...rena_7_showPlayerWeapons_withoutWeapon.jpg | 3 - .../arena_addedSpawns.jpg | 3 - .../arena_createPlayerManager.png | 3 - .../arena_createTimer.png | 3 - .../arena_finishedProject_arenaHero.jpg | 3 - .../arena_gamePhase_cleanup.jpg | 3 - .../arena_gamePhase_compete.jpg | 3 - .../arena_gamePhase_intermission.jpg | 3 - .../arena_playtestGraybox_cropped.jpg | 3 - .../battle-royale-series/arena_showWeapon.png | 3 - .../battleRoyal_webFinal.mp4 | 3 - .../islandRoyale_example_2.jpg | 3 - .../playerShowcase_Jandel.jpg | 3 - .../playerShowcase_luxeyes.jpg | 3 - .../roundBased_grayboxExample.jpg | 3 - .../roundBased_hero_lesson8.jpg | 3 - ...sed_obstacleExampleComplexity_balanced.png | 3 - ...Based_obstacleExampleComplexity_simple.png | 3 - ...d_obstacleExampleComplexity_tooComplex.png | 3 - .../roundBased_thumbnail_alt.jpg | 3 - .../show-weapon-spawned.mp4 | 3 - ...ectorMap_arenaSteps_finalizedLayoutMap.png | 3 - .../vectorMap_example_obstacle.png | 3 - .../vectorMap_playerSpawns.png | 3 - .../BetaTestingGame.png | 3 - .../alo-feedback-form.png | 3 - .../CreateAndDestroy_template.rbxl | 3 - .../ExpandedMap_920x640.png | 3 - .../FilterWorkspace_920x640.png | 3 - .../GameSettingsFoundpsd.png | 3 - .../GameSettingsSearch_640x300.png | 3 - .../PlaceCustomBuilding_930x640.png | 3 - .../PlacedHalfMap.jpg | 3 - .../SpawnLocation_Select_920x600.jpg | 3 - .../avatarItemHeroBanners_backpack.png | 3 - .../avatarItemHeroBanners_head.jpg | 3 - .../avatarItemHeroBanners_wing.jpg | 3 - .../buildingExamples_large.jpg | 3 - .../buildingExamples_props.jpg | 3 - .../cc2019_bannerTerrain.jpg | 3 - .../cc2019_heroBanner_overCity.jpg | 3 - .../cc2019_introVideo_final_webOptimize.mp4 | 3 - .../cc2019_moveFirstBuilding.mp4 | 3 - .../cc2019_moveSpawnLocation.mp4 | 3 - .../cc2019_quizGamePage.png | 3 - .../cc2019_quizGameScreenshot.jpg | 3 - .../cc2019_showCameraControlsBuilding.mp4 | 3 - .../cc2019_showDuplicateCity.mp4 | 3 - .../cc2019_showSelectDragCity.mp4 | 3 - .../cc2019_switchBackTop.mp4 | 3 - .../cc2019_thumbnail_312x200.jpg | 3 - .../ccs2019_addTerrain.png | 3 - .../ccs2019_changeShapeSize.png | 3 - .../ccs2019_terrainSmooth.png | 3 - .../ccs2019_terrainTools_paint.png | 3 - .../ccs2019_terrainTools_subtract.png | 3 - .../changeViewSelectorSide_updated.mp4 | 3 - .../clickViewSelectorToTop.jpg | 3 - .../exampleCustomBuildings.jpg | 3 - .../firstHalfSetup_800x450.jpg | 3 - .../islandBlankExample_800x450.jpg | 3 - .../islandTerrainAdded_600x600.jpg | 3 - .../lessonBanner_3.jpg | 3 - .../lessonThumbnail_1_360x360.jpg | 3 - .../lessonThumbnail_2_360x360.jpg | 3 - .../lessonThumbnail_3_360x360.jpg | 3 - .../playersOverlookingCity_banner.jpg | 3 - .../playtestRunCenter.jpg | 3 - .../roadsPlacedExample_600x450.jpg | 3 - .../show-terrain-360px.jpg | 3 - .../showFocusBuilding.jpg | 3 - .../showIslandExamples_600x600.jpg | 3 - .../showIslandPainted_600x600.jpg | 3 - .../showPropsPlaced.jpg | 3 - .../showSpawnLocations_800x450.jpg | 3 - .../showTerrainAdd.mp4 | 3 - .../showThumbnailCameraAngle.jpg | 3 - .../spawnLocations_2placed.jpg | 3 - .../add-new-models/hero-new-assets.jpeg | 3 - .../add-new-models/hero-ring-hat.jpeg | 3 - .../add-new-models/new-parts-design-1.jpeg | 3 - .../add-new-models/new-parts-design-2.jpeg | 3 - .../add-new-models/show-assets-added.jpeg | 3 - .../add-to-the-garage/find-garage.png | 3 - .../add-to-the-garage/paste-into-garage.png | 3 - .../add-to-the-garage/rename-model.png | 3 - .../adding-wings/move-wing.mp4 | 3 - .../adding-wings/rotate-wing.mp4 | 3 - .../adding-wings/scale-wing.mp4 | 3 - .../adding-wings/wing-example.jpeg | 3 - .../adding-wings/work-area-correct.jpeg | 3 - .../adding-wings/work-area-wrong.jpeg | 3 - .../colors-and-textures/add-image.png | 3 - .../colors-and-textures/body-highlighted.png | 3 - .../callout-textureid.jpeg | 3 - .../colors-and-textures/colored-ships.jpeg | 3 - .../colors-and-textures/new-texture.jpeg | 3 - .../colors-and-textures/original-texture.jpeg | 3 - .../scrapper-backpack.jpeg | 3 - .../colors-and-textures/speeder-blue.png | 3 - .../colors-and-textures/speeder-rust.png | 3 - .../colors-and-textures/speeder-teal.png | 3 - .../compare-speeder-speeds.mp4 | 3 - .../customize-and-share/hero-group.jpeg | 3 - .../open-explorer-garage.png | 3 - .../customize-and-share/speed300.mp4 | 3 - .../customize-and-share/speed50.mp4 | 3 - .../design-the-world/hero-jetpack.jpeg | 3 - .../design-the-world/hero-winter.jpeg | 3 - .../design-the-world/junkbot-hero.jpeg | 3 - .../design-the-world/paint-terrain-snow.gif | 3 - .../design-the-world/paint-tool-snow.png | 3 - .../design-the-world/select-snow-material.png | 3 - .../select-terrain-explorer.png | 3 - .../show-terrain-color-change.mp4 | 3 - .../terrain-editor-edit-tab.png | 3 - .../terrain-expand-materials.png | 3 - .../terrain-winter-version.jpeg | 3 - .../Decorative-Parts-Parts.png | 3 - .../Decorative-Parts.png | 3 - .../Starting-Bodies-Parts.png | 3 - .../Starting-Bodies.png | 3 - .../Wing-Sets-Parts.png | 3 - .../designing-your-speeder/Wing-Sets.png | 3 - .../move-camera-to-focus.mp4 | 3 - .../move-camera-to-focus.png | 3 - .../speeder-progress-1.jpeg | 3 - .../speeder-progress-2.jpeg | 3 - .../speeder-progress-3.jpeg | 3 - .../decorated-version-1.jpeg | 3 - .../decorated-version-2.jpeg | 3 - .../duplicate-and-design/duplicated-wing.jpeg | 3 - .../duplicate-and-design/rotate-compare.mp4 | 3 - .../scrapyard-decorations.jpeg | 3 - .../duplicate-and-design/second-wing.jpeg | 3 - .../duplicate-and-design/second-wing.mp4 | 3 - .../duplicate-and-design/wing-extension.jpeg | 3 - .../wing-variations-1.jpeg | 3 - .../wing-variations-2.jpeg | 3 - .../wing-variations-3.jpeg | 3 - .../galactic-speedway-template.rbxl | 3 - .../get-off-the-ground/lesson-banner.jpeg | 3 - .../go-beyond-the-challenge/extension-1.jpeg | 3 - .../go-beyond-the-challenge/extension-2.jpeg | 3 - .../go-beyond-the-challenge/extension-3.jpeg | 3 - .../next-steps-particles.jpeg | 3 - .../next-steps-share.jpeg | 3 - .../going-for-a-race/hero-race.jpeg | 3 - .../going-for-a-race/testing-plane.jpeg | 3 - .../grouping-the-parts/group-select.png | 3 - .../grouping-the-parts/grouping.mp4 | 3 - .../grouping-the-parts/test-grouping.mp4 | 3 - .../main-page/lesson-1.jpeg | 3 - .../main-page/lesson-2.jpeg | 3 - .../main-page/lesson-3.jpeg | 3 - .../main-page/overview-video.mp4 | 3 - .../main-page/show-quiz-game-example.jpeg | 3 - .../moving-the-body/move-body.mp4 | 3 - .../show-body-variations-1.jpeg | 3 - .../show-body-variations-2.jpeg | 3 - .../show-body-variations-3.jpeg | 3 - .../sharing-your-speeders/DistributeonCS.png | 3 - .../sharing-your-speeders/GetModelButton.png | 3 - .../sharing-your-speeders/LinktoCD.png | 3 - .../hero-garage-racer.jpeg | 3 - .../take-flight/interact-robot.png | 3 - .../take-flight/show-selection-gui.jpg | 3 - .../take-the-challenge-2/quiz-game-page.jpeg | 3 - .../take-the-challenge-2/scrapper-hat.jpeg | 3 - .../hero-alien-friend.jpeg | 3 - .../take-the-challenge/hero-pauldron.jpeg | 3 - .../take-the-challenge/show-quiz-npc.jpg | 3 - .../test-the-speeder/explorer-correct.png | 3 - .../test-the-speeder/explorer-wrong.png | 3 - .../test-the-speeder/select-speeder.png | 3 - .../test-the-speeder/test-speeder.mp4 | 3 - .../addKeyframes.gif | 3 - .../bipi-tier2-showButtonSetup.png | 3 - .../bipi_nav_button.png | 3 - .../bipi_t2_clickFrame2.png | 3 - .../bipi_t2_clickFrame3.png | 3 - .../bipi_t2_clickLooping.png | 3 - .../bipi_t2_clickPlay.png | 3 - .../bipi_t2_createRig_showRig.jpg | 3 - .../bipi_t2_lessonSamples_lesson1.jpg | 3 - .../bipi_t2_lessonSamples_lesson2alt.jpg | 3 - .../bipi_t2_selectFirstFrame.png | 3 - .../bipi_t2_selectPartHierarchy.png | 3 - .../bipi_t2_showExportedAnimation.png | 3 - .../bipi_t2_showFrame3_front.jpg | 3 - .../bipi_t2_showFrame3_side.jpg | 3 - .../bipi_t2_showLastFrames.png | 3 - .../bipi_t2_showPartsFolder.png | 3 - .../bipi_t2_touchedPartExamples_obby.jpg | 3 - .../bipi_t2_touchedPartExamples_treasure.jpg | 3 - .../bipi_tier2_extension_gameThubmanil.jpg | 3 - .../bipi_tier2_extension_partSetup.jpg | 3 - .../ccs2020_t2_changeLength.png | 3 - .../ccs2020_t2_clickAEPlus.png | 3 - .../ccs2020_t2_clickOptions.png | 3 - .../ccs2020_t2_createAnimationName.png | 3 - .../ccs2020_t2_exportedAnimationWeb_alt.png | 3 - .../ccs2020_t2_jumpAnimationStills_01.jpg | 3 - .../ccs2020_t2_jumpAnimationStills_2.jpg | 3 - .../ccs2020_t2_jumpAnimationStills_3.jpg | 3 - ...20_t2_selectKeyframeExamples_selectAll.png | 3 - ...s2020_t2_selectKeyframeExamples_single.png | 3 - .../ccs2020_t2_showDurationCurrent.png | 3 - .../exampleProject_tweeningButtonDoor.mp4 | 3 - .../exampleProject_tweeningPetRotate.mp4 | 3 - .../example_allTweens.mp4 | 3 - .../showAnimationIDScript.gif | 3 - .../showChangeFrameDifference_opt.mp4 | 3 - .../showFinalAnimation_singleAlt.mp4 | 3 - .../showFinalVictoryPose_simple.mp4 | 3 - ...AnimationMoreFrames_improved_optimized.mp4 | 3 - .../showMoveBody.mp4 | 3 - .../showNPCAnimationsFeedback_noFeedback.mp4 | 3 - ...showNPCAnimationsFeedback_withFeedback.mp4 | 3 - ...howOverallAnimationTimelapse_optimized.mp4 | 3 - .../showPose2TimeLapse_optimized.mp4 | 3 - .../showRotateArms_web.mp4 | 3 - .../showScaleTween.mp4 | 3 - .../showTweenColor.mp4 | 3 - .../showTweenMove_Wrong.gif | 3 - .../showTweenMove_correct.gif | 3 - ...victoryPose_finalSingleObbyExample_web.mp4 | 3 - .../adding-new-models/show-new-assets.jpeg | 3 - .../full-swim-animation.mp4 | 3 - .../press-loop-button.png | 3 - .../set-timeline-middle.png | 3 - .../show-full-swim-animation.mp4 | 3 - .../show-middle-timelapse.mp4 | 3 - .../beginner-landing-page/lesson-1.jpeg | 3 - .../beginner-landing-page/lesson-2.jpeg | 3 - .../beginner-landing-page/lesson-3.jpeg | 3 - .../beginner-landing-page/overview.mp4 | 3 - .../beginner-landing-page/show-game-hub.jpeg | 3 - .../game-redeem-npc.jpeg | 3 - .../game-redeem-npc.jpeg | 3 - .../challenge-checkpoint/game-redeem-npc.jpeg | 3 - .../Animations-Button.png | 3 - .../change-the-animation/CopyAssetID.png | 3 - .../finished-animation.mp4 | 3 - .../search-walk-select.png | 3 - .../set-animation-value.png | 3 - .../create-the-first-pose/click-upper-arm.mp4 | 3 - .../create-the-first-pose/example-crouch.jpeg | 3 - .../create-the-first-pose/example-dance.jpeg | 3 - .../create-the-first-pose/example-swim.jpeg | 3 - .../rotate-upper-arm.mp4 | 3 - .../timelapse-first-pose.mp4 | 3 - .../creating-animations/AnimationExample.mp4 | 3 - .../creating-animations/highlight-figure.jpg | 3 - .../creating-animations/rig-selected.jpg | 3 - .../show-animation-breakdown.mp4 | 3 - .../creating-animations/show-move-camera.mp4 | 3 - .../exporting-animations/hero-banner.jpeg | 3 - .../adding-new-models.png | 3 - .../go-beyond-the-challenge/hero-banner.jpeg | 3 - .../go-beyond-the-challenge/learn-coding.png | 3 - .../personalize-the-game.png | 3 - .../share-animations.png | 3 - .../invite-friends-to-play/hero-banner.jpeg | 3 - .../looping-animations/Scrubber.png | 3 - .../looping-animations/Timeline.png | 3 - .../looping-animations/added-last-pose.png | 3 - .../change-duration-to-end.gif | 3 - .../select-first-pose-diamond.png | 3 - .../overview-game-progress.mp4 | 3 - .../show-template-pick.png | 3 - .../opening-the-template/template-example.png | 3 - .../personalize-the-game/atmosphere.jpeg | 3 - .../open-game-settings.png | 3 - .../particle-effects.jpeg | 3 - .../personalize-the-game/show-explorer.jpeg | 3 - .../show-rename-after.jpeg | 3 - .../show-rename-before.jpeg | 3 - .../personalize-the-game/terrain.jpeg | 3 - .../publish-animations/Publish-Highlight.png | 3 - .../publish-animations/publish-copy-id.png | 3 - .../save-and-publish/hero-banner.jpeg | 3 - .../save-and-publish/save-animation.png | 3 - .../sharing-animations/animation-keyframe.png | 3 - .../sharing-animations/click-options.png | 3 - .../sharing-animations/hero-banner.png | 3 - .../select-animation-saves.png | 3 - .../sharing-animations/select-animation.png | 3 - .../test-the-game/click-game-button.mp4 | 3 - .../test-the-game/click-npc.png | 3 - .../test-the-game/click-play-game.jpeg | 3 - .../adding-scripts/create-events.png | 3 - .../create-particles-folder.png | 3 - .../create-tutorial-manager.png | 3 - .../create-tutorial-particles.png | 3 - .../adding-scripts/create-tutorial-script.png | 3 - .../adding-scripts/delete-test-player.mp4 | 3 - .../adding-scripts/final-example-2.mp4 | 3 - .../adding-scripts/final-example.mp4 | 3 - .../adding-scripts/move-tutorial-beam.png | 3 - .../become-an-artist/game-example.mp4 | 3 - .../become-an-artist/template-overview.jpeg | 3 - .../become-an-artist/template-overview.png | 3 - .../beginner-avatar-items.jpeg | 3 - .../lesson-1-thumbnail.jpeg | 3 - .../lesson-2-thumbnail.jpeg | 3 - .../lesson-3-thumbnail.jpeg | 3 - .../beginner-landing-page/trailer.mp4 | 3 - .../challenge-checkpoint-2/avatar-items.jpeg | 3 - .../challenge-checkpoint-2/prize-avatar.jpeg | 3 - .../challenge-checkpoint-3/avatar-items.jpeg | 3 - .../challenge-checkpoint-3/prize-avatar.jpeg | 3 - .../avatar-items-hero.jpeg | 3 - .../challenge-checkpoint/prize-avatar.jpeg | 3 - .../challenge-checkpoint/prize-avatar.png | 3 - .../attachment0-to-player.mp4 | 3 - .../connect-the-beam/beam-texture-change.mp4 | 3 - .../connect-the-beam/default-beam.png | 3 - .../connect-the-beam/face-camera-off.jpeg | 3 - .../connect-the-beam/face-camera-on.jpeg | 3 - .../finished-beam-example.mp4 | 3 - .../connect-the-beam/set-face-camera.png | 3 - .../connect-the-beam/set-goal-attachment.png | 3 - .../connect-the-beam/set-texture-mode.png | 3 - .../connect-the-beam/show-static-beam.png | 3 - .../creating-a-sparkler/add-delete-colors.mp4 | 3 - .../creating-a-sparkler/avatar-items.jpeg | 3 - .../click-sparkler-particles.mp4 | 3 - .../creating-a-sparkler/cut-staff.mp4 | 3 - .../creating-a-sparkler/final-example.jpeg | 3 - .../creating-a-sparkler/final-example.mp4 | 3 - .../creating-a-sparkler/final-staff.mp4 | 3 - .../creating-a-sparkler/move-colors.mp4 | 3 - .../non-selected-arrow.png | 3 - .../creating-a-sparkler/paste-staff.mp4 | 3 - .../select-color-property.png | 3 - .../creating-a-sparkler/select-color.png | 3 - .../creating-a-sparkler/show-sparklers.jpeg | 3 - .../creating-a-sparkler/show-texture.jpeg | 3 - .../beam-example.mp4 | 3 - .../create-beam.png | 3 - .../create-goal-attachments.png | 3 - .../create-player-attachment.png | 3 - .../edit-place.png | 3 - .../open-template.jpeg | 3 - .../open-template.jpg | 3 - .../template-overview.jpeg | 3 - .../ux-example-bad.jpeg | 3 - .../ux-example-good.jpeg | 3 - .../example-full-game.mp4 | 3 - .../finish-the-blast/change-size-example.jpeg | 3 - .../finish-the-blast/change-size.png | 3 - .../finish-the-blast/locked-to-part.mp4 | 3 - .../finish-the-blast/set-locked-to-part.png | 3 - .../finish-the-blast/show-shot-color.mp4 | 3 - .../invite-friends/hero-image.jpeg | 3 - .../landing-page/beginner.jpeg | 3 - .../landing-page/experienced.jpeg | 3 - .../landing-page/header.jpeg | 3 - .../landing-page/prizes-beginner.png | 3 - .../landing-page/prizes-experienced.png | 3 - .../change-explode-size.png | 3 - .../make-final-touches/change-speed.png | 3 - .../make-final-touches/explosion-final.mp4 | 3 - .../make-final-touches/lifetime-new.mp4 | 3 - .../make-final-touches/lifetime.mp4 | 3 - .../light-emission-0.5.jpeg | 3 - .../make-final-touches/light-emission-0.jpeg | 3 - .../light-emission-1.0.jpeg | 3 - .../make-final-touches/newsizecomparison.mp4 | 3 - .../make-final-touches/rotation-speed-new.mp4 | 3 - .../make-final-touches/rotation-speed.mp4 | 3 - .../show-random-options.png | 3 - .../make-final-touches/size-comparison.mp4 | 3 - .../make-final-touches/size-comparison_1.mp4 | 3 - .../making-an-explosion/explode-color.png | 3 - .../making-an-explosion/explode-texture.png | 3 - .../explosion-color-texture.mp4 | 3 - .../final-shot-example.mp4 | 3 - .../making-an-explosion/search-explosion.png | 3 - .../next-steps-advanced/hero-image.jpeg | 3 - .../next-steps/extension-cards-sparkler.jpeg | 3 - .../next-steps/hero-final.jpeg | 3 - .../next-steps/terrain.jpeg | 3 - .../particle-emitters/Fire-Video.mp4 | 3 - .../particle-emitters/Portal-Video.mp4 | 3 - .../particle-emitters/Rock-Video.mp4 | 3 - .../particle-emitters/Short-Arrow-Down.png | 3 - .../particle-emitters/particle-example.mp4 | 3 - .../particle-emitters/particle-flame.png | 3 - .../particle-emitters/particle-holder.png | 3 - .../particle-emitters/particle-portal.png | 3 - .../particle-emitters/particle-star.png | 3 - .../particle-emitters/select-blaster-shot.mp4 | 3 - .../particle-emitters/select-blaster-shot.png | 3 - .../particle-emitters/select-color.png | 3 - .../particle-emitters/select-explosion.png | 3 - .../particle-emitters/set-color.png | 3 - .../particle-emitters/show-color-change.jpeg | 3 - .../particle-emitters/show-color-change.png | 3 - .../test-and-play/game-health.png | 3 - .../test-and-play/start-game.png | 3 - .../before-after-particle-settings.mp4 | 3 - .../create-particle-emitter.png | 3 - .../default-particle-stream.jpg | 3 - .../using-particles-for-actions/energy.png | 3 - .../using-particles-for-actions/gem.png | 3 - .../using-particles-for-actions/heart.png | 3 - .../using-particles-for-actions/leaf.png | 3 - .../particle-interaction.mp4 | 3 - .../using-particles-for-actions/paw.png | 3 - .../using-particles-for-actions/potion.png | 3 - .../set-enabled-off.png | 3 - .../show-particle-texture.jpg | 3 - .../show-texture-color-size.jpg | 3 - .../spread-angle.mp4 | 3 - .../using-particles-for-actions/star.png | 3 - .../using-particles-for-actions/ticket.png | 3 - .../using-textures/circle-2.png | 3 - .../using-textures/circle.png | 3 - .../using-textures/heart.png | 3 - .../particle-texture-example.mp4 | 3 - .../using-textures/paste-texture.png | 3 - .../using-textures/scratch.png | 3 - .../using-textures/show-texture-property.png | 3 - .../using-textures/smoke.png | 3 - .../using-textures/spark.png | 3 - .../using-textures/star-1.png | 3 - .../using-textures/star-2.png | 3 - .../using-textures/star-3.png | 3 - .../using-textures/swirl.png | 3 - .../using-textures/texture-changed.jpeg | 3 - .../using-textures/texture-changed.png | 3 - .../using-textures/trace.png | 3 - .../using-textures/triangle.png | 3 - .../coding-1/coding-1-output-window_800.png | 3 - .../coding-1/color-changer_400x216.png | 3 - .../coding-1/color-picker_800x140.png | 3 - .../coding-1/helloworld-output_800x150.png | 3 - ...hover-over-serverscriptservice_400x400.png | 3 - .../coding-1/part-properties_400.png | 3 - .../education/coding-1/practice-part_400.png | 3 - .../scriptParent_finalExample_web.mp4 | 3 - .../coding-2/parameters-and-events_trap.mp4 | 3 - .../assets/education/coding-2/red-button.jpg | 3 - .../education/coding-2/transparent-bridge.jpg | 3 - .../coding-3/coding3Hero_ifElseIf.jpg | 3 - ...oding3_colorPointBlockFinalizedExample.mp4 | 3 - .../coding-3/colorPoint_loopingColors.gif | 3 - .../coding-3/colorPoint_showParticles_web.mp4 | 3 - .../colorPoint_showPointChange_web.mp4 | 3 - .../raceCourse_showDistanceBetween.jpg | 3 - .../coding-3/raceCourse_showPartCraeted.jpg | 3 - .../education/coding-3/trap-exampleFinal.mp4 | 3 - .../coding-4/CupCakeBloopers_Compressed.mp4 | 3 - .../education/coding-4/Fade_480x320.png | 3 - .../coding-4/LoopingTower2_Compressed.mp4 | 3 - .../coding-4/NestedLoopsDiagram300x500.png | 3 - .../coding-4/florLoop_lightAdded.png | 3 - .../forLoopBridge-finishedCountdown.mp4 | 3 - .../coding-4/forLoopBridge_addTextLabel.png | 3 - .../coding-4/forLoopBridge_bridgeSetup.png | 3 - .../coding-4/forLoopDiagram_generic1.png | 3 - .../coding-4/forLoopDiagram_generic2.png | 3 - .../coding-4/forLoopDiagram_generic3.png | 3 - .../coding-4/forLoop_annotatedExample.png | 3 - .../coding-4/forLoop_outputError.mp4 | 3 - .../coding-4/glowing-light-finished.mp4 | 3 - .../coding-4/glowing-light-increase.mp4 | 3 - .../coding-4/glowing-light-singleLoop.mp4 | 3 - .../coding-4/glowing-lights-lightPart.jpg | 3 - .../coding-4/glowing-lights-setClockTime.png | 3 - .../coding-4/loops-and-parts-finishedPart.mp4 | 3 - .../coding-4/nestedLoop-finalExample.mp4 | 3 - .../coding-4/timedBridgePresentation.mp4 | 3 - ...ing_Changes_to_Arrays_-_Final_Project.rbxl | 3 - .../education/coding-5/TemplateNPC.rbxm | 3 - .../coding-5/coding4_arrayFunctions.jpg | 3 - .../coding-5/coding4_introToTables.jpg | 3 - .../coding-5/disappearingHero_16_9web.mp4 | 3 - ...introArray_showDialogIndexes_optimized.mp4 | 3 - .../introArrays_projectTotal_optimized.mp4 | 3 - ...roArrays_showFullLoopIndexes_optimized.mp4 | 3 - .../coding-5/introArrays_showSpeech.jpg | 3 - .../coding-5/showPathDisappearFirst_web.mp4 | 3 - .../coding-5/showPathDisappearIndexed_web.mp4 | 3 - .../abstraction-backpacks.png | 3 - .../backpack-violet.png | 3 - .../backpack-yellow.png | 3 - .../no-abstraction-backpacks.png | 3 - .../square-and-child-squares.png | 3 - ...o_to_Module_Scripts_-_Starter_Project.rbxl | 3 - .../create-module-script.png | 3 - .../creating-modules-hero.jpeg | 3 - .../final-example.mp4 | 3 - .../get-first-key.mp4 | 3 - .../module-template-example.jpeg | 3 - .../show-leaderboard-key.jpg | 3 - .../create-module-script.png | 3 - .../Designing-Educational-Experiences.pdf | 3 - .../education/developer/petGame-pets.jpg | 3 - .../developer/thumbnail-luaLearning.png | 3 - .../developer/thumbnail-missionMars.png | 3 - .../developer/thumbnail-untamedAnimals.png | 3 - .../bipi_lessonPlan_thumbnail_312x200.png | 3 - .../ccw2019_thumbnail_312x200px.png | 3 - .../introToGameDesign_thumbnail.jpg | 3 - .../introToStudio_thumbnail.jpg | 3 - .../newGettingStartedThumbnails-develop.jpg | 3 - .../newGettingStartedThumbnails-games.jpg | 3 - .../thumbnail_adventureRthroAlt_312x200.jpg | 3 - .../thumbnail_remoteLearning.jpg | 3 - .../thumbnail_traps_312x200.jpg | 3 - .../Handout_-_Getting_Ready.pdf | 3 - .../hero-banner-classroom.jpg | 3 - .../educator-onboarding/hero-robloxHQ.jpg | 3 - .../educators-page/Bianca-Riviera.jpg | 3 - .../education/educators-page/Code-Wiz.png | 3 - .../education/educators-page/EDMO-Round-1.png | 3 - .../educators-page/Genius-Academy.png | 3 - .../Large_Code_Ninjas-_White_Horizontal.png | 3 - .../educators-page/Natalie-Clabo.jpg | 3 - .../educators-page/The-Math-Obby.jpg | 3 - .../education/educators-page/WGFactory.png | 3 - .../education/educators-page/alvinblox.png | 3 - .../educators-page/code-kingdom-logo.png | 3 - .../education/educators-page/id-tech-logo.png | 3 - .../Create-Your-First-Civil-and-Safe-Game.pdf | 3 - .../civility.png | 3 - .../assets/education/general/Anchor-Tool.png | 3 - .../assets/education/general/Move-Tool.png | 3 - .../assets/education/general/Rotate-Tool.png | 3 - .../assets/education/general/Scale-Tool.png | 3 - .../education/general/Snap-Settings-A.png | 3 - .../education/general/Snap-Settings-B.png | 3 - .../education/general/Snap-Settings-C.png | 3 - .../Studio-Setup-Galactic-Speedway.jpg | 3 - .../general/Studio-Setup-Island-Of-Move.jpg | 3 - .../Studio-Setup-Mansion-Of-Wonder.jpg | 3 - .../general/Studio-Setup-Story-Games.jpg | 3 - .../education/general/Toolbox-Inventory.png | 3 - .../assets/education/general/play-button.png | 3 - .../assets/education/general/stop-button.png | 3 - .../Handout-CollaborationGuidelines.docx | 3 - .../handouts/Roblox_Classroom_Kit.zip | 3 - .../education/handouts/animation-feedback.pdf | 3 - .../handouts/digital-safety-presentation.pptx | 3 - .../handouts/digital-safety-scavenger.pdf | 3 - .../handouts/introToCoding-cheatsheet.pdf | 3 - .../handouts/introToStudio-cheatsheet.pdf | 3 - .../project-feedback-presentation.pptx | 3 - .../education/handouts/project-feedback.pdf | 3 - .../education/handouts/upstander-roleplay.pdf | 3 - .../Upstander_Situations_Handout.docx | 3 - ...digitalCitizenship_onlineCommunityHero.jpg | 3 - .../digitalCitizenship_showNPC_bully.jpg | 3 - .../digitalCitizenship_showNPC_noBully.jpg | 3 - .../hero_digitalCitizenshipIntro.jpg | 3 - ...Digital_Safety_Scavenger_Hunt_Handout.docx | 3 - ...Intro_to_Digital_Safety_Lesson_Slides.pptx | 3 - .../digitalSafety_gameHero.png | 3 - .../digitalSafety_heroImage.jpg | 3 - .../digitalSafety_reportClick.jpg | 3 - .../digitalSafety_showReport.jpg | 3 - .../digitalSafety_youtube.png | 3 - .../education/legacy/ConfigureServer.png | 3 - .../Handout-CollaborationGuidelines.docx | 3 - .../legacy/Handout-CollabrationGuidelines.pdf | 3 - .../Handout_-_Computer_Science_Quiz.docx | 3 - .../Handout_-_Computer_Science_Quiz.pdf | 3 - .../legacy/Handout_-_Getting_Ready.pdf | 3 - .../legacy/Handout_-_Project_Rubric.docx | 3 - .../legacy/Handout_-_Project_Rubric.pdf | 3 - ...dout_-_Roblox_Client_Quick_Start_Guide.pdf | 3 - .../legacy/Handout_-_Roblox_Glossary.pdf | 3 - .../assets/education/legacy/NameServer.png | 3 - .../legacy/RobloxStudio-Cheatsheet.pdf | 3 - ...lox_Account_Creation_(Student_Handout).pdf | 3 - .../legacy/Roblox_Assessment_Handouts.zip | 3 - .../education/legacy/Roblox_Classroom_Kit.zip | 3 - .../legacy/Safety_education_brochure.pdf | 3 - .../assets/education/legacy/ServersTab.png | 3 - .../legacy/Twitterheader1500x500.jpg | 3 - .../assets/education/legacy/VIPGamePage.png | 3 - .../education/legacy/cityScape_312x200.jpg | 3 - .../legacy/classroomThumbnail_312x200.png | 3 - .../legacy/coding4_loopingArraysThumbnail.jpg | 3 - .../legacy/collabrationArticle_heroBanner.jpg | 3 - .../legacy/devStarted-allowCopying.png | 3 - .../legacy/devStarted-clickCreate.png | 3 - .../legacy/devStarted-createNewGame.jpg | 3 - .../education/legacy/devStarted-editPlace.png | 3 - .../legacy/devStarted-editTemplate.png | 3 - .../legacy/devStarted-gameSettings.png | 3 - .../legacy/devStarted-setCreator.jpg | 3 - .../legacy/devTemplates-BrandingExample.jpg | 3 - .../legacy/devTemplates-assetKit-01.jpg | 3 - .../legacy/devTemplates-assetKit-02.jpg | 3 - .../legacy/devTemplates-mansions-byjus.jpg | 3 - .../legacy/devTemplates-mansions-original.jpg | 3 - .../legacy/devTemplates-newTemplates-city.jpg | 3 - .../devTemplates-newTemplates-spaceship.jpg | 3 - .../legacy/hero-banner-peopleTalking.jpg | 3 - .../education/legacy/hero-classroomLab.jpg | 3 - .../education/legacy/impactPage_hero.jpg | 3 - .../legacy/introToGameDesign_thumbnail.jpg | 3 - .../legacy/introToStudio_thumbnail.jpg | 3 - .../legacy/knnoss-palace-example.jpg | 3 - .../legacy/module1-exampleStudio.jpg | 3 - .../module1-gameExamples-normalCurve.jpg | 3 - .../legacy/module1-gameExamples-ocean.jpg | 3 - .../education/legacy/module2-addEmail.png | 3 - .../education/legacy/module2-capture.jpg | 3 - .../education/legacy/module2-clickPlay.jpg | 3 - .../legacy/module2-finishedTraining.jpg | 3 - .../legacy/module2-gamePage copy.png | 3 - .../education/legacy/module2-gamePage.png | 3 - .../education/legacy/module2-homepage.jpg | 3 - .../education/legacy/module2-settings.png | 3 - .../legacy/module2-trainingExample.jpg | 3 - .../education/legacy/module3-signinScreen.jpg | 3 - .../legacy/module4-luaLearningQuiz.png | 3 - .../education/legacy/module4-showChat.jpg | 3 - .../legacy/module5-gameImages-450x250-lua.jpg | 3 - .../module5-gameImages-450x250-ocean.jpg | 3 - .../assets/education/legacy/plane-crazy.jpg | 3 - .../legacy/thumbnail_digitalCitizenship.jpg | 3 - .../thumbnail_digitalCitizenship_312x200.jpg | 3 - .../legacy/worldbuilding_thumbnail.jpg | 3 - .../adventureGameReferenceHandout.pdf | 3 - .../adventureGameVisionHandout.pdf | 3 - .../animateInRoblox-evaluation.pdf | 3 - .../lesson-plans/animateInRoblox-hero.jpg | 3 - .../animateInRoblox-presentation.pptx | 3 - .../lesson-plans/createAndDestroy-hero.jpg | 3 - .../createAndDestroy-presentation.pptx | 3 - .../lesson-plans/galactic-speedway-hero.jpg | 3 - .../galacticSpeedway-evaluationHandout.pdf | 3 - .../galacticSpeedway-presentation.pptx | 3 - .../galacticSpeedway-quizQuestions.pdf | 3 - .../introToGameDesign-brainstormHandout.pdf | 3 - .../lesson-plans/introToGames-hero.jpg | 3 - .../lesson-plans/robloxDeveloper-hero.jpg | 3 - .../lesson-plans/storyGames-hero.jpg | 3 - .../lesson-plans/storyGames-overviewVideo.mp4 | 3 - .../stock-graphics/edu-marketing.zip | 3 - .../stock-graphics/hero-robloxHighSchool.jpg | 3 - .../stock-graphics/hero-robloxUsersPark.jpg | 3 - .../stock-graphics/hero-spaceStudents.jpg | 3 - .../stock-graphics/hero-studentTeaching.jpg | 3 - .../thumbnail-studentTeaching.jpg | 3 - .../thumbnail-teacherInClassroom.jpg | 3 - .../education/story-games/StoryExample.png | 3 - .../education/story-games/StoryManager.png | 3 - .../story-games/Story_Games_Template.rbxl | 3 - .../story-games/wcc2018_annotatedStory.png | 3 - .../wcc2018_quizGameExample_900x500.jpg | 3 - .../story-games/wccVideo_final_wSound.mp4 | 3 - .../story-games/wcc_heroOverhead.jpg | 3 - .../story-games/wcc_heroPedestal.jpg | 3 - .../education/story-games/wcc_heroUsing.jpg | 3 - .../story-games/wcc_lessonThumbnail_1.png | 3 - .../story-games/wcc_lessonThumbnail_2.png | 3 - .../story-games/wcc_lessonThumbnail_3.png | 3 - .../classes/ArcHandles/ArcHandles-Example.jpg | 3 - .../classes/Beam/Curvature-Diagram.png | 3 - .../Camera/DeviceSafeAreaVsFullscreen.png | 3 - .../engine-api/classes/Camera/NearPlaneZ.jpg | 3 - .../Camera/ViewportPointToRayOrigin.png | 3 - .../Depth-Of-Field-Diagram.svg | 3 - .../EditableMesh/GetAdjacentTriangles.png | 3 - .../EditableMesh/GetAdjacentVertices.png | 3 - .../classes/EditableMesh/Winding.png | 3 - .../AbsolutePositionCoordinateSystem.png | 3 - .../classes/HapticEffect/Position-Radius.png | 3 - .../ScreenGui/ClipToDeviceSafeArea-False.png | 3 - .../ScreenGui/ClipToDeviceSafeArea-True.png | 3 - .../classes/ScreenshotHud/Diagram.jpg | 3 - .../classes/UIListLayout/FillDirection.png | 3 - .../classes/UIListLayout/FlexMode-Fill.png | 3 - .../classes/UIListLayout/FlexMode-Grow.png | 3 - .../classes/UIListLayout/FlexMode-Shrink.png | 3 - .../HorizontalFlex-Cross-Direction.png | 3 - .../UIListLayout/HorizontalFlex-Options.png | 3 - .../UIListLayout/HorizontalFlex-Tabs-3.png | 3 - .../UIListLayout/HorizontalFlex-Tabs-6.png | 3 - .../UIListLayout/ItemLineAlignment-Start.png | 3 - .../ItemLineAlignment-Stretch.png | 3 - .../UIListLayout/ItemLineAlignment.png | 3 - .../classes/UIListLayout/SortOrder.png | 3 - .../UIListLayout/VerticalAlignment-Center.png | 3 - .../VerticalFlex-Cross-Direction.png | 3 - .../UIListLayout/VerticalFlex-Options.png | 3 - .../engine-api/classes/UIListLayout/Wraps.png | 3 - .../datatypes/Font/Accanthis-ADF-Std.png | 3 - .../engine-api/datatypes/Font/Amatic-SC.png | 3 - .../engine-api/datatypes/Font/Arimo.png | 3 - .../engine-api/datatypes/Font/Balthazar.png | 3 - .../engine-api/datatypes/Font/Bangers.png | 3 - .../datatypes/Font/Builder-Extended.png | 3 - .../datatypes/Font/Builder-Mono.png | 3 - .../datatypes/Font/Builder-Sans.png | 3 - .../datatypes/Font/Comic-Neue-Angular.png | 3 - .../engine-api/datatypes/Font/Creepster.png | 3 - .../engine-api/datatypes/Font/Denk-One.png | 3 - .../engine-api/datatypes/Font/Fondamento.png | 3 - .../engine-api/datatypes/Font/Fredoka-One.png | 3 - .../datatypes/Font/Grenze-Gotisch.png | 3 - .../assets/engine-api/datatypes/Font/Guru.png | 3 - .../datatypes/Font/Highway-Gothic.png | 3 - .../engine-api/datatypes/Font/Inconsolata.png | 3 - .../datatypes/Font/Indie-Flower.png | 3 - .../datatypes/Font/Josefin-Sans.png | 3 - .../assets/engine-api/datatypes/Font/Jura.png | 3 - .../engine-api/datatypes/Font/Kalam.png | 3 - .../datatypes/Font/Luckiest-Guy.png | 3 - .../datatypes/Font/Merriweather.png | 3 - .../engine-api/datatypes/Font/Michroma.png | 3 - .../engine-api/datatypes/Font/Montserrat.png | 3 - .../engine-api/datatypes/Font/Nunito.png | 3 - .../engine-api/datatypes/Font/Oswald.png | 3 - .../datatypes/Font/Patrick-Hand.png | 3 - .../datatypes/Font/Permanent-Marker.png | 3 - .../datatypes/Font/Press-Start-2P.png | 3 - .../datatypes/Font/Roboto-Condensed.png | 3 - .../engine-api/datatypes/Font/Roboto-Mono.png | 3 - .../engine-api/datatypes/Font/Roboto.png | 3 - .../datatypes/Font/Roman-Antique.png | 3 - .../engine-api/datatypes/Font/Sarpanch.png | 3 - .../datatypes/Font/Source-Sans-Pro.png | 3 - .../datatypes/Font/Special-Elite.png | 3 - .../datatypes/Font/Titillium-Web.png | 3 - .../engine-api/datatypes/Font/Ubuntu.png | 3 - .../engine-api/datatypes/Font/Zekton.png | 3 - .../enums/AlphaMode/Fern-Cutout.png | 3 - .../enums/AlphaMode/Fern-Overlay.png | 3 - .../enums/AudioChannelLayout/Mono.jpg | 3 - .../enums/AudioChannelLayout/Quad.jpg | 3 - .../enums/AudioChannelLayout/Stereo.jpg | 3 - .../enums/AudioChannelLayout/Surround_5.jpg | 3 - .../enums/AudioChannelLayout/Surround_5_1.jpg | 3 - .../enums/AudioChannelLayout/Surround_7_1.jpg | 3 - .../AudioChannelLayout/Surround_7_1_4.jpg | 3 - .../enums/EasingStyle/Easing-Styles-In.png | 3 - .../enums/EasingStyle/Easing-Styles-InOut.png | 3 - .../enums/EasingStyle/Easing-Styles-Out.png | 3 - .../assets/engine-api/enums/Font/AmaticSC.png | 3 - .../assets/engine-api/enums/Font/Antique.png | 3 - .../assets/engine-api/enums/Font/Arcade.png | 3 - .../assets/engine-api/enums/Font/Arimo.png | 3 - .../engine-api/enums/Font/ArimoBold.png | 3 - .../assets/engine-api/enums/Font/Bangers.png | 3 - .../assets/engine-api/enums/Font/Bodoni.png | 3 - .../engine-api/enums/Font/BuilderSans.png | 3 - .../engine-api/enums/Font/BuilderSansBold.png | 3 - .../enums/Font/BuilderSansExtraBold.png | 3 - .../enums/Font/BuilderSansMedium.png | 3 - .../assets/engine-api/enums/Font/Cartoon.png | 3 - .../assets/engine-api/enums/Font/Code.png | 3 - .../engine-api/enums/Font/Creepster.png | 3 - .../assets/engine-api/enums/Font/DenkOne.png | 3 - .../assets/engine-api/enums/Font/Fantasy.png | 3 - .../engine-api/enums/Font/Fondamento.png | 3 - .../engine-api/enums/Font/FredokaOne.png | 3 - .../assets/engine-api/enums/Font/Garamond.png | 3 - .../engine-api/enums/Font/GrenzeGotisch.png | 3 - .../assets/engine-api/enums/Font/Highway.png | 3 - .../engine-api/enums/Font/IndieFlower.png | 3 - .../engine-api/enums/Font/JosefinSans.png | 3 - .../assets/engine-api/enums/Font/Jura.png | 3 - .../assets/engine-api/enums/Font/Kalam.png | 3 - .../assets/engine-api/enums/Font/Legacy.png | 3 - .../engine-api/enums/Font/LuckiestGuy.png | 3 - .../engine-api/enums/Font/Merriweather.png | 3 - .../assets/engine-api/enums/Font/Michroma.png | 3 - .../assets/engine-api/enums/Font/Nunito.png | 3 - .../assets/engine-api/enums/Font/Oswald.png | 3 - .../engine-api/enums/Font/PatrickHand.png | 3 - .../engine-api/enums/Font/PermanentMarker.png | 3 - .../assets/engine-api/enums/Font/Roboto.png | 3 - .../engine-api/enums/Font/RobotoCondensed.png | 3 - .../engine-api/enums/Font/RobotoMono.png | 3 - .../assets/engine-api/enums/Font/Sarpanch.png | 3 - .../assets/engine-api/enums/Font/SciFi.png | 3 - .../engine-api/enums/Font/SourceSans.png | 3 - .../engine-api/enums/Font/SourceSansBold.png | 3 - .../enums/Font/SourceSansItalic.png | 3 - .../engine-api/enums/Font/SourceSansLight.png | 3 - .../enums/Font/SourceSansSemibold.png | 3 - .../engine-api/enums/Font/SpecialElite.png | 3 - .../engine-api/enums/Font/TitilliumWeb.png | 3 - .../assets/engine-api/enums/Font/Ubuntu.png | 3 - .../enums/ScreenInsets/CoreUISafeInsets.png | 3 - .../enums/ScreenInsets/DeviceSafeInsets.png | 3 - .../enums/ScreenInsets/Inset-Regions-All.png | 3 - .../engine-api/enums/ScreenInsets/None.png | 3 - .../enums/ScreenInsets/Top-Bar-Cutout.png | 3 - .../enums/ScreenInsets/TopbarSafeInsets.png | 3 - .../engine-api/enums/TextureMode/Stretch.png | 3 - .../enums/TextureMode/Wrap-Static.png | 3 - .../libraries/bit32/32-Bit-Restriction.png | 3 - .../assets/engine-api/libraries/bit32/AND.png | 3 - .../engine-api/libraries/bit32/LSHIFT.png | 3 - .../assets/engine-api/libraries/bit32/NOT.png | 3 - .../assets/engine-api/libraries/bit32/OR.png | 3 - .../engine-api/libraries/bit32/RSHIFT.png | 3 - .../assets/engine-api/libraries/bit32/XOR.png | 3 - .../engine-comparisons/Studio-Properties.png | 3 - .../Unity-Editor-Layout.png | 3 - .../Unreal-Details-Panel.png | 3 - .../Unreal-Editor-Layout.png | 3 - .../en-us/assets/feeds/ads_manager.webp | 3 - .../en-us/assets/feeds/advertising.webp | 3 - .../en-us/assets/feeds/age-based-chat.webp | 3 - .../roblox/en-us/assets/feeds/age_chat.webp | 3 - .../assets/feeds/analytics_essentials.webp | 3 - .../roblox/en-us/assets/feeds/animations.webp | 3 - .../roblox/en-us/assets/feeds/asset_repo.webp | 3 - .../roblox/en-us/assets/feeds/assets.webp | 3 - .../en-us/assets/feeds/audio_speaker.webp | 3 - .../roblox/en-us/assets/feeds/autosetup.webp | 3 - .../roblox/en-us/assets/feeds/avatar.png | 3 - .../en-us/assets/feeds/avatar_items.webp | 3 - .../roblox/en-us/assets/feeds/avatars.webp | 3 - .../roblox/en-us/assets/feeds/bans_dash.webp | 3 - .../en-us/assets/feeds/blender_stream.webp | 3 - .../roblox/en-us/assets/feeds/boots.webp | 3 - .../en-us/assets/feeds/browse_store_dark.webp | 3 - .../assets/feeds/browse_store_light.webp | 3 - .../roblox/en-us/assets/feeds/caging.webp | 3 - .../en-us/assets/feeds/camera_manip.webp | 3 - .../en-us/assets/feeds/character_specs.webp | 3 - .../roblox/en-us/assets/feeds/characters.webp | 3 - .../roblox/en-us/assets/feeds/client_mem.webp | 3 - .../roblox/en-us/assets/feeds/clothing.webp | 3 - .../roblox/en-us/assets/feeds/code_org.webp | 3 - .../en-us/assets/feeds/collaboration.webp | 3 - .../en-us/assets/feeds/content_updates.webp | 3 - .../roblox/en-us/assets/feeds/core_loops.webp | 3 - .../assets/feeds/create_sliding_door.webp | 3 - .../roblox/en-us/assets/feeds/creator_hub.png | 3 - .../roblox/en-us/assets/feeds/data_model.webp | 3 - .../roblox/en-us/assets/feeds/datamodel.png | 3 - .../en-us/assets/feeds/datastores_mmo.webp | 3 - .../roblox/en-us/assets/feeds/debugger.webp | 3 - .../roblox/en-us/assets/feeds/debugging.webp | 3 - .../en-us/assets/feeds/developer_console.webp | 3 - .../en-us/assets/feeds/dynamic_cloth.webp | 3 - .../roblox/en-us/assets/feeds/engine.png | 3 - .../rules/roblox/en-us/assets/feeds/enyu.webp | 3 - .../en-us/assets/feeds/event_sequencer.webp | 3 - .../roblox/en-us/assets/feeds/events.webp | 3 - .../assets/feeds/forum_widget_thumbnail.png | 3 - .../feeds/forum_widget_thumbnail@2x.png | 3 - .../roblox/en-us/assets/feeds/fps_design.webp | 3 - .../en-us/assets/feeds/friend_invite.webp | 3 - .../en-us/assets/feeds/game_design.webp | 3 - .../feeds/generate_textures_with_ai.webp | 3 - .../assets/feeds/getting_started_ugc.webp | 3 - .../roblox/en-us/assets/feeds/graybox.webp | 3 - .../assets/feeds/halloween_game_jam.webp | 3 - .../roblox/en-us/assets/feeds/heads.webp | 3 - .../roblox/en-us/assets/feeds/input.webp | 3 - .../roblox/en-us/assets/feeds/laser_beam.png | 3 - .../assets/feeds/laser_beam_tutorial.png | 3 - .../en-us/assets/feeds/layered_clothing.webp | 3 - .../en-us/assets/feeds/lighting_effects.webp | 3 - .../en-us/assets/feeds/lighting_terrain.webp | 3 - .../en-us/assets/feeds/localization.webp | 3 - .../rules/roblox/en-us/assets/feeds/lod.webp | 3 - .../roblox/en-us/assets/feeds/luau_oop.webp | 3 - .../roblox/en-us/assets/feeds/luau_time.webp | 3 - .../roblox/en-us/assets/feeds/make_hair.webp | 3 - .../en-us/assets/feeds/making-a-bag.webp | 3 - .../en-us/assets/feeds/matchmaking.webp | 3 - .../en-us/assets/feeds/memory_leaks.webp | 3 - .../en-us/assets/feeds/microprofiler.webp | 3 - .../assets/feeds/microprofiler_advanced.webp | 3 - .../assets/feeds/microprofiler_how_to.webp | 3 - .../feeds/microprofiler_memory_profiling.webp | 3 - .../assets/feeds/modulescripts_sleit.webp | 3 - .../roblox/en-us/assets/feeds/npc_kit.webp | 3 - .../roblox/en-us/assets/feeds/obby_chat.webp | 3 - .../assets/feeds/performance_basics.webp | 3 - .../en-us/assets/feeds/physics_101.webp | 3 - .../roblox/en-us/assets/feeds/players.webp | 3 - .../roblox/en-us/assets/feeds/plugins.webp | 3 - .../en-us/assets/feeds/polarcub_store.webp | 3 - .../assets/feeds/polish_environment.webp | 3 - .../roblox/en-us/assets/feeds/promotion.webp | 3 - .../assets/feeds/real_world_optimization.webp | 3 - .../en-us/assets/feeds/rewarded_ads.webp | 3 - .../roblox/en-us/assets/feeds/rigging.webp | 3 - .../en-us/assets/feeds/rigid_accessory.webp | 3 - .../assets/feeds/robloxYoutubeAvatar.webp | 3 - .../en-us/assets/feeds/roblox_studio.webp | 3 - .../en-us/assets/feeds/rp_interview.webp | 3 - .../en-us/assets/feeds/rp_modeling.webp | 3 - .../en-us/assets/feeds/rp_texturing.webp | 3 - .../roblox/en-us/assets/feeds/rush_ugc.webp | 3 - .../en-us/assets/feeds/script_editor.webp | 3 - .../en-us/assets/feeds/script_locations.webp | 3 - .../roblox/en-us/assets/feeds/scripting.webp | 3 - .../roblox/en-us/assets/feeds/shoes.webp | 3 - .../assets/feeds/single_multi_script.webp | 3 - .../roblox/en-us/assets/feeds/sketch.png | 3 - .../en-us/assets/feeds/smooth_damp.webp | 3 - .../en-us/assets/feeds/social_design.webp | 3 - .../en-us/assets/feeds/stephen_remotes.webp | 3 - .../en-us/assets/feeds/studio_comments.webp | 3 - .../en-us/assets/feeds/studio_icon.webp | 3 - .../en-us/assets/feeds/studio_shortcuts.webp | 3 - .../roblox/en-us/assets/feeds/studio_tour.png | 3 - .../en-us/assets/feeds/studio_upsell.webp | 3 - .../assets/feeds/subscription_design.webp | 3 - .../en-us/assets/feeds/terrain_editor.webp | 3 - .../roblox/en-us/assets/feeds/tutorials.png | 3 - .../en-us/assets/feeds/ugc_homestore.webp | 3 - .../roblox/en-us/assets/feeds/ui_style.webp | 3 - .../roblox/en-us/assets/feeds/user_base.webp | 3 - .../roblox/en-us/assets/feeds/validation.webp | 3 - .../en-us/assets/feeds/version_control.webp | 3 - .../en-us/assets/feeds/video_previews.webp | 3 - .../roblox/en-us/assets/feeds/workspace.webp | 3 - .../en-us/assets/feeds/world_building.webp | 3 - .../balancing-virtual-economies-1.png | 3 - .../balancing-virtual-economies-2.png | 3 - .../balancing-virtual-economies-3.png | 3 - .../balancing-virtual-economies-4.png | 3 - .../content-update/content-update1.jpg | 3 - .../content-update/content-update2.png | 3 - .../content-update/content-update3.png | 3 - .../content-update/content-update4.jpg | 3 - .../content-update/content-update5.jpg | 3 - .../content-update/content-update6.png | 3 - .../contextual-purchases-1.png | 3 - .../contextual-purchases-12.png | 3 - .../contextual-purchases-13.png | 3 - .../contextual-purchases-2.png | 3 - .../contextual-purchases-3.png | 3 - .../contextual-purchases-4.png | 3 - .../contextual-purchases-5.png | 3 - .../contextual-purchases-6.png | 3 - .../contextual-purchases-7.png | 3 - .../contextual-purchases-8.png | 3 - .../contextual-purchases-9.png | 3 - .../game-design/core-loops/core-loops1.png | 3 - .../game-design/core-loops/core-loops2.png | 3 - .../game-design/core-loops/core-loops3.png | 3 - .../quest-design-0.png | 3 - .../quest-design-1.png | 3 - .../quest-design-10.png | 3 - .../quest-design-11.png | 3 - .../quest-design-2.png | 3 - .../quest-design-3.png | 3 - .../quest-design-4.png | 3 - .../quest-design-5.png | 3 - .../quest-design-7.png | 3 - .../quest-design-8.png | 3 - .../quest-design-9.png | 3 - .../live-ops-communication.png | 3 - .../live-ops-planning/live-ops-planning.png | 3 - .../game-design/live-ops/live-ops-1.png | 3 - .../game-design/live-ops/live-ops-2.png | 3 - .../game-design/live-ops/live-ops-3.png | 3 - .../game-design/live-ops/live-ops-4.png | 3 - .../monetization-foundation-0.png | 3 - .../monetization-foundation-1.png | 3 - .../monetization-foundation-10.png | 3 - .../monetization-foundation-11.png | 3 - .../monetization-foundation-12.png | 3 - .../monetization-foundation-13.png | 3 - .../monetization-foundation-14.png | 3 - .../monetization-foundation-15.png | 3 - .../monetization-foundation-16.png | 3 - .../monetization-foundation-17.png | 3 - .../monetization-foundation-18.png | 3 - .../monetization-foundation-19.png | 3 - .../monetization-foundation-2.png | 3 - .../monetization-foundation-20.png | 3 - .../monetization-foundation-21.png | 3 - .../monetization-foundation-22.png | 3 - .../monetization-foundation-23.png | 3 - .../monetization-foundation-24.png | 3 - .../monetization-foundation-3.png | 3 - .../monetization-foundation-4.png | 3 - .../monetization-foundation-5.png | 3 - .../monetization-foundation-6.png | 3 - .../monetization-foundation-7.png | 3 - .../monetization-foundation-8.png | 3 - .../monetization-foundation-9.png | 3 - .../contextual-tutorial-1.png | 3 - .../contextual-tutorial-2.png | 3 - .../contextual-tutorial-3.png | 3 - .../contextual-tutorial-4.png | 3 - .../onboarding-techniques/timed-hints-1.png | 3 - .../onboarding-techniques/timed-hints-2.png | 3 - .../onboarding-techniques/timed-hints-3.png | 3 - .../onboarding-techniques/timed-hints-4.png | 3 - .../visual-elements-1.png | 3 - .../visual-elements-2.png | 3 - .../visual-elements-3.png | 3 - .../visual-elements-4.png | 3 - .../visual-elements-5.png | 3 - .../visual-elements-6.png | 3 - .../visual-elements-7.png | 3 - .../game-design/onboarding/onboarding_1.png | 3 - .../game-design/onboarding/onboarding_2.png | 3 - .../game-design/onboarding/onboarding_3.png | 3 - .../game-design/onboarding/onboarding_4.png | 3 - .../game-design/prototyping/prototyping-1.png | 3 - .../game-design/prototyping/prototyping-2.png | 3 - .../game-design/prototyping/prototyping-3.png | 3 - .../game-design/prototyping/prototyping-4.png | 3 - .../season-pass-design-0.png | 3 - .../season-pass-design-1.png | 3 - .../season-pass-design-10.png | 3 - .../season-pass-design-12.png | 3 - .../season-pass-design-13.png | 3 - .../season-pass-design-14.png | 3 - .../season-pass-design-2.png | 3 - .../season-pass-design-4.png | 3 - .../season-pass-design-5.png | 3 - .../season-pass-design-6.png | 3 - .../season-pass-design-7.png | 3 - .../season-pass-design-8.png | 3 - .../season-pass-design-9.png | 3 - .../season-pass-design-ui1.png | 3 - .../season-pass-design-ui2.png | 3 - .../season-pass-design/season-pass-design.pdf | 3 - .../season-pass-spreadsheet-.xlsx | 3 - .../season-pass-design/season-pass-ui.pdf | 3 - .../subscriptions/subscriptions-1.png | 3 - .../subscriptions/subscriptions-2.png | 3 - .../subscriptions/subscriptions-3.png | 3 - .../subscriptions/subscriptions-4.png | 3 - .../ui-ux-design/ui-ux-design-1.png | 3 - .../ui-ux-design/ui-ux-design-10.png | 3 - .../ui-ux-design/ui-ux-design-11.png | 3 - .../ui-ux-design/ui-ux-design-12.png | 3 - .../ui-ux-design/ui-ux-design-13.png | 3 - .../ui-ux-design/ui-ux-design-14.png | 3 - .../ui-ux-design/ui-ux-design-15.png | 3 - .../ui-ux-design/ui-ux-design-16.png | 3 - .../ui-ux-design/ui-ux-design-17.png | 3 - .../ui-ux-design/ui-ux-design-18-video.mp4 | 3 - .../ui-ux-design/ui-ux-design-2.png | 3 - .../ui-ux-design/ui-ux-design-3.png | 3 - .../ui-ux-design/ui-ux-design-4.png | 3 - .../ui-ux-design/ui-ux-design-6.png | 3 - .../ui-ux-design/ui-ux-design-7.png | 3 - .../ui-ux-design/ui-ux-design-8.png | 3 - .../ui-ux-design/ui-ux-design-9.png | 3 - .../getting-started/AssetPack-Catapult.jpg | 3 - .../getting-started/AssetPack-Platform.jpg | 3 - .../getting-started/AssetPack-Projectiles.jpg | 3 - .../getting-started/AssetPack-Viewport.jpg | 3 - .../Baseplate-Template-Icon.png | 3 - .../assets/getting-started/Baseplate-Tile.png | 3 - .../getting-started/Course-Completed.jpg | 3 - .../assets/getting-started/Course-Gravity.mp4 | 3 - .../getting-started/Course-No-Baseplate.jpg | 3 - .../assets/getting-started/DataModel-End.png | 3 - .../getting-started/DataModel-Start.png | 3 - .../getting-started/DataModel-Workspace.png | 3 - .../Experience-Page-Default.jpg | 3 - .../getting-started/First-Inserted-Part.jpg | 3 - .../getting-started/First-Part-Moved.jpg | 3 - .../getting-started/First-Part-Rotated.jpg | 3 - .../getting-started/First-Part-Scaled.jpg | 3 - .../getting-started/First-Part-Styled.jpg | 3 - .../getting-started/ModernCity-Tile.png | 3 - .../New-Template-With-Spawn-Location.jpg | 3 - .../en-us/assets/getting-started/Overview.jpg | 3 - .../getting-started/Projectile-TooClose.mp4 | 3 - .../getting-started/Projectile-TooFar.mp4 | 3 - .../assets/getting-started/Projectiles-1.jpg | 3 - .../assets/getting-started/Projectiles-2.jpg | 3 - .../assets/getting-started/Projectiles-3.mp4 | 3 - .../assets/getting-started/Publish-2A.png | 3 - .../assets/getting-started/Publish-2B.png | 3 - .../assets/getting-started/Racing-Tile.png | 3 - .../assets/getting-started/Scripts-1.png | 3 - .../assets/getting-started/Scripts-2.png | 3 - .../assets/getting-started/Scripts-3.png | 3 - .../assets/getting-started/Scripts-5B.mp4 | 3 - .../assets/getting-started/Scripts-5C.mp4 | 3 - .../assets/getting-started/Targets-1B.png | 3 - .../assets/getting-started/Targets-1C.jpg | 3 - .../assets/getting-started/Targets-2.jpg | 3 - .../assets/getting-started/Targets-3.jpg | 3 - .../Workspace-Baseplate-Selected.png | 3 - .../Global-User-Community-Chart.jpg | 3 - .../Percentage-O13-Users-Chart.jpg | 3 - .../platform-overview/Community.jpg | 3 - .../platform-overview/Everything-You-Need.jpg | 3 - .../platform-overview/Everything-You-Need.png | 3 - .../Instant-Global-Access.jpg | 3 - .../platform-overview/Rapid-Iteration.jpg | 3 - .../platform-overview/Rapid-Iteration.png | 3 - .../assets/ip-licensing/AddIPToIPFamily.png | 3 - .../en-us/assets/ip-licensing/AddLicense.png | 3 - .../assets/ip-licensing/AddLicenseStep.png | 3 - .../assets/ip-licensing/AvailableLicenses.png | 3 - .../assets/ip-licensing/BlueLockLogo.png | 3 - .../assets/ip-licensing/CreateIPFamily.png | 3 - .../assets/ip-licensing/CreateIPFamily2.png | 3 - .../ip-licensing/CreateIPFamily_NoFlow.png | 3 - .../ip-licensing/CreateIPFamily_YesFlow.png | 3 - .../assets/ip-licensing/CreateLicense.png | 3 - .../assets/ip-licensing/CreateListing.png | 3 - .../assets/ip-licensing/CreateListingStep.png | 3 - .../assets/ip-licensing/ExploreLicenses.png | 3 - .../roblox/en-us/assets/ip-licensing/Fall.png | 3 - .../en-us/assets/ip-licensing/IPFamilies.png | 3 - .../en-us/assets/ip-licensing/IPLicensing.mp4 | 3 - .../ip-licensing/IPRegistrationFlow.png | 3 - .../ip-licensing/IPRegistrationPage.png | 3 - .../assets/ip-licensing/LicenseListing.png | 3 - .../assets/ip-licensing/LicensesCatalog.png | 3 - .../assets/ip-licensing/LicensesPage.png | 3 - .../en-us/assets/ip-licensing/bluelock.png | 3 - .../en-us/assets/ip-licensing/catalog.png | 3 - .../en-us/assets/ip-licensing/kodansha.png | 3 - .../en-us/assets/ip-licensing/lionsgate.jpg | 3 - .../en-us/assets/ip-licensing/logo-dark.png | 3 - .../en-us/assets/ip-licensing/logo-light.png | 3 - .../en-us/assets/ip-licensing/rivals.png | 3 - .../assets/landing/Avatar_Banner_Landing.jpg | 3 - .../assets/landing/Cloud_Banner_Landing.jpg | 3 - .../assets/landing/Data-Model-Mapping.png | 3 - .../assets/landing/Exp_Banner_Landing.jpg | 3 - .../assets/landing/Growth_Banner_Landing.jpg | 3 - .../en-us/assets/landing/affiliate-link.webp | 3 - .../en-us/assets/landing/aged-up-avatar.jpg | 3 - .../rules/roblox/en-us/assets/landing/app.jpg | 3 - .../roblox/en-us/assets/landing/assets.png | 3 - .../en-us/assets/landing/avatar-play.jpg | 3 - .../en-us/assets/landing/blender-logo.png | 3 - .../en-us/assets/landing/chat-translation.jpg | 3 - .../en-us/assets/landing/cloud/banner.jpg | 3 - .../en-us/assets/landing/core-experience.png | 3 - .../roblox/en-us/assets/landing/datamodel.png | 3 - .../en-us/assets/landing/device-family.png | 3 - .../roblox/en-us/assets/landing/discovery.jpg | 3 - .../rules/roblox/en-us/assets/landing/ebp.jpg | 3 - .../en-us/assets/landing/education/banner.jpg | 3 - .../assets/landing/engine-simulation.gif | 3 - .../en-us/assets/landing/engine/banner.jpg | 3 - .../get-started/Laser-Tag-Template.jpg | 3 - .../get-started/Platformer-Template.png | 3 - .../landing/get-started/Racing-Detailed.jpg | 3 - .../get-started/baseplate-template.png | 3 - .../landing/get-started/first-experience.png | 3 - .../get-started/modern-city-template.png | 3 - .../landing/get-started/racing-template.png | 3 - .../assets/landing/get-started/studio.png | 3 - .../landing/get-started/video-interviews.jpg | 3 - .../roblox/en-us/assets/landing/groups.jpg | 3 - .../en-us/assets/landing/guides/banner.jpg | 3 - .../home/articleBanner_announcements.png | 3 - .../landing/home/articleBanner_avatar.png | 3 - .../home/articleBanner_building_visuals.png | 3 - .../articleBanner_education_tutorials.png | 3 - .../landing/home/articleBanner_open_cloud.png | 3 - .../landing/home/articleBanner_production.png | 3 - .../landing/home/articleBanner_scripting.png | 3 - .../landing/home/articleBanner_studio.png | 3 - .../en-us/assets/landing/home/banner.jpg | 3 - .../assets/landing/home/creator-store.jpg | 3 - .../en-us/assets/landing/home/discover.jpg | 3 - .../home/started_creator_dashboard.jpg | 3 - .../assets/landing/home/started_studio.jpg | 3 - .../assets/landing/home/topic_avatar.jpg | 3 - .../landing/home/topic_building_visuals.jpg | 3 - .../assets/landing/home/topic_education.jpg | 3 - .../assets/landing/home/topic_production.jpg | 3 - .../assets/landing/home/topic_scripting.jpg | 3 - .../roblox/en-us/assets/landing/hub-home.jpg | 3 - .../assets/landing/in-exp-monetization.jpg | 3 - .../en-us/assets/landing/limited-items.png | 3 - .../en-us/assets/landing/marketplace.jpg | 3 - .../assets/landing/monetization/hero.png | 3 - .../landing/monetization/testimonial1.jpg | 3 - .../landing/monetization/testimonial2.jpg | 3 - .../landing/monetization/testimonial3.png | 3 - .../landing/monetization/testimonial4.png | 3 - .../roblox/en-us/assets/landing/plugins.jpg | 3 - .../en-us/assets/landing/price-floors.png | 3 - .../assets/landing/scripting-animation.gif | 3 - .../roblox/en-us/assets/landing/scripting.png | 3 - .../en-us/assets/landing/sponsored-items.jpg | 3 - .../roblox/en-us/assets/landing/store.jpg | 3 - .../en-us/assets/landing/ugchomestore.jpeg | 3 - .../aero-fluid-dynamics/Global-Wind-Gusts.mp4 | 3 - .../Global-Wind-Particles.mp4 | 3 - .../Global-Wind-Showcase.mp4 | 3 - .../Wind-Direction-Widget.jpg | 3 - .../atmosphere/Color-A.jpg | 3 - .../atmosphere/Color-B.jpg | 3 - .../atmosphere/Decay-A.jpg | 3 - .../atmosphere/Decay-B.jpg | 3 - .../atmosphere/Density-A.jpg | 3 - .../atmosphere/Density-B.jpg | 3 - .../atmosphere/Glare-A.jpg | 3 - .../atmosphere/Glare-B.jpg | 3 - .../atmosphere/Haze-A.jpg | 3 - .../atmosphere/Haze-B.jpg | 3 - .../atmosphere/Offset-A.jpg | 3 - .../atmosphere/Offset-B.jpg | 3 - .../atmosphere/Sahara-Sunset.jpg | 3 - .../atmosphere/Showcase.jpg | 3 - .../beam/Attachments-Rotated.png | 3 - .../beam/ColorSequence-Applied.png | 3 - .../beam/Curves-Applied.png | 3 - .../beam/Default-Beam.png | 3 - .../lighting-and-effects/beam/FaceCamera.mp4 | 3 - .../lighting-and-effects/beam/Showcase.mp4 | 3 - .../beam/Texture-Applied.png | 3 - .../beam/Transparency-Applied.png | 3 - .../beam/Width-Adjusted.png | 3 - .../lighting-and-effects/clouds/Color-A.jpg | 3 - .../lighting-and-effects/clouds/Color-B.jpg | 3 - .../lighting-and-effects/clouds/Cover-A.jpg | 3 - .../lighting-and-effects/clouds/Cover-B.jpg | 3 - .../lighting-and-effects/clouds/Density-A.jpg | 3 - .../lighting-and-effects/clouds/Density-B.jpg | 3 - .../lighting-and-effects/clouds/Showcase.mp4 | 3 - .../light-sources/Light-Brightness-10.jpg | 3 - .../light-sources/Light-Brightness-2.jpg | 3 - .../light-sources/Light-Brightness-50.jpg | 3 - .../light-sources/Light-Color-0-255-125.jpg | 3 - .../light-sources/Light-Color-255-100-50.jpg | 3 - .../light-sources/Light-Color-75-150-255.jpg | 3 - .../light-sources/Light-Shadows-False.jpg | 3 - .../light-sources/Light-Shadows-True.jpg | 3 - .../light-sources/PointLight-Range-12.jpg | 3 - .../light-sources/PointLight-Range-8.jpg | 3 - .../light-sources/Showcase.jpg | 3 - .../light-sources/SpotLight-Angle-30.jpg | 3 - .../light-sources/SpotLight-Angle-75.jpg | 3 - .../light-sources/SpotLight-Face-Bottom.jpg | 3 - .../light-sources/SpotLight-Face-Left.jpg | 3 - .../light-sources/SurfaceLight-Angle-0.jpg | 3 - .../SurfaceLight-Face-Bottom.jpg | 3 - .../light-sources/SurfaceLight-Face-Right.jpg | 3 - .../lighting-properties/Ambient-0-0-0.jpg | 3 - .../lighting-properties/Ambient-160-80-0.jpg | 3 - .../lighting-properties/Ambient-25-0-125.jpg | 3 - .../lighting-properties/Brightness-0.5.jpg | 3 - .../lighting-properties/Brightness-1.5.jpg | 3 - .../lighting-properties/Brightness-3.75.jpg | 3 - .../ColorShift-Bottom-0-255-190.jpg | 3 - .../ColorShift-Bottom-255-0-220.jpg | 3 - .../ColorShift-Top-0-100-255.jpg | 3 - .../ColorShift-Top-255-60-0.jpg | 3 - .../EnvironmentDiffuseScale-0.jpg | 3 - .../EnvironmentDiffuseScale-1.jpg | 3 - .../EnvironmentSpecularScale-0.jpg | 3 - .../EnvironmentSpecularScale-1.jpg | 3 - .../ExposureCompensation--1.jpg | 3 - .../ExposureCompensation-0.jpg | 3 - .../ExposureCompensation-1.25.jpg | 3 - .../Geographic-Latitude.mp4 | 3 - .../GlobalShadows-False.jpg | 3 - .../GlobalShadows-True.jpg | 3 - .../LightingStyle-Realistic.jpg | 3 - .../LightingStyle-Soft.jpg | 3 - .../OutdoorAmbient-0-175-255.jpg | 3 - .../OutdoorAmbient-200-150-240.jpg | 3 - .../OutdoorAmbient-255-150-50.jpg | 3 - .../lighting-properties/ShadowSoftness-0.jpg | 3 - .../lighting-properties/ShadowSoftness-1.jpg | 3 - .../lighting-properties/TimeOfDay-0.jpg | 3 - .../lighting-properties/TimeOfDay-17.jpg | 3 - .../lighting-properties/TimeOfDay-6.3.jpg | 3 - .../particle-emitter/8x8-Explosion.png | 3 - .../particle-emitter/Color-Examples.jpg | 3 - .../Cylinder-ShapePartial-0.5.jpg | 3 - .../Cylinder-ShapePartial-0.jpg | 3 - .../particle-emitter/Cylinder-Surface.jpg | 3 - .../particle-emitter/Cylinder-Volume.jpg | 3 - .../Disc-ShapePartial-0.1.jpg | 3 - .../Disc-ShapePartial-0.5.jpg | 3 - .../particle-emitter/Emission-Direction.mp4 | 3 - .../particle-emitter/Flipbook.mp4 | 3 - .../particle-emitter/LightEmission.mp4 | 3 - .../particle-emitter/Orientation.mp4 | 3 - .../particle-emitter/Shape-Box.jpg | 3 - .../particle-emitter/Shape-Cylinder.jpg | 3 - .../particle-emitter/Shape-Disc.jpg | 3 - .../particle-emitter/Shape-Sphere.jpg | 3 - .../particle-emitter/ShapeInOut.mp4 | 3 - .../particle-emitter/Showcase.mp4 | 3 - .../particle-emitter/Size-Envelope.mp4 | 3 - .../particle-emitter/Speed.mp4 | 3 - .../Sphere-ShapePartial-0.5.jpg | 3 - .../particle-emitter/SpreadAngle.mp4 | 3 - .../particle-emitter/Squash.mp4 | 3 - .../particle-emitter/Texture-Examples.mp4 | 3 - .../particle-emitter/Texture-Indicated.jpg | 3 - .../particle-emitter/Transparency.mp4 | 3 - .../post-processing/BloomEffect-With.jpg | 3 - .../post-processing/BloomEffect-Without.jpg | 3 - .../post-processing/BlurEffect-With.jpg | 3 - .../post-processing/BlurEffect-Without.jpg | 3 - .../ColorCorrectionEffect-With.jpg | 3 - .../ColorCorrectionEffect-Without.jpg | 3 - .../post-processing/ColorGrading-Default.jpg | 3 - .../post-processing/ColorGrading-Retro.jpg | 3 - .../DepthOfFieldEffect-With.jpg | 3 - .../DepthOfFieldEffect-Without.jpg | 3 - .../post-processing/Sun-Rays-Effect.mp4 | 3 - .../skybox/Skybox-Folded.png | 3 - .../skybox/Skybox-Orientation.mp4 | 3 - .../skybox/Skybox-Property-Faces.png | 3 - .../skybox/Skybox-Unfolded.png | 3 - .../trail/Attachment-Width-Between.mp4 | 3 - .../trail/Color-Static-Gradient.mp4 | 3 - .../lighting-and-effects/trail/Lifetime.mp4 | 3 - .../lighting-and-effects/trail/Showcase.mp4 | 3 - .../lighting-and-effects/trail/Textures.mp4 | 3 - .../localization/ATC-Studio-Disabled.png | 3 - .../localization/ATC-Studio-Enabled.png | 3 - .../localization/Add-Languages-Menu.png | 3 - .../assets/localization/Add-Languages.png | 3 - .../Automatic-Translation-Quotas.png | 3 - .../Change-Source-Language-Dropdown.png | 3 - .../assets/localization/Concept-Banner.jpg | 3 - .../Dynamic-Content-Example-A.jpg | 3 - .../Dynamic-Content-Example-B.jpg | 3 - .../Dynamic-Content-Example-C.jpg | 3 - ...Experience-Page-Configure-Localization.png | 3 - .../Game-Settings-Configure-Localization.png | 3 - .../In-Experience-Language-Switcher-Modal.png | 3 - .../In-Experience-Language-Switcher.png | 3 - .../Invite-User-As-Translator.png | 3 - .../assets/localization/Locale-Left-Nav.png | 3 - .../assets/localization/Locale-Source.png | 3 - .../localization/Locale-Translation.png | 3 - .../localization/Localized-Image-English.png | 3 - .../Localized-Image-Portuguese.png | 3 - .../localization/Localized-Image-Spanish.png | 3 - .../assets/localization/Lock-Translations.png | 3 - .../assets/localization/Parameter-Diagram.png | 3 - .../localization/Portal-Add-Source-String.png | 3 - .../Portal-Adding-Information-Thumbnail.png | 3 - .../Portal-Adding-Information.png | 3 - .../localization/Portal-Adding-Product.png | 3 - .../localization/Portal-Adding-String.png | 3 - .../Portal-Automatic-Translation.png | 3 - .../localization/Portal-Clear-Strings.png | 3 - .../localization/Portal-Enable-ATC-Auto.png | 3 - .../assets/localization/Portal-Enable-ATC.png | 3 - .../localization/Portal-Manually-Remove.png | 3 - .../assets/localization/Portal-Translate.png | 3 - .../Portal-Use-Translated-Content.png | 3 - .../localization/Translation-Reports.png | 3 - .../assets/localization/Translator-Portal.png | 3 - .../assets/localization/Translators-Tab.png | 3 - .../en-us/assets/localization/Update-Log.png | 3 - .../assets/makeup/Blender_Screenshot.png | 3 - .../en-us/assets/makeup/Creation-Steps-1.png | 3 - .../en-us/assets/makeup/Creation-Steps-2.png | 3 - .../en-us/assets/makeup/Creation-Steps-3.png | 3 - .../assets/makeup/Imported-DataModel.png | 3 - .../makeup/Makeup-Blender-Datamodel.png | 3 - .../makeup/Makeup-Character-Folders.png | 3 - .../en-us/assets/makeup/Makeup-Eye-Acc.png | 3 - .../makeup/Makeup-Eye-Accessory-Datamodel.png | 3 - .../assets/makeup/Makeup-Eye-Section.png | 3 - .../makeup/Makeup-Face-No-Highlights.png | 3 - .../assets/makeup/Makeup-Face-Section.png | 3 - .../assets/makeup/Makeup-Full-Render.png | 3 - .../assets/makeup/Makeup-Mouth-Section.png | 3 - .../assets/makeup/Makeup-Studio-Datamodel.png | 3 - .../makeup/caging-examples/Anthro-A.png | 3 - .../makeup/caging-examples/Anthro-B.png | 3 - .../makeup/caging-examples/Creatures-A.png | 3 - .../makeup/caging-examples/Creatures-B.png | 3 - .../assets/makeup/caging-examples/Ears-A.png | 3 - .../assets/makeup/caging-examples/Ears-B.png | 3 - .../makeup/caging-examples/Equidistant-A.png | 3 - .../makeup/caging-examples/Equidistant-B.png | 3 - .../makeup/caging-examples/Eye-Enclosed.png | 3 - .../makeup/caging-examples/Eye-Inner.png | 3 - .../Eyebrows-Layered-Clothing.png | 3 - .../caging-examples/Eyebrows-Textured.png | 3 - .../caging-examples/Eyebrows-head-tail.png | 3 - .../makeup/caging-examples/Hairline-A.png | 3 - .../makeup/caging-examples/Hairline-B.png | 3 - .../makeup/caging-examples/Hairline.png | 3 - .../makeup/caging-examples/Inorganic-A.png | 3 - .../makeup/caging-examples/Inorganic-B.png | 3 - .../makeup/caging-examples/Middle-axis.png | 3 - .../makeup/caging-examples/Missing-A.png | 3 - .../makeup/caging-examples/Missing-B.png | 3 - .../makeup/caging-examples/Missing-C.png | 3 - .../makeup/caging-examples/Missing-D.png | 3 - .../caging-examples/Missing-Eyebrows.png | 3 - .../caging-examples/Missing-Regions.jpg | 3 - .../assets/makeup/caging-examples/Mouth.png | 3 - .../assets/makeup/caging-examples/Neck-A.png | 3 - .../assets/makeup/caging-examples/Neck-B.png | 3 - .../makeup/caging-examples/Non-Vertex-A.png | 3 - .../makeup/caging-examples/Non-Vertex-B.png | 3 - .../assets/makeup/caging-examples/Nose.png | 3 - .../makeup/caging-examples/Paint-on-A.png | 3 - .../makeup/caging-examples/Paint-on-B.png | 3 - .../makeup/caging-examples/Primary-A.png | 3 - .../makeup/caging-examples/Primary-B.png | 3 - .../makeup/caging-examples/Tight-Cage-A.png | 3 - .../makeup/caging-examples/Tight-Cage-B.png | 3 - .../makeup/caging-examples/Vertex-A.png | 3 - .../makeup/caging-examples/Vertex-B.png | 3 - .../makeup/resources/Blender-Assign-New.png | 3 - .../resources/Blender-Expected-Nodes.png | 3 - .../resources/Blender-Select-Region.png | 3 - .../makeup/resources/Blender-Thumbnail.png | 3 - .../makeup/resources/Blender-Unlink-Image.png | 3 - .../assets/makeup/resources/Fbx-Thumbnail.png | 3 - .../resources/Makeup-Reference-Blender.zip | 3 - .../resources/Makeup-Reference-Fbx-Gltf.zip | 3 - .../resources/Makeup-Reference-Maya.zip | 3 - .../Makeup-Textures-Photoshop_Gimp.zip | 3 - .../Makeup-Textures-SubstancePainter.zip | 3 - .../makeup/resources/Maya-Expected-Nodes.png | 3 - .../makeup/resources/Maya-Replace-Texture.png | 3 - .../resources/Maya-Select-Graph-Network.png | 3 - .../resources/Maya-Select-Hypershade.png | 3 - .../makeup/resources/Maya-Thumbnail.png | 3 - .../makeup/resources/Photoshop-Thumbnail.png | 3 - .../makeup/resources/Substance-Thumbnail.png | 3 - .../matchmaking/CustomConfiguration_List.png | 3 - .../assets/matchmaking/Custom_Matchmaking.png | 3 - .../matchmaking/Default_Matchmaking.png | 3 - .../matchmaking/MatchmakingAnalytics.png | 3 - .../Matchmaking_Analytics_Chart.png | 3 - .../matchmaking/Matchmaking_Simulation.png | 3 - .../assets/matchmaking/Player_Attribute.png | 3 - .../matchmaking/Preview_Custom_Signal.png | 3 - .../assets/matchmaking/Server_Attribute.png | 3 - .../roblox/en-us/assets/misc/Arrow-High.png | 3 - .../roblox/en-us/assets/misc/Arrow-Higher.png | 3 - .../en-us/assets/misc/Arrow-Highest.png | 3 - .../roblox/en-us/assets/misc/Arrow-Low.png | 3 - .../roblox/en-us/assets/misc/Arrow-Lower.png | 3 - .../roblox/en-us/assets/misc/Arrow-Lowest.png | 3 - .../en-us/assets/misc/Arrow-Neutral.png | 3 - .../en-us/assets/misc/Audio-Error-Popup.png | 3 - .../roblox/en-us/assets/misc/Box-Label-A.png | 3 - .../roblox/en-us/assets/misc/Box-Label-B.png | 3 - .../roblox/en-us/assets/misc/Box-Label-C.png | 3 - .../roblox/en-us/assets/misc/Box-Label-D.png | 3 - .../roblox/en-us/assets/misc/Box-Label-E.png | 3 - .../roblox/en-us/assets/misc/Box-Label-F.png | 3 - .../roblox/en-us/assets/misc/Box-Label-G.png | 3 - .../en-us/assets/misc/Data-Share-Dialog.png | 3 - .../en-us/assets/misc/Mouse-Icon-Busy.png | 3 - .../assets/misc/Mouse-Icon-Crosshair.png | 3 - .../assets/misc/Mouse-Icon-Forbidden.png | 3 - .../assets/misc/Mouse-Icon-GrabbingHand.png | 3 - .../en-us/assets/misc/Mouse-Icon-IBeam.png | 3 - .../en-us/assets/misc/Mouse-Icon-OpenHand.png | 3 - .../en-us/assets/misc/Mouse-Icon-Pointer.png | 3 - .../assets/misc/Mouse-Icon-PointingHand.png | 3 - .../assets/misc/Mouse-Icon-ResizeAll.png | 3 - .../en-us/assets/misc/Mouse-Icon-ResizeEW.png | 3 - .../assets/misc/Mouse-Icon-ResizeNESW.png | 3 - .../en-us/assets/misc/Mouse-Icon-ResizeNS.png | 3 - .../assets/misc/Mouse-Icon-ResizeNWSE.png | 3 - .../assets/misc/Mouse-Icon-ResizeSplitH.png | 3 - .../assets/misc/Mouse-Icon-ResizeSplitV.png | 3 - .../en-us/assets/misc/Mouse-Icon-Wait.png | 3 - .../en-us/assets/misc/SA-Icon-Laser-Tag.jpg | 3 - .../en-us/assets/misc/SA-Icon-Racing.jpg | 3 - .../en-us/assets/misc/SA-Icon-Soccer.jpg | 3 - .../en-us/assets/misc/Todays-Picks-Home.png | 3 - .../assets/misc/Todays-Picks-Marketplace.png | 3 - .../assets/misc/Webhooks-Bot-Workflow.png | 3 - .../misc/Webhooks-Example-Message-Body.png | 3 - .../misc/Webhooks-Sample-Notification.png | 3 - .../en-us/assets/misc/blog_evergreen.png | 3 - .../cframes/CFrame-Front-Face-Pointing-A.png | 3 - .../cframes/CFrame-Front-Face-Pointing-B.png | 3 - .../assets/modeling/cframes/CFrame-Lerp-A.png | 3 - .../assets/modeling/cframes/CFrame-Lerp-B.png | 3 - .../cframes/CFrame-Other-Part-Offset-A.png | 3 - .../cframes/CFrame-Other-Part-Offset-B.png | 3 - .../CFrame-Other-Part-Relative-Position-A.png | 3 - .../CFrame-Other-Part-Relative-Position-B.png | 3 - .../modeling/cframes/CFrame-Self-Offset-A.png | 3 - .../modeling/cframes/CFrame-Self-Offset-B.png | 3 - .../modeling/cframes/CFrame-Self-Rotate-A.png | 3 - .../modeling/cframes/CFrame-Self-Rotate-B.png | 3 - .../cframes/CFrame-Strict-Position-A.png | 3 - .../cframes/CFrame-Strict-Position-B.png | 3 - .../cframes/CFrame-Strict-Rotation-A.png | 3 - .../cframes/CFrame-Strict-Rotation-B.png | 3 - .../cframes/CFrame-Top-Face-Pointing-A.png | 3 - .../cframes/CFrame-Top-Face-Pointing-B.png | 3 - .../Explorer-MaterialVariant-Instances.png | 3 - .../Material-Generator-Example-1A.jpg | 3 - .../Material-Generator-Example-1B.jpg | 3 - .../Material-Generator-Example-1C.jpg | 3 - .../Material-Generator-Example-1D.jpg | 3 - .../Material-Generator-Example-2A.jpg | 3 - .../Material-Generator-Example-2B.jpg | 3 - .../Material-Generator-Example-2C.jpg | 3 - .../Material-Generator-Example-2D.jpg | 3 - .../Material-Generator-Example-3A.jpg | 3 - .../Material-Generator-Example-3B.jpg | 3 - .../Material-Generator-Example-3C.jpg | 3 - .../Material-Generator-Example-3D.jpg | 3 - .../Material-Generator-Example-4A.jpg | 3 - .../Material-Generator-Example-4B.jpg | 3 - .../Material-Generator-Example-4C.jpg | 3 - .../Material-Generator-Example-4D.jpg | 3 - .../Material-Generator-Expanded-Options.png | 3 - .../Material-Generator-Preview-On-Part.jpg | 3 - .../materials/Material-Generator-Preview.mp4 | 3 - ...roperties-Material-And-MaterialVariant.png | 3 - ...operties-Part-CustomPhysicalProperties.png | 3 - .../Properties-Physical-Overridden.png | 3 - .../materials/Properties-View-Override.png | 3 - .../modeling/meshes/3d-Import-Queue.png | 3 - .../modeling/meshes/3d-Importer-Panels.png | 3 - .../meshes/Base-Mesh-In-Marketplace.png | 3 - .../meshes/Beyond-The-Dark-Example.png | 3 - .../meshes/Blender-Scale-Examples.png | 3 - .../modeling/meshes/Collar-Attachment-1.png | 3 - .../modeling/meshes/Collar-Attachment-2.png | 3 - .../modeling/meshes/Grip_Attachments.png | 3 - .../meshes/Mesh-SurfaceAppearance.jpg | 3 - .../assets/modeling/meshes/Mesh-Textured.jpg | 3 - .../meshes/Modeling-Requirements-Caps.png | 3 - .../meshes/Mystery-of-Duvall-Example.png | 3 - .../modeling/meshes/Properties-TextureID.png | 3 - .../assets/modeling/meshes/Reimport-menu.png | 3 - .../modeling/meshes/Render-Fidelity-High.jpg | 3 - .../modeling/meshes/Render-Fidelity-Low.jpg | 3 - .../meshes/Render-Fidelity-Medium.jpg | 3 - .../modeling/meshes/Warning-Mouse-Over.png | 3 - .../meshes/Warning-Settings-Panel.png | 3 - .../Compositor-Example-Optimized.png | 3 - .../Compositor-Example-Poor.png | 3 - .../mesh-requirements/Face-Tone-Beige.png | 3 - .../mesh-requirements/Face-Tone-Blue.png | 3 - .../mesh-requirements/Face-Tone-Brown.png | 3 - .../mesh-requirements/Face-Tone-Pink.png | 3 - .../Face-Tone-Transparent.png | 3 - .../mesh-requirements/UV-Island-Optimized.png | 3 - .../mesh-requirements/UV-Island-Poor.png | 3 - .../mesh-requirements/UV-Layout-Optimized.png | 3 - .../mesh-requirements/UV-Layout-Poor.png | 3 - .../meshes/mesh-requirements/UV_Grid_1024.png | 3 - .../meshes/mesh-requirements/UV_Grid_256.png | 3 - .../meshes/mesh-requirements/UV_Grid_512.png | 3 - .../reference-files/Body_Cage_Templates.zip | 3 - .../Clothing_Cage_Templates.zip | 3 - .../reference-files/Combined_Templates.zip | 3 - .../Rig_and_Attachments_Templates.zip | 3 - .../reference-files/lola-base-model.fbx | 3 - .../reference-files/lola-rigged-r15.blend | 3 - .../reference-files/lola-skinned-s15.blend | 3 - .../reference-files/shoebot-base-model.fbx | 3 - .../reference-files/shoebot-rigged-model.fbx | 3 - .../1-resizing-base-model.mp4 | 3 - .../rigging-humanoid/2-bone-visualization.mp4 | 3 - .../rigging-humanoid/3-x-axis-mirror.mp4 | 3 - .../4-repositioning-bones.mp4 | 3 - .../rigging-humanoid/5-inspect-bones.mp4 | 3 - .../rigging-humanoid/6-parenting-bones.mp4 | 3 - .../7-assign-influence-head.mp4 | 3 - .../rigging-humanoid/8-assign-influence.mp4 | 3 - .../meshes/rigging-humanoid/9-test-bones.mp4 | 3 - .../rigging-simple/1-setting-up-blender.mp4 | 3 - .../rigging-simple/2-adding-armature.mp4 | 3 - .../rigging-simple/3.1-positioning-bones.mp4 | 3 - .../rigging-simple/3.2-positioning-bones.mp4 | 3 - .../rigging-simple/3.3-positioning-bones.mp4 | 3 - .../meshes/rigging-simple/4-rename-bones.mp4 | 3 - .../rigging-simple/5-parenting-armature.mp4 | 3 - .../rigging-simple/6.1-assigning-vertices.mp4 | 3 - .../rigging-simple/6.2-assigning-vertices.mp4 | 3 - .../rigging-simple/6.3-assigning-vertices.mp4 | 3 - .../meshes/rigging-simple/7-testing.mp4 | 3 - .../rigging-simple/rigging-r1-imported.png | 3 - .../1-bone-visualizations.mp4 | 3 - .../10-weight-paint-lower-arm.mp4 | 3 - .../11-switch-to-upper-arm.mp4 | 3 - .../12-weight-paint-upper-arm.mp4 | 3 - .../13-switch-to-upper-torso.mp4 | 3 - .../14-weight-paint-upper-torso.mp4 | 3 - .../skinning-humanoid/2-auto-normalize.mp4 | 3 - .../skinning-humanoid/3-select-head.mp4 | 3 - .../skinning-humanoid/4-weight-paint-head.mp4 | 3 - .../meshes/skinning-humanoid/5-test-head.mp4 | 3 - .../6-select-hand-and-test.mp4 | 3 - .../skinning-humanoid/7-weight-paint-hand.mp4 | 3 - .../meshes/skinning-humanoid/8-test-hand.mp4 | 3 - .../9-switch-to-lower-arm.mp4 | 3 - .../skinning-humanoid/Candywrap-Example.png | 3 - .../autonormalize-example.mp4 | 3 - .../autonormalize-example2.mp4 | 3 - .../head-example-headbone-selected.png | 3 - .../head-example-uppertorso-selected.png | 3 - .../modeling/model-generation/Behaviors.rbxm | 3 - .../Green-Dragon-Car-Driving.mp4 | 3 - .../model-generation/Green-Dragon-Car.jpg | 3 - .../model-objects/LevelOfDetail-Actual.jpg | 3 - .../model-objects/LevelOfDetail-Imposter.jpg | 3 - .../model-objects/LevelOfDetail-Original.jpg | 3 - .../model-objects/LevelOfDetail-Slim.jpg | 3 - .../LevelOfDetail-StreamingMesh.jpg | 3 - .../model-objects/Model-Example-3D.jpg | 3 - .../model-objects/Model-Example-Hierarchy.png | 3 - .../model-objects/Model-Group-Simple.png | 3 - .../modeling/parts/Basic-Part-Block.png | 3 - .../parts/Basic-Part-Corner-Wedge.png | 3 - .../modeling/parts/Basic-Part-Cylinder.png | 3 - .../modeling/parts/Basic-Part-Sphere.png | 3 - .../modeling/parts/Basic-Part-Wedge.png | 3 - .../assets/modeling/parts/Material-Neon.png | 3 - .../modeling/parts/Material-SmoothPlastic.png | 3 - .../assets/modeling/parts/Mesh-Example.jpg | 3 - .../modeling/parts/Move-Local-Orientation.png | 3 - .../modeling/parts/Move-World-Orientation.png | 3 - .../modeling/parts/Part-Example-CSG.jpg | 3 - .../parts/Transform-Move-Cursor-Drag-Snap.png | 3 - .../parts/Transform-Move-Cursor-Drag-T-R.png | 3 - .../parts/Transform-Move-Indicator.png | 3 - .../parts/Transform-Move-Pivot-Snap.png | 3 - .../parts/Transform-Move-Ruler-Snap.png | 3 - .../modeling/parts/Transform-Move-SM.png | 3 - .../assets/modeling/parts/Transform-Move.png | 3 - .../modeling/parts/Transform-Rotate-SM.png | 3 - .../modeling/parts/Transform-Rotate.png | 3 - .../modeling/parts/Transform-Scale-SM.png | 3 - .../assets/modeling/parts/Transform-Scale.png | 3 - .../skinned-meshes/Adding-Armature.mp4 | 3 - .../Animation-Editor-Add-Tracks.png | 3 - .../Blender-Export-Settings-1.png | 3 - .../Blender-Export-Settings-2.png | 3 - .../Blender-Export-Settings-3.png | 3 - .../Blender-Export-Settings-4.png | 3 - .../Blender-Export-Settings-5.png | 3 - .../Blender-Scene-Units-Icon.png | 3 - .../Blender-Scene-Units-Settings.png | 3 - .../modeling/skinned-meshes/Bone-In-Front.mp4 | 3 - .../skinned-meshes/Bone-Visualization.png | 3 - .../skinned-meshes/Brush-Settings.png | 3 - .../skinned-meshes/Clothing-Data-Model.png | 3 - .../modeling/skinned-meshes/CreatureModel.fbx | 3 - .../skinned-meshes/Enabling-Autonormalize.mp4 | 3 - .../skinned-meshes/Extrude-Last-Bone.mp4 | 3 - .../skinned-meshes/Extrude-Second-Bone.mp4 | 3 - .../skinned-meshes/Head-Rigid-Example.mp4 | 3 - .../skinned-meshes/Head-Skinned-Example.mp4 | 3 - .../modeling/skinned-meshes/Import-Model.jpg | 3 - .../assets/modeling/skinned-meshes/Lola.fbx | 3 - .../modeling/skinned-meshes/MapleLeafTree.fbx | 3 - .../skinned-meshes/MapleLeafTree_S3.zip | 3 - .../modeling/skinned-meshes/MapleTreeS1.blend | 3 - .../skinned-meshes/Paint-Bottom-Bone.mp4 | 3 - .../skinned-meshes/Paint-Middle-Bone.mp4 | 3 - .../skinned-meshes/Paint-Top-Bone.mp4 | 3 - .../skinned-meshes/Parenting-Armature.mp4 | 3 - .../skinned-meshes/Position-First-Bone.mp4 | 3 - .../skinned-meshes/Renaming-Bones.mp4 | 3 - .../skinned-meshes/Rig-Bone-Visualization.jpg | 3 - .../skinned-meshes/Rig-Constraint-Details.jpg | 3 - .../skinned-meshes/Rig-Hierarchy-Blender.png | 3 - .../skinned-meshes/Rig-Hierarchy-Maya.png | 3 - .../Setting-Projected-Brush.mp4 | 3 - .../skinned-meshes/Shoe-Data-Model.png | 3 - .../skinned-meshes/Stick-Visualization.mp4 | 3 - .../modeling/skinned-meshes/Test-Bones.mp4 | 3 - .../skinned-meshes/Test-Bottom-Bone.mp4 | 3 - .../skinned-meshes/Transform-Demo-AE.mp4 | 3 - .../skinned-meshes/Transform-Demo-Default.mp4 | 3 - .../skinned-meshes/Transform-Demo-Skinned.mp4 | 3 - .../Weight-Painting-Example-Gradient.mp4 | 3 - .../calisthenic-tool/1_Hide-Armature.mp4 | 3 - .../calisthenic-tool/2_Set-Armature-Test.mp4 | 3 - .../3_Fix-Skinning-Example.mp4 | 3 - .../calisthenic-tool/Blender-Preferences.png | 3 - .../Calisthenics-Tool-Addon.png | 3 - .../Calisthenics-Tool-Open.png | 3 - .../calisthenic-tool/CalisthenicsTool.zip | 3 - .../calisthenic-tool/Exporting-Model.png | 3 - .../Fish-Character-No-FACS.fbx | 3 - .../calisthenic-tool/Movement-Reference.mp4 | 3 - .../calisthenic-tool/Normal-Reference.png | 3 - .../calisthenic-tool/Running-Reference.mp4 | 3 - .../calisthenic-tool/Slender-Reference.png | 3 - .../calisthenic-tool/Toolbar-Slider.png | 3 - .../calisthenic-tool/Walking-Reference.mp4 | 3 - .../solid-modeling/CSG-SmoothingAngle-0.jpg | 3 - .../solid-modeling/CSG-SmoothingAngle-50.jpg | 3 - .../solid-modeling/Intersect-Result.jpg | 3 - .../modeling/solid-modeling/Negate-Result.jpg | 3 - .../solid-modeling/Negated-Part-To-Union.jpg | 3 - .../Separate-Parts-To-Intersect.jpg | 3 - .../Separate-Parts-To-Subtract.jpg | 3 - .../Separate-Parts-To-Union.jpg | 3 - .../modeling/solid-modeling/Union-Result.jpg | 3 - .../surface-appearance/010_SilkSatin.png | 3 - .../surface-appearance/011_VelvetSuede.png | 3 - .../surface-appearance/012_GlossyLeather.png | 3 - .../surface-appearance/013_WornLeather.png | 3 - .../modeling/surface-appearance/014_Fur.png | 3 - .../surface-appearance/015_Scales.png | 3 - .../modeling/surface-appearance/016_Bone.png | 3 - .../modeling/surface-appearance/017_Skin.png | 3 - .../modeling/surface-appearance/018_Wax.png | 3 - .../surface-appearance/019_Marble.png | 3 - .../surface-appearance/01_GlossyPlastic.png | 3 - .../modeling/surface-appearance/020_Jade.png | 3 - .../surface-appearance/021_PaintedMetal.png | 3 - .../surface-appearance/022_PureMetals.png | 3 - .../surface-appearance/023_WornMetals.png | 3 - .../surface-appearance/024_GlassMirror.png | 3 - .../surface-appearance/02_MattePlastic.png | 3 - .../modeling/surface-appearance/03_Rubber.png | 3 - .../modeling/surface-appearance/04_Latex.png | 3 - .../surface-appearance/05_GlossyWood.png | 3 - .../surface-appearance/06_WornWood.png | 3 - .../07_CottonCanvasDenim.png | 3 - .../surface-appearance/08_PolyesterNylon.png | 3 - .../surface-appearance/09_WoolLinen.png | 3 - .../Custom-Skin-Tone-Example.png | 3 - .../Custom-Skin-Tone-Map.png | 3 - .../surface-appearance/Denim-Jacket-Sp.png | 3 - .../surface-appearance/Denim-Jacket-St.png | 3 - .../Gold-Puffy-Jacket-Sp.png | 3 - .../Gold-Puffy-Jacket-St.png | 3 - .../surface-appearance/Green-Jacket-Sp.png | 3 - .../surface-appearance/Green-Jacket-St.png | 3 - .../Layered-Clothing-Example-2.jpg | 3 - .../Layered-Clothing-Example.png | 3 - .../surface-appearance/Leather-Jacket-Sp.png | 3 - .../surface-appearance/Leather-Jacket-St.png | 3 - .../surface-appearance/Metalness-0.png | 3 - .../surface-appearance/Metalness-1.png | 3 - .../surface-appearance/Metalness-Half.png | 3 - .../modeling/surface-appearance/Normal-0.png | 3 - .../modeling/surface-appearance/Normal-1.png | 3 - .../surface-appearance/Normal-Half.png | 3 - .../surface-appearance/Normal-Map-0.png | 3 - .../surface-appearance/Normal-Map-1.png | 3 - .../surface-appearance/Normal-Map-Half.png | 3 - .../modeling/surface-appearance/Opacity-0.png | 3 - .../modeling/surface-appearance/Opacity-1.png | 3 - .../surface-appearance/Opacity-Half.png | 3 - .../surface-appearance/OpacityTexture-0.png | 3 - .../surface-appearance/OpacityTexture-1.png | 3 - .../OpacityTexture-Half.png | 3 - .../surface-appearance/Roughness-0.png | 3 - .../surface-appearance/Roughness-1.png | 3 - .../surface-appearance/Roughness-Half.png | 3 - .../Roughness-Metalness-Matrix.png | 3 - .../SurfaceAppearance-AlphaMode-ColorMap.png | 3 - ...eAppearance-AlphaMode-Gradient-Overlay.jpg | 3 - ...Appearance-AlphaMode-Gradient-TintMask.jpg | 3 - ...arance-AlphaMode-Gradient-Transparency.jpg | 3 - .../SurfaceAppearance-AlphaMode-Overlay.jpg | 3 - ...rance-AlphaMode-TintMask-Bricks-Albedo.jpg | 3 - ...arance-AlphaMode-TintMask-Bricks-Alpha.jpg | 3 - ...ceAppearance-AlphaMode-TintMask-Bricks.jpg | 3 - .../SurfaceAppearance-ColorMap-After.jpg | 3 - .../SurfaceAppearance-ColorMap-Before.jpg | 3 - .../SurfaceAppearance-ColorMap.jpg | 3 - .../SurfaceAppearance-Example-1.jpg | 3 - .../SurfaceAppearance-Example-3.jpg | 3 - .../SurfaceAppearance-MetalnessMap-After.jpg | 3 - .../SurfaceAppearance-MetalnessMap-Before.jpg | 3 - .../SurfaceAppearance-MetalnessMap.jpg | 3 - .../SurfaceAppearance-NormalMap-After.jpg | 3 - .../SurfaceAppearance-NormalMap-Before.jpg | 3 - .../SurfaceAppearance-NormalMap.jpg | 3 - .../SurfaceAppearance-Opaque-After.jpg | 3 - .../SurfaceAppearance-Opaque-Before.jpg | 3 - .../SurfaceAppearance-Opaque-ColorMap.jpg | 3 - .../SurfaceAppearance-RoughnessMap-After.jpg | 3 - .../SurfaceAppearance-RoughnessMap-Before.jpg | 3 - .../SurfaceAppearance-RoughnessMap.png | 3 - .../surface-appearance/Tinting-Green.png | 3 - .../surface-appearance/Tinting-None.png | 3 - .../surface-appearance/Tinting-Red.png | 3 - .../terrain/Custom-Colors-Fantasy.jpg | 3 - .../modeling/terrain/Custom-Colors-Tundra.jpg | 3 - .../assets/modeling/terrain/Material-Air.png | 3 - .../modeling/terrain/Material-Asphalt.jpg | 3 - .../modeling/terrain/Material-Basalt.jpg | 3 - .../modeling/terrain/Material-Brick.jpg | 3 - .../modeling/terrain/Material-Cobblestone.jpg | 3 - .../modeling/terrain/Material-Concrete.jpg | 3 - .../terrain/Material-Cracked-Lava.jpg | 3 - .../modeling/terrain/Material-Glacier.jpg | 3 - .../modeling/terrain/Material-Grass.jpg | 3 - .../modeling/terrain/Material-Ground.jpg | 3 - .../assets/modeling/terrain/Material-Ice.jpg | 3 - .../modeling/terrain/Material-Leafy-Grass.jpg | 3 - .../modeling/terrain/Material-Limestone.jpg | 3 - .../assets/modeling/terrain/Material-Mud.jpg | 3 - .../modeling/terrain/Material-Pavement.jpg | 3 - .../assets/modeling/terrain/Material-Rock.jpg | 3 - .../assets/modeling/terrain/Material-Salt.jpg | 3 - .../assets/modeling/terrain/Material-Sand.jpg | 3 - .../modeling/terrain/Material-Sandstone.jpg | 3 - .../modeling/terrain/Material-Slate.jpg | 3 - .../assets/modeling/terrain/Material-Snow.jpg | 3 - .../modeling/terrain/Material-Water.jpg | 3 - .../modeling/terrain/Material-Wood-Planks.jpg | 3 - .../modeling/terrain/RobloxColorMapIndex.png | 3 - .../assets/modeling/terrain/Showcase.jpg | 3 - .../terrain/Terrain-Colormap-Result.jpg | 3 - .../modeling/terrain/Terrain-Colormap.png | 3 - .../modeling/terrain/Terrain-GrassLength.jpg | 3 - .../modeling/terrain/Terrain-Heightmap.png | 3 - .../modeling/terrain/Water-Appearance.mp4 | 3 - .../textures-decals/Animated-Textures.mp4 | 3 - .../Blender-Add-Image-Texture.png | 3 - .../textures-decals/Blender-Add-Normal.png | 3 - .../Blender-Create-New-Material.png | 3 - .../Blender-Image-Texture-No-Assignment.png | 3 - .../Blender-Material-Check.png | 3 - .../textures-decals/Blender-Shading-Tab.png | 3 - .../textures-decals/Decal-On-Surface.jpg | 3 - .../Decal-Texture-Sample-1.png | 3 - .../Decal-Texture-Sample-2.png | 3 - .../textures-decals/Maya-Assign-Material.png | 3 - .../modeling/textures-decals/Maya-Bump-2D.png | 3 - .../textures-decals/Maya-Connect-Nodes.png | 3 - .../textures-decals/Maya-Create-Surface.png | 3 - .../Maya-Tangent-Space-Normals.png | 3 - .../textures-decals/Orientation-Indicator.jpg | 3 - .../Texture-Color3-255-0-100.jpg | 3 - .../Texture-Example-Grafitti04.png | 3 - .../textures-decals/Texture-Face-Front.jpg | 3 - .../textures-decals/Texture-Face-Top.jpg | 3 - .../textures-decals/Texture-On-Surface.jpg | 3 - .../Texture-Sample-Offset-1.png | 3 - .../Texture-Sample-Offset-2.png | 3 - .../Texture-Sample-Scale-1.png | 3 - .../Texture-Sample-Scale-2.png | 3 - .../Texture-Transparency-0.4.jpg | 3 - .../Avatar-Creation-Token-Copy-ID.png | 3 - .../Avatar-Creation-Token-Prices.png | 3 - .../avatar-items/Avatar-Items-Enable.png | 3 - .../Linked-Avatar-Items-Example.png | 3 - .../avatar-items/avatar-item-analytics-3.png | 3 - .../avatar-items/avatar-items-analytics-2.png | 3 - .../avatar-items/avatar-items-analytics.png | 3 - .../commerce-products/Commerce-Product-ID.png | 3 - .../Commerce-Product-Metafield-Example.png | 3 - .../Commerce-Product-PDP-Diagram.png | 3 - .../Commerce-Product-Put-On-Sale.png | 3 - .../Commerce-Product-Virtual-Benefits.png | 3 - .../creator-rewards/dashboard.png | 3 - .../creator-rewards/share-links.png | 3 - .../Buy-Product-Example.jpg | 3 - .../developer-products/RankedItems.png | 3 - .../developer-products/StoreTopPicks.png | 3 - .../developer-products-analytics-2.png | 3 - .../developer-products-analytics.png | 3 - .../earning/Average-Cash-Payouts.png | 3 - .../earning/Earning-Flowchart.png | 3 - .../Economy-Stats-Creator-Earnings.png | 3 - .../earning/Economy-Stats-DAU.png | 3 - .../earning/Monetization-Growth-CAGR.png | 3 - .../Percentages-Clothes-Accessories.png | 3 - .../Percentages-Reselling-Limiteds.png | 3 - .../earning/Virtual-Items-Odds.png | 3 - .../Modal-Example.jpg | 3 - .../Premium-Banner.jpg | 3 - .../engagement-based-payouts-2.png | 3 - .../immersive-ads/ImageAds-Active.jpg | 3 - .../immersive-ads/ImageAds-Inactive.jpg | 3 - .../immersive-ads/ImageAds-Invalid.jpg | 3 - .../immersive-ads/ImageAds-Sample.jpg | 3 - .../immersive-ads/Inserting-ImageAd.jpg | 3 - .../immersive-ads/Inserting-PortalAd.jpg | 3 - .../immersive-ads/Overview-ImageAd.jpg | 3 - .../immersive-ads/Overview-PortalAd.mp4 | 3 - .../immersive-ads/Overview-UserA.jpg | 3 - .../immersive-ads/Overview-UserB.jpg | 3 - .../immersive-ads/Overview-UserC.jpg | 3 - .../immersive-ads/Portal-Ads-BasePortal.png | 3 - .../immersive-ads/Portal-Ads-Decorative.png | 3 - .../immersive-ads/PortalAds-Active.jpg | 3 - .../immersive-ads/PortalAds-Inactive.png | 3 - .../immersive-ads/PortalAds-Invalid.png | 3 - .../immersive-ads/PortalAds-Sample1.png | 3 - .../immersive-ads/PortalAds-Sample2.jpg | 3 - .../immersive-ads/ViewingMetrics-Graph.png | 3 - .../immersive-ads-eligibility.png | 3 - .../paid-access/Buy-Access-Example.png | 3 - .../passes/Circular-Trimming-Bad.png | 3 - .../passes/Circular-Trimming-Good.png | 3 - .../passes/Configure-For-Sale-Toggle.png | 3 - .../passes/Configure-Sales-Button.png | 3 - .../passes/Configure-Set-Price.png | 3 - .../monetization/passes/Open-In-New-Tab.png | 3 - .../monetization/passes/PromotedPass.png | 3 - .../monetization/passes/PromotedPass2.png | 3 - .../passes/passes-analytics-2.png | 3 - .../monetization/passes/passes-analytics.png | 3 - .../monetization/passes/passes-sample.png | 3 - .../Price-Optimization-Example.png | 3 - .../Example-Purchase-Dialog.png | 3 - .../rewarded-video-ads/LikelySpenders.png | 3 - .../OpportunityCalculator.png | 3 - .../rewarded-video-ads/Placements.png | 3 - .../rewarded-video-ads/RVAAnalytics.png | 3 - .../subscriptions/Example-Subscriptions.png | 3 - .../subscriptions/subscriptions-1.png | 3 - .../subscriptions/subscriptions-2.png | 3 - .../subscriptions/subscriptions-3.png | 3 - .../subscriptions/subscriptions-4.png | 3 - .../subscriptions/subscriptions-activate.png | 3 - .../subscriptions-analytics-2.png | 3 - .../subscriptions/subscriptions-analytics.png | 3 - .../subscriptions-my-transaction.png | 3 - .../subscriptions/subscriptions-pay-out.png | 3 - .../Analytics-Itemized.png | 3 - .../Analytics-Summary.png | 3 - .../Example-Notification-A.png | 3 - .../Example-Notification-B.png | 3 - .../Example-Notification-C.png | 3 - .../Example-Notification-D.png | 3 - .../Example-Notification-E.png | 3 - .../Example-Notification-F.png | 3 - .../experience-notifications/Move-Package.png | 3 - .../Notification-Stream.png | 3 - .../Toolbox-Package.png | 3 - .../open-cloud/guides/datastore-perms.png | 3 - .../assets/open-cloud/instance-api-beta.png | 3 - .../en-us/assets/open-cloud/instance-api.png | 3 - .../open-cloud-nodejs-sample-oauth2-main.zip | 3 - .../open-cloud-potion-shop-demo.ods | 3 - .../en-us/assets/open-cloud/protocol-flow.png | 3 - .../assets/optimization/Perf-Flow.drawio | 3 - .../en-us/assets/optimization/Perf-Flow.png | 3 - .../en-us/assets/optimization/Perf-Flow.svg | 3 - .../assets/optimization/chicken-rocket.jpg | 3 - .../microprofiler/RaycastSpam.rbxl | 3 - .../microprofiler/custom-profile.png | 3 - .../microprofiler/micro-counter.png | 3 - .../microprofiler/micro-counters-mode.png | 3 - .../microprofiler/micro-detailed.png | 3 - .../microprofiler/micro-flame-diff.png | 3 - .../microprofiler/micro-flame-diff2.png | 3 - .../microprofiler/micro-flame.png | 3 - .../microprofiler/micro-frame.png | 3 - .../microprofiler/micro-frames.png | 3 - .../microprofiler/micro-graph.png | 3 - .../microprofiler/micro-group.png | 3 - .../microprofiler/micro-groups-mode.png | 3 - .../microprofiler/micro-mobile.png | 3 - .../microprofiler/micro-network-asset.png | 3 - .../microprofiler/micro-network-events.png | 3 - .../microprofiler/micro-network-extra.png | 3 - .../microprofiler/micro-network.png | 3 - .../microprofiler/micro-panning.png | 3 - .../microprofiler/micro-save-to-file.png | 3 - .../microprofiler/micro-server.png | 3 - .../microprofiler/micro-spike.png | 3 - .../microprofiler/micro-studio-flame.png | 3 - .../microprofiler/micro-threads-mode.png | 3 - .../microprofiler/micro-timeline.png | 3 - .../microprofiler/micro-timers-mode.png | 3 - .../microprofiler/micro-tut-bar-graph.png | 3 - .../micro-tut-explorer-filter.png | 3 - .../microprofiler/micro-tut-framerate.png | 3 - .../microprofiler/micro-tut-framerate2.png | 3 - .../microprofiler/micro-tut-localscript.png | 3 - .../microprofiler/micro-tut-raycast-label.png | 3 - .../microprofiler/micro-tut-spam.png | 3 - .../microprofiler/micro-tut-stepped.png | 3 - .../optimization/microprofiler/micro-xray.png | 3 - .../en-us/assets/optimization/perf-hud.png | 3 - .../streaming/Model-Stream-In-Default.svg | 3 - .../Model-Stream-In-Improved-Character.svg | 3 - .../Model-Stream-In-Improved-Non-Spatial.svg | 3 - .../Model-Stream-In-Improved-Spatial.svg | 3 - .../streaming/ModelStreamingMode-Atomic.svg | 3 - .../ModelStreamingMode-Persistent.svg | 3 - .../streaming/Technical-Behavior.svg | 3 - .../task-scheduler/scheduler-priority.png | 3 - .../task-scheduler/task-scheduler.png | 3 - .../Adaptive-Timestepping-Microprofiler-A.png | 3 - .../Adaptive-Timestepping-Microprofiler-B.png | 3 - .../Adaptive-Timestepping.mp4 | 3 - .../adaptive-timestepping/Diagram-Labels.png | 3 - .../PhysicsSteppingMethod-Adaptive.png | 3 - .../Settings-Are-Timesteps-Shown.png | 3 - .../assemblies/Assembly-Anchor-Diagram-1.png | 3 - .../assemblies/Assembly-Anchor-Diagram-2.png | 3 - .../assemblies/Assembly-Anchor-Diagram-3.png | 3 - .../assemblies/Assembly-Example-Avatar.png | 3 - .../assemblies/Assembly-Example-Block.png | 3 - .../assemblies/Assembly-Example-Ship.png | 3 - .../assets/physics/assemblies/Sleep-Demo.mp4 | 3 - .../Explorer-ControllerManager.png | 3 - .../Explorer-Controllers.png | 3 - .../Explorer-Core-Setup.png | 3 - .../Explorer-RootPart-ClimbSensor.png | 3 - .../Explorer-RootPart-GroundSensor.png | 3 - .../Linking-References.png | 3 - .../Properties-ClimbSensor.png | 3 - .../Properties-GroundController.png | 3 - .../Properties-GroundSensor.png | 3 - .../Properties-Testing-ControllerManager.png | 3 - .../Properties-Testing-GroundController.png | 3 - .../character-controller/Testing-Labeled.jpg | 3 - .../collisions/BasePart-CollisionGroup.png | 3 - .../collisions/Collision-Fidelity-Box.jpg | 3 - .../collisions/Collision-Fidelity-Default.jpg | 3 - .../collisions/Collision-Fidelity-Hull.jpg | 3 - .../Collision-Fidelity-MeshPart.jpg | 3 - .../collisions/Collision-Fidelity-Precise.jpg | 3 - .../physics/collisions/Collision-Groups.mp4 | 3 - .../AlignOrientation-AlignType.mp4 | 3 - .../constraints/AlignOrientation-Demo.mp4 | 3 - .../AlignOrientation-RigidityEnabled.mp4 | 3 - .../constraints/AlignPosition-Demo.mp4 | 3 - .../AlignPosition-ReactionForceEnabled.mp4 | 3 - .../constraints/AngularVelocity-Demo.mp4 | 3 - ...AngularVelocity-RelativeTo-Attachment1.mp4 | 3 - .../AngularVelocity-RelativeTo-World.mp4 | 3 - .../constraints/AnimationConstraint-Demo.mp4 | 3 - .../AnimationConstraint-IsKinematic.mp4 | 3 - .../AnimationConstraint-Transform.mp4 | 3 - .../physics/constraints/BallSocket-Demo.mp4 | 3 - .../constraints/BallSocket-Limits-Tilt.mp4 | 3 - .../constraints/BallSocket-Limits-Twist.mp4 | 3 - .../Constraint-AlignPosition-Labeled.jpg | 3 - .../Constraint-AngularVelocity-Labeled.jpg | 3 - .../physics/constraints/Creation-Diagram.jpg | 3 - .../physics/constraints/Cylindrical-Demo.mp4 | 3 - .../Cylindrical-InclinationAngle-30.mp4 | 3 - .../Cylindrical-InclinationAngle-90.mp4 | 3 - .../Cylindrical-Limits-Angular.mp4 | 3 - .../constraints/Cylindrical-Limits-Linear.mp4 | 3 - .../constraints/Hinge-ActuatorType-Motor.mp4 | 3 - .../constraints/Hinge-ActuatorType-Servo.mp4 | 3 - .../assets/physics/constraints/Hinge-Demo.mp4 | 3 - .../LineForce-ApplyAtCenterOfMass-False.mp4 | 3 - .../LineForce-ApplyAtCenterOfMass-True.mp4 | 3 - .../physics/constraints/LineForce-Demo.mp4 | 3 - .../LineForce-InverseSquareLaw-False.mp4 | 3 - .../LineForce-InverseSquareLaw-True.mp4 | 3 - .../LineForce-ReactionForceEnabled-False.mp4 | 3 - .../LineForce-ReactionForceEnabled-True.mp4 | 3 - .../constraints/LinearVelocity-Demo.mp4 | 3 - .../LinearVelocity-Link-Attachment0-1.png | 3 - .../LinearVelocity-Link-Attachment0-2.png | 3 - .../LinearVelocity-RelativeTo-Attachment0.mp4 | 3 - .../LinearVelocity-RelativeTo-World.mp4 | 3 - .../constraints/Plane-Attachment0-1.jpg | 3 - .../constraints/Plane-Attachment0-2.jpg | 3 - .../assets/physics/constraints/Plane-Demo.mp4 | 3 - .../Prismatic-ActuatorType-Motor.mp4 | 3 - .../Prismatic-ActuatorType-Servo.mp4 | 3 - .../physics/constraints/Prismatic-Demo.mp4 | 3 - .../assets/physics/constraints/Rod-Demo.mp4 | 3 - .../assets/physics/constraints/Rope-Demo.mp4 | 3 - .../physics/constraints/Spring-Demo.mp4 | 3 - .../constraints/Spring-Stiffness-25.mp4 | 3 - .../constraints/Spring-Stiffness-500.mp4 | 3 - .../SpringConstraint-Link-Attachment0-1.png | 3 - .../SpringConstraint-Link-Attachment0-2.png | 3 - .../physics/constraints/Torque-Demo.mp4 | 3 - .../Torque-RelativeTo-Attachment0.mp4 | 3 - .../constraints/Torque-RelativeTo-World.mp4 | 3 - .../constraints/TorsionSpring-Damping-0.mp4 | 3 - .../constraints/TorsionSpring-Damping-50.mp4 | 3 - .../constraints/TorsionSpring-Demo.mp4 | 3 - .../Universal-Attachments-Correct.jpg | 3 - .../Universal-Attachments-Incorrect.jpg | 3 - .../physics/constraints/Universal-Demo.mp4 | 3 - .../VectorForce-ApplyAtCenterOfMass-False.mp4 | 3 - .../VectorForce-ApplyAtCenterOfMass-True.mp4 | 3 - .../physics/constraints/VectorForce-Demo.mp4 | 3 - .../VectorForce-RelativeTo-Attachment0.mp4 | 3 - .../VectorForce-RelativeTo-World.mp4 | 3 - .../network-ownership/Visualization-Demo.mp4 | 3 - .../Advanced-Bubble.png | 3 - .../in-experience-text-chat/Chat-NPC.jpg | 3 - .../Chat-Rich-Text.png | 3 - .../in-experience-text-chat/Chat-System.jpg | 3 - .../in-experience-text-chat/Chat-Tag-VIP.png | 3 - .../Chat-User-Name-Colored.png | 3 - .../Chat-User-Name-Gradient.png | 3 - .../Chat-Window-Components.jpg | 3 - .../in-experience-text-chat/Chat-Workflow.png | 3 - .../Low-Health-Bubble.mp4 | 3 - .../Player-Conversation-Bubbles.mp4 | 3 - .../Text-Custom-Command.mp4 | 3 - .../TextChat-Group-Tag.png | 3 - .../TextChatCommand-Aliases.png | 3 - ...ervice-BubbleChatConfiguration-Enabled.png | 3 - ...extChatService-BubbleChatConfiguration.png | 3 - .../TextChatService-Callbacks.png | 3 - .../TextChatService-Configuration-Objects.png | 3 - .../in-experience-text-chat/VIP-Bubble.mp4 | 3 - .../in-experience-tools/Tool-Grip-Correct.jpg | 3 - .../Tool-Grip-Incorrect.jpg | 3 - .../Tool-Handle-Example.jpg | 3 - .../Tool-Inventory-Non-Physical.jpg | 3 - .../in-experience-tools/Tool-Inventory.jpg | 3 - .../leaderboard/Leaderboard-On-Screen.jpg | 3 - .../leaderboard/Leaderboard-Stat-Name.png | 3 - .../Leaderboards-Insert-Script.png | 3 - .../Leaderboards-Multiple-Players.png | 3 - .../players/teleport-access-control.png | 3 - .../voice-chat/In-Experience-Example.jpg | 3 - .../promotion/ads-manager/Ad-Credits.png | 3 - .../promotion/ads-manager/Ad-Placement.png | 3 - .../promotion/ads-manager/Ad-Set-Bidding.png | 3 - .../Ad-Set-Gender-Ages-Devices.png | 3 - .../ads-manager/Ad-Set-Locations.png | 3 - .../ads-manager/Ad-Set-Name-Next.png | 3 - .../ads-manager/Ad-Upload-Widget.png | 3 - .../ads-manager/AdsManagerMetricCards.png | 3 - .../ads-manager/AdsManagerReporting.png | 3 - .../ads-manager/AdsManagerReportingTable.png | 3 - .../promotion/ads-manager/AdsOverview.png | 3 - .../ads-manager/Brand-Suitability.png | 3 - .../ads-manager/Campaign-Budget-Schedule.png | 3 - .../promotion/ads-manager/Campaign-Create.png | 3 - .../ads-manager/Campaign-Name-Next.png | 3 - .../ads-manager/Campaign-Objective.png | 3 - .../ads-manager/Campaign-Set-End-Date.png | 3 - .../ads-manager/Create-Ad-Account.png | 3 - .../EnableRewardedVideoAdsToggle.png | 3 - .../ads-manager/Image-Ad-Preview.png | 3 - .../ads-manager/Live-Preview-Experience.png | 3 - .../ads-manager/Menu-Payment-Settings.png | 3 - .../ads-manager/Payment-Activity-1.png | 3 - .../ads-manager/Portal Ad Preview.png | 3 - .../Portal-Ad-Destination-Experience.png | 3 - .../promotion/ads-manager/Reports-Ad-Sets.png | 3 - .../promotion/ads-manager/Reports-Ads.png | 3 - .../ads-manager/Reports-Campaigns.png | 3 - .../ads-manager/Review-Campaign-Ad-Set.png | 3 - .../ads-manager/Review-Campaign-Ad.png | 3 - .../promotion/ads-manager/Review-Campaign.png | 3 - .../ads-manager/Sponsored-Experience.png | 3 - .../ads-manager/campaign-payment-method.png | 3 - .../Dedicated-Event-Page-Copy-URL.png | 3 - .../Dedicated-Event-Page-Live.jpg | 3 - .../Experience-Page-Promotion.png | 3 - .../Group-Page-About-Tab.jpg | 3 - .../Group-Page-Events-Tab.jpg | 3 - .../Group-Page-Feature-Event.jpg | 3 - .../Notification-Lock-Screen.jpg | 3 - .../Notification-Roblox-App.png | 3 - .../experience-events/Notification-Update.png | 3 - .../off-platform-featuring.png | 3 - .../submit-for-featuring.png | 3 - .../Invite-App-Notification-Stream.png | 3 - .../invite-prompts/Invite-From-Experience.png | 3 - .../Invite-Phone-Lock-Screen.png | 3 - .../assets/promotion/misc/BadContent.jpg | 3 - .../assets/promotion/misc/BadDisclosure.jpg | 3 - .../promotion/misc/Banner-Ad-Example.png | 3 - .../misc/Experience-Guidelines-Example.png | 3 - ...Experience-Mobile-Enable-Notifications.png | 3 - .../misc/Experience-Mobile-Share.png | 3 - .../Experience-Page-Enable-Notifications.png | 3 - .../misc/Experiences-Sorted-View.png | 3 - .../assets/promotion/misc/GoodContent.jpg | 3 - .../assets/promotion/misc/GoodDisclosure.jpg | 3 - .../In-Experience-Enable-Notifications.png | 3 - .../misc/Model-Tab-Material-Manager.png | 3 - .../promotion/misc/ModerateFear-Blocky.png | 3 - .../misc/ModerateFear-BloodyEyes.png | 3 - .../promotion/misc/ModerateFear-NoFlesh.png | 3 - .../promotion/misc/Social-Links-Example.png | 3 - .../assets/promotion/misc/Sponsored-Items.png | 3 - .../assets/promotion/misc/Updates-Listing.png | 3 - .../promotion/misc/User-Ad-Templates.png | 3 - .../assets/promotion/misc/User-Safety-O13.jpg | 3 - .../assets/promotion/misc/User-Safety-U13.jpg | 3 - .../Invite-Flow-Referral-System.mp4 | 3 - .../promotion/referral-system/Invite-Flow.gif | 3 - .../referral-system/Invite-Friends.png | 3 - .../Invitee-Flow-Referral-System.mp4 | 3 - .../referral-system/Reward-Details.gif | 3 - .../referral-system/Reward-Details.mp4 | 3 - .../promotion/search-ads/Ad-Set-Search.png | 3 - .../promotion/search-ads/Edit-Ad-Creative.png | 3 - .../promotion/search-ads/Edit-Ad-Name.png | 3 - .../promotion/search-ads/Keyword-Bidding.png | 3 - .../promotion/search-ads/Search-Example-1.png | 3 - .../promotion/search-ads/Search-Example-2.png | 3 - .../promotion/search-ads/Search-Example-3.png | 3 - .../promotion/search-ads/Select-Keywords.png | 3 - .../publishing/Description-Peek-Mobile.png | 3 - .../publishing/Google-Game-Search-Result.png | 3 - .../publishing/accessibility/Audio-Volume.mp4 | 3 - .../accessibility/Color-Contrast-High.png | 3 - .../accessibility/Color-Contrast-Low.png | 3 - .../accessibility/Color-Grayscale.jpg | 3 - .../publishing/accessibility/Color-Normal.jpg | 3 - .../accessibility/Color-Symbols-Grayscale.jpg | 3 - .../accessibility/Color-Symbols-Normal.jpg | 3 - .../Preferred-Transparency-Default.png | 3 - .../Preferred-Transparency-Full.png | 3 - .../Preferred-Transparency-Half.png | 3 - .../Preferred-Transparency-Labels.png | 3 - .../accessibility/Sound-Reliance.mp4 | 3 - .../accessibility/Text-Size-LG-Blur.jpg | 3 - .../publishing/accessibility/Text-Size-LG.jpg | 3 - .../accessibility/Text-Size-SM-Blur.jpg | 3 - .../publishing/accessibility/Text-Size-SM.jpg | 3 - .../account-verification/Account-Settings.png | 3 - .../account-verification/Add-Phone.png | 3 - .../account-verification/Phone-Verified.png | 3 - .../account-verification/Verify-Birthday.png | 3 - .../account-verification/Verify-My-Age.png | 3 - .../Verify-Phone-Dialog.png | 3 - .../account-verification/Verify-With-ID.png | 3 - .../badges/Badge-Experience-Page.png | 3 - .../publishing/badges/Badges-Inventory.png | 3 - .../badges/Circular-Trimming-Bad.png | 3 - .../badges/Circular-Trimming-Good.png | 3 - .../publishing/badges/Reorder-Button.png | 3 - .../assets/publishing/badges/Reordering.png | 3 - .../publishing/console/10ft-Experience.png | 3 - .../publishing/console/Haptic-Feedback.png | 3 - .../console/Progressive-Disclosure.png | 3 - .../publishing/console/TV-Safe-Area.png | 3 - .../publishing/console/UI-Navigation.png | 3 - .../publishing/cross-platform/ButtonA-PS.png | 3 - .../cross-platform/ButtonA-Xbox.png | 3 - .../publishing/cross-platform/ButtonX-PS.png | 3 - .../cross-platform/ButtonX-Xbox.png | 3 - .../cross-platform/Dynamic-Sizing-Large.jpg | 3 - .../cross-platform/Dynamic-Sizing-Medium.jpg | 3 - .../cross-platform/Dynamic-Sizing-Small.jpg | 3 - .../cross-platform/Input-Actions-Jump.png | 3 - .../Inventory-Selection-Gamepad.jpg | 3 - .../Inventory-Selection-Keyboard.jpg | 3 - .../Inventory-Selection-Touch.jpg | 3 - .../cross-platform/Position-Scale.jpg | 3 - .../Responsive-Layout-Landscape.jpg | 3 - .../Responsive-Layout-Portrait.jpg | 3 - .../cross-platform/Screen-Size-Themes.png | 3 - .../experience-metadata/Genre-Example.png | 3 - .../experience-metadata/Icon-Action.jpg | 3 - .../experience-metadata/Icon-Camping.jpg | 3 - .../Icon-Colorization-A.jpg | 3 - .../Icon-Colorization-B.jpg | 3 - .../Icon-Colorization-C.jpg | 3 - .../experience-metadata/Icon-Default.jpg | 3 - .../experience-metadata/Icon-High-Res.jpg | 3 - .../experience-metadata/Icon-Low-Res.jpg | 3 - .../experience-metadata/Icon-Not-Square.jpg | 3 - .../experience-metadata/Icon-Ocean.jpg | 3 - .../Icon-Theme-Park-Symbol.jpg | 3 - .../experience-metadata/Icon-Theme-Park.jpg | 3 - .../Thumbnail-High-Res.jpg | 3 - .../Thumbnail-Home-Page-Tab.png | 3 - .../Thumbnail-Impressions-Graph.png | 3 - .../Thumbnail-Not-16-9.jpg | 3 - .../Thumbnail-Theme-Comical.jpg | 3 - .../Thumbnail-Theme-Horror.jpg | 3 - .../experience-metadata/Thumbnail-Unclear.jpg | 3 - .../Thumbnail-Urban-Rush.jpg | 3 - .../Thumbnail-Video-Accurate.mp4 | 3 - .../Thumbnail-Video-Inaccurate.mp4 | 3 - .../Edit-Place-In-Studio.jpg | 3 - .../Experience-Hierarchy.png | 3 - .../Experience-Page-Example.jpg | 3 - .../Maturity-Label-Strong-Language.jpg | 3 - .../Publish-Window-Select-Start-Place.png | 3 - .../marketplace/Asset-Configure-Dropdown.png | 3 - .../Asset-Configure-Page-Limited.png | 3 - .../marketplace/Asset-Configure-Page-Sale.png | 3 - .../marketplace/Asset-Configure-Page.png | 3 - .../marketplace/Catalog-Example.png | 3 - .../publishing/marketplace/Creation-Page.png | 3 - .../marketplace/Enable-Third-Party-Sales.png | 3 - .../publishing/marketplace/Error-Example.png | 3 - .../marketplace/Item-Attributes.png | 3 - .../marketplace/Manage-Item-Page.png | 3 - .../marketplace/Mannequin-Example.png | 3 - .../marketplace/Mannequin-Explorer.png | 3 - .../marketplace/Pricing-Settings.png | 3 - .../marketplace/Publishing-Body.png | 3 - .../marketplace/Publishing-Clothes.png | 3 - .../marketplace/Publishing-Item.png | 3 - .../ReplicatedStorage-Settings.png | 3 - .../publishing/marketplace/Sale-Location.png | 3 - .../publishing/marketplace/Sale-Toggle.png | 3 - .../ServerScriptStorage-Readme.png | 3 - .../Thumbnail-Configuration-Example.png | 3 - .../marketplace/Thumbnail-Example-A.png | 3 - .../marketplace/Thumbnail-Example-B.png | 3 - .../marketplace/Timed-Options-Bulk-A.png | 3 - .../marketplace/Timed-Options-Bulk-B.png | 3 - .../Timed-Options-Mobile-Marketplace.png | 3 - .../marketplace/Timed-Options-Per-Item.png | 3 - .../marketplace/Transaction-Report.png | 3 - .../safety/Abuse-Reports-Per-Category.png | 3 - .../publishing/safety/Automated-Insights.png | 3 - .../publishing/safety/Filter-by-channel.png | 3 - .../safety/Submitters-Per-Hours.png | 3 - .../publishing/vr/Auto-Quality-Mode.png | 3 - .../Battle-Royale-Building-View.jpeg | 3 - .../Battle-Royale-New-Tile-1.png | 3 - .../Battle-Royale-New-Tile-2.png | 3 - .../building-system/Octant-Cube.png | 3 - .../Battle-Royale-AM-Select-Places-1.png | 3 - .../Battle-Royale-Edit-Place.png | 3 - .../Battle-Royale-Gameplay-Close.png | 3 - .../Battle-Royale-Lobby-Close.png | 3 - .../Battle-Royale-Lobby-Copy-ID.png | 3 - .../Battle-Royale-Lobby-Set-Name.png | 3 - .../Battle-Royale-Lobby-View.jpeg | 3 - .../Battle-Royale-Place-MainConfiguration.png | 3 - .../Battle-Royale-Place-Names.png | 3 - .../Battle-Royale-Place-Overwrite.png | 3 - .../Place-Server-Fill-Maximum.png | 3 - .../Publish-Update-Existing.png | 3 - .../Publish-Window-Create-New-Game.png | 3 - .../RobloxBattleRoyale.zip | 3 - .../introduction/Battle-Royale-Slide-B.jpeg | 3 - .../Battle-Royale-Minimap-Objects.png | 3 - .../minimap-system/Battle-Royale-Minimap.jpeg | 3 - .../Battle-Royale-Item-Common.png | 3 - .../pickup-system/Battle-Royale-Item-Epic.png | 3 - .../Battle-Royale-Item-Legendary.png | 3 - .../pickup-system/Battle-Royale-Item-Rare.png | 3 - .../Battle-Royale-Item-Special.png | 3 - .../Battle-Royale-Item-Uncommon.png | 3 - .../Battle-Royale-New-Pickup.png | 3 - .../Battle-Royale-New-Weapon.png | 3 - .../Battle-Royale-PickupSpawners.png | 3 - .../pickup-system/Battle-Royale-Pickups.png | 3 - .../Battle-Royale-Weapon-Pickup.jpg | 3 - .../pickup-system/Battle-Royale-Weapons.png | 3 - .../Battle-Royale-Lobby-Open-Place-1.png | 3 - .../Battle-Royale-Lobby-Open-Place-2.png | 3 - .../running-the-game/Studio-Recent-Games.png | 3 - .../the-storm/Battle-Royale-Storm.jpeg | 3 - .../resources/beyond-the-dark/btd-banner.png | 3 - .../Architecture-Overview.jpeg | 3 - .../Architecture_Example_1.jpeg | 3 - .../Architecture_Example_2.jpeg | 3 - .../Architecture_Example_3.jpeg | 3 - .../Architecture_Example_4.jpeg | 3 - .../Architecture_Example_5.png | 3 - .../Architecture_Example_6.png | 3 - .../Architecture_Example_7.png | 3 - .../Architecture_Example_8.png | 3 - .../Modular_Trim_Sheet.png | 3 - .../building-architecture/PBR_Example_1.png | 3 - .../building-architecture/PBR_Example_2.png | 3 - .../building-architecture/PBR_Example_3.png | 3 - .../building-architecture/PBR_Example_4.png | 3 - .../Packages_Example_1.png | 3 - .../Packages_Example_2.png | 3 - .../Surface_Appearance_Example_1.png | 3 - .../Surface_Appearance_Example_2.png | 3 - .../Trim_Sheet_Example.png | 3 - .../Trim_Sheet_Example_2.png | 3 - .../Trim_Sheet_Final_1.png | 3 - .../Trim_Sheet_Final_2.png | 3 - .../custom-characters/Animation-Example.gif | 3 - .../custom-characters/Animation-Import-2.png | 3 - .../Bad_Skinning_Example.png | 3 - .../custom-characters/Creature-Eyes.jpeg | 3 - .../custom-characters/Creature-In-Maya.png | 3 - .../custom-characters/Creature_Banner.png | 3 - .../custom-characters/Creature_Front.png | 3 - .../custom-characters/Custom-Import-2.png | 3 - .../custom-characters/Final-Result.png | 3 - .../custom-characters/Glowing-Creature.png | 3 - .../custom-characters/In-Studio-VFX.jpeg | 3 - .../custom-characters/Light-Emission.jpeg | 3 - .../custom-characters/Particle-Emitter.jpeg | 3 - .../custom-characters/Rigging_Neutral_1.png | 3 - .../custom-characters/Rigging_Neutral_2.png | 3 - .../custom-characters/Script-Example.jpeg | 3 - .../Smooth_Skinning_Example.png | 3 - .../custom-characters/Spotlights.png | 3 - .../Surface-Appearance-Transparency.jpeg | 3 - .../custom-characters/Surface-Appearance.png | 3 - .../custom-characters/Texture-Map-1.jpeg | 3 - .../custom-characters/Texture-Map-2.jpeg | 3 - .../custom-characters/Texture-Map-3.jpeg | 3 - .../custom-characters/Texture-Map-4.jpeg | 3 - .../Accessories-In-Explorer.png | 3 - .../Accessory-Fitting-Tool-Adjustments-2.png | 3 - .../Accessory-Fitting-Tool-Adjustments-3.png | 3 - .../Accessory-Fitting-Tool-Adjustments.png | 3 - .../Accessory-Tool-Mannequin.png | 3 - .../Adding-Surface-Appearance-2.jpeg | 3 - .../Adding-Surface-Appearance.jpeg | 3 - .../layered-clothing/Body-Cage-Example-1.png | 3 - .../layered-clothing/Body-Cage-Example-2.png | 3 - .../layered-clothing/Body-Cage-Example-3.png | 3 - .../layered-clothing/Body-Cage-Example-4.png | 3 - .../layered-clothing/Body-Cage-Example-5.png | 3 - .../layered-clothing/Body-Cage-Example-6.png | 3 - .../layered-clothing/Caging-With-Gloves.png | 3 - .../Character-And-Suit-Overview.png | 3 - .../Character-Model-Exploded.png | 3 - .../layered-clothing/Character-Model.png | 3 - .../Clothing-Design-Example-1.png | 3 - .../Clothing-Design-Example-2.png | 3 - .../layered-clothing/Clothing-Outer-Cage.png | 3 - .../layered-clothing/Clothing-Posing.png | 3 - .../Custom-Character-Example.png | 3 - .../Glass-Surface-Example.png | 3 - .../layered-clothing/Helmet-Attachments.jpeg | 3 - .../Helmet-Equipped-Final.png | 3 - .../layered-clothing/Helmet-Silhouette.png | 3 - .../layered-clothing/Helmet-Texture-Map.png | 3 - .../Importing-Helmet-Mesh.jpeg | 3 - .../Layerable-Suit-Comparison.png | 3 - .../layered-clothing/Motion-Test.png | 3 - .../Replacing-Hands-And-Feet.png | 3 - .../layered-clothing/Seams-Example-1.png | 3 - .../layered-clothing/Seams-Example-2.png | 3 - .../Shoulder-Seams-Example-1.png | 3 - .../Shoulder-Seams-Example-2.png | 3 - .../layered-clothing/Silhouette-1.png | 3 - .../layered-clothing/Silhouette-2.png | 3 - .../layered-clothing/Skin-Tone-Maps-1.png | 3 - .../layered-clothing/Skin-Tone-Maps-2.png | 3 - .../layered-clothing/Skin-Tone-Maps-3.png | 3 - .../Skinning-Influence-Example-1.png | 3 - .../Skinning-Influence-Example-2.png | 3 - .../Skinning-Influence-Example-3.png | 3 - .../Skinning-Influence-Example-4.png | 3 - .../layered-clothing/Skinning-Movement.gif | 3 - .../layered-clothing/Suit-Lighting-Test-2.png | 3 - .../layered-clothing/Suit-Lighting-Test.gif | 3 - .../Suit-Texturing-Example-1.png | 3 - .../Suit-Texturing-Example-2.png | 3 - .../Suit-Texturing-Example-3.png | 3 - .../Suit-Texturing-Example-4.png | 3 - .../layered-clothing/Texture-Comparisons.png | 3 - .../layered-clothing/Texturing-Showcase.png | 3 - .../layered-clothing/Trim-Map-Texture-1.png | 3 - .../layered-clothing/Trim-Map-Texture-2.png | 3 - .../layered-clothing/Trim-Map-Texture-3.png | 3 - .../layered-clothing/Trim-Map-Texture-4.png | 3 - .../layered-clothing/UV-Diagram.png | 3 - .../layered-clothing/UV-Maps-1.png | 3 - .../layered-clothing/UV-Maps-2.png | 3 - .../layered-clothing/UV-Maps-3.png | 3 - .../layered-clothing/UV-Maps-4.png | 3 - .../layered-clothing/Unique-Characters.png | 3 - .../Vertex-Influence-Example-1.png | 3 - .../Vertex-Influence-Example-2.png | 3 - .../sound-design/In-Explorer-Sound.png | 3 - .../sound-design/In-Studio-Sound.jpeg | 3 - .../sound-design/Sound-Banner.jpeg | 3 - .../sound-design/Sound-Properties.png | 3 - .../Sound-Structure-Properties.png | 3 - .../sound-design/Sound-Structure.png | 3 - .../user-interface/Final-UI.mp4 | 3 - .../user-interface/Light-Properties.mp4 | 3 - .../user-interface/Parallax-Example.png | 3 - .../user-interface/Proximity-Prompt.png | 3 - .../user-interface/StarterGui-Adornee.mp4 | 3 - .../user-interface/UI-Export.png | 3 - .../user-interface/UI-Mock.png | 3 - .../user-interface/UITweenModule.png | 3 - .../city-people-cars/CPC-Slide-D.jpeg | 3 - .../city-people-cars/CityPeopleCars.rbxl | 3 - .../Bundles/Bundles-Intro copy.png | 3 - .../Bundles/Bundles-Intro.png | 3 - .../Bundles/Bundles-Small.png | 3 - .../Missions/Missions-Condensed.png | 3 - .../Missions/Missions-Intro.png | 3 - .../Season-Passes/Season-Passes-Intro.png | 3 - .../engagement/rewards-annotated.png | 3 - .../feature-packages/engagement/rewards.jpg | 3 - .../armillary-asset.png | 3 - .../armillary-model-package.png | 3 - .../asset-storage-place.png | 3 - .../assigning-textures-crow.png | 3 - .../blueprint-attic.png | 3 - .../blueprint-dining.png | 3 - .../blueprint-foyer.png | 3 - .../blueprint-second-floor.png | 3 - .../blueprint-whole-house.png | 3 - .../convert-to-package-dialog.png | 3 - .../crow-cleaned-up.png | 3 - .../constructing-the-house/crow-notes.png | 3 - .../decimation-crow.png | 3 - .../decimation-settings.png | 3 - .../earliest-version-toolbox-house.png | 3 - .../early-concept-approach-house.png | 3 - .../early-draft-playable-area.png | 3 - .../early-shot-driveway-approach.png | 3 - .../final-candle-asset.png | 3 - .../final-content-versions.jpeg | 3 - .../final-crow-asset.png | 3 - .../constructing-the-house/final-foyer.png | 3 - .../freeform-settings.png | 3 - .../furniture-spreadsheet.jpeg | 3 - .../gray-boxed-versions.jpeg | 3 - .../gray-mesh-front.png | 3 - .../constructing-the-house/gray-mesh-side.png | 3 - .../gray-mesh-top-down.png | 3 - .../constructing-the-house/hand-draw-crow.png | 3 - .../metal-surface-appearance-package.png | 3 - .../original-scan-automated-uvs.jpeg | 3 - .../original-scan-candle.png | 3 - .../original-scan-crow.png | 3 - .../overlapping-crow.png | 3 - .../constructing-the-house/overview.png | 3 - .../package-corrupt-state.png | 3 - .../package-entire-bedroom.png | 3 - .../package-normal-state.png | 3 - .../constructing-the-house/pbr-textures-1.png | 3 - .../constructing-the-house/pbr-textures-2.png | 3 - .../retopologized-candle.png | 3 - .../retopologized-crow.png | 3 - .../constructing-the-house/scale-final.png | 3 - .../constructing-the-house/scale-inside.png | 3 - .../constructing-the-house/scale-outside.png | 3 - .../scan-data-candle-final.png | 3 - .../scan-data-crow-final.png | 3 - .../scan-data-texture-1.jpeg | 3 - .../scan-data-texture-2.png | 3 - .../constructing-the-house/texture-1.png | 3 - .../constructing-the-house/texture-2.png | 3 - .../constructing-the-house/texture-3.png | 3 - .../constructing-the-house/texture-4.png | 3 - .../constructing-the-house/zremesher-crow.png | 3 - .../zremesher-settings.png | 3 - .../audio-volume.png | 3 - .../car-part-volume.png | 3 - .../compressorsoundeffect-properties.png | 3 - .../exterior-audio-hierarchy.png | 3 - .../main-audio-mixer.png | 3 - .../designing-dark-soundscapes/overview.png | 3 - .../sound-emitters-hierarchy.png | 3 - .../volumetric-audio-emitter-greenhouse.png | 3 - .../volumetric-audio-immersive.png | 3 - .../animated-trees.png | 3 - .../developing-a-moving-world/base-piece.png | 3 - .../beechwood-joint-animation.png | 3 - .../cloud-billboard.png | 3 - .../cloud-shading.png | 3 - .../cloud-texture-on-parts.png | 3 - .../collision-fidelity-treehouse.png | 3 - .../debris-volumes.png | 3 - .../eye-of-the-storm-1.png | 3 - .../eye-of-the-storm-2.png | 3 - .../developing-a-moving-world/false-wall.png | 3 - .../fog-particle-volume.png | 3 - .../fog-particle.png | 3 - .../developing-a-moving-world/forest-pack.png | 3 - .../friends-spinning.png | 3 - .../high-poly-sculpt.png | 3 - .../hingeconstraint-properties.png | 3 - .../illusion-image.png | 3 - .../layered-cloud-meshes.png | 3 - .../leaf-particle.png | 3 - .../lightning-bolt-photoshop-settings.png | 3 - .../lightning-bolts.png | 3 - .../low-poly-mesh-with-normal-info.png | 3 - .../low-poly-mesh.png | 3 - .../main-vortex-settings.png | 3 - .../movement-example.mp4 | 3 - .../obstacle-course.png | 3 - .../pantry-corrupt-state.png | 3 - .../pantry-movement.mp4 | 3 - .../part-volumes.png | 3 - .../particle-emitter-properties.png | 3 - .../particle-emitter-settings.png | 3 - .../redwood-tree-animation.png | 3 - .../show-decomposition-geometry-disabled.png | 3 - .../show-decomposition-geometry-enabled.png | 3 - .../single-cloud-mesh.png | 3 - .../developing-a-moving-world/son-puzzle.png | 3 - .../spinning-elements.png | 3 - .../developing-a-moving-world/squash-20.png | 3 - .../developing-a-moving-world/squash-3.png | 3 - .../storm-iteration-1.png | 3 - .../storm-iteration-2.png | 3 - .../storm-iteration-3.png | 3 - .../storm-iteration-4.png | 3 - .../target-closed.png | 3 - .../tree-animation-import.png | 3 - .../tree-hierarchy.png | 3 - .../developing-a-moving-world/tree-joints.png | 3 - .../treehouse-mesh.png | 3 - .../treehouse-texture.png | 3 - .../unanchored-platform.png | 3 - .../vertex-painting.png | 3 - .../yellow-part-volume.png | 3 - .../announcements-interrupt.png | 3 - .../announcements-purple.png | 3 - .../announcements-white.png | 3 - .../announcements-yellow.png | 3 - .../barn-owl-thought-bubbles.png | 3 - .../immersive-narrative/blank-textlabel.png | 3 - .../immersive-narrative/chalkboard.png | 3 - .../immersive-narrative/dog-statue-lore.png | 3 - .../immersive-narrative/dog-statue.png | 3 - .../immersive-narrative/example-script.png | 3 - .../immersive-narrative/grandfather-room.png | 3 - .../immersive-narrative/jacob-photo-album.png | 3 - .../immersive-narrative/lore-1.png | 3 - .../immersive-narrative/lore-2.png | 3 - .../immersive-narrative/lore-3.png | 3 - .../immersive-narrative/lore-4.png | 3 - .../immersive-narrative/lore-template.png | 3 - .../overlay-back-button.png | 3 - .../overview-announcement.png | 3 - .../overview-thought-bubble.png | 3 - .../overview-visual-cues.png | 3 - .../immersive-narrative/power-line.png | 3 - .../richtext-thought-bubble.png | 3 - .../immersive-narrative/storynote-object.png | 3 - .../materializing-the-world/1-1-texture.png | 3 - .../after-override.png | 3 - .../alpha-merge-substance-designer.png | 3 - .../backyard-terrain-materials.png | 3 - .../backyard-wet-material-variants.png | 3 - .../materializing-the-world/basecolor-rgb.png | 3 - .../before-override.png | 3 - .../cleaner-texture.png | 3 - .../couch-surface-appearance-set.png | 3 - .../craftsman-reference-images.png | 3 - .../edit-variant-dialog.png | 3 - .../materializing-the-world/final-alpha.png | 3 - .../final-surface-on-couch.png | 3 - .../furniture-set-stain.png | 3 - .../materializing-the-world/height-map.png | 3 - .../leather-couch-settings.png | 3 - .../leather-trim-texture-set.png | 3 - .../material-variant-overrides.png | 3 - .../mesh-in-foreground.png | 3 - .../only-colormap-and-mesh-color.png | 3 - .../materializing-the-world/overview.png | 3 - .../rgba-in-combination.png | 3 - .../scratches-and-wear-mask.png | 3 - .../materializing-the-world/set-override.png | 3 - .../tiling-texture.png | 3 - .../too-much-detail-texture.png | 3 - .../transform-2d-node.png | 3 - .../materializing-the-world/trim-texture.png | 3 - .../wood-trim-asset-place.png | 3 - .../wood-trim-assets-in-place.png | 3 - .../wood-trim-texture-set.png | 3 - .../overview/overview.png | 3 - .../1024-max-distance.png | 3 - .../64-max-distance.png | 3 - .../content-streaming.png | 3 - .../perspective-house.png | 3 - .../perspective-treelines.png | 3 - .../streaming-in-immersion/winding-path.png | 3 - .../technical-overview/cutscene.mp4 | 3 - .../technical-overview/interpolation.mp4 | 3 - .../key-grabbing-system.jpg | 3 - .../technical-overview/respawning-players.mp4 | 3 - .../technical-overview/simple-lobby.jpg | 3 - .../Endorsed-NPC-NP-C-9000-Robots.jpeg | 3 - .../npc-kit/Endorsed-NPC-RO-01-Robots.jpeg | 3 - .../npc-kit/Endorsed-NPC-Soldiers.jpeg | 3 - .../npc-kit/Endorsed-NPC-Zombie.jpeg | 3 - .../resources/plant/Architecture-Systems.png | 3 - .../resources/plant/Architecture-UI.png | 3 - .../assets/resources/plant/Project-Banner.jpg | 3 - .../roblox-connect/Camera-Mode-Cinematic.jpg | 3 - .../roblox-connect/Camera-Mode-PiP.jpg | 3 - .../roblox-connect/Camera-Mode-Switcher.png | 3 - .../CanSendCallingInviteAsync.mp4 | 3 - .../resources/roblox-connect/Emote-Bar.jpg | 3 - .../roblox-connect/Environment-Switcher.png | 3 - .../roblox-connect/GetDeviceCameraCFrame.mp4 | 3 - .../roblox-connect/PromptPhoneBook.mp4 | 3 - .../roblox-connect/ShowHideSelfView.mp4 | 3 - .../templates/Baseplate-Template.png | 3 - .../resources/templates/CTF-Template.png | 3 - .../resources/templates/Castle-Template.png | 3 - .../templates/Classic-Baseplate-Template.png | 3 - .../templates/Classic-Racing-Template.png | 3 - .../resources/templates/Combat-Template.png | 3 - .../resources/templates/Concert-Template.png | 3 - .../resources/templates/FFA-Template.png | 3 - .../templates/FPS-System-Template.png | 3 - .../templates/Flat-Terrain-Template.png | 3 - .../templates/Homestore-Template.png | 3 - .../templates/Laser-Tag-Template.png | 3 - .../templates/Line-Runner-Template.png | 3 - .../resources/templates/MIS-Template.png | 3 - .../resources/templates/MOW-Template.png | 3 - .../resources/templates/Obby-Template.png | 3 - .../templates/Pirate-Island-Template.png | 3 - .../templates/Platformer-Template.png | 3 - .../resources/templates/Racing-Template-2.png | 3 - .../resources/templates/Racing-Template.png | 3 - .../templates/Starting-Place-Template.png | 3 - .../resources/templates/Suburban-Template.png | 3 - .../resources/templates/Village-Template.png | 3 - .../weapons-kit/Endorsed-Weapon-AR.jpeg | 3 - .../weapons-kit/Endorsed-Weapon-Crossbow.jpeg | 3 - .../Endorsed-Weapon-Grenade-Launcher.jpeg | 3 - .../weapons-kit/Endorsed-Weapon-Pistol.jpeg | 3 - .../weapons-kit/Endorsed-Weapon-Railgun.jpeg | 3 - .../Endorsed-Weapon-Rocket-Launcher.jpeg | 3 - .../weapons-kit/Endorsed-Weapon-Shotgun.jpeg | 3 - .../Endorsed-Weapon-Sniper-Rifle.jpeg | 3 - .../Endorsed-Weapon-Submachine-Gun.jpeg | 3 - .../weapons-kit/Endorsed-Weapons-Banner.jpeg | 3 - .../weapons-kit/Move-WeaponsSystem-Folder.png | 3 - .../Sprint-Zoom-Configurations.png | 3 - .../weapons-kit/Weapon-BulletHole.png | 3 - ...onfiguration-Children-Grenade-Launcher.png | 3 - .../Weapon-Configuration-Children-Railgun.png | 3 - .../Weapon-Configuration-Children.png | 3 - .../weapons-kit/Weapon-Model-BaseParts.png | 3 - .../Weapon-Model-Descendants-Crossbow.png | 3 - .../Weapon-Model-Descendants-Railgun.png | 3 - .../weapons-kit/Weapon-Model-Descendants.png | 3 - .../weapons-kit/Weapon-MuzzleParticles.png | 3 - .../weapons-kit/WeaponsSystem-Structure.png | 3 - .../Client-Script-Containers.png | 3 - .../client-server/Client-Server-Model.png | 3 - .../client-server/Data-Model-Mapping.png | 3 - .../Remote-Flow-Client-Server-Client.png | 3 - .../Remote-Flow-Client-Server.png | 3 - .../Remote-Flow-Server-All-Clients.png | 3 - .../Remote-Flow-Server-Client-Server.png | 3 - .../Remote-Flow-Server-Client.png | 3 - .../assets/scripting/controls/apostrophe.png | 3 - .../assets/scripting/controls/backspace.png | 3 - .../en-us/assets/scripting/controls/comma.png | 3 - .../assets/scripting/controls/dpadDown.png | 3 - .../assets/scripting/controls/dpadLeft.png | 3 - .../assets/scripting/controls/dpadRight.png | 3 - .../assets/scripting/controls/dpadUp.png | 3 - .../assets/scripting/controls/graveaccent.png | 3 - .../assets/scripting/controls/period.png | 3 - .../assets/scripting/controls/return.png | 3 - .../en-us/assets/scripting/controls/shift.png | 3 - .../assets/scripting/controls/spacebar.png | 3 - .../en-us/assets/scripting/controls/tab.png | 3 - .../en-us/assets/scripting/controls/xboxA.png | 3 - .../en-us/assets/scripting/controls/xboxB.png | 3 - .../assets/scripting/controls/xboxLB.png | 3 - .../assets/scripting/controls/xboxLS.png | 3 - .../scripting/controls/xboxLSDirectional.png | 3 - .../assets/scripting/controls/xboxLT.png | 3 - .../assets/scripting/controls/xboxRB.png | 3 - .../assets/scripting/controls/xboxRS.png | 3 - .../scripting/controls/xboxRSDirectional.png | 3 - .../assets/scripting/controls/xboxRT.png | 3 - .../assets/scripting/controls/xboxView.png | 3 - .../en-us/assets/scripting/controls/xboxX.png | 3 - .../en-us/assets/scripting/controls/xboxY.png | 3 - .../assets/scripting/controls/xboxmenu.png | 3 - .../external-tools-rojo-plugin.png | 3 - .../external-tools-rojo-sync.png | 3 - .../external-tools/external-tools-vscode.png | 3 - .../scripting/input/Gamepad-Inputs-PS.png | 3 - .../scripting/input/Gamepad-Inputs-Xbox.png | 3 - .../assets/scripting/scripts/Actor-Tree.png | 3 - .../scripts/FewerVsMoreActorsDark.png | 3 - .../scripts/ImmediateVsDeferredEvents.png | 3 - .../scripting/scripts/Parallel-Luau.mp4 | 3 - .../scripts/ParallelExecutionDark.png | 3 - .../scripting/scripts/Scope-Diagram.png | 3 - .../scripts/Touched-Event-No-Debounce.png | 3 - .../assets/scripting/scripts/multi-thread.png | 3 - .../scripting/scripts/single-thread.png | 3 - .../security/Movement-Validation-1.jpg | 3 - .../security/Movement-Validation-2.jpg | 3 - .../security/Remote-Purchase-Flow.png | 3 - .../studio/align-tool/Align-In-Before.jpg | 3 - .../studio/align-tool/Align-In-Local-Z.jpg | 3 - .../studio/align-tool/Align-In-World-Z.jpg | 3 - .../assets/studio/align-tool/Icon-Center.png | 3 - .../assets/studio/align-tool/Icon-Max.png | 3 - .../assets/studio/align-tool/Icon-Min.png | 3 - .../assets/studio/align-tool/Mode-Center.jpg | 3 - .../assets/studio/align-tool/Mode-Max.jpg | 3 - .../assets/studio/align-tool/Mode-Min.jpg | 3 - .../Relative-To-Active-Object-Before.jpg | 3 - .../Relative-To-Active-Object-Max-X.jpg | 3 - .../Relative-To-Active-Object-Min-X.jpg | 3 - .../Relative-To-Selection-Bounds-Before.jpg | 3 - .../Relative-To-Selection-Bounds-Max-X.jpg | 3 - .../Relative-To-Selection-Bounds-Min-X.jpg | 3 - .../asset-manager/Asset-Inspect-Icon.png | 3 - .../asset-manager/Asset-Type-Filters.png | 3 - .../studio/asset-manager/Display-Options.png | 3 - .../asset-manager/Grid-View-Ordering.png | 3 - .../assets/studio/asset-manager/Grid-View.png | 3 - .../studio/asset-manager/Import-Button-V1.png | 3 - .../studio/asset-manager/Import-Button.png | 3 - .../studio/asset-manager/Inventory-Sorts.png | 3 - .../asset-manager/List-View-Ordering.png | 3 - .../studio/asset-manager/View-Toggle.png | 3 - .../collaboration/Collaborative-Session.jpg | 3 - .../collaboration/Collaborator-Search.png | 3 - .../studio/collaboration/Comments-Cursor.jpg | 3 - .../studio/collaboration/Comments-Window.png | 3 - .../studio/collaboration/Drafts-Commit.png | 3 - .../studio/collaboration/Drafts-Compare.png | 3 - .../collaboration/Drafts-Diff-Result.png | 3 - .../studio/collaboration/Drafts-Merge.png | 3 - .../studio/collaboration/Drafts-Restore.png | 3 - .../studio/collaboration/Drafts-Window.png | 3 - .../Edit-Permission-All-Group-Experiences.png | 3 - .../Edit-Permission-Per-Experience.png | 3 - .../Live-Collaborators-Disable.png | 3 - .../collaboration/Live-Collaborators-Join.png | 3 - .../Live-Collaborators-Status.png | 3 - .../Live-Collaborators-Toggle-Selections.png | 3 - .../collaboration/Live-Scripting-Cursors.png | 3 - .../collaboration/User-Color-Explorer.png | 3 - .../studio/collaboration/User-Color-Parts.jpg | 3 - .../collision-groups-editor/Add-To-Group.png | 3 - .../Configure-Groups-List-View.png | 3 - .../Configure-Groups-Table-View.png | 3 - .../collision-groups-editor/List-View.png | 3 - .../New-Group-List-View.png | 3 - .../New-Group-Table-View.png | 3 - .../collision-groups-editor/Rename-Group.png | 3 - .../StudioSelectable-Off.png | 3 - .../collision-groups-editor/Table-View.png | 3 - .../assets/studio/console/Callgraph.jpeg | 3 - .../studio/console/Client-Server-Dropdown.png | 3 - .../studio/console/Console-Summary-Bar.png | 3 - .../assets/studio/console/Export-Window.jpeg | 3 - .../assets/studio/console/Functions.jpeg | 3 - .../assets/studio/console/Graph-View.jpeg | 3 - .../assets/studio/console/Log-Sections.png | 3 - .../console/LuauHeap-Native-Annotation.png | 3 - .../assets/studio/console/LuauHeap-Open.png | 3 - .../assets/studio/console/Memory-Open.png | 3 - .../console/ScriptProfiler-Expand-Root.png | 3 - .../ScriptProfiler-Native-Annotation.png | 3 - .../studio/console/ScriptProfiler-Open.png | 3 - .../studio/console/ScriptProfiler-Start.png | 3 - .../studio/console/ScriptProfiler-Units.png | 3 - .../studio/console/Unique-Reference-View.jpeg | 3 - .../debugging/Breakpoints-Window-Contexts.png | 3 - .../studio/debugging/Breakpoints-Window.png | 3 - .../debugging/Call-Stack-Flow-Script.png | 3 - .../debugging/Call-Stack-Flow-Window.png | 3 - .../Client-Server-Toggle-3D-Client.jpg | 3 - .../Client-Server-Toggle-3D-Server.jpg | 3 - .../Client-Server-Toggle-Explorer-Client.png | 3 - .../Client-Server-Toggle-Explorer-Server.png | 3 - .../debugging/Gutter-Breakpoint-Active.png | 3 - .../Gutter-Breakpoint-Conditional.png | 3 - .../debugging/Gutter-Breakpoint-Disabled.png | 3 - .../Gutter-Breakpoint-Logpoint-Disabled.png | 3 - .../debugging/Gutter-Breakpoint-Logpoint.png | 3 - .../studio/debugging/Gutter-Breakpoint.png | 3 - .../debugging/Native-Code-Size-Analysis.png | 3 - .../Script-Editor-Mouseover-Table.png | 3 - .../Server-Authority-Simulation-Radius.jpg | 3 - .../debugging/Watch-Expressions-Script.png | 3 - .../debugging/Watch-Expressions-Window.png | 3 - .../debugging/Watch-Variables-Script.png | 3 - .../debugging/Watch-Variables-Window.png | 3 - .../studio/explorer/Branch-Expanded.png | 3 - .../assets/studio/explorer/CSS-Test-Setup.png | 3 - .../studio/explorer/Chat-Descendants.png | 3 - .../studio/explorer/Context-Menu-Model.png | 3 - .../studio/explorer/Context-Menu-Service.png | 3 - .../studio/explorer/Drag-Select-Searched.png | 3 - ...xample-Maps-In-Workspace-ServerStorage.png | 3 - ...Example-Organized-Folders-In-Workspace.png | 3 - .../studio/explorer/Folder-Children.png | 3 - .../studio/explorer/Insert-Object-Options.png | 3 - .../studio/explorer/Lighting-Atmosphere.png | 3 - .../assets/studio/explorer/Lighting-Sky.png | 3 - .../assets/studio/explorer/LinearVelocity.png | 3 - .../explorer/LocalScript-In-TextButton.png | 3 - .../explorer/MeshPart-ParticleEmitter.png | 3 - .../explorer/MeshPart-SurfaceAppearance.png | 3 - .../studio/explorer/Model-Beam-Setup.png | 3 - .../studio/explorer/Model-DragDetector.png | 3 - .../explorer/Model-Generation-Behaviors.png | 3 - .../explorer/Model-Generation-Hierarchy.png | 3 - .../explorer/Parent-Child-Hierarchy.png | 3 - ...art-Attachment-BillboardGui-ImageLabel.png | 3 - .../explorer/Part-BillboardGui-ImageLabel.png | 3 - .../explorer/Part-SurfaceGui-ImageLabel.png | 3 - .../studio/explorer/Part-Trail-Setup.png | 3 - .../assets/studio/explorer/Plugin-Created.png | 3 - .../explorer/Plugin-Empty-Script-Adder.png | 3 - .../explorer/Plugin-Inserted-Script.png | 3 - .../studio/explorer/Reparent-Object.png | 3 - .../explorer/ReplicatedStorage-Model.png | 3 - .../ReplicatedStorage-Server-Authority.png | 3 - .../explorer/ReplicatedStorage-Tools.png | 3 - .../assets/studio/explorer/Rig-Clothing.png | 3 - .../assets/studio/explorer/Rig-Hierarchy.png | 3 - .../studio/explorer/Rig-Shirt-Graphic.png | 3 - .../studio/explorer/Script-Parent-Model.png | 3 - .../Script-Parent-ReplicatedStorage.png | 3 - .../assets/studio/explorer/Script-Sync.png | 3 - .../assets/studio/explorer/Search-By-Name.png | 3 - .../assets/studio/explorer/Search-Diagram.png | 3 - .../studio/explorer/Select-All-Searched.png | 3 - .../explorer/ServerScriptService-Actor.png | 3 - .../explorer/Shift-Click-Non-Searched-A.png | 3 - .../explorer/Shift-Click-Non-Searched-B.png | 3 - .../studio/explorer/Shift-Click-Searched.png | 3 - ...ndService-SoundGroup-ReverbSoundEffect.png | 3 - .../explorer/SoundService-SoundGroup.png | 3 - .../studio/explorer/SpringConstraint.png | 3 - .../StarterGui-BindableEvent-ContextEvent.png | 3 - ...utContext-InputAction-InputBinding-All.png | 3 - ...nputAction-InputBinding-GamepadBinding.png | 3 - ...putAction-InputBinding-KeyboardBinding.png | 3 - ...-InputAction-InputBinding-TouchBinding.png | 3 - ...i-InputContext-InputAction-LocalScript.png | 3 - .../StarterGui-InputContext-InputAction.png | 3 - .../explorer/StarterGui-InputContext.png | 3 - .../StarterGui-LocalScript-UpdateContext.png | 3 - .../StarterGui-ScreenGui-HUDContainer.png | 3 - .../StarterGui-ScreenGui-MenuFrame.png | 3 - .../explorer/StarterGui-ScreenGui-Path2D.png | 3 - .../StarterGui-ScreenGui-SprintButton.png | 3 - .../StarterGui-ScreenGui-StyleLink.png | 3 - .../StarterGui-ScreenGui-TextButton.png | 3 - .../StarterGui-ScreenGui-VideoFrame.png | 3 - .../studio/explorer/StarterGui-ScreenGui.png | 3 - .../studio/explorer/StarterGui-SurfaceGui.png | 3 - .../explorer/StarterGui-UIDragDetector.png | 3 - .../assets/studio/explorer/StarterGui.png | 3 - .../studio/explorer/StarterPack-Tools.png | 3 - .../assets/studio/explorer/StarterPlayer.png | 3 - .../studio/explorer/StyleLink-Propagation.png | 3 - .../studio/explorer/Styling-Hierarchy.png | 3 - .../assets/studio/explorer/Teams-Team.png | 3 - .../assets/studio/explorer/Terrain-Clouds.png | 3 - ...xtChatService-ChannelTabsConfiguration.png | 3 - ...tChatService-ChatInputBarConfiguration.png | 3 - ...extChatService-ChatWindowConfiguration.png | 3 - .../TextChatService-TextChatCommand.png | 3 - .../assets/studio/explorer/UIGradient.png | 3 - .../assets/studio/explorer/UIGridLayout.png | 3 - .../assets/studio/explorer/UIPageLayout.png | 3 - .../assets/studio/explorer/UITableLayout.png | 3 - .../studio/explorer/VoiceChatService.png | 3 - .../studio/explorer/Workspace-Add-Object.png | 3 - .../studio/explorer/Workspace-Baseplate.png | 3 - .../studio/explorer/Workspace-Terrain.png | 3 - .../assets/studio/explorer/Workspace-Tool.png | 3 - .../assets/studio/explorer/Workspace.png | 3 - .../studio/general/3D-Asset-Preview.mp4 | 3 - .../studio/general/Activity-History.png | 3 - .../assets/studio/general/Boom-Impact.mp3 | 3 - .../general/ColorSequence-Red-Cyan-Purple.png | 3 - .../general/ColorSequence-Red-Purple.png | 3 - .../general/ColorSequence-Red-White.png | 3 - .../ColorSequence-White-Keypoints-Labeled.png | 3 - .../studio/general/ColorSequence-White.png | 3 - .../assets/studio/general/Command-Bar.png | 3 - .../studio/general/Controller-Emulator-VR.png | 3 - .../studio/general/Controller-Emulator.png | 3 - .../studio/general/Device-Emulator-Phone.png | 3 - .../studio/general/Device-Emulator-Tablet.png | 3 - .../general/Docking-Expand-Collapse.png | 3 - .../studio/general/Docking-Grouped-Tabs.png | 3 - .../studio/general/Docking-Pinned-Tabs.png | 3 - .../Docking-Position-Selector-Empty.png | 3 - .../Docking-Position-Selector-Left.png | 3 - .../Docking-Position-Selector-Right.png | 3 - .../Editor-Window-Emulation-Options.png | 3 - .../Editor-Window-Object-Selection.jpg | 3 - .../assets/studio/general/Editor-Window.jpg | 3 - .../studio/general/Emulator-Viewport-VR.jpg | 3 - .../general/Manage-Tabs-Popup-Options.png | 3 - .../studio/general/Manage-Tabs-Popup.png | 3 - .../Mezzanine-Debug-Resume-Scripts.png | 3 - .../studio/general/Mezzanine-Debug-Stop.png | 3 - .../studio/general/Mezzanine-Debug-Tools.png | 3 - .../studio/general/Mezzanine-Default-Tabs.png | 3 - .../assets/studio/general/Mezzanine-Right.png | 3 - .../general/Mezzanine-Testing-Client.png | 3 - .../general/Mezzanine-Testing-Controls.png | 3 - .../general/Mezzanine-Testing-End-Session.png | 3 - .../general/Mezzanine-Testing-Mode-Run.png | 3 - .../Mezzanine-Testing-Mode-Server-Clients.png | 3 - .../Mezzanine-Testing-Mode-Team-Test.png | 3 - .../Mezzanine-Testing-Mode-Test-Here.png | 3 - .../general/Mezzanine-Testing-Mode-Test.png | 3 - .../general/Mezzanine-Testing-Options.png | 3 - .../general/Mezzanine-Testing-Pause.png | 3 - .../general/Mezzanine-Testing-Server.png | 3 - .../Mezzanine-Testing-Step-Forward.png | 3 - .../studio/general/Mezzanine-Testing-Stop.png | 3 - .../studio/general/NumberSequence-0-1-0.png | 3 - .../studio/general/NumberSequence-0-1.png | 3 - ...mberSequence-0.5-0.5-Keypoints-Labeled.png | 3 - .../studio/general/NumberSequence-0.5-0.5.png | 3 - .../general/NumberSequence-Envelope.png | 3 - .../Output-Window-Client-Server-Labels.png | 3 - .../studio/general/Output-Window-Diagram.png | 3 - .../assets/studio/general/Output-Window.png | 3 - .../assets/studio/general/Party-Simulator.png | 3 - .../general/Preview-Panel-Hierarchy.png | 3 - .../general/Selected-Object-Bounding-Box.jpg | 3 - .../studio/general/Selection-Cycling.mp4 | 3 - .../assets/studio/general/Studio-Layout.png | 3 - .../studio/general/Studio-Logo-Blue.png | 3 - .../assets/studio/general/Studio-Splash.jpg | 3 - .../studio/general/Toolbar-Add-Custom-Tab.png | 3 - .../assets/studio/general/Toolbar-Align.png | 3 - .../assets/studio/general/Toolbar-Anchor.png | 3 - .../studio/general/Toolbar-Animation.png | 3 - .../studio/general/Toolbar-Assistant.png | 3 - .../general/Toolbar-Avatar-Settings.png | 3 - .../studio/general/Toolbar-Avatar-Setup.png | 3 - .../studio/general/Toolbar-Character.png | 3 - .../studio/general/Toolbar-Collaborate.png | 3 - .../studio/general/Toolbar-Color-Picker.png | 3 - .../studio/general/Toolbar-Comments.png | 3 - .../general/Toolbar-Constraint-Pickers.png | 3 - .../general/Toolbar-Current-Collaborators.png | 3 - .../general/Toolbar-Custom-Plugin-Button.png | 3 - .../general/Toolbar-Custom-Tab-Add-Tool.png | 3 - .../general/Toolbar-Custom-Tab-Filled.png | 3 - .../general/Toolbar-Debugging-Tools.png | 3 - .../studio/general/Toolbar-Explorer.png | 3 - .../assets/studio/general/Toolbar-Group.png | 3 - .../general/Toolbar-Insert-Part-Widget.png | 3 - .../assets/studio/general/Toolbar-Lock.png | 3 - .../general/Toolbar-Manage-Collaborators.png | 3 - .../studio/general/Toolbar-Material-Color.png | 3 - .../general/Toolbar-Material-Picker.png | 3 - .../studio/general/Toolbar-Mezzanine.png | 3 - .../studio/general/Toolbar-Mode-Physical.png | 3 - .../studio/general/Toolbar-Pivot-Reset.png | 3 - .../assets/studio/general/Toolbar-Pivot.png | 3 - .../studio/general/Toolbar-Properties.png | 3 - .../studio/general/Toolbar-Solid-Modeling.png | 3 - .../studio/general/Toolbar-Style-Editor.png | 3 - .../studio/general/Toolbar-Terrain-Editor.png | 3 - .../assets/studio/general/Toolbar-Toolbox.png | 3 - .../general/Toolbar-Transform-Snapping.png | 3 - .../general/Toolbar-Transform-Tools.png | 3 - .../general/Toolbar-Update-Available.png | 3 - .../studio/general/Touch-Simulation.png | 3 - .../studio/general/Visualization-Options.png | 3 - .../Apply-To-Selected-Parts.png | 3 - .../Base-Material-Selected.png | 3 - .../Create-Material-Variant.png | 3 - .../material-manager/Custom-Material-Icon.png | 3 - .../Disable-Material-Override-Specific.png | 3 - .../Paint-Parts-With-Selected-Material.png | 3 - .../material-manager/Physical-Properties.png | 3 - .../Set-Override-Disabled.png | 3 - .../material-manager/Set-Override-Enabled.png | 3 - .../Terrain-Details-Create-Buttons.png | 3 - .../material-manager/Terrain-Details-Edit.png | 3 - .../packages/Compare-Versions-Selector.png | 3 - .../Package-Configured-Attributes-Reset.png | 3 - .../Package-Configured-Attributes.png | 3 - .../studio/packages/Package-Modified.png | 3 - .../packages/Package-Structure-Explorer.png | 3 - .../packages/Package-Update-Available.png | 3 - .../studio/packages/PackageLink-Explorer.png | 3 - .../studio/packages/Script-Unlock-Link.png | 3 - .../pivot-tools/Edit-Pivot-Center-A.jpg | 3 - .../pivot-tools/Edit-Pivot-Corner-A.jpg | 3 - .../studio/pivot-tools/Edit-Pivot-Model-A.jpg | 3 - .../studio/pivot-tools/Edit-Pivot-Model-B.jpg | 3 - .../studio/pivot-tools/Edit-Pivot-Model-C.jpg | 3 - .../pivot-tools/Edit-Pivot-Outside-A.jpg | 3 - .../studio/pivot-tools/Hotspots-Model.jpg | 3 - .../studio/pivot-tools/Hotspots-Part.jpg | 3 - .../studio/pivot-tools/PrimaryPart-1.jpg | 3 - .../studio/pivot-tools/PrimaryPart-2.jpg | 3 - .../studio/pivot-tools/PrimaryPart-3.jpg | 3 - .../properties/Add-Attribute-Button.png | 3 - .../studio/properties/Add-Tag-Button.png | 3 - .../studio/properties/AnchorPoint-Default.png | 3 - .../properties/AnchorPoint-Overridden.png | 3 - .../properties/Appearance-Color3-Picker.png | 3 - .../Appearance-Color3-RGB-Entry.png | 3 - .../studio/properties/Attributes-Example.png | 3 - .../studio/properties/Color-Input-Options.png | 3 - .../studio/properties/Color-Open-Sequence.png | 3 - .../assets/studio/properties/Color-Picker.png | 3 - .../studio/properties/Color-RGB-Entry.png | 3 - .../properties/Default-Properties-Toast.jpg | 3 - .../properties/Enter-Private-Asset-ID.png | 3 - .../studio/properties/Folder-Sandboxed.png | 3 - .../properties/GuiObject-AnchorPoint.png | 3 - .../properties/GuiObject-AutomaticSize.png | 3 - .../studio/properties/GuiObject-Position.png | 3 - .../studio/properties/GuiObject-Size.png | 3 - .../studio/properties/GuiObject-ZIndex.png | 3 - .../studio/properties/Input-Combined.png | 3 - .../studio/properties/Input-Expanded.png | 3 - .../properties/InputAction-Type-Bool.png | 3 - .../InputBinding-KeyCode-ButtonY.png | 3 - .../InputBinding-KeyCode-LeftShift.png | 3 - .../InputBinding-UIButton-SprintButton.png | 3 - .../studio/properties/Instance-Filtered.png | 3 - .../LinearVelocity-Attachment0-Unassigned.png | 3 - .../studio/properties/Model-LevelOfDetail.png | 3 - .../properties/Model-ModelStreamingMode.png | 3 - .../ParticleEmitter-WindAffectsDrag.png | 3 - ...th2D-SelectedControlPointData-Expanded.png | 3 - .../Path2D-SelectedControlPointData.png | 3 - .../studio/properties/Remove-Tag-Button.png | 3 - .../Rename-Delete-Attribute-Button.png | 3 - ...creenGui-ScreenInsets-DeviceSafeInsets.png | 3 - .../studio/properties/Script-RunContext.png | 3 - .../studio/properties/Sections-Example.png | 3 - .../studio/properties/Set-Attribute.png | 3 - .../assets/studio/properties/Set-Tag.png | 3 - .../studio/properties/Size-Open-Sequence.png | 3 - .../studio/properties/Sound-SoundGroup.png | 3 - .../studio/properties/Sound-SoundId.png | 3 - .../properties/SpawnLocation-TeamColor.png | 3 - ...pringConstraint-Attachment0-Unassigned.png | 3 - .../properties/StarterPlayer-Camera-Group.png | 3 - ...tarterPlayer-EnableMouseLockOption-Off.png | 3 - .../properties/StyleLink-StyleSheet.png | 3 - .../properties/Styling-Modified-Property.png | 3 - .../properties/SurfaceGui-Adornee-Face.png | 3 - .../studio/properties/SurfaceGui-Face-Top.png | 3 - .../Team-AutoAssignable-Disabled.png | 3 - .../studio/properties/Team-Name-TeamColor.png | 3 - .../studio/properties/Terrain-Decoration.png | 3 - .../studio/properties/Terrain-GrassLength.png | 3 - .../Terrain-MaterialColors-Expand.png | 3 - ...tService-ChatVersion-LegacyChatService.png | 3 - ...hatService-ChatVersion-TextChatService.png | 3 - .../assets/studio/properties/Tool-Grip.png | 3 - .../studio/properties/Tool-RequiresHandle.png | 3 - .../properties/Transparency-Open-Sequence.png | 3 - .../properties/UICorner-CornerRadius.png | 3 - .../UIGradient-Open-ColorSequence-Window.png | 3 - .../UIGradient-Open-NumberSequence-Window.png | 3 - .../properties/VideoFrame-Looped-Playing.png | 3 - .../properties/Workspace-GlobalWind.png | 3 - ...rkspace-ModelStreamingBehavior-Default.png | 3 - ...kspace-ModelStreamingBehavior-Improved.png | 3 - .../Workspace-Streaming-Properties.png | 3 - .../properties/Workspace-StreamingEnabled.png | 3 - .../studio/script-editor/AddAboveBelow.mp4 | 3 - .../studio/script-editor/AddToAllMatches.mp4 | 3 - .../script-editor/AddToNextPrevMatch.mp4 | 3 - .../studio/script-editor/AddWithClick.mp4 | 3 - .../studio/script-editor/AddWithDrag.mp4 | 3 - .../studio/script-editor/Autocomplete-API.png | 3 - .../script-editor/Autocomplete-CustomDocs.png | 3 - .../script-editor/Autocomplete-Data-Model.png | 3 - .../Autocomplete-Diagnostics.png | 3 - .../script-editor/Autocomplete-Signature.png | 3 - .../Autocomplete-Suggestions.png | 3 - .../script-editor/Autocomplete-Variable.png | 3 - .../studio/script-editor/Code-Assist.mp4 | 3 - .../script-editor/ColumnBlockSelect.mp4 | 3 - .../assets/studio/script-editor/CopyPaste.mp4 | 3 - .../Find-Match-Case-Whole-Word.png | 3 - .../Find-Replace-Widget-Labeled.png | 3 - .../script-editor/Go-To-Declaration.png | 3 - .../script-editor/MatchCaseWholeWord1.mp4 | 3 - .../script-editor/MatchCaseWholeWord2.mp4 | 3 - .../studio/script-editor/OnTypeFormatting.mp4 | 3 - .../studio/script-editor/RemoveWithClick.mp4 | 3 - .../script-editor/Script-Analysis-1.png | 3 - .../script-editor/Script-Analysis-2.png | 3 - .../script-editor/Script-Functions-Filter.png | 3 - .../Shortcut-Edit-Select-Prev.png | 3 - .../SplitSelectionsIntoLines.mp4 | 3 - .../studio/script-editor/UndoRecentCursor.mp4 | 3 - .../terrain-editor/Brush-Shape-Icons.png | 3 - .../terrain-editor/Brush-Shape-Size.png | 3 - .../terrain-editor/Create-Tab-Clear.png | 3 - .../terrain-editor/Create-Tab-Generate.png | 3 - .../terrain-editor/Create-Tab-Import.png | 3 - .../studio/terrain-editor/Draw-Tool.mp4 | 3 - .../terrain-editor/Edit-Tab-Detail-Tools.png | 3 - .../studio/terrain-editor/Edit-Tab-Draw.png | 3 - .../studio/terrain-editor/Edit-Tab-Fill.png | 3 - .../terrain-editor/Edit-Tab-Flatten.png | 3 - .../studio/terrain-editor/Edit-Tab-Paint.png | 3 - .../studio/terrain-editor/Edit-Tab-Sculpt.png | 3 - .../terrain-editor/Edit-Tab-Sea-Level.png | 3 - .../studio/terrain-editor/Edit-Tab-Select.png | 3 - .../studio/terrain-editor/Edit-Tab-Smooth.png | 3 - .../terrain-editor/Edit-Tab-Transform.png | 3 - .../studio/terrain-editor/Fill-Region.jpg | 3 - .../terrain-editor/Flatten-Mode-Icons.png | 3 - .../studio/terrain-editor/Flatten-Tool.mp4 | 3 - .../studio/terrain-editor/Generate-Tool.mp4 | 3 - .../studio/terrain-editor/Import-Tool.mp4 | 3 - .../studio/terrain-editor/Paint-Tool.mp4 | 3 - .../studio/terrain-editor/Sculpt-Tool.mp4 | 3 - .../studio/terrain-editor/Sea-Level-Tool.mp4 | 3 - .../terrain-editor/Select-Region-Labeled.jpg | 3 - .../studio/terrain-editor/Smooth-Tool.mp4 | 3 - .../Transform-Region-Labeled.jpg | 3 - .../studio/texture-generator/Art-Style.png | 3 - .../Generation-Angle-Bad.png | 3 - .../Generation-Angle-Good.png | 3 - .../Generation-Mossy-Stone.jpg | 3 - .../Generation-Post-Preview.png | 3 - .../Generation-Rusted-Metal-Charred.jpg | 3 - .../Generation-Snow-Covered-Ice.jpg | 3 - .../Generation-Untextured.jpg | 3 - .../texture-generator/Saved-Textures-List.png | 3 - .../Specify-Front-View-Bad-Back.jpg | 3 - .../Specify-Front-View-Bad-Front.jpg | 3 - .../Specify-Front-View-Good-Back.jpg | 3 - .../Specify-Front-View-Good-Front.jpg | 3 - .../texture-generator/Texture-Applied.jpg | 3 - .../studio/toolbox/Asset-Inspect-Icon.png | 3 - .../toolbox/Creations-Group-Packages.png | 3 - .../assets/studio/toolbox/Creations-Tab.png | 3 - .../toolbox/Creator-Store-Advanced-Filter.png | 3 - .../toolbox/Creator-Store-Audio-Discovery.png | 3 - .../studio/toolbox/Creator-Store-Audio.png | 3 - .../toolbox/Creator-Store-Categories-Ads.png | 3 - .../Creator-Store-Categories-See-All.png | 3 - .../Creator-Store-Category-Selector.png | 3 - .../Creator-Store-Scene-Manager-Plugin.png | 3 - .../studio/toolbox/Creator-Store-Tab.png | 3 - .../studio/toolbox/Inventory-My-Packages.png | 3 - .../assets/studio/toolbox/Inventory-Tab.png | 3 - .../studio/toolbox/Model-Search-Example.png | 3 - .../assets/studio/toolbox/Recent-Tab.png | 3 - .../roblox/en-us/assets/tutorials/.gitkeep | 0 .../UCT-Overview/Background-Music.png | 3 - .../tutorials/UCT-Overview/Box-Modeling.png | 3 - .../UCT-Overview/Creating-Animations.png | 3 - .../UCT-Overview/Creating-HUD-Meters.png | 3 - .../assets/tutorials/UCT-Overview/Events.png | 3 - .../UCT-Overview/First-Person-Camera.png | 3 - .../tutorials/UCT-Overview/Humanoid-Model.png | 3 - .../UCT-Overview/Indoor-Lighting.png | 3 - .../tutorials/UCT-Overview/Interactive-UI.png | 3 - .../UCT-Overview/Isometric-Camera.png | 3 - .../tutorials/UCT-Overview/Laser-Beams.png | 3 - .../UCT-Overview/Modular-Environments.png | 3 - .../tutorials/UCT-Overview/Moving-Objects.png | 3 - .../tutorials/UCT-Overview/Neon-Signs.png | 3 - .../UCT-Overview/Outdoor-Lighting.png | 3 - .../UCT-Overview/Part-Interfaces.png | 3 - .../tutorials/UCT-Overview/Player-Input.png | 3 - .../UCT-Overview/Positional-Audio.png | 3 - .../UCT-Overview/Properties-Attributes.png | 3 - .../UCT-Overview/Proximity-Prompts.png | 3 - .../tutorials/UCT-Overview/Saving-Data.png | 3 - .../tutorials/UCT-Overview/Score-Bars.png | 3 - .../UCT-Overview/Script-Types-Locations.png | 3 - .../Scripting-Avatar-Animations.png | 3 - .../tutorials/UCT-Overview/Services.png | 3 - .../UCT-Overview/Side-Scrolling-Camera.png | 3 - .../tutorials/UCT-Overview/Simple-Mesh.png | 3 - .../UCT-Overview/Spinning-Objects.png | 3 - .../tutorials/UCT-Overview/Text-to-Speech.png | 3 - .../UCT-Overview/Vertex-Coloring.png | 3 - .../tutorials/UCT-Overview/Voice-Chat.png | 3 - .../tutorials/UCT-Overview/Volcanoes.png | 3 - .../tutorials/UCT-Overview/Waterfalls.png | 3 - .../tutorials/add-2D-audio/Button-Default.jpg | 3 - .../tutorials/add-2D-audio/Button-Pressed.jpg | 3 - .../assets/tutorials/add-2D-audio/Default.jpg | 3 - .../add-2D-audio/Feedback-DataModel.jpg | 3 - .../tutorials/add-2D-audio/Feedback-Final.mp4 | 3 - .../tutorials/add-2D-audio/In-Focus-State.jpg | 3 - .../add-2D-audio/Looping-DataModel.png | 3 - .../tutorials/add-2D-audio/Looping-Final.mp4 | 3 - .../tutorials/add-2D-audio/Metal-Track.mp4 | 3 - .../tutorials/add-2D-audio/On-Hover-State.jpg | 3 - .../tutorials/add-2D-audio/Selected-State.jpg | 3 - .../tutorials/add-2D-audio/UI-DataModel.png | 3 - .../tutorials/add-2D-audio/UI-Final.mp4 | 3 - .../tutorials/add-2D-audio/With-Looping.mp4 | 3 - .../add-2D-audio/Without-Looping.mp4 | 3 - .../add-2D-audio/game-state-example.mp4 | 3 - .../tutorials/add-3D-audio/Button-Default.jpg | 3 - .../tutorials/add-3D-audio/Button-Pressed.jpg | 3 - .../CharacterDialogue-DataModel.png | 3 - .../tutorials/add-3D-audio/Dialogue-Final.mp4 | 3 - .../add-3D-audio/EventFeedback-DataModel.png | 3 - .../Experience-Object-Representations.png | 3 - .../add-3D-audio/Feedback-DataModel.jpg | 3 - .../tutorials/add-3D-audio/Feedback-Final.mp4 | 3 - .../add-3D-audio/Looping-DataModel.png | 3 - .../tutorials/add-3D-audio/Looping-Final.mp4 | 3 - .../add-3D-audio/ObjectInteraction-Final.mp4 | 3 - .../tutorials/add-3D-audio/Plant-Example.mp4 | 3 - .../Realworld-Object-Representations.png | 3 - .../tutorials/add-3D-audio/Space-Bark.mp4 | 3 - .../tutorials/add-3D-audio/Volume-Example.jpg | 3 - .../tutorials/add-3D-audio/event-example.mp4 | 3 - .../add-3D-audio/looping-example.mp4 | 3 - .../add-text-to-speech/ContextTTS-final.mp4 | 3 - .../add-text-to-speech/GreenGumdrop.png | 3 - .../add-text-to-speech/RedGumdrop.png | 3 - .../add-text-to-speech/YellowGumdrop.png | 3 - .../add-text-to-speech/basicTTS-exp1.mp3 | 3 - .../add-text-to-speech/basicTTS-exp2.mp3 | 3 - .../add-text-to-speech/basicTTS-exp3.mp3 | 3 - .../add-text-to-speech/basicTTS-exp3.mp4 | 3 - .../add-text-to-speech/basicTTS-final.mp4 | 3 - .../add-voice-chat/DisabledScripts.jpg | 3 - .../Combining-Additional-Mesh.jpg | 3 - .../Combining-Core-Mesh.jpg | 3 - .../Combining-Making-A-Building.mp4 | 3 - .../Combining-Overlapping-Meshes.jpg | 3 - .../Customizing-MassSelection.jpg | 3 - .../Customizing-MaterialVariants.jpg | 3 - .../Customizing-NewColor.jpg | 3 - .../Customizing-NewCustomMaterial.jpg | 3 - .../DecorativeProps-Building.jpg | 3 - .../Overview-Asset-Kit.png | 3 - .../Overview-City-Template.png | 3 - .../Pivot-Points-Aligned-Diagram.jpg | 3 - .../Pivot-Points-Aligned.mp4 | 3 - .../Pivot-Points-Awning.jpg | 3 - .../Pivot-Points-Cornice.jpg | 3 - .../Pivot-Points-Misaligned-Diagram.jpg | 3 - .../Pivot-Points-Misaligned-TopView.png | 3 - .../Pivot-Points-Misaligned.mp4 | 3 - .../Pivot-Points-Railing.jpg | 3 - .../Pivot-Points-Stud-Diagram.png | 3 - .../Snapping-Behavior-Values.jpg | 3 - .../SurfaceAppearance-Concrete.jpg | 3 - .../SurfaceAppearance-DefaultTrim.jpg | 3 - .../SurfaceAppearance-Delete.jpg | 3 - .../SurfaceAppearance-Final.jpg | 3 - .../SurfaceAppearance-NewColor.jpg | 3 - .../SurfaceAppearance-NewTrim.jpg | 3 - .../SurfaceAppearance-Objects.jpg | 3 - .../SurfaceAppearance-Wood.jpg | 3 - .../Textures-Building.jpg | 3 - .../WithTexture.jpg | 3 - .../WithoutTexture.jpg | 3 - .../basicParticleFinished.mp4 | 3 - .../basicParticleNoLight.mp4 | 3 - .../defaultParticles.jpg | 3 - .../explorerMeshPart.jpg | 3 - .../basic-particle-effects/meshProperties.jpg | 3 - .../basic-particle-effects/particleColor.jpg | 3 - .../particleColorGame.jpg | 3 - .../particleLifetime.jpg | 3 - .../particleLifetimeGame.jpg | 3 - .../basic-particle-effects/particleRate.jpg | 3 - .../particleRateGame.jpg | 3 - .../basic-particle-effects/particleSpeed.jpg | 3 - .../particleSpreadAngle.jpg | 3 - .../particleSpreadAngleGame.jpg | 3 - .../rotatingParticleEffect.mp4 | 3 - .../scalingParticleEffect.mp4 | 3 - .../Add-Platforms-Final.jpg | 3 - .../Add-Platforms-Greybox.jpg | 3 - .../Explorer-Add-Folder.png | 3 - .../Explorer-Add-Model.png | 3 - .../Explorer-Character-Humanoid.png | 3 - .../Explorer-Model-Renamed.png | 3 - .../Final-Platforms.jpg | 3 - .../First-Platform.jpg | 3 - .../HollowTunnel-Final.jpg | 3 - .../HollowTunnel-Negate.jpg | 3 - .../HollowTunnel-Start.jpg | 3 - .../HollowTunnel-Union.jpg | 3 - .../Humanoid-Jump-Settings.png | 3 - .../New-Part-As-Child-Of-Model.png | 3 - .../block-out-a-playable-area/Part-Picker.png | 3 - .../Platform-Levels.jpg | 3 - .../Platforms-Aligned-Underwater.jpg | 3 - .../playable-area-walk.mp4 | 3 - .../Ferris-Wheel-Edit-Place.png | 3 - .../ferrisWheel-finalExample.mp4 | 3 - .../ferrisWheel-inContext.mp4 | 3 - .../makingAFerrisWheel_actuatorType.png | 3 - .../makingAFerrisWheel_angularVelocity.png | 3 - .../makingAFerrisWheel_mainMotor.png | 3 - ...akingAFerrisWheel_mainMotorAttachments.png | 3 - .../makingAFerrisWheel_motorMaxTorque.png | 3 - .../makingAFerrisWheel_moveMainSupport.jpg | 3 - ...ingAFerrisWheel_movedSupportAttachment.jpg | 3 - ...akingAFerrisWheel_movedWheelAttachment.jpg | 3 - .../makingAFerrisWheel_originalPosition.jpg | 3 - ...kingAFerrisWheel_rotateWheelAttachment.jpg | 3 - .../makingAFerrisWheel_supportAttachment.png | 3 - .../makingAFerrisWheel_wheelAttachment.png | 3 - .../introToConstraints-showDoorCreated.jpg | 3 - ...ntroToConstraints_attachmentsConnected.png | 3 - .../introToConstraints_attachmentsCreated.png | 3 - .../introToConstraints_attachmentsRenamed.png | 3 - .../introToConstraints_doorSwingingWrong.mp4 | 3 - .../introToConstraints_finalDoor.mp4 | 3 - ...ntroToConstraints_finalDoor_WithLimits.mp4 | 3 - .../introToConstraints_finalExample.mp4 | 3 - .../introToConstraints_limitAnglesV2.jpg | 3 - .../introToConstraints_limitsEnabled.png | 3 - .../introToConstraints_primaryAxis.jpg | 3 - .../introToConstraints_secondaryAxisArrow.png | 3 - .../introToConstraints_selectAnchored.png | 3 - .../introToConstraints_selectAttachment0.mp4 | 3 - ...troToConstraints_selectFrameAttachment.png | 3 - ...troToConstraints_showAttachementsMoved.jpg | 3 - .../introToConstraints_showAttachmentAxis.jpg | 3 - .../introToConstraints_showAxisArc.jpg | 3 - ...oConstraints_showCreateHingeConstraint.png | 3 - .../introToConstraints_showLimitsSet.png | 3 - .../introToConstraints_showMoveAttachment.mp4 | 3 - .../introToConstraints_snapRotate.png | 3 - .../building-lesson/Mezzanine-Assistant.png | 3 - .../building-lesson/ObbyThumbnail.png | 3 - .../building-lesson/Studio-Setup.jpg | 3 - .../building-lesson/Texture-On-Surface.jpg | 3 - .../tutorials/building-lesson/anchor-demo.mp4 | 3 - .../building-lesson/createPrompt-2.png | 3 - .../tutorials/building-lesson/customize-1.png | 3 - .../tutorials/building-lesson/customize-2.png | 3 - .../tutorials/building-lesson/customize-3.png | 3 - .../tutorials/building-lesson/customize-4.png | 3 - .../tutorials/building-lesson/customize-5.png | 3 - .../tutorials/building-lesson/insert-2.png | 3 - .../tutorials/building-lesson/insert-3.png | 3 - .../tutorials/building-lesson/materials.png | 3 - .../tutorials/building-lesson/part-picker.png | 3 - .../coding-lesson/StoryGameThumb.png | 3 - .../CameraManagerScript.png | 3 - .../CameraModeProperty.png | 3 - .../FirstPersonCameraExample.jpg | 3 - .../IsometricCameraExample.jpg | 3 - .../SidescrollingCameraExample.jpg | 3 - .../StarterPlayerSelection.png | 3 - .../ThirdPersonCameraExample.jpg | 3 - .../VectorComponentDemonstration.jpg | 3 - .../ApplyAssetLibrary/Coins-Final.jpg | 3 - .../ApplyAssetLibrary/Mountains-Final.jpg | 3 - .../Organization-Structure.jpg | 3 - .../ApplyAssetLibrary/Platforms-4.jpg | 3 - .../ApplyAssetLibrary/Platforms-5.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-10.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-11.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-12.png | 3 - .../ApplyAssetLibrary/SeaStacks-13.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-14.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-15.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-16.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-17.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-18.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-3.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-4.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-5.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-6.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-7.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-8.jpg | 3 - .../ApplyAssetLibrary/SeaStacks-9.jpg | 3 - .../Asset-Library-Complete-With-Materials.jpg | 3 - .../Asset-Library-Complete.jpg | 3 - .../Baseplate-Deleted.jpg | 3 - .../core-building-and-scripting/Coin-Mesh.jpg | 3 - .../Completed-Sea-Stack.jpg | 3 - .../Custom-AirParticleDensity.jpg | 3 - .../Custom-Color.jpg | 3 - .../Custom-Offset.jpg | 3 - .../Custom-Shadows.jpg | 3 - .../Custom-SunPosition.jpg | 3 - .../Default-Color.jpg | 3 - .../Default-Shadows.jpg | 3 - .../Default-SunPosition.jpg | 3 - .../Dust-Motes-Sky.jpg | 3 - .../DustMotes-NumberSequence-Size.png | 3 - .../DustMotes-NumberSequence-Transparency.png | 3 - .../DustParticles-1.mp4 | 3 - .../Final-Coin.jpg | 3 - .../Final-Flare.jpg | 3 - .../Final-Polished-Assets.jpg | 3 - .../First-Platform.jpg | 3 - .../core-building-and-scripting/Flare-1.mp4 | 3 - .../Flare-NumberSequence-Size.png | 3 - .../Flare-NumberSequence-Transparency.png | 3 - .../Flare-With-PointLight.jpg | 3 - .../Lighting-Post-Customization.jpg | 3 - .../Lighting-Pre-Customization.jpg | 3 - .../LightingStyle-Realistic.jpg | 3 - .../LightingStyle-Soft.jpg | 3 - .../MaterialService-Contents.png | 3 - .../Mountain-Mesh.jpg | 3 - .../Mountain-Meshes-Stacked.jpg | 3 - .../Platform-A-Model.jpg | 3 - .../Platform-B-Model.jpg | 3 - .../Platform-Types.jpg | 3 - .../Pre-Polished-Assets.jpg | 3 - .../Sea-Stack-Cave-Mesh.jpg | 3 - .../Sea-Stack-Mesh.jpg | 3 - .../Sea-Stacks.jpg | 3 - .../Terrain-Adding-First-Sphere.mp4 | 3 - .../Terrain-Editor-Draw-Settings.png | 3 - .../Terrain-Editor-Fill-Settings.png | 3 - .../Terrain-Editor-Flatten-Settings.png | 3 - .../Terrain-Editor-Paint-Settings.png | 3 - .../Terrain-Editor-Sculpt-Settings.png | 3 - .../Terrain-Filling-Water.mp4 | 3 - .../Terrain-Flattening-Sphere.mp4 | 3 - .../Terrain-Painting-Grass.mp4 | 3 - .../Terrain-Sculpting-Edges.mp4 | 3 - ...eate-an-environment-with-terrain-spawn.mp4 | 3 - ...te-an-environment-with-terrain-walking.mp4 | 3 - .../Hazard-Part-On-Water.jpg | 3 - .../create-player-hazards/New-Hazard-Part.png | 3 - .../player-hazards-example.mp4 | 3 - .../Showdown-Town-Edit-Place.png | 3 - .../dangerousVent.jpg | 3 - .../finalHealthPickup.mp4 | 3 - .../finalHealthPickupTest.mp4 | 3 - .../creating-a-health-pickup/forLoop.jpg | 3 - .../fullHealthPickupEffect.mp4 | 3 - .../healthPickupExplorer.png | 3 - .../healthPickupGame.jpg | 3 - .../Device-Emulator-Preview.png | 3 - .../Device-Emulator-Setup.png | 3 - .../creating-a-score-bar/Frame-2A.png | 3 - .../creating-a-score-bar/Frame-2B.png | 3 - .../creating-a-score-bar/Frame-Diagram2.png | 3 - .../creating-a-score-bar/Frame-Horizontal.png | 3 - .../creating-a-score-bar/Frame-Vertical.png | 3 - .../creating-a-score-bar/Icon-1B.png | 3 - .../creating-a-score-bar/Icon-2E.png | 3 - .../creating-a-score-bar/Score-Bar-Intro.png | 3 - .../creating-a-score-bar/Text-1B.png | 3 - .../creating-a-score-bar/Text-2H.png | 3 - .../bipi_t2_showFrame3_front.jpg | 3 - .../bipi_t2_showFrame3_side.jpg | 3 - .../ccs2020_t2_exportedAnimationWeb_alt.png | 3 - .../ccs2020_t2_jumpAnimationStills_01.jpg | 3 - .../ccs2020_t2_jumpAnimationStills_2.jpg | 3 - .../ccs2020_t2_jumpAnimationStills_3.jpg | 3 - .../ccs2020_t2_jumpAnimationStills_4.jpg | 3 - .../creating-an-animation-AddKeyframe.mp4 | 3 - .../creating-an-animation-changeExactTime.png | 3 - .../creating-an-animation-clickAddAll.png | 3 - .../creating-an-animation-clickMenuButton.png | 3 - .../creating-an-animation-exportAnim.mp4 | 3 - .../creating-an-animation-exportCopy.png | 3 - .../creating-an-animation-partHierarchy.png | 3 - .../creating-an-animation-pasteLastFrame.png | 3 - .../creating-an-animation-rigCreated.jpg | 3 - .../creating-an-animation-selectFirst.png | 3 - .../creating-an-animation-setToMidFrame.png | 3 - .../creating-an-animation-setToThirdFrame.png | 3 - .../intro-to-animations-victoryPoseFinal.mp4 | 3 - .../showFinalVictoryPose_simple.mp4 | 3 - .../creating-an-animation/showMoveBody.mp4 | 3 - .../showPose2TimeLapse_optimized.mp4 | 3 - .../showRotateArms_web.mp4 | 3 - .../Add-Rig-2.jpg | 3 - .../Creations-Animations.png | 3 - .../Ellipsis-Button.png | 3 - .../Feminine-Rthro-Rig.jpg | 3 - .../Final-Animation.mp4 | 3 - .../Gear-Icon.png | 3 - .../InterpolationExample.mp4 | 3 - .../Left-Contact-2A.png | 3 - .../Left-Contact-2C.mp4 | 3 - .../Left-Contact-3A.jpg | 3 - .../Left-Contact-3B.jpg | 3 - .../Left-Contact-4A.jpg | 3 - .../Left-Contact-4B.jpg | 3 - .../Left-Contact-5A.jpg | 3 - .../Left-Contact-5B.jpg | 3 - .../Left-Contact-6A.png | 3 - .../Left-Contact.mp4 | 3 - .../Left-High-2A.jpg | 3 - .../Left-High-2B.jpg | 3 - .../Left-High-3A.jpg | 3 - .../Left-High-3B.jpg | 3 - .../Left-High-4.jpg | 3 - .../Left-High-5A.jpg | 3 - .../Left-High-5B.jpg | 3 - .../Left-High.mp4 | 3 - .../Left-Low-2A.jpg | 3 - .../Left-Low-2B.jpg | 3 - .../Left-Low-3A.jpg | 3 - .../Left-Low-3B.jpg | 3 - .../Left-Low-4.jpg | 3 - .../Left-Low-5A.jpg | 3 - .../Left-Low-5B.jpg | 3 - .../Left-Low.mp4 | 3 - .../Left-Passing-2A.jpg | 3 - .../Left-Passing-2B.jpg | 3 - .../Left-Passing-3A.jpg | 3 - .../Left-Passing-3B.jpg | 3 - .../Left-Passing-4.jpg | 3 - .../Left-Passing-5A.jpg | 3 - .../Left-Passing-5B.jpg | 3 - .../Left-Passing.mp4 | 3 - .../LeftStepSequence.jpg | 3 - .../Masculine-Block-Rig.jpg | 3 - .../Masculine-Skinned-Rig.jpg | 3 - .../Publish-4.png | 3 - .../creating-character-animations/Ref-All.jpg | 3 - .../Ref-Feet.jpg | 3 - .../Ref-Head.jpg | 3 - .../Ref-Masculine-Rig.jpg | 3 - .../Right-Contact-2.jpg | 3 - .../Right-Contact-3A.jpg | 3 - .../Right-Contact-3B.jpg | 3 - .../Right-Contact-4A.jpg | 3 - .../Right-Contact-4B.jpg | 3 - .../Right-Contact-5A.jpg | 3 - .../Right-Contact-5B.jpg | 3 - .../Right-Contact.mp4 | 3 - .../Right-High-2.jpg | 3 - .../Right-High-3A.jpg | 3 - .../Right-High-3B.png | 3 - .../Right-High-4A.jpg | 3 - .../Right-High-4B.jpg | 3 - .../Right-High-5A.jpg | 3 - .../Right-High-5B.jpg | 3 - .../Right-High.jpg | 3 - .../Right-High.mp4 | 3 - .../Right-Low-2.jpg | 3 - .../Right-Low-3A.jpg | 3 - .../Right-Low-3B.jpg | 3 - .../Right-Low-4A.jpg | 3 - .../Right-Low-4B.jpg | 3 - .../Right-Low-5A.jpg | 3 - .../Right-Low-5B.jpg | 3 - .../Right-Low.mp4 | 3 - .../Right-Passing-2.jpg | 3 - .../Right-Passing-3A.jpg | 3 - .../Right-Passing-3B.jpg | 3 - .../Right-Passing-4A.jpg | 3 - .../Right-Passing-4B.jpg | 3 - .../Right-Passing-5A.jpg | 3 - .../Right-Passing-5B.jpg | 3 - .../Right-Passing.mp4 | 3 - .../RightStepReference.jpg | 3 - .../creating-character-animations/Test-1.png | 3 - .../creating-character-animations/Test-2.png | 3 - .../Constraint-Details-Scale.jpg | 3 - .../creating-elevators/Constraint-Details.jpg | 3 - .../Creating-Platform-Track-Hierarchy.jpg | 3 - .../Creating-Platform-Track-Parts.jpg | 3 - ...eating-PrismaticConstraint-Attachments.jpg | 3 - .../Creating-PrismaticConstraint.jpg | 3 - .../Creating-ProximityPrompt.jpg | 3 - .../Elevator-Comparison.jpg | 3 - .../Elevator-Stud-Visualization.jpg | 3 - .../creating-elevators/Moving-Attachments.jpg | 3 - .../tutorials/creating-elevators/Overview.mp4 | 3 - .../Rotating-Attachments.jpg | 3 - .../BankersLamp.rbxm | 3 - .../BrightnessCurve-Attribute.jpg | 3 - .../BrightnessCurve-Default.jpg | 3 - .../BrightnessCurve-Example.jpg | 3 - .../BrightnessCurve-Menu.jpg | 3 - .../Importing-Sample-Lamp.jpg | 3 - .../LoopDuration-Attribute.jpg | 3 - .../creating-flickering-lights/Overview.mp4 | 3 - .../Scripting-Light-Flicker.mp4 | 3 - .../Default-Health-Meter-Disabled.png | 3 - .../Default-Health-Meter.png | 3 - .../Emulation-Phone-Constrained.png | 3 - .../Emulation-Tablet-Constrained.png | 3 - .../Emulation-Tablet-Unconstrained.png | 3 - .../tutorials/creating-hud-meters/Intro.png | 3 - .../Meter-Change-Damage-Effect.mp4 | 3 - .../Meter-Change-Static.mp4 | 3 - .../Meter-Change-Tweened.mp4 | 3 - .../Meter-CoreUISafeInsets.png | 3 - .../Meter-Design-Components.png | 3 - .../Meter-Design-Icon-Finalized.png | 3 - .../Meter-Design-Icon-Large.png | 3 - .../Meter-Design-Icon-Preview.png | 3 - .../Meter-Design-Inner-Fill-Colored.png | 3 - .../Meter-Design-Inner-Fill-Preview.png | 3 - .../Meter-Design-Inner-Fill-Resized.png | 3 - .../Meter-Design-Inner-Fill-Rounded.png | 3 - .../Meter-Design-Parent-Frame-Anchor.png | 3 - .../Meter-Design-Parent-Frame-Opaque.png | 3 - .../Meter-Design-Parent-Frame-Preview.png | 3 - ...Meter-Design-Parent-Frame-Repositioned.png | 3 - .../Meter-Design-Parent-Frame-Resized.png | 3 - .../Meter-Design-Parent-Frame-Rounded.png | 3 - .../Meter-Design-Parent-Frame-Stroked.png | 3 - .../Meter-Design-Parent-Frame.png | 3 - .../Meter-DeviceSafeInsets.png | 3 - .../ScreenGui-Axis-Ranges.png | 3 - .../ScreenGui-With-Padding.png | 3 - ...-MeterBar-Icon-UIAspectRatioConstraint.png | 3 - ...rGui-HUDContainer-MeterBar-Icon-Values.png | 3 - .../StarterGui-HUDContainer-MeterBar-Icon.png | 3 - ...DContainer-MeterBar-InnerFill-UICorner.png | 3 - ...terGui-HUDContainer-MeterBar-InnerFill.png | 3 - ...rterGui-HUDContainer-MeterBar-UICorner.png | 3 - ...ainer-MeterBar-UISizeConstraint-Values.png | 3 - ...HUDContainer-MeterBar-UISizeConstraint.png | 3 - ...rterGui-HUDContainer-MeterBar-UIStroke.png | 3 - .../StarterGui-HUDContainer-MeterBar.png | 3 - ...arterGui-HUDContainer-UIPadding-Values.png | 3 - .../StarterGui-HUDContainer-UIPadding.png | 3 - .../StarterGui-HUDContainer.png | 3 - ...rterCharacterScripts-UpdateCustomMeter.png | 3 - .../StarterPlayer-StarterCharacterScripts.png | 3 - ...erPlayerScripts-HideDefaultHealthMeter.png | 3 - .../StarterPlayer-StarterPlayerScripts.png | 3 - .../creating-moving-objects/Big-Triangle.mp4 | 3 - .../creating-moving-objects/Impulse-3.mp4 | 3 - .../creating-moving-objects/Intro.mp4 | 3 - .../creating-moving-objects/LV-3.jpg | 3 - .../creating-moving-objects/LV-4.mp4 | 3 - .../LV-Attachment-2.jpg | 3 - .../LV-Attachment-3.jpg | 3 - .../creating-moving-objects/LV-Intro.mp4 | 3 - .../creating-moving-objects/Move-Block.mp4 | 3 - .../creating-moving-objects/Movement-Axis.jpg | 3 - .../creating-moving-objects/One-Stud.jpg | 3 - .../creating-moving-objects/PC-2.jpg | 3 - .../creating-moving-objects/PC-3.jpg | 3 - .../creating-moving-objects/PC-4.mp4 | 3 - .../PC-Attachment-2.jpg | 3 - .../PC-Attachment-3.jpg | 3 - .../PC-Attachment-4.jpg | 3 - .../PC-Attachment-5.jpg | 3 - .../creating-moving-objects/PC-Intro.mp4 | 3 - .../Plate-Friction.jpg | 3 - .../Plate-Friction.mp4 | 3 - .../Small-Triangle.mp4 | 3 - .../creating-moving-objects/Wind-Block.mp4 | 3 - .../creating-neon-signs/Backboard.jpg | 3 - .../creating-neon-signs/Border-Moved.jpg | 3 - .../tutorials/creating-neon-signs/Border.jpg | 3 - .../creating-neon-signs/Duplicate-Border.jpg | 3 - .../creating-neon-signs/Final-Sign.jpg | 3 - .../creating-neon-signs/Moving-Border.jpg | 3 - .../creating-neon-signs/NegativePart.jpg | 3 - .../creating-neon-signs/Overview.jpg | 3 - .../neon-sign-baseplate.rbxl | 3 - .../creating-neon-signs/open-text.obj | 3 - .../explorer-MeshPart.png | 3 - .../explorer-blaster.png | 3 - .../explorer-equipped-character.png | 3 - .../creating-player-tools/explorer-handle.png | 3 - .../creating-player-tools/explorer-sounds.png | 3 - .../explorer-starterpack.png | 3 - .../explorer-toolcontroller.png | 3 - .../explorer-unequipped.png | 3 - .../properties-MeshPart.png | 3 - .../property-grippos.png | 3 - .../creating-player-tools/title-image.jpg | 3 - .../video-collection.mp4 | 3 - .../viewport-blaster-icon-2.png | 3 - .../viewport-blaster-icon.png | 3 - .../creating-player-tools/viewport-mesh.jpg | 3 - .../viewport-tooltip.png | 3 - .../viewport-weapon-pos-1.jpg | 3 - .../viewport-weapon-pos-2.jpg | 3 - .../AV-Attachment-2.jpg | 3 - .../AV-Attachment-3.jpg | 3 - .../AV-Constraint-2.jpg | 3 - .../AV-Constraint-2.mp4 | 3 - .../Attachment-Visual-Aids.png | 3 - .../creating-spinning-objects/Big-Block.mp4 | 3 - .../Big-Triangle.mp4 | 3 - .../Dirt-Friction.png | 3 - .../Dirt-Propeller.mp4 | 3 - .../HC-Attachments-2.jpg | 3 - .../HC-Attachments-3.jpg | 3 - .../HC-Attachments-4.jpg | 3 - .../creating-spinning-objects/HC-Hinge-2.jpg | 3 - .../creating-spinning-objects/HC-Hinge-3.jpg | 3 - .../creating-spinning-objects/HC-Hinge-3.mp4 | 3 - .../creating-spinning-objects/Impulse-1.jpg | 3 - .../creating-spinning-objects/Impulse-3.mp4 | 3 - .../Little-Triangle.mp4 | 3 - .../creating-spinning-objects/Overview.mp4 | 3 - .../Propeller-HingeConstraint-Method.fbx | 3 - .../Propeller-Scripting-Method.fbx | 3 - .../creating-spinning-objects/Propeller.jpg | 3 - .../Rotational-Axis.mp4 | 3 - .../Rotational-Axis.png | 3 - .../Stop-Propeller.mp4 | 3 - .../Using-HingeConstraints.mp4 | 3 - .../Using-Scripts.mp4 | 3 - .../creating-volcanoes/Bottom-Layer.jpg | 3 - .../creating-volcanoes/Crust-Texture.jpg | 3 - .../creating-volcanoes/Custom-Lighting.jpg | 3 - .../creating-volcanoes/Default-Lighting.jpg | 3 - .../DenseSplash-Texture.jpg | 3 - .../tutorials/creating-volcanoes/Embers-2.jpg | 3 - .../tutorials/creating-volcanoes/Embers-5.mp4 | 3 - .../creating-volcanoes/Embers-5Color.jpg | 3 - .../creating-volcanoes/Embers-5Size.jpg | 3 - .../creating-volcanoes/Embers-5Squash.jpg | 3 - .../Embers-5Transparency.jpg | 3 - .../creating-volcanoes/Embers-Texture.jpg | 3 - .../tutorials/creating-volcanoes/GL-1.jpg | 3 - .../tutorials/creating-volcanoes/GL-2.jpg | 3 - .../tutorials/creating-volcanoes/GL-3.jpg | 3 - .../tutorials/creating-volcanoes/GL-4.jpg | 3 - .../tutorials/creating-volcanoes/LL-3.jpg | 3 - .../tutorials/creating-volcanoes/LL-4.jpg | 3 - .../tutorials/creating-volcanoes/LL-5.jpg | 3 - .../tutorials/creating-volcanoes/LL-6.jpg | 3 - .../tutorials/creating-volcanoes/LL-7.jpg | 3 - .../creating-volcanoes/LavaFlow-10.mp4 | 3 - .../creating-volcanoes/LavaFlow-11.mp4 | 3 - .../creating-volcanoes/LavaFlow-3.jpg | 3 - .../creating-volcanoes/LavaFlow-4.jpg | 3 - .../creating-volcanoes/LavaFlow-6.jpg | 3 - .../creating-volcanoes/LavaFlow-7.mp4 | 3 - .../creating-volcanoes/LavaFlow-7Color.jpg | 3 - .../LavaFlow-7Transparency.jpg | 3 - .../creating-volcanoes/LavaFlow-9.mp4 | 3 - .../LavaFlow-9Transparency.jpg | 3 - .../creating-volcanoes/Middle-Layer.jpg | 3 - .../tutorials/creating-volcanoes/Plume-2.jpg | 3 - .../creating-volcanoes/Plume-4Color.jpg | 3 - .../Plume-4Transparency.jpg | 3 - .../tutorials/creating-volcanoes/Plume-5.mp4 | 3 - .../creating-volcanoes/Ripples-2B.jpg | 3 - .../creating-volcanoes/Ripples-2C.jpg | 3 - .../creating-volcanoes/Ripples-3DColor.jpg | 3 - .../creating-volcanoes/Ripples-3DSize.jpg | 3 - .../Ripples-3DTransparency.jpg | 3 - .../creating-volcanoes/Sample-Components.jpg | 3 - .../creating-volcanoes/Splashes-2.jpg | 3 - .../creating-volcanoes/Splashes-5.mp4 | 3 - .../creating-volcanoes/Splashes-5Size.jpg | 3 - .../creating-volcanoes/Splashes-5Squash.jpg | 3 - .../creating-volcanoes/Splashes-6.mp4 | 3 - .../creating-volcanoes/Splashes-6Size.jpg | 3 - .../creating-volcanoes/Splashes-6Squash.jpg | 3 - .../creating-volcanoes/Splashes-7.mp4 | 3 - .../creating-volcanoes/Splashes-7Size.jpg | 3 - .../Splashes-7Transparency.jpg | 3 - .../creating-volcanoes/Top-Layer.jpg | 3 - .../creating-volcanoes/Volcano-Complete.jpg | 3 - .../creating-volcanoes/Volcano-Components.jpg | 3 - .../Volcano-NoComponents.jpg | 3 - .../creating-volcanoes/Volcano-Start.jpg | 3 - .../WebbySplash-Texture.jpg | 3 - .../creating-volcanoes/With-Bloom.jpg | 3 - .../creating-volcanoes/With-LocalLighting.jpg | 3 - .../With-SurfaceRipples.mp4 | 3 - .../creating-volcanoes/Without-Bloom.jpg | 3 - .../Without-LocalLighting.jpg | 3 - .../Without-SurfaceRipples.jpg | 3 - .../creating-waterfalls/Cascades-1C.png | 3 - .../creating-waterfalls/Cascades-1D.png | 3 - .../creating-waterfalls/Cascades-1F.png | 3 - .../creating-waterfalls/Cascades-1G1.png | 3 - .../creating-waterfalls/Cascades-1G2.png | 3 - .../creating-waterfalls/Cascades-1H.mp4 | 3 - .../creating-waterfalls/Cascades-1H1.png | 3 - .../creating-waterfalls/Cascades-1H2.png | 3 - .../creating-waterfalls/Cascades-2C.png | 3 - .../creating-waterfalls/Cascades-2D.png | 3 - .../creating-waterfalls/Cascades-2F.png | 3 - .../creating-waterfalls/Cascades-2G11.mp4 | 3 - .../creating-waterfalls/Cascades-2G8.png | 3 - .../creating-waterfalls/Cascades-2G9.png | 3 - .../creating-waterfalls/Cascades-3.mp4 | 3 - .../creating-waterfalls/Cascades-Final.mp4 | 3 - .../creating-waterfalls/Cascades-MainDrop.mp4 | 3 - .../Cascades-SecondDrop.mp4 | 3 - .../Cascades-Unnatural.mp4 | 3 - .../creating-waterfalls/Falls-Components.png | 3 - .../Falls-NoComponents.png | 3 - .../tutorials/creating-waterfalls/Foam-2.mp4 | 3 - .../tutorials/creating-waterfalls/Foam-2B.png | 3 - .../creating-waterfalls/Foam-2D3.png | 3 - .../creating-waterfalls/Foam-2D4.png | 3 - .../creating-waterfalls/Foam-Final.mp4 | 3 - .../creating-waterfalls/Foam-Texture.png | 3 - .../tutorials/creating-waterfalls/Intro.mp4 | 3 - .../tutorials/creating-waterfalls/Mist-2.mp4 | 3 - .../tutorials/creating-waterfalls/Mist-2B.png | 3 - .../creating-waterfalls/Mist-2D2.png | 3 - .../creating-waterfalls/Mist-2D3.png | 3 - .../creating-waterfalls/Mist-2D4.png | 3 - .../tutorials/creating-waterfalls/Mist-3.mp4 | 3 - .../tutorials/creating-waterfalls/Mist-4.mp4 | 3 - .../creating-waterfalls/Mist-Final.mp4 | 3 - .../creating-waterfalls/Mist-Texture.png | 3 - .../creating-waterfalls/Rainbow-4B.png | 3 - .../creating-waterfalls/Rainbow-4D.png | 3 - .../creating-waterfalls/Rainbow-Texture.png | 3 - .../creating-waterfalls/Sample-Components.png | 3 - .../creating-waterfalls/Snoqualmie-Falls.png | 3 - .../creating-waterfalls/Splashes-3.png | 3 - .../creating-waterfalls/Splashes-4.mp4 | 3 - .../creating-waterfalls/Splashes-4B2.png | 3 - .../creating-waterfalls/Splashes-4B3.png | 3 - .../creating-waterfalls/Splashes-4B4.png | 3 - .../creating-waterfalls/Splashes-5.mp4 | 3 - .../creating-waterfalls/Splashes-5B2.png | 3 - .../creating-waterfalls/Splashes-5B3.png | 3 - .../creating-waterfalls/Splashes-Dense.png | 3 - .../creating-waterfalls/Splashes-Droplets.png | 3 - .../creating-waterfalls/Splashes-Final.mp4 | 3 - .../Splashes-WhiteWater.png | 3 - .../tutorials/creating-waterfalls/WW-3.png | 3 - .../tutorials/creating-waterfalls/WW-4.mp4 | 3 - .../tutorials/creating-waterfalls/WW-4A3.png | 3 - .../tutorials/creating-waterfalls/WW-4A4.png | 3 - .../tutorials/creating-waterfalls/WW-5.mp4 | 3 - .../tutorials/creating-waterfalls/WW-5B1.png | 3 - .../tutorials/creating-waterfalls/WW-5B2.png | 3 - .../creating-waterfalls/WW-Final.mp4 | 3 - .../Treasure-Island-Edit-Place.png | 3 - .../accelerationParticles.jpg | 3 - .../centerLavaLocation.jpg | 3 - .../colorSequenceDefault.jpg | 3 - .../colorSequenceGradient.jpg | 3 - .../colorSequenceParticles.jpg | 3 - .../fadingParticles.mp4 | 3 - .../finishedDistantVolcano.jpg | 3 - .../finishedVolcanoClose.mp4 | 3 - .../newTextureVolcano.jpg | 3 - .../openSizeSequence.jpg | 3 - .../openTransparencySequence.jpg | 3 - .../particleEmitterInsertionVolcano.jpg | 3 - .../particleEmitterInsertionWorkspace.jpg | 3 - .../particleExamples.mp4 | 3 - .../custom-particle-effects/sizeSequence.jpg | 3 - .../sizeSequenceParticles.jpg | 3 - .../textureProperty.jpg | 3 - .../transparencyDefault.jpg | 3 - .../transparencySequence.jpg | 3 - .../data-storage/DataStoreTutorial.png | 3 - .../data-storage/DataStoreTutorial2.png | 3 - .../deadly-lava/lavaFloorGameplay.mp4 | 3 - .../tutorials/deadly-lava/lavaProperties.jpg | 3 - .../tutorials/deadly-lava/partInserted.jpg | 3 - .../tutorials/deadly-lava/propertiesSet.jpg | 3 - .../tutorials/deadly-lava/scriptExplorer.png | 3 - .../detecting-user-input/ReloadingSymbol.mp4 | 3 - .../ReloadingSymbolZoomInOnly.mp4 | 3 - .../ToolControllerExplorer.png | 3 - .../Ambient-2.jpg | 3 - .../Ambient-Custom.png | 3 - .../Ambient-Default.png | 3 - .../Cabin-Final.jpg | 3 - .../Cabin-NoParts.jpg | 3 - .../Cabin-WithParts.jpg | 3 - .../Candles-1.mp4 | 3 - .../Candles-2.mp4 | 3 - .../Candles-3.mp4 | 3 - .../Candles-4.mp4 | 3 - .../Candles-WithPL.jpg | 3 - .../Candles-WithoutPL.jpg | 3 - .../Contrast-2.jpg | 3 - .../Deer-SpotLight.jpg | 3 - .../Deer-SurfaceLight.jpg | 3 - .../Density-2.jpg | 3 - .../Exposure-2.jpg | 3 - .../Exposure-Brightness.jpg | 3 - .../Exposure-ExposureCompensation.jpg | 3 - .../Exposure-NoChange.jpg | 3 - .../HighDensity.jpg | 3 - .../enhancing-indoor-environments/Lamp-1.jpg | 3 - .../enhancing-indoor-environments/Lamp-2.jpg | 3 - .../enhancing-indoor-environments/Lamp-3.jpg | 3 - .../enhancing-indoor-environments/Lamp-4.jpg | 3 - .../LightingStyle-Realistic.jpg | 3 - .../LowDensity.jpg | 3 - .../enhancing-indoor-environments/Radio-1.jpg | 3 - .../enhancing-indoor-environments/Radio-2.jpg | 3 - .../Radio-PointLight.jpg | 3 - .../Radio-Realistic.jpg | 3 - .../Radio-Soft.jpg | 3 - .../Radio-SpotLight.jpg | 3 - .../Sample-Complete.jpg | 3 - .../Sample-Start.jpg | 3 - .../Skybox-2.jpg | 3 - .../SkyboxBk.png | 3 - .../SkyboxDn.png | 3 - .../SkyboxFt.png | 3 - .../SkyboxLf.png | 3 - .../SkyboxRt.png | 3 - .../SkyboxUp.png | 3 - .../SunRays-Custom.jpg | 3 - .../SunRays-Default.jpg | 3 - .../TimeOfDay-2.jpg | 3 - .../WithReflections.jpg | 3 - .../WithoutReflections.jpg | 3 - .../Adjusting-Brightness-Color.png | 3 - .../Ambient-Default.png | 3 - .../Ambient-New.png | 3 - .../Bad-Skybox.png | 3 - .../Color-85-78-54.png | 3 - .../Default-Sun-Position.png | 3 - .../Density-0.272.png | 3 - .../Density-0.3.jpg | 3 - .../Density-0.jpg | 3 - .../Enabling-Shadows.png | 3 - .../EnvironmentScale-0.jpg | 3 - .../EnvironmentScale-1.jpg | 3 - .../Forest_EveningLightingExample.rbxl | 3 - .../Good-Skybox.png | 3 - .../enhancing-outdoor-environments/Haze-1.png | 3 - .../Increasing-Range.png | 3 - .../Intro-After.png | 3 - .../Intro-Before.png | 3 - .../LightingStyle-Realistic.jpg | 3 - .../LightingStyle-Soft.jpg | 3 - .../New-PointLight-Values.png | 3 - .../New-Sun-Position.png | 3 - .../No-PointLight.png | 3 - .../Yes-PointLight.jpg | 3 - .../Section1/CombatPockets-1.jpg | 3 - .../Section1/CombatPockets-2.jpg | 3 - .../Section1/CombatPockets-3.jpg | 3 - .../Section1/CombatPockets-4.jpg | 3 - .../Section1/CombatPockets-Intro1.jpg | 3 - .../Section1/CombatPockets-Intro2.jpg | 3 - .../Section1/CreatingPlayableAreas-Intro1.jpg | 3 - .../Section1/CreatingPlayableAreas-Intro2.png | 3 - .../Section1/Exterior-1.jpg | 3 - .../Section1/Exterior-2.jpg | 3 - .../Section1/Exterior-3.jpg | 3 - .../Section1/Exterior-4.jpg | 3 - .../Section1/Exterior-5.jpg | 3 - .../Section1/Exterior-Intro.jpg | 3 - .../Section1/Floor-1.jpg | 3 - .../Section1/Floor-2.jpg | 3 - .../Section1/Floor-3.jpg | 3 - .../Section1/Floor-4.jpg | 3 - .../Section1/Floor-5.jpg | 3 - .../Section1/Floor-Intro.jpg | 3 - .../Section1/GeneralCombatPockets-2.jpg | 3 - .../Section1/GeneralCombatPockets-3.jpg | 3 - .../Section1/GeneralCombatPockets-4.jpg | 3 - .../Section1/GeneralExterior-1.jpg | 3 - .../Section1/GeneralFloor-1.jpg | 3 - .../Section1/GeneralPerimeter-1.jpg | 3 - .../Section1/GeneralSpawnZone-1.jpg | 3 - .../Section1/Perimeter-1.jpg | 3 - .../Section1/Perimeter-2.jpg | 3 - .../Section1/Perimeter-3.jpg | 3 - .../Section1/Perimeter-4.jpg | 3 - .../Section1/Perimeter-Intro.jpg | 3 - .../Section1/Placeholder-Left.jpg | 3 - .../Section1/Placeholder-Right.jpg | 3 - .../Section1/PlaceholderMaterials.jpg | 3 - .../Section1/SpawnZone-1.jpg | 3 - .../Section1/SpawnZone-2.jpg | 3 - .../Section1/SpawnZone-3.jpg | 3 - .../Section1/SpawnZone-ExitPoints.jpg | 3 - .../Section1/SpawnZone-Intro.jpg | 3 - .../Section1/ThreeLaneLayout-CrossLanes.jpg | 3 - .../ThreeLaneLayout-IntersectingPoints.jpg | 3 - .../Section1/ThreeLaneLayout-PrimaryLanes.jpg | 3 - .../Section1/ThreeLaneLayout-SpawnZones.jpg | 3 - .../Section2/Art-Style.png | 3 - .../DesigningModularKits-ModularKit.jpg | 3 - .../DesigningModularKits-Snapping.mp4 | 3 - .../Section2/DesigningProps-PropsKit.png | 3 - .../Section2/DesigningProps-Scale.jpg | 3 - .../Section2/Overview.png | 3 - .../Section2/TileableTextures-Moss.png | 3 - .../Section2/TileableTextures-MossFlowers.png | 3 - .../Section2/TileableTextures-MossStones.png | 3 - .../Section2/TileableTextures-NoElement.jpg | 3 - .../Section2/TileableTextures-Part.png | 3 - .../Section2/TileableTextures-Stones.png | 3 - .../Section2/TileableTextures-WithElement.jpg | 3 - .../Section2/TrimSheetTextureMaps.zip | 3 - .../Section2/TrimSheets-Albedo.png | 3 - .../Section2/TrimSheets-Ceiling.jpg | 3 - .../Section2/TrimSheets-Doorway.jpg | 3 - .../Section2/TrimSheets-Metalness.png | 3 - .../Section2/TrimSheets-Normal.png | 3 - .../Section2/TrimSheets-Reader.jpg | 3 - .../Section2/TrimSheets-Roughness.png | 3 - .../Section2/Trimsheet.png | 3 - .../Section3/CastShadow-Disabled.jpg | 3 - .../Section3/CastShadow-Enabled.jpg | 3 - .../Section3/CollisionFidelity-Box.jpg | 3 - .../Section3/CollisionFidelity-BoxTop.jpg | 3 - .../Section3/CollisionFidelity-Default.jpg | 3 - .../Section3/CollisionFidelity-Doorway.png | 3 - .../Section3/CollisionFidelity-Hull.jpg | 3 - .../Section3/CollisionFidelity-WallMesh.jpg | 3 - .../Section3/ConvertingAssets-2.png | 3 - .../Section3/ConvertingAssets-Intro.png | 3 - .../Section3/CustomMaterials-4.jpg | 3 - .../Section3/CustomMaterials-5.jpg | 3 - .../Section3/CustomMaterials-7a.jpg | 3 - .../Section3/CustomMaterials-7b.jpg | 3 - .../Section3/CustomMaterials-8.jpg | 3 - .../Section3/CustomMaterials-9.jpg | 3 - .../Section3/DoubleSided-Disabled.png | 3 - .../Section3/DoubleSided-Enabled.png | 3 - .../Section3/Importing-3.jpg | 3 - .../Section3/Importing-Intro.png | 3 - .../Section3/Overview.png | 3 - .../Section3/SAPackages-3.jpg | 3 - .../Section3/SAPackages-7.jpg | 3 - .../Section3/SAPackages-8.jpg | 3 - .../Section3/SAPackages-Intro.jpg | 3 - .../Section3/SettingParameters-CanCollide.png | 3 - .../Section3/SettingParameters-CanTouch.png | 3 - .../SettingParameters-CastShadow1.png | 3 - .../Section4/ApplyingLibraryDiagram.png | 3 - .../Section4/BackgroundClouds-1.jpg | 3 - .../Section4/BackgroundClouds-2.jpg | 3 - .../Section4/BackgroundClouds-Intro1.jpg | 3 - .../Section4/BackgroundClouds-Intro2.jpg | 3 - .../Section4/Ceiling-1.jpg | 3 - .../Section4/Ceiling-3.jpg | 3 - .../Section4/CloudVid1.mp4 | 3 - .../Section4/CloudVid2.mp4 | 3 - .../Section4/Columns-1.jpg | 3 - .../Section4/Columns-2.jpg | 3 - .../Section4/Columns-4.jpg | 3 - .../Section4/Columns-5.jpg | 3 - .../Section4/CombatPockets-1.jpg | 3 - .../Section4/CombatPockets-10.jpg | 3 - .../Section4/CombatPockets-11.jpg | 3 - .../Section4/CombatPockets-12.jpg | 3 - .../Section4/CombatPockets-13.jpg | 3 - .../Section4/CombatPockets-14.jpg | 3 - .../Section4/CombatPockets-15.jpg | 3 - .../Section4/CombatPockets-16.jpg | 3 - .../Section4/CombatPockets-2.jpg | 3 - .../Section4/CombatPockets-3.jpg | 3 - .../Section4/CombatPockets-4.jpg | 3 - .../Section4/CombatPockets-5.jpg | 3 - .../Section4/CombatPockets-6.jpg | 3 - .../Section4/CombatPockets-7.jpg | 3 - .../Section4/CombatPockets-8.jpg | 3 - .../Section4/CombatPockets-9.jpg | 3 - .../Section4/CombatPockets-Intro1.jpg | 3 - .../Section4/CombatPockets-Intro2.jpg | 3 - .../Section4/CombatPockets-Intro3.jpg | 3 - .../Section4/ContainingPlayableArea-1.jpg | 3 - .../Section4/DeletingGeo-1.png | 3 - .../Section4/DeletingGeo-2.png | 3 - .../Section4/Doors-1.jpg | 3 - .../Section4/Doors-2.jpg | 3 - .../Section4/DustParticles-4b.png | 3 - .../Section4/DustParticles-4d.png | 3 - .../Section4/DustParticlesVid-1.mp4 | 3 - .../Section4/Floors-1.jpg | 3 - .../Section4/Floors-2.jpg | 3 - .../Section4/Floors-3.jpg | 3 - .../Section4/Floors-4.jpg | 3 - .../Section4/Floors-5.jpg | 3 - .../Section4/Floors-6.jpg | 3 - .../Section4/Floors-7.jpg | 3 - .../Section4/Floors-Intro.jpg | 3 - .../Section4/ForegroundClouds-4a.png | 3 - .../Section4/ForegroundClouds-4b.png | 3 - .../Section4/ForegroundClouds-5.jpg | 3 - .../Section4/GeneralColumns-1.jpg | 3 - .../Section4/GeneralCombatPockets-1.jpg | 3 - .../Section4/GeneralCombatPockets-2.jpg | 3 - .../Section4/GeneralFloors-1.jpg | 3 - .../Section4/GeneralFloors-2.jpg | 3 - .../Section4/GeneralFloors-3.jpg | 3 - .../Section4/GeneralFloors-4.jpg | 3 - .../Section4/GeneralFloors-5.jpg | 3 - .../Section4/GeneralFloors-6.jpg | 3 - .../Section4/GeneralTowers-1.jpg | 3 - .../Section4/GlobalLighting-1.jpg | 3 - .../Section4/GlobalLighting-2.jpg | 3 - .../Section4/GlobalLighting-3.jpg | 3 - .../Section4/GlobalLighting-4.jpg | 3 - .../Section4/LocalLighting-1.jpg | 3 - .../Section4/LocalLighting-2.jpg | 3 - .../Section4/LocalLighting-3B.jpg | 3 - .../Section4/LocalLighting-3a.jpg | 3 - .../Section4/LocalLighting-4.jpg | 3 - .../Section4/LocalLighting-Intro.jpg | 3 - .../Section4/Overhang-1.jpg | 3 - .../Section4/Overhang-2.jpg | 3 - .../Section4/Overhang-3.jpg | 3 - .../Section4/Overhang-4.jpg | 3 - .../Section4/Overview.png | 3 - .../Section4/Perimeter-1.jpg | 3 - .../Section4/Perimeter-2.jpg | 3 - .../Section4/Perimeter-3.jpg | 3 - .../Section4/Perimeter-4.jpg | 3 - .../Section4/Perimeter-5.jpg | 3 - .../Section4/Perimeter-6.jpg | 3 - .../Section4/Perimeter-Intro1.jpg | 3 - .../Section4/Perimeter-Intro2.jpg | 3 - .../Section4/Planters-1.jpg | 3 - .../Section4/Planters-10.jpg | 3 - .../Section4/Planters-11.jpg | 3 - .../Section4/Planters-3.jpg | 3 - .../Section4/Planters-5.jpg | 3 - .../Section4/Planters-6.jpg | 3 - .../Section4/Planters-7.jpg | 3 - .../Section4/Planters-8.jpg | 3 - .../Section4/Planters-9.jpg | 3 - .../Section4/Roof-Intro.jpg | 3 - .../Section4/Skylight-1.jpg | 3 - .../Section4/Skylight-2.jpg | 3 - .../Section4/Skylight-3.jpg | 3 - .../Section4/Skylight-4.jpg | 3 - .../Section4/Skylight-5.jpg | 3 - .../Section4/Skylight-6.jpg | 3 - .../Section4/Skylight-7.jpg | 3 - .../Section4/Skylight-8.jpg | 3 - .../Section4/SpawnZones-1.jpg | 3 - .../Section4/SpawnZones-2.jpg | 3 - .../Section4/SpawnZones-3.jpg | 3 - .../Section4/SpawnZones-4.jpg | 3 - .../Section4/SpecialEffects-Intro.mp4 | 3 - .../Section4/Terrain-10.jpg | 3 - .../Section4/Terrain-3.jpg | 3 - .../Section4/Terrain-4.mp4 | 3 - .../Section4/Terrain-6.mp4 | 3 - .../Section4/Terrain-9.mp4 | 3 - .../Section4/TopRoof-1.jpg | 3 - .../Section4/TopRoof-2.jpg | 3 - .../Section4/TopRoof-3.jpg | 3 - .../Section4/TopRoof-4.jpg | 3 - .../Section4/TopRoof-5.jpg | 3 - .../Section4/TopRoof-6.jpg | 3 - .../Section4/TopRoof-7.jpg | 3 - .../Section4/TopRoof-8.jpg | 3 - .../Section4/TopRoof-9.jpg | 3 - .../Section4/Towers-1.jpg | 3 - .../Section4/Towers-3.jpg | 3 - .../Section4/Trim-1.jpg | 3 - .../Section4/Trim-2.jpg | 3 - .../Section4/Trim-3.jpg | 3 - .../Section4/Trim-4.jpg | 3 - .../Section4/Trim-5.jpg | 3 - .../Section5/LayeredTransparencies-Left.jpg | 3 - .../Section5/LayeredTransparencies-Right.jpg | 3 - .../Section5/OptimizingGeo-Towers.jpg | 3 - .../Section5/Overview.jpg | 3 - .../RemovingTextures-Firehydrants.jpg | 3 - .../Section5/ReviewingParameters-Disabled.jpg | 3 - .../Section5/ReviewingParameters-Enabled.jpg | 3 - .../fading-trap/completedFadingTrap.mp4 | 3 - .../assets/tutorials/fading-trap/forLoop.jpg | 3 - .../fading-trap/multipleFadingTraps.mp4 | 3 - .../tutorials/fading-trap/partInPlace.jpg | 3 - .../tutorials/fading-trap/scriptInPlace.png | 3 - .../Adding-Rounds/Defeat-UI.mp4 | 3 - .../Adding-Rounds/Large-Prompt.jpg | 3 - .../Adding-Rounds/Placeholder-Prompt.jpg | 3 - .../Adding-Rounds/Rounds-Diagram.png | 3 - .../Adding-Rounds/Victory-UI.mp4 | 3 - .../Blaster-Behavior/Custom-BlastState.mp4 | 3 - .../Blaster-Behavior/Normal-BlastState.mp4 | 3 - .../Creating-Teams/Green-Team-Players.jpg | 3 - .../Creating-Teams/Green-Team-Properties.png | 3 - .../Creating-Teams/Green-Team.jpg | 3 - .../Creating-Teams/Intro.png | 3 - .../Creating-Teams/Leaderboard-Indicator.jpg | 3 - .../Creating-Teams/Name-Tint.jpg | 3 - .../Creating-Teams/Objective-UI.jpg | 3 - .../Creating-Teams/Pink-Team-Players.jpg | 3 - .../Creating-Teams/Pink-Team-Properties.png | 3 - .../Creating-Teams/Pink-Team.jpg | 3 - .../Creating-Teams/Player-Indicator.jpg | 3 - .../Creating-Teams/Team-Indicator.jpg | 3 - .../Detecting-Hits/Reduce-Player-Health.png | 3 - .../Detecting-Hits/Two-Rays.png | 3 - .../Spawn-Respawn/Find-All.png | 3 - .../Spawn-Respawn/First-Person-Visuals.png | 3 - .../Spawn-Respawn/Neutral.jpg | 3 - .../Spawn-Respawn/Reset-Character-Button.png | 3 - .../Spawn-Respawn/Respawn-Screen.png | 3 - .../Spawn-Respawn/TeamASpawn.jpg | 3 - .../Spawn-Respawn/TeamBSpawn.jpg | 3 - .../Spawn-Respawn/Third-Person-Visuals.png | 3 - .../CFrame-Render.png | 3 - .../Client-Laser-Communication-Video.mp4 | 3 - .../Explorer-Character-Hierarchy.png | 3 - .../Explorer-ClientLaserManager.png | 3 - .../Explorer-Damage-Character.png | 3 - .../Explorer-Events-Folder.png | 3 - .../Explorer-LaserFired.png | 3 - .../Explorer-LaserRenderer.png | 3 - .../Explorer-ServerLaserManager.png | 3 - .../Explorer-ToolController.png | 3 - .../Introduction-Video.mp4 | 3 - .../Laser-Render-Video.mp4 | 3 - .../Output-Video.mp4 | 3 - .../hit-detection-with-lasers/Ray-Diagram.png | 3 - .../ingameSounds-collectablePage.png | 3 - .../ingameSounds-collectables.mp4 | 3 - .../ingameSounds-createFeedbackSound.png | 3 - .../in-game-sounds/ingameSounds-looping.png | 3 - .../ingameSounds-rollOffDistance.png | 3 - .../ingameSounds-rollOffMode.png | 3 - .../in-game-sounds/ingameSounds-soundID.png | 3 - .../ingameSounds-waterfall-web.mp4 | 3 - .../ingameSounds-waterfallExample.jpg | 3 - .../ingameSounds-waterfallSound.png | 3 - .../tutorials/interactive-ui/Handle-Demo.mp4 | 3 - .../interactive-ui/Interactive-UI-Final.mp4 | 3 - .../assets/tutorials/interactive-ui/Intro.png | 3 - .../Link-UIDragDetector-BoundingUI.png | 3 - .../ReplicatedStorage-SliderController.png | 3 - ...icatedStorage-StatefulObjectController.png | 3 - .../Settings-Button-Design-Components.png | 3 - .../Settings-Button-Design-Finalized.png | 3 - .../Settings-Button-Design-Initial.png | 3 - ...u-Design-BackgroundVolumeSlider-Handle.png | 3 - ...enu-Design-BackgroundVolumeSlider-Icon.png | 3 - ...-Design-BackgroundVolumeSlider-Initial.png | 3 - ...sign-BackgroundVolumeSlider-Inner-Fill.png | 3 - ...gn-BackgroundVolumeSlider-Measurements.png | 3 - ...ngs-Menu-Design-Close-Button-Finalized.png | 3 - ...tings-Menu-Design-Close-Button-Initial.png | 3 - .../Settings-Menu-Design-Close-Button.png | 3 - .../Settings-Menu-Design-Components.png | 3 - ...ngs-Menu-Design-Parent-Frame-Finalized.png | 3 - .../Settings-Menu-Design-Parent-Frame.png | 3 - ...s-Menu-Design-Range-Frame-Measurements.png | 3 - ...ttings-Menu-Design-Range-Frame-Outline.png | 3 - ...-Menu-Design-Slider-Frame-Measurements.png | 3 - .../Settings-Menu-Design-Slider-Handle.png | 3 - ...ings-Menu-Design-Slider-Icon-Finalized.png | 3 - .../Settings-Menu-Design-Slider-Icon.png | 3 - ...enu-Design-Slider-Inner-Fill-Finalized.png | 3 - ...Settings-Menu-Design-Slider-Inner-Fill.png | 3 - .../tutorials/interactive-ui/Sliders-Demo.mp4 | 3 - ...SettingsButton-UIAspectRatioConstraint.png | 3 - ...SettingsButton-UISizeConstraint-Values.png | 3 - ...tainer-SettingsButton-UISizeConstraint.png | 3 - ...StarterGui-HUDContainer-SettingsButton.png | 3 - ...enu-BackgroundVolumeSlider-Icon-Values.png | 3 - ...ttingsMenu-BackgroundVolumeSlider-Icon.png | 3 - ...der-SliderFrame-Handle-UIStroke-Values.png | 3 - ...lumeSlider-SliderFrame-Handle-UIStroke.png | 3 - ...umeSlider-SliderFrame-InnerFill-Values.png | 3 - ...oundVolumeSlider-SliderFrame-InnerFill.png | 3 - ...er-SettingsMenu-BackgroundVolumeSlider.png | 3 - ...nu-CloseButton-UIAspectRatioConstraint.png | 3 - ...-HUDContainer-SettingsMenu-CloseButton.png | 3 - ...-SettingsMenu-EffectsVolumeSlider-Full.png | 3 - ...umeSlider-Icon-UIAspectRatioConstraint.png | 3 - ...-SettingsMenu-EffectsVolumeSlider-Icon.png | 3 - ...iderFrame-Handle-UIDragDetector-Values.png | 3 - ...ider-SliderFrame-Handle-UIDragDetector.png | 3 - ...EffectsVolumeSlider-SliderFrame-Handle.png | 3 - ...-SliderFrame-InnerFill-UICorner-Values.png | 3 - ...eSlider-SliderFrame-InnerFill-UICorner.png | 3 - ...ectsVolumeSlider-SliderFrame-InnerFill.png | 3 - ...gsMenu-EffectsVolumeSlider-SliderFrame.png | 3 - ...sMenu-EffectsVolumeSlider-UIListLayout.png | 3 - ...ainer-SettingsMenu-EffectsVolumeSlider.png | 3 - ...ngsMenu-UIAspectRatioConstraint-Values.png | 3 - ...r-SettingsMenu-UIAspectRatioConstraint.png | 3 - ...Container-SettingsMenu-UICorner-Values.png | 3 - ...Gui-HUDContainer-SettingsMenu-UICorner.png | 3 - ...r-SettingsMenu-UISizeConstraint-Values.png | 3 - ...ontainer-SettingsMenu-UISizeConstraint.png | 3 - .../StarterGui-HUDContainer-SettingsMenu.png | 3 - ...StarterGui-HUDContainer-SettingsScript.png | 3 - .../StarterGui-HUDContainer.png | 3 - .../ServerScriptService-GoldManager.png | 3 - .../alternatingPlatforms.mp4 | 3 - .../intro-to-scripting/anchoredProperty.png | 3 - .../intro-to-scripting/canCollide.mp4 | 3 - .../finishedSinglePlatformShort.mp4 | 3 - .../intro-to-scripting/partInPlace.jpg | 3 - .../intro-to-scripting/scriptInPlace.jpg | 3 - .../intro-to-scripting/transparency.mp4 | 3 - .../assets/tutorials/landing/Animation.png | 3 - .../tutorials/landing/AnimationThumbnail.png | 3 - .../tutorials/landing/BuildingThumbnail.png | 3 - .../en-us/assets/tutorials/landing/Camera.jpg | 3 - .../tutorials/landing/CodingThumbnail.png | 3 - .../assets/tutorials/landing/Effects.png | 3 - .../assets/tutorials/landing/Physics.jpg | 3 - .../assets/tutorials/landing/Physics.png | 3 - .../assets/tutorials/landing/Scripting.jpg | 3 - .../tutorials/landing/StudioThumbnail.png | 3 - .../en-us/assets/tutorials/landing/UI.png | 3 - .../tutorials/landing/VFXArtThumbnail.png | 3 - .../laser-traps-with-beams/Attachments-1.png | 3 - .../laser-traps-with-beams/Attachments-2.jpg | 3 - .../laser-traps-with-beams/Attachments-3.jpg | 3 - .../laser-traps-with-beams/Attachments-4.jpg | 3 - .../laser-traps-with-beams/Beam-2.jpg | 3 - .../laser-traps-with-beams/Beam-3.mp4 | 3 - .../laser-traps-with-beams/CollisionBox-1.jpg | 3 - .../laser-traps-with-beams/CollisionBox-2.jpg | 3 - .../laser-traps-with-beams/CollisionBox-3.jpg | 3 - .../LaserBlasterAsset.png | 3 - .../laser-traps-with-beams/Script.mp4 | 3 - .../laser-traps-with-beams/beam6060542021.png | 3 - .../laser-traps-with-beams/beam6060542158.png | 3 - .../laser-traps-with-beams/beam6060542252.png | 3 - .../laserTrap_beamExamples.mp4 | 3 - .../laserTrap_setAttachment0.mp4 | 3 - .../laserTrap_testFinalLaser.mp4 | 3 - .../lasertrap_addBeamObject.jpg | 3 - .../lasertrap_anchorPart.png | 3 - .../lasertrap_beamColor.jpg | 3 - .../lasertrap_beamDifferentAngles_left.jpg | 3 - .../lasertrap_beamDifferentAngles_top.jpg | 3 - .../lasertrap_beamWidthLarger.jpg | 3 - .../lasertrap_changeColor.png | 3 - .../lasertrap_collisionBox.jpg | 3 - .../lasertrap_constraintDetails.png | 3 - .../lasertrap_createCollisionBox.png | 3 - .../lasertrap_drawOnTop.png | 3 - .../lasertrap_pasteTextureID.png | 3 - .../lasertrap_setWidth.png | 3 - .../lasertrap_showAttachments.jpg | 3 - .../lasertrap_showAttachmentsSet.png | 3 - .../lasertrap_showBeamLightEmission.jpg | 3 - .../lasertrap_showBeamWithTexture.jpg | 3 - .../lasertrap_showPartsCreated.png | 3 - .../lasertrap_showSetup_alt.png | 3 - .../lasertrap_showTrapPart.jpg | 3 - .../lasertrap_toggleFaceCamera.png | 3 - .../lasertrap_transparencyLightEmission.png | 3 - .../Billboard-Select-Model.jpg | 3 - .../Billboard-Select-SurfaceLight.png | 3 - .../LightCasing-Material-Property.png | 3 - .../LightCasing-Material.jpg | 3 - .../LightPole-Add-Light.jpg | 3 - .../LightPole-Add-Light.png | 3 - .../LightPole-Select-LightCasing.png | 3 - .../LightPole-Select-Model.jpg | 3 - .../Misty-Harbor-Banner.jpg | 3 - .../Misty-Harbor-Edit-Place.png | 3 - .../PointLight-Brightness.jpg | 3 - .../lighting-with-props/PointLight-Color.jpg | 3 - .../PointLight-Range-12.jpg | 3 - .../PointLight-Range-8.jpg | 3 - .../SpotLight-Angle-30.jpg | 3 - .../SpotLight-Angle-75.jpg | 3 - .../SpotLight-Face-Bottom.jpg | 3 - .../SpotLight-Face-Left.jpg | 3 - .../StreetLight-Select-Model.jpg | 3 - .../StreetLight-Select-SpotLight.png | 3 - .../SurfaceLight-Angle-0.jpg | 3 - .../SurfaceLight-Angle-60.jpg | 3 - .../SurfaceLight-Face-Bottom.jpg | 3 - .../introToSound_bgMusic_web.mp4 | 3 - ...playingBGMusic_changeProperties_looped.png | 3 - ...playingBGMusic_changeProperties_volume.png | 3 - ...ayingBGMusic_createSoundInSoundService.png | 3 - .../playingBGMusic_pressPreview.png | 3 - .../playingBGMusic_soundID.png | 3 - .../Add-Animation-3.mp4 | 3 - .../Custom-Walk-Animation.mp4 | 3 - .../Default-Climb-Animation.mp4 | 3 - .../Default-Fall-Animation.mp4 | 3 - .../Default-Swim-Animation.mp4 | 3 - .../Default-Walk-Animation.mp4 | 3 - .../Insert-Volume-3.jpg | 3 - .../Pose-Example.mp4 | 3 - .../Replace-AssetID-2B.mp4 | 3 - .../Volume-Example.jpg | 3 - .../Dungeon-Delve-Edit-Place.png | 3 - .../proximity-prompts/HoldDuration.mp4 | 3 - .../proximity-prompts/PromptsShowcase.mp4 | 3 - ...ximity-Prompts-Insert-PromptAttachment.png | 3 - ...oximity-Prompts-Insert-ProximityPrompt.png | 3 - ...ity-Prompts-MaxActivationDistance-View.jpg | 3 - ...mity-Prompts-PromptAttachment-Position.png | 3 - ...roximity-Prompts-PromptAttachment-View.jpg | 3 - .../Proximity-Prompts-PromptEvents-Script.png | 3 - .../Proximity-Prompts-Select-Door-View.jpg | 3 - .../Proximity-Prompts-Select-Door.png | 3 - .../Proximity-Prompts-Select-PrisonDoor.png | 3 - .../ProximityPrompt-ActionText.png | 3 - .../ProximityPrompt-Diagram.png | 3 - .../ProximityPrompt-HoldDuration.png | 3 - .../ProximityPrompt-MaxActivationDistance.png | 3 - .../ProximityPrompt-ObjectText.png | 3 - .../Insert-ModuleScript.png | 3 - .../ModuleScript-Renamed-Leaderboard.png | 3 - .../ModuleScript-Renamed-PlayerData.png | 3 - ...record-and-display-player-data-example.mp4 | 3 - .../finishedScoringPointsSolo.mp4 | 3 - .../tutorials/scoring-points/leaderboard.jpg | 3 - .../scoring-points/leaderboardCounting.mp4 | 3 - .../tutorials/scoring-points/sceneInPlace.jpg | 3 - .../scoring-points/setupPointsScript.jpg | 3 - .../Insert-RemoteFunction.png | 3 - .../script-an-upgrade-button-example.mp4 | 3 - .../script-game-behavior/Duplicated-Coins.png | 3 - .../script-game-behavior/Insert-Script.png | 3 - .../Multiple-Coins-In-Level.jpg | 3 - .../script-game-behavior/New-Single-Coin.png | 3 - .../Output-Collect-Coin.png | 3 - .../Rename-New-Script.png | 3 - .../Single-Coin-In-Viewport.jpg | 3 - .../script-game-behavior-coin-collection.mp4 | 3 - ...sing-Animations-FinalDefaultRunExample.mp4 | 3 - .../Using-Animations-FinalEventAnimation.mp4 | 3 - ...Using-Animations-FinalExamples-default.jpg | 3 - .../Using-Animations-FinalExamples-event.jpg | 3 - ...g-Animations-ServerScriptChangeDefault.png | 3 - .../Using-Animations-ShockButtonModel.jpg | 3 - .../Using-Animations-ShockPlayerScript.png | 3 - .../tutorials/studio-lesson/3D-Viewport.jpg | 3 - .../tutorials/studio-lesson/Explorer.jpg | 3 - .../tutorials/studio-lesson/Mezzanine.jpg | 3 - .../tutorials/studio-lesson/Properties.jpg | 3 - .../tutorials/studio-lesson/Toolbar.jpg | 3 - .../tutorials/studio-lesson/Toolbox.jpg | 3 - .../Section1/BlasterFlow.png | 3 - .../Section1/BlasterInteractionOrder.png | 3 - .../Section1/GreenLeft.jpg | 3 - .../user-interface-design/Section1/Intro.jpg | 3 - .../Section1/ObjectivePromptPreview.png | 3 - .../Section1/PinkRight.jpg | 3 - .../Section1/PlayerInfoPreview.png | 3 - .../Section1/RespawningPreview.png | 3 - .../Section2/MobileBlockIn.png | 3 - .../Section2/PCBlockIn.png | 3 - .../Section2/UserFlowChart.jpg | 3 - .../Section2/VisualHierarchy.png | 3 - .../user-interface-design/Section3/BS-1A.png | 3 - .../user-interface-design/Section3/BS-1B.png | 3 - .../user-interface-design/Section3/BS-2B.png | 3 - .../user-interface-design/Section3/BS-3B.png | 3 - .../user-interface-design/Section3/BS-3E.png | 3 - .../user-interface-design/Section3/BS-4B.png | 3 - .../user-interface-design/Section3/BS-4C.png | 3 - .../user-interface-design/Section3/BS-5E.png | 3 - .../user-interface-design/Section3/BS-7B.png | 3 - .../user-interface-design/Section3/BS-7C.png | 3 - .../user-interface-design/Section3/BS-7E.png | 3 - .../user-interface-design/Section3/BS-8C.png | 3 - .../user-interface-design/Section3/BS-9B.png | 3 - .../user-interface-design/Section3/BS-9C.png | 3 - .../user-interface-design/Section3/BS-9E.png | 3 - .../Section3/BS-Intro.png | 3 - .../Section3/BlastButtonComponent.jpg | 3 - .../Section3/BlastButtonIcon-Default.jpg | 3 - .../Section3/BlastButtonIcon-Pressed.jpg | 3 - .../Section3/BlasterButton-1C.png | 3 - .../Section3/BlasterButton-Intro.jpg | 3 - .../Section3/BlasterButton-Intro.png | 3 - .../Section3/BlasterUI-Intro.png | 3 - .../Section3/Border-Fade.jpg | 3 - .../Section3/CooldownMeter-2D.png | 3 - .../Section3/CooldownMeter-3C.png | 3 - .../Section3/CooldownMeter-4B.png | 3 - .../Section3/CooldownMeter-5B.png | 3 - .../Section3/CooldownMeter-9A.png | 3 - .../Section3/CooldownMeter-Intro.mp4 | 3 - .../Section3/Crosshair-1C.png | 3 - .../Section3/Crosshair-2F.png | 3 - .../Section3/CrosshairIcon.jpg | 3 - .../Section3/Device-Emulator-Preview.png | 3 - .../Section3/Device-Emulator-Setup.png | 3 - .../user-interface-design/Section3/Fade.jpg | 3 - .../Section3/GreenTeamIcon.jpg | 3 - .../Section3/Hexagon.jpg | 3 - .../Section3/HitMarker-Icon.jpg | 3 - .../Section3/Hitmarker-1C.png | 3 - .../Section3/Hitmarker-2F.png | 3 - .../Section3/Join-1C.png | 3 - .../Section3/Join-2E.png | 3 - .../Section3/Join-4Ai.png | 3 - .../Section3/Join-4Av1.png | 3 - .../Section3/Join-4Av2.png | 3 - .../Section3/Join-4B.png | 3 - .../Section3/Join-4Cii1.png | 3 - .../Section3/Join-4Cii2.png | 3 - .../Section3/Join-6A.png | 3 - .../Section3/Join-6C.png | 3 - .../Section3/Join-Complete.png | 3 - .../Section3/Multi-Directional-Fade.jpg | 3 - .../Section3/MultiBlasterConfiguration.png | 3 - .../Section3/MultiBlasterIcon.jpg | 3 - .../Section3/MultiBlasterIcon2.jpg | 3 - .../Section3/Objective-1.jpg | 3 - .../Section3/Objective-2.jpg | 3 - .../Section3/Objective-3B.jpg | 3 - .../Section3/Objective-3E.jpg | 3 - .../Section3/Objective-4B.jpg | 3 - .../Section3/Objective-4E.jpg | 3 - .../Section3/Objective-5.jpg | 3 - .../Section3/Objective-7B.jpg | 3 - .../Section3/Objective-7E.jpg | 3 - .../Section3/Objective-7F.jpg | 3 - .../Section3/Objective-8.jpg | 3 - .../Section3/Objective-Intro.jpg | 3 - .../Section3/ObjectiveComponent.jpg | 3 - .../Section3/ObjectiveUI-Intro.png | 3 - .../user-interface-design/Section3/PI-2.jpg | 3 - .../user-interface-design/Section3/PI-3.jpg | 3 - .../user-interface-design/Section3/PI-4B.jpg | 3 - .../user-interface-design/Section3/PI-4D.jpg | 3 - .../user-interface-design/Section3/PI-5.jpg | 3 - .../user-interface-design/Section3/PI-6B1.jpg | 3 - .../user-interface-design/Section3/PI-6B2.jpg | 3 - .../user-interface-design/Section3/PI-6C.jpg | 3 - .../Section3/PI-Intro.jpg | 3 - .../Section3/PickABlasterComponent.jpg | 3 - .../Section3/PinkTeamIcon.jpg | 3 - .../Section3/PlayerInfoComponent.jpg | 3 - .../Section3/PlayerUI-Intro.png | 3 - .../Section3/ResolutionDropdown.jpg | 3 - .../Section3/Respawn-1A.png | 3 - .../Section3/Respawn-1B.png | 3 - .../Section3/Respawn-1F.png | 3 - .../Section3/Respawn-2B.png | 3 - .../Section3/Respawn-2D.png | 3 - .../Section3/Respawn-Complete.png | 3 - .../Section3/ScreenGuiContainers.jpg | 3 - .../Section3/ScreenGuiContainers.png | 3 - .../Section3/SelectionArrowIcon.jpg | 3 - .../Section3/SingleBlasterConfiguration.png | 3 - .../Section3/SingleBlasterIcon.jpg | 3 - .../Section3/SurfaceGuiContainers.png | 3 - .../user-interface-design/Section3/TI-1.jpg | 3 - .../user-interface-design/Section3/TI-2.jpg | 3 - .../user-interface-design/Section3/TI-4.jpg | 3 - .../user-interface-design/Section3/TI-5.jpg | 3 - .../user-interface-design/Section3/TI-6.jpg | 3 - .../user-interface-design/Section3/TOI-1.png | 3 - .../user-interface-design/Section3/TOI-2.png | 3 - .../user-interface-design/Section3/TOI-4.png | 3 - .../user-interface-design/Section3/TOI-6.png | 3 - .../Section3/TOI-Intro.png | 3 - .../Section3/Team-Indicator-Intro.jpg | 3 - .../Section3/Trapezoid-Reverse.jpg | 3 - .../Section3/Trapezoid.jpg | 3 - .../burstParticle_finalInContext.mp4 | 3 - .../burstParticle_genericFinal.mp4 | 3 - .../burstParticle_testParticleEmit.mp4 | 3 - .../burstParticles_colorSequence.png | 3 - .../burstParticles_confirmPluginInstall.png | 3 - .../burstParticles_createExplosion.png | 3 - .../burstParticles_enterEmitRate.png | 3 - .../burstParticles_explorerCreateScript.png | 3 - .../burstParticles_partExample.png | 3 - .../burstParticles_pluginInstall.png | 3 - .../burstParticles_toggleEnabled.png | 3 - .../burstParticles_transparencyGradient.png | 3 - ...tParticles_transparencyGradientExample.jpg | 3 - .../ui/2D-paths/Control-Point-Relativity.png | 3 - .../Path-Example-Add-Point-Between.png | 3 - .../Path-Example-Add-Point-From-End.png | 3 - .../ui/2D-paths/Path-Example-Add-Tangent.png | 3 - .../2D-paths/Path-Example-Adjust-Tangent.png | 3 - .../2D-paths/Path-Example-Break-Tangents.png | 3 - .../2D-paths/Path-Example-Clear-Tangents.png | 3 - .../ui/2D-paths/Path-Example-Create-Basic.png | 3 - .../ui/2D-paths/Path-Example-Delete-Point.png | 3 - .../2D-paths/Path-Example-Delete-Tangent.png | 3 - .../ui/2D-paths/Path-Example-Move-Point.png | 3 - .../ui/2D-paths/Path-Example-Thick-Red.png | 3 - .../ui/2D-paths/Path-Example-Thin-Grey.png | 3 - .../2D-paths/Path-Example-ZIndex-Layering.png | 3 - .../en-us/assets/ui/2D-paths/Path2D.mp4 | 3 - .../en-us/assets/ui/2D-paths/Tangents.png | 3 - .../assets/ui/2D-paths/Widget-Add-Point.png | 3 - .../assets/ui/2D-paths/Widget-Add-Tangent.png | 3 - .../assets/ui/2D-paths/Widget-Select.png | 3 - .../ui/3D-drag-detectors/Balance-Tower.mp4 | 3 - .../ui/3D-drag-detectors/Color-Slider.mp4 | 3 - .../ui/3D-drag-detectors/Desk-Drawers.mp4 | 3 - .../ui/3D-drag-detectors/Marionette.mp4 | 3 - .../assets/ui/3D-drag-detectors/Showcase.mp4 | 3 - .../ui/9-slice/9-Slice-Comparison-With.png | 3 - .../ui/9-slice/9-Slice-Comparison-Without.png | 3 - .../ui/9-slice/9-Slice-Concept-Diagram.png | 3 - .../assets/ui/9-slice/9-Slice-Editor-View.png | 3 - .../ui/9-slice/9-Slice-Example-A-Editor.png | 3 - .../9-slice/9-Slice-Example-A-ImageLabel.png | 3 - .../ui/9-slice/9-Slice-Example-B-Editor.png | 3 - .../9-slice/9-Slice-Example-B-ImageLabel.png | 3 - .../ui/9-slice/9-Slice-Intro-Examples.png | 3 - .../ui/9-slice/9-Slice-Offset-Diagram.png | 3 - .../ui/9-slice/9-Slice-Properties-Image.png | 3 - .../9-slice/9-Slice-Properties-ScaleType.png | 3 - .../9-Slice-Properties-SliceCenter.png | 3 - .../ui/automatic-sizing/Intro-Frame.mp4 | 3 - .../customizing-anchorpoint.mp4 | 3 - .../automatic-sizing/customizing-size-0.mp4 | 3 - .../automatic-sizing/customizing-size-100.mp4 | 3 - .../customizing-textwrapping.mp4 | 3 - .../ImageButton-Screen-New.jpg | 3 - .../ImageButton-State-Hover.png | 3 - .../ImageButton-State-Normal.png | 3 - .../ImageButton-State-Pressed.png | 3 - .../ImageButton-SurfaceGui-New.jpg | 3 - .../ui/button-text-input/Sprint-Button.png | 3 - .../ui/button-text-input/Sprint-Demo.mp4 | 3 - .../highlighting-objects/Adding-Highlight.jpg | 3 - .../DepthMode-AlwaysOnTop.jpg | 3 - .../DepthMode-Occluded.jpg | 3 - .../highlighting-objects/FillColor-Blue.jpg | 3 - .../highlighting-objects/FillColor-Green.jpg | 3 - .../ui/highlighting-objects/FillColor-Red.jpg | 3 - .../FillTransparency-0.jpg | 3 - .../FillTransparency-1.jpg | 3 - .../FillTransparency-Half.jpg | 3 - .../OutlineColor-Blue.jpg | 3 - .../OutlineColor-Green.jpg | 3 - .../highlighting-objects/OutlineColor-Red.jpg | 3 - .../OutlineTransparency-0.jpg | 3 - .../OutlineTransparency-1.jpg | 3 - .../Overview-Yellow-Interior.jpg | 3 - .../Overview-Yellow-Outline.jpg | 3 - .../ui/in-experience/BillboardGui-Diagram.jpg | 3 - .../BillboardGui-LightInfluence-0.jpg | 3 - .../BillboardGui-LightInfluence-1.jpg | 3 - .../BillboardGui-Sizing-Positioning.mp4 | 3 - .../assets/ui/in-experience/Showcase.mp4 | 3 - .../in-experience/SurfaceGui-Brightness-0.jpg | 3 - .../SurfaceGui-Brightness-10.jpg | 3 - .../ui/in-experience/SurfaceGui-Diagram.jpg | 3 - .../ui/in-experience/SurfaceGui-Sizing.mp4 | 3 - .../assets/ui/misc/Anchor-Point-Scaling.png | 3 - .../en-us/assets/ui/misc/Anchor-Points.png | 3 - .../assets/ui/misc/Contextual-Button.png | 3 - .../en-us/assets/ui/misc/CoreGui-Elements.jpg | 3 - .../ui/misc/Custom-Buttons-Near-Jump.png | 3 - .../assets/ui/misc/Loading-Animation.mp4 | 3 - .../assets/ui/misc/Roblox-Menu-Button.png | 3 - .../ui/misc/Scale-Offset-Positioning.png | 3 - .../en-us/assets/ui/misc/Scale-Sizing.png | 3 - .../misc/Thumb-Zones-Phone-Non-Reachable.png | 3 - .../ui/misc/Thumb-Zones-Phone-Reachable.png | 3 - .../misc/Thumb-Zones-Tablet-Non-Reachable.png | 3 - .../ui/misc/Thumb-Zones-Tablet-Reachable.png | 3 - .../assets/ui/misc/Touch-Reserved-Zones.png | 3 - .../assets/ui/misc/TouchGui-Elements.png | 3 - .../en-us/assets/ui/misc/UDim2-Components.png | 3 - .../Exclusivity-AlwaysShow.jpg | 3 - .../Exclusivity-OneGlobally.jpg | 3 - .../Exclusivity-OnePerButton.jpg | 3 - .../ui/proximity-prompt/HoldDuration.mp4 | 3 - .../MaxActivationDistance.jpg | 3 - .../ui/proximity-prompt/Prompt-Diagram.png | 3 - .../proximity-prompt/ProximityPrompt-New.png | 3 - .../proximity-prompt/RequiresLineOfSight.mp4 | 3 - .../assets/ui/proximity-prompt/Showcase.mp4 | 3 - .../assets/ui/rich-text/Enable-Rich-Text.png | 3 - .../assets/ui/rich-text/Example-Bold.png | 3 - .../assets/ui/rich-text/Example-Color.png | 3 - .../assets/ui/rich-text/Example-Comment.png | 3 - .../assets/ui/rich-text/Example-Font-Face.png | 3 - .../ui/rich-text/Example-Highlighted.png | 3 - .../assets/ui/rich-text/Example-Italic.png | 3 - .../ui/rich-text/Example-Line-Break.png | 3 - .../assets/ui/rich-text/Example-Size.png | 3 - .../ui/rich-text/Example-Small-Caps.png | 3 - .../ui/rich-text/Example-Strikethrough.png | 3 - .../assets/ui/rich-text/Example-Stroke.png | 3 - .../ui/rich-text/Example-Transparency.png | 3 - .../assets/ui/rich-text/Example-Underline.png | 3 - .../assets/ui/rich-text/Example-Uppercase.png | 3 - .../assets/ui/rich-text/Example-Weight.png | 3 - .../ui/ui-animation/Easing-Direction.mp4 | 3 - .../assets/ui/ui-animation/Easing-Style.mp4 | 3 - .../ui-animation/ModuleScript-AnimateUI.png | 3 - .../ui/ui-animation/Text-Typewriter.mp4 | 3 - .../assets/ui/ui-drag-detectors/Grid-Drag.mp4 | 3 - .../assets/ui/ui-drag-detectors/GridDrag.rbxm | 3 - .../ui/ui-drag-detectors/Hue-Rotator.mp4 | 3 - .../ui/ui-drag-detectors/HueRotator.rbxm | 3 - .../assets/ui/ui-drag-detectors/Showcase.mp4 | 3 - .../ui-drag-detectors/Transparency-Slider.mp4 | 3 - .../ui-drag-detectors/TransparencySlider.rbxm | 3 - .../assets/ui/ui-objects/Frame-Example.jpg | 3 - .../ui/ui-objects/ScreenGui-Example.jpg | 3 - .../ui/ui-objects/ScreenGuis-Enabled.png | 3 - .../ScrollingFrame-Canvas-Inset.png | 3 - .../ScrollingFrame-Canvas-No-Inset.png | 3 - .../ui/ui-objects/ScrollingFrame-Example.jpg | 3 - .../ScrollingFrame-Scroll-Bar-Elements.png | 3 - .../ui/ui-objects/StarterGui-To-PlayerGui.png | 3 - .../assets/ui/ui-objects/TextBox-Example.jpg | 3 - .../UICorner-CornerRadius-Properties.png | 3 - .../ui/ui-objects/UICorner-Offset-32.png | 3 - .../ui/ui-objects/UICorner-Offset-64.png | 3 - .../ui/ui-objects/UICorner-Scale-0.25.png | 3 - .../ui/ui-objects/UICorner-Scale-0.5.png | 3 - .../ui/ui-objects/UIFlexItem-Example.png | 3 - .../ui/ui-objects/UIFlexItem-Hierarchy.png | 3 - .../ui/ui-objects/UIGradient-Example.png | 3 - .../ui/ui-objects/UIGradient-Offset-X-0.png | 3 - .../UIGradient-Offset-X-Neg-0.25.png | 3 - .../UIGradient-Offset-X-Pos-0.25.png | 3 - .../ui/ui-objects/UIGradient-Rotation-0.png | 3 - .../ui-objects/UIGradient-Rotation-Neg-90.png | 3 - .../ui-objects/UIGradient-Rotation-Pos-45.png | 3 - .../ui/ui-objects/UIGridLayout-Example.jpg | 3 - .../ui/ui-objects/UIListLayout-Example.png | 3 - .../UIPadding-PaddingBottom-Default.png | 3 - ...IPadding-PaddingBottom-Offset-Negative.png | 3 - ...IPadding-PaddingBottom-Offset-Positive.png | 3 - .../assets/ui/ui-objects/UIScale-Example.png | 3 - .../ui/ui-objects/UIStroke-As-Border.png | 3 - .../ui-objects/UIStroke-As-Text-Outline.png | 3 - .../ui-objects/UIStroke-BorderOffset-In.png | 3 - .../ui-objects/UIStroke-BorderOffset-Out.png | 3 - .../UIStroke-BorderStrokePosition-Center.png | 3 - .../UIStroke-BorderStrokePosition-Inner.png | 3 - .../UIStroke-BorderStrokePosition-Outer.png | 3 - .../ui/ui-objects/UIStroke-Color-Gradient.png | 3 - .../ui/ui-objects/UIStroke-Color-Solid.png | 3 - .../UIStroke-LineJoinMode-Bevel.png | 3 - .../UIStroke-LineJoinMode-Miter.png | 3 - .../UIStroke-LineJoinMode-Round.png | 3 - .../UIStroke-Stroke-Mode-Border.png | 3 - .../ui/ui-objects/UIStroke-Thickness-12.png | 3 - .../ui/ui-objects/UIStroke-Thickness-4.png | 3 - .../ui/ui-objects/UIStroke-Transparency-A.png | 3 - .../ui/ui-objects/UIStroke-Transparency-B.png | 3 - .../ui/ui-objects/UITableLayout-Example.jpg | 3 - .../ui/ui-objects/UITextSizeConstraint.mp4 | 3 - .../ui/ui-styling/SE-Class-Rule-Configure.png | 3 - .../ui/ui-styling/SE-Class-Rule-New-Class.png | 3 - .../ui/ui-styling/SE-Class-Rule-Result.png | 3 - .../ui/ui-styling/SE-Class-Rule-Tokens.png | 3 - .../ui/ui-styling/SE-Create-Design-Entry.png | 3 - .../ui/ui-styling/SE-Initial-Config.png | 3 - .../ui-styling/SE-Modifier-Rule-Configure.png | 3 - .../ui-styling/SE-Modifier-Rule-New-Class.png | 3 - ...-Modifier-Rule-Pseudo-Instance-Created.png | 3 - .../SE-Modifier-Rule-Pseudo-Instance-New.png | 3 - ...E-Modifier-Rule-Pseudo-Instance-Tokens.png | 3 - .../ui/ui-styling/SE-Modifier-Rule-Result.png | 3 - .../ui/ui-styling/SE-Modifier-Rule-Tokens.png | 3 - .../ui/ui-styling/SE-State-Rule-Created.png | 3 - .../ui/ui-styling/SE-State-Rule-New-Class.png | 3 - .../ui/ui-styling/SE-State-Rule-New.png | 3 - .../ui/ui-styling/SE-State-Rule-Result.png | 3 - .../ui/ui-styling/SE-State-Rule-Tokens.png | 3 - .../ui/ui-styling/SE-Tag-Rule-Apply-Tag.png | 3 - .../ui/ui-styling/SE-Tag-Rule-Configure.png | 3 - .../assets/ui/ui-styling/SE-Tag-Rule-New.png | 3 - .../ui/ui-styling/SE-Tag-Rule-Renamed.png | 3 - .../ui/ui-styling/SE-Tag-Rule-Result.png | 3 - .../ui/ui-styling/SE-Tag-Rule-Tokens.png | 3 - .../ui/ui-styling/SE-Themes-Class-Tokens.png | 3 - .../ui-styling/SE-Themes-Duplicated-Theme.png | 3 - .../ui/ui-styling/SE-Themes-New-Class.png | 3 - .../ui/ui-styling/SE-Themes-New-Folder.png | 3 - .../ui/ui-styling/SE-Themes-New-Theme.png | 3 - .../ui-styling/SE-Themes-Swapping-ThemeA.png | 3 - .../ui-styling/SE-Themes-Swapping-ThemeB.png | 3 - .../ui-styling/SE-Themes-Theme-Configure.png | 3 - .../ui/ui-styling/SE-Themes-ThemeA-Result.png | 3 - .../ui/ui-styling/SE-Themes-ThemeA-Tokens.png | 3 - .../ui/ui-styling/SE-Themes-ThemeB-Result.png | 3 - .../ui/ui-styling/SE-Themes-ThemeB-Tokens.png | 3 - .../ui/ui-styling/SE-TokenSheet-New.png | 3 - .../ui/ui-styling/SE-TokenSheet-Tokens.png | 3 - .../ui/ui-styling/Styling-Flowchart-Class.png | 3 - .../ui-styling/Styling-Flowchart-Modifier.png | 3 - .../ui/ui-styling/Styling-Flowchart-Tag.png | 3 - .../workspace/camera/Camera-Occlusion.mp4 | 3 - .../workspace/raycasting/Laser-Maze.mp4 | 3 - .cursor/rules/roblox/en-us/assistant/guide.md | 79 - .cursor/rules/roblox/en-us/assistant/mcp.md | 24 - .../rules/roblox/en-us/assistant/overview.md | 65 - .../en-us/assistant/prompt-engineering.md | 248 - .cursor/rules/roblox/en-us/audio/assets.md | 106 - .cursor/rules/roblox/en-us/audio/effects.md | 225 - .cursor/rules/roblox/en-us/audio/index.md | 29 - .cursor/rules/roblox/en-us/audio/objects.md | 490 - .../avatar-setup/auto-setup-requirements.md | 335 - .../roblox/en-us/avatar-setup/auto-setup.md | 165 - .../rules/roblox/en-us/avatar-setup/index.md | 75 - .../rules/roblox/en-us/avatar-setup/tools.md | 92 - .../roblox/en-us/avatar/avatar-generation.md | 67 - .../en-us/avatar/in-experience-creation.md | 324 - .cursor/rules/roblox/en-us/avatar/index.md | 281 - .../rules/roblox/en-us/avatar/resources.md | 645 - .../rules/roblox/en-us/avatar/tutorials.md | 320 - .../en-us/characters/adaptive-animation.md | 104 - .../roblox/en-us/characters/appearance.md | 275 - .../rules/roblox/en-us/characters/emotes.md | 90 - .../rules/roblox/en-us/characters/index.md | 75 - .../en-us/characters/name-health-display.md | 221 - .../roblox/en-us/characters/pathfinding.md | 633 - .../en-us/characters/r6-to-r15-adapter.md | 75 - .../rules/roblox/en-us/chat/bubble-chat.md | 464 - .../rules/roblox/en-us/chat/chat-window.md | 452 - .../examples/custom-text-chat-commands.md | 55 - .../en-us/chat/examples/group-chat-tags.md | 56 - .../en-us/chat/examples/proximity-chat.md | 44 - .../examples/rate-limit-public-text-inputs.md | 75 - .../examples/simple-custom-frontend-ui.md | 84 - .cursor/rules/roblox/en-us/chat/guidelines.md | 56 - .../en-us/chat/in-experience-text-chat.md | 292 - .cursor/rules/roblox/en-us/chat/voice-chat.md | 186 - .../cloud-services/cross-server-messaging.md | 63 - .../data-stores-vs-memory-stores.md | 158 - .../data-stores/best-practices.md | 68 - .../data-stores/data-stores-manager.md | 70 - .../data-stores/error-codes-and-limits.md | 577 - .../en-us/cloud-services/data-stores/index.md | 358 - .../data-stores/observability.md | 46 - .../data-stores/player-data-purchasing.md | 323 - .../versioning-listing-and-caching.md | 262 - .../en-us/cloud-services/extended-services.md | 266 - .../en-us/cloud-services/http-service.md | 247 - .../memory-stores/best-practices.md | 172 - .../cloud-services/memory-stores/hash-map.md | 253 - .../cloud-services/memory-stores/index.md | 363 - .../memory-stores/observability.md | 77 - .../memory-stores/per-partition-limits.md | 37 - .../cloud-services/memory-stores/queue.md | 137 - .../memory-stores/sorted-map.md | 300 - .../roblox/en-us/cloud-services/secrets.md | 70 - .../rules/roblox/en-us/cloud/auth/api-keys.md | 241 - .../roblox/en-us/cloud/auth/oauth2-develop.md | 206 - .../en-us/cloud/auth/oauth2-overview.md | 167 - .../en-us/cloud/auth/oauth2-reference.md | 427 - .../en-us/cloud/auth/oauth2-registration.md | 144 - .../roblox/en-us/cloud/auth/oauth2-sample.md | 79 - .../roblox/en-us/cloud/guides/configs.md | 244 - .../en-us/cloud/guides/data-stores/index.md | 339 - .../guides/data-stores/request-handling.md | 57 - .../cloud/guides/data-stores/throttling.md | 118 - .../cloud/guides/experience-notifications.md | 107 - .../rules/roblox/en-us/cloud/guides/index.md | 14 - .../roblox/en-us/cloud/guides/instance.md | 442 - .../roblox/en-us/cloud/guides/inventory.md | 159 - .../en-us/cloud/guides/secrets-store.md | 74 - .../roblox/en-us/cloud/guides/usage-assets.md | 416 - .../en-us/cloud/guides/usage-messaging.md | 149 - .../cloud/guides/usage-place-publishing.md | 67 - .cursor/rules/roblox/en-us/cloud/index.md | 35 - .../roblox/en-us/cloud/reference/errors.md | 219 - .../roblox/en-us/cloud/reference/openapi.md | 32 - .../roblox/en-us/cloud/reference/patterns.md | 234 - .../en-us/cloud/reference/rate-limits.md | 63 - .../en-us/cloud/reference/risk-levels.md | 65 - .../roblox/en-us/cloud/reference/scopes.md | 10 - .../roblox/en-us/cloud/reference/types.md | 119 - .../webhooks/automate-right-to-erasure.md | 538 - .../cloud/webhooks/webhook-notifications.md | 269 - .cursor/rules/roblox/en-us/creation.md | 186 - .cursor/rules/roblox/en-us/creator-fund.md | 30 - .cursor/rules/roblox/en-us/creator-hub.md | 133 - .../brand-developer-directory.md | 34 - .../creator-programs/creator-affiliate.md | 47 - .../en-us/creator-programs/creator-events.md | 51 - .../creator-programs/developer-awards.md | 67 - .../roblox/en-us/creator-programs/feedback.md | 38 - .../roblox/en-us/creator-programs/index.md | 361 - .../creator-programs/innovation-awards.md | 20 - .../roblox/en-us/creator-programs/inspire.md | 30 - .../creator-programs/learn-explore-sort.md | 28 - .../managed-brand-integrations.md | 31 - .../creator-programs/notable-translators.md | 35 - .../roblox/en-us/creator-programs/rdc.md | 20 - .../en-us/creator-programs/research-panel.md | 34 - .../en-us/creator-programs/safety-council.md | 49 - .../en-us/creator-programs/spotlights.md | 36 - .../creator-programs/todays-picks-home.md | 26 - .../todays-picks-marketplace.md | 36 - .cursor/rules/roblox/en-us/creator-rewards.md | 277 - .cursor/rules/roblox/en-us/discovery.md | 207 - .../adventure-game-series/buying-upgrades.md | 249 - .../code-the-leaderboard.md | 222 - .../adventure-game-series/collect-items.md | 336 - .../adventure-game-series/create-the-map.md | 123 - .../finishing-the-project.md | 60 - .../adventure-game-series/landing.md | 90 - .../adventure-game-series/selling-items.md | 210 - .../battle-royale-series/cleanup-and-reset.md | 670 - .../coding-the-game-loop.md | 335 - .../battle-royale-series/creating-a-gui.md | 527 - .../battle-royale-series/ending-matches.md | 581 - .../finishing-the-project.md | 125 - .../education/battle-royale-series/landing.md | 102 - .../battle-royale-series/managing-players.md | 422 - .../battle-royale-series/project-setup.md | 199 - .../battle-royale-series/timers-and-events.md | 354 - .../build-one-half.md | 99 - .../build-the-roads.md | 23 - .../buildings-and-props.md | 21 - .../challenge-1.md | 19 - .../challenge-2.md | 16 - .../challenge-3.md | 16 - .../change-the-script.md | 73 - .../complete-the-city.md | 21 - .../designing-a-map.md | 37 - .../finish-the-challenge.md | 39 - .../island-terrain.md | 30 - .../landing.md | 54 - .../playtest-the-map.md | 43 - .../save-and-publish.md | 14 - .../snap-to-grid.md | 49 - .../terrain-tools.md | 47 - .../add-new-models.md | 63 - .../add-to-the-garage.md | 57 - .../adding-wings.md | 59 - .../colors-and-textures.md | 107 - .../customize-and-share.md | 73 - .../design-the-world.md | 75 - .../designing-your-speeder.md | 101 - .../duplicate-and-design.md | 55 - .../get-off-the-ground.md | 35 - .../go-beyond-the-challenge.md | 110 - .../going-for-a-race.md | 27 - .../grouping-the-parts.md | 16 - .../main-page.md | 56 - .../moving-the-body.md | 31 - .../save-and-publish.md | 19 - .../sharing-your-speeders.md | 50 - .../take-flight.md | 76 - .../take-the-challenge-2.md | 22 - .../take-the-challenge-3.md | 22 - .../take-the-challenge.md | 20 - .../test-the-speeder.md | 49 - .../adding-animations.md | 145 - .../adding-new-models.md | 44 - .../adding-the-second-pose.md | 45 - .../animating-parts.md | 327 - .../animations-and-feedback.md | 62 - .../beginner-landing-page.md | 60 - .../challenge-checkpoint-2.md | 20 - .../challenge-checkpoint-3.md | 20 - .../challenge-checkpoint.md | 20 - .../change-the-animation.md | 73 - .../create-the-first-pose.md | 50 - .../creating-animations.md | 71 - .../designing-poses.md | 177 - .../exporting-animations.md | 37 - .../go-beyond-the-challenge.md | 87 - .../invite-friends-to-play.md | 18 - .../landing.md | 41 - .../looping-animations.md | 28 - .../opening-the-template.md | 36 - .../personalize-the-game.md | 131 - .../save-and-publish.md | 37 - .../sharing-animations.md | 56 - .../test-the-game.md | 24 - .../adding-scripts.md | 286 - .../become-an-artist.md | 38 - .../beginner-landing-page.md | 60 - .../challenge-checkpoint-2.md | 22 - .../challenge-checkpoint-3.md | 22 - .../challenge-checkpoint.md | 22 - .../connect-the-beam.md | 69 - .../creating-a-sparkler.md | 168 - .../creating-engaging-experiences.md | 77 - .../experienced-landing-page.md | 20 - .../finish-the-blast.md | 39 - .../invite-friends.md | 18 - .../landing-page.md | 48 - .../make-final-touches.md | 75 - .../making-an-explosion.md | 89 - .../next-steps-advanced.md | 13 - .../next-steps.md | 31 - .../particle-emitters.md | 75 - .../save-by-publishing.md | 18 - .../test-and-play.md | 26 - .../using-particles-for-actions.md | 150 - .../using-textures.md | 89 - .../code-the-story.md | 109 - .../coding-a-question.md | 97 - .../complete-the-challenge.md | 35 - .../finish-and-add.md | 112 - .../first-challenge.md | 12 - .../build-it-play-it-story-games/landing.md | 61 - .../opening-the-template.md | 35 - .../second-challenge.md | 12 - .../start-coding.md | 46 - .../test-and-save.md | 67 - .../third-challenge.md | 12 - .../writing-the-story.md | 36 - .../collaborating-in-roblox-landing-page.md | 92 - .../collaboration-best-practices.md | 79 - .../developer/beta-testing-experiences.md | 337 - .../designing-educational-experiences.md | 35 - .../planning-for-educational-settings.md | 396 - .../edu-templates/classroom-collection.md | 62 - .../edu-templates/edu-lesson-plan-template.md | 117 - .../education/edu-templates/edu-styles.md | 30 - .../edu-templates/series-template.md | 45 - .../educator-onboarding/1-intro-to-roblox.md | 145 - .../2-playing-on-roblox.md | 143 - .../3-setting-up-a-roblox-classroom.md | 135 - .../4-running-classrooms.md | 211 - .../educator-onboarding/5-next-steps.md | 267 - .../education/educator-onboarding/landing.md | 58 - .../landing-pages/build-it-play-it.md | 109 - .../lesson-plans/animate-in-roblox-lesson.md | 193 - .../lesson-plans/build-an-obby-lesson.md | 160 - .../lesson-plans/create-and-destroy-lesson.md | 181 - .../animating-characters.md | 137 - .../being-a-digital-citizen.md | 140 - .../civil-and-safe-game.md | 24 - .../coding-fundamentals.md | 110 - .../digital-citizenship/finishing-projects.md | 93 - .../digital-citizenship/intro-to-roblox.md | 138 - .../digital-citizenship/landing.md | 59 - .../digital-citizenship/lights-and-polish.md | 100 - .../lesson-plans/galactic-speedway-lesson.md | 194 - .../lesson-plans/intro-to-game-and-coding.md | 185 - .../lesson-plans/roblox-developer-lesson.md | 630 - .../lesson-plans/roblox-developer/landing.md | 55 - .../roblox-developer/roblox-developer-1.md | 142 - .../roblox-developer/roblox-developer-2.md | 115 - .../roblox-developer/roblox-developer-3.md | 138 - .../roblox-developer/roblox-developer-4.md | 106 - .../roblox-developer/roblox-developer-5.md | 100 - .../lesson-plans/story-games-lesson.md | 239 - .../resources/classroom-best-practices.md | 83 - .../resources/coding-concept-abstraction.md | 132 - .../resources/coding-concept-algorithms.md | 146 - .../resources/collaboration-best-practices.md | 66 - .../frequently-asked-questions-education.md | 140 - ...etting-started-for-developers-education.md | 129 - .../resources/intro-to-digital-civility.md | 99 - .../resources/intro-to-digital-safety.md | 154 - .../resources/marketing-materials.md | 20 - .../education/resources/resources-landing.md | 114 - .../education/resources/roblox-educators.md | 738 - ...-for-the-ap-csp-create-performance-task.md | 190 - .../education/resources/teaching-remotely.md | 115 - .../support/creating-bundled-installers.md | 36 - .../support/designing-studio-templates.md | 168 - .../support/education-contact-form.md | 6 - .../education/support/education-content.md | 80 - .../support/education-getting-started.md | 71 - .../private-servers-for-classroom-use.md | 71 - .../support/roblox-account-creation.md | 37 - .cursor/rules/roblox/en-us/effects/beams.md | 209 - .../roblox/en-us/effects/highlighting.md | 162 - .cursor/rules/roblox/en-us/effects/index.md | 89 - .../roblox/en-us/effects/light-sources.md | 156 - .../roblox/en-us/effects/particle-emitters.md | 534 - .cursor/rules/roblox/en-us/effects/trails.md | 190 - .../roblox/en-us/environment/atmosphere.md | 114 - .../rules/roblox/en-us/environment/clouds.md | 65 - .../roblox/en-us/environment/global-wind.md | 74 - .../rules/roblox/en-us/environment/index.md | 63 - .../roblox/en-us/environment/lighting.md | 228 - .../environment/post-processing-effects.md | 131 - .../rules/roblox/en-us/environment/skybox.md | 94 - .cursor/rules/roblox/en-us/experiences.md | 209 - .../roblox/en-us/get-started/creating.md | 194 - .../get-started/how-is-roblox-different.md | 87 - .../rules/roblox/en-us/get-started/index.md | 104 - .../roblox/en-us/get-started/monetization.md | 256 - .../roblox/en-us/get-started/resources.md | 98 - .../roblox/en-us/get-started/strategies.md | 554 - .../rules/roblox/en-us/get-started/tools.md | 207 - .../en-us/get-started/why-build-on-roblox.md | 98 - .../includes/beta-features/beta-alert.md | 5 - .../en-us/includes/cloud/legacy-note.md | 7 - .../en-us/includes/cloud/legacy-warning.md | 7 - .../roblox/en-us/includes/default-bindings.md | 219 - .../opening-developer-console.md | 15 - .../fishing-pole-code-sample.md | 34 - .../engine-comparisons/script-locations.md | 15 - .../engine-comparisons/script-types.md | 17 - .../includes/engine-comparisons/transforms.md | 8 - .../analytics-itemized-stats.md | 14 - .../analytics-notification-summary.md | 42 - .../analytics-overview.md | 10 - .../delivery-system.md | 19 - .../experience-notifications/eligibility.md | 9 - .../experience-notifications/guidelines.md | 82 - ...plementation-create-notification-string.md | 26 - .../experience-notifications/intro.md | 44 - .../en-us/includes/studio/camera-controls.md | 52 - .../includes/studio/constraint-simulation.md | 7 - .../studio/constraint-visualization.md | 12 - .../includes/studio/controller-emulator.md | 11 - .../en-us/includes/studio/device-emulator.md | 9 - .../en-us/includes/studio/playtest-modes.md | 30 - .../en-us/includes/studio/system-reqs.md | 30 - .../en-us/includes/studio/toolbox-find-use.md | 32 - .../en-us/includes/studio/touch-simulation.md | 14 - .../includes/text-filtering/text-filtering.md | 9 - .../roblox/en-us/includes/ui/default-ui.md | 68 - .../roblox/en-us/includes/ui/screen-insets.md | 32 - .cursor/rules/roblox/en-us/input/gamepad.md | 95 - .cursor/rules/roblox/en-us/input/index.md | 103 - .../roblox/en-us/input/input-action-system.md | 356 - .cursor/rules/roblox/en-us/input/mobile.md | 112 - .../roblox/en-us/input/mouse-and-keyboard.md | 95 - .../roblox/en-us/ip-licensing/creators.md | 210 - .../rules/roblox/en-us/ip-licensing/faq.md | 102 - .../roblox/en-us/ip-licensing/get-started.md | 243 - .../roblox/en-us/ip-licensing/glossary.md | 67 - .../rules/roblox/en-us/ip-licensing/index.md | 349 - .../en-us/ip-licensing/license-manager.md | 211 - .cursor/rules/roblox/en-us/luau/booleans.md | 14 - .cursor/rules/roblox/en-us/luau/comments.md | 87 - .../roblox/en-us/luau/control-structures.md | 299 - .cursor/rules/roblox/en-us/luau/enums.md | 59 - .cursor/rules/roblox/en-us/luau/functions.md | 269 - .cursor/rules/roblox/en-us/luau/index.md | 39 - .../en-us/luau/luau-csharp-comparison.md | 611 - .cursor/rules/roblox/en-us/luau/metatables.md | 466 - .../roblox/en-us/luau/native-code-gen.md | 155 - .cursor/rules/roblox/en-us/luau/nil.md | 49 - .cursor/rules/roblox/en-us/luau/numbers.md | 87 - .cursor/rules/roblox/en-us/luau/operators.md | 350 - .cursor/rules/roblox/en-us/luau/queues.md | 123 - .cursor/rules/roblox/en-us/luau/scope.md | 168 - .cursor/rules/roblox/en-us/luau/stacks.md | 88 - .cursor/rules/roblox/en-us/luau/strings.md | 602 - .cursor/rules/roblox/en-us/luau/tables.md | 374 - .cursor/rules/roblox/en-us/luau/tuples.md | 28 - .../rules/roblox/en-us/luau/type-checking.md | 349 - .../rules/roblox/en-us/luau/type-coercion.md | 72 - .cursor/rules/roblox/en-us/luau/userdata.md | 6 - .cursor/rules/roblox/en-us/luau/variables.md | 105 - .cursor/rules/roblox/en-us/makeup/import.md | 64 - .cursor/rules/roblox/en-us/makeup/index.md | 269 - .../roblox/en-us/makeup/reassign-textures.md | 119 - .../roblox/en-us/makeup/specifications.md | 55 - .../en-us/marketplace/custom-thumbnails.md | 71 - .../marketplace/frequently-asked-questions.md | 83 - .../roblox/en-us/marketplace/homestore.md | 94 - .../rules/roblox/en-us/marketplace/index.md | 24 - .../marketplace/intellectual-property.md | 111 - .../marketplace-fees-and-commissions.md | 501 - .../en-us/marketplace/marketplace-policy.md | 568 - .../roblox/en-us/marketplace/moderation.md | 37 - .../marketplace/publish-to-marketplace.md | 283 - .../roblox/en-us/matchmaking/analytics.md | 96 - .../matchmaking/attributes-and-signals.md | 426 - .../matchmaking/customize-matchmaking.md | 159 - .../roblox/en-us/matchmaking/glossary.md | 115 - .../rules/roblox/en-us/matchmaking/index.md | 65 - .../rules/roblox/en-us/matchmaking/scoring.md | 380 - .cursor/rules/roblox/en-us/parts/index.md | 288 - .cursor/rules/roblox/en-us/parts/materials.md | 1805 - .cursor/rules/roblox/en-us/parts/meshes.md | 182 - .../roblox/en-us/parts/model-generation.md | 247 - .cursor/rules/roblox/en-us/parts/models.md | 156 - .../roblox/en-us/parts/solid-modeling.md | 254 - .cursor/rules/roblox/en-us/parts/terrain.md | 686 - .../roblox/en-us/parts/textures-decals.md | 157 - .../en-us/performance-optimization/design.md | 60 - .../performance-optimization/identify.md | 155 - .../en-us/performance-optimization/improve.md | 595 - .../en-us/performance-optimization/index.md | 45 - .../microprofiler/index.md | 264 - .../microprofiler/modes.md | 54 - .../microprofiler/network.md | 69 - .../microprofiler/tag-table.md | 450 - .../microprofiler/task-scheduler.md | 43 - .../microprofiler/use-microprofiler.md | 116 - .../en-us/performance-optimization/monitor.md | 19 - .../en-us/physics/adaptive-timestepping.md | 58 - .../rules/roblox/en-us/physics/assemblies.md | 127 - .../en-us/physics/character-controllers.md | 107 - .../physics/constraints/align-orientation.md | 42 - .../physics/constraints/align-position.md | 36 - .../physics/constraints/angular-velocity.md | 35 - .../en-us/physics/constraints/animation.md | 32 - .../en-us/physics/constraints/ball-socket.md | 34 - .../en-us/physics/constraints/cylindrical.md | 63 - .../roblox/en-us/physics/constraints/hinge.md | 40 - .../en-us/physics/constraints/line-force.md | 57 - .../physics/constraints/linear-velocity.md | 31 - .../en-us/physics/constraints/no-collision.md | 6 - .../roblox/en-us/physics/constraints/plane.md | 23 - .../en-us/physics/constraints/prismatic.md | 37 - .../roblox/en-us/physics/constraints/rigid.md | 17 - .../roblox/en-us/physics/constraints/rod.md | 16 - .../roblox/en-us/physics/constraints/rope.md | 22 - .../en-us/physics/constraints/spring.md | 39 - .../en-us/physics/constraints/torque.md | 35 - .../physics/constraints/torsion-spring.md | 39 - .../en-us/physics/constraints/universal.md | 29 - .../en-us/physics/constraints/vector-force.md | 50 - .../roblox/en-us/physics/constraints/weld.md | 36 - .cursor/rules/roblox/en-us/physics/index.md | 61 - .../en-us/physics/mechanical-constraints.md | 227 - .../roblox/en-us/physics/mover-constraints.md | 233 - .../roblox/en-us/physics/network-ownership.md | 118 - .../roblox/en-us/physics/sleep-system.md | 148 - .cursor/rules/roblox/en-us/physics/units.md | 184 - .cursor/rules/roblox/en-us/platform.md | 267 - .../en-us/players/avatar-context-menu.md | 349 - .../roblox/en-us/players/avatar-editor.md | 210 - .../en-us/players/avatar-inspect-menu.md | 67 - .../rules/roblox/en-us/players/disable-ui.md | 8 - .cursor/rules/roblox/en-us/players/index.md | 176 - .../roblox/en-us/players/leaderboards.md | 160 - .../roblox/en-us/players/loading-screens.md | 151 - .cursor/rules/roblox/en-us/players/teams.md | 60 - .cursor/rules/roblox/en-us/players/tools.md | 216 - .../en-us/production/analytics/acquisition.md | 170 - .../analytics/analytics-dashboard.md | 295 - .../production/analytics/custom-events.md | 91 - .../production/analytics/custom-fields.md | 39 - .../production/analytics/demographics.md | 43 - .../production/analytics/economy-events.md | 132 - .../en-us/production/analytics/engagement.md | 62 - .../production/analytics/error-report.md | 71 - .../en-us/production/analytics/event-types.md | 130 - .../en-us/production/analytics/feedback.md | 91 - .../production/analytics/funnel-events.md | 200 - .../en-us/production/analytics/index.md | 118 - .../en-us/production/analytics/insights.md | 84 - .../production/analytics/monetization.md | 86 - .../en-us/production/analytics/performance.md | 217 - .../en-us/production/analytics/retention.md | 161 - .cursor/rules/roblox/en-us/production/bans.md | 34 - .../rules/roblox/en-us/production/configs.md | 157 - .../roblox/en-us/production/creator-store.md | 149 - .../roblox/en-us/production/experiments.md | 223 - .../game-design/analytics-essentials.md | 60 - .../game-design/balance-virtual-economies.md | 92 - .../production/game-design/content-updates.md | 113 - .../game-design/contextual-purchases.md | 112 - .../production/game-design/core-loops.md | 49 - .../game-design/design-for-roblox.md | 159 - .../en-us/production/game-design/index.md | 65 - .../introduction-to-quest-design.md | 185 - .../game-design/liveops-essentials.md | 131 - .../game-design/liveops-planning.md | 70 - .../game-design/monetization-foundations.md | 398 - .../game-design/onboarding-techniques.md | 230 - .../production/game-design/onboarding.md | 93 - .../production/game-design/prototyping.md | 86 - .../game-design/season-pass-design.md | 315 - .../game-design/starter-pack-design.md | 56 - .../game-design/subscription-design.md | 131 - .../production/game-design/ui-ux-design.md | 272 - .../rules/roblox/en-us/production/index.md | 61 - .../localization/add-source-content.md | 85 - .../localization/add-translations.md | 183 - .../auto-translate-dynamic-content.md | 225 - .../localization/automatic-translations.md | 175 - .../en-us/production/localization/index.md | 104 - .../production/localization/language-codes.md | 268 - .../localization/localize-with-scripting.md | 448 - .../localization/manual-translations.md | 68 - .../production/localization/remove-content.md | 45 - .../localization/translate-dynamic-content.md | 261 - .../localization/work-with-translators.md | 80 - .../monetization/avatar-creation-token.md | 42 - .../production/monetization/avatar-items.md | 70 - .../monetization/commerce-products.md | 442 - .../monetization/developer-products.md | 396 - .../monetization/engagement-based-payouts.md | 136 - .../production/monetization/immersive-ads.md | 329 - .../en-us/production/monetization/index.md | 137 - .../paid-access-local-currency.md | 136 - .../monetization/paid-access-robux.md | 65 - .../en-us/production/monetization/passes.md | 353 - .../monetization/price-optimization.md | 163 - .../monetization/private-servers.md | 42 - .../monetization/regional-pricing.md | 243 - .../production/monetization/subscriptions.md | 406 - .../production/monetization/virtual-items.md | 27 - .../en-us/production/promotion/ads-manager.md | 374 - .../promotion/advertise-on-roblox.md | 64 - .../en-us/production/promotion/advertise.md | 146 - .../comply-with-advertising-standards.md | 121 - .../production/promotion/content-maturity.md | 519 - .../en-us/production/promotion/deeplinks.md | 103 - .../production/promotion/experience-events.md | 245 - .../promotion/experience-guidelines.md | 207 - .../promotion/experience-notifications.md | 333 - .../en-us/production/promotion/index.md | 93 - .../production/promotion/invite-prompts.md | 323 - .../production/promotion/referral-system.md | 223 - .../regional-content-availability.md | 23 - .../promotion/reporting-and-billing.md | 400 - .../promotion/rewarded-video-ads.md | 375 - .../en-us/production/promotion/search-ads.md | 118 - .../en-us/production/promotion/share-links.md | 26 - .../promotion/social-media-links.md | 21 - .../production/promotion/sponsor-items.md | 131 - .../publishing/about-GDPR-and-CCPA.md | 33 - .../production/publishing/accessibility.md | 248 - .../publishing/account-verification.md | 88 - .../production/publishing/adaptive-design.md | 102 - .../en-us/production/publishing/badges.md | 169 - .../publishing/console-guidelines.md | 127 - .../production/publishing/descriptions.md | 174 - .../production/publishing/dmca-guidelines.md | 144 - .../publishing/experience-genres.md | 228 - .../production/publishing/experience-icons.md | 115 - .../publish-experiences-and-places.md | 218 - .../production/publishing/rights-manager.md | 44 - .../en-us/production/publishing/thumbnails.md | 327 - .../production/publishing/vr-guidelines.md | 57 - .../en-us/production/roblox-user-base.md | 145 - .../en-us/production/sell-on-creator-store.md | 136 - .../roblox/en-us/projects/activity-history.md | 80 - .../rules/roblox/en-us/projects/assets/api.md | 226 - .../assets/in-experience-asset-creation.md | 83 - .../roblox/en-us/projects/assets/index.md | 353 - .../roblox/en-us/projects/assets/manager.md | 490 - .../roblox/en-us/projects/assets/monetize.md | 26 - .../roblox/en-us/projects/assets/packages.md | 303 - .../roblox/en-us/projects/assets/privacy.md | 280 - .../roblox/en-us/projects/assets/toolbox.md | 118 - .../roblox/en-us/projects/client-server.md | 128 - .../roblox/en-us/projects/collaboration.md | 324 - .../en-us/projects/configure-experiences.md | 113 - .../roblox/en-us/projects/cross-platform.md | 173 - .../rules/roblox/en-us/projects/data-model.md | 335 - .../projects/experience-ownership-transfer.md | 121 - .../roblox/en-us/projects/external-tools.md | 163 - .../roblox/en-us/projects/group-guidelines.md | 28 - .cursor/rules/roblox/en-us/projects/groups.md | 370 - .cursor/rules/roblox/en-us/projects/index.md | 98 - .../roblox/en-us/projects/place-files.md | 65 - .../en-us/projects/server-authority/index.md | 270 - .../projects/server-authority/techniques.md | 268 - .../rules/roblox/en-us/projects/teleport.md | 228 - .../en-us/projects/update-experiences.md | 38 - .../roblox/en-us/reference/cloud/README.md | 7 - .../cloud/asset-permissions-api/v1.json | 285 - .../en-us/reference/cloud/assets/v1.json | 1065 - .../en-us/reference/cloud/cloud.docs.json | 10441 - .../cloud/datastores-api/ordered-v1.json | 718 - .../reference/cloud/datastores-api/v1.json | 1187 - .../cloud/developer-products-api/v1.json | 768 - .../cloud/game-passes-http-service/v1.json | 735 - .../reference/cloud/messaging-service/v1.json | 151 - .../reference/cloud/open-eval-api/v1.json | 355 - .../roblox/en-us/reference/cloud/openapi.json | 93060 ------- .../cloud/secrets-store-service/v1.json | 601 - .../reference/cloud/toolbox-service/v1.json | 2469 - .../reference/cloud/universes-api/v1.json | 127 - .../roblox/en-us/reference/engine/README.md | 6 - .../en-us/reference/engine/STUDIO_VERSION | 2 - .../roblox/en-us/reference/engine/classes.md | 4 - .../reference/engine/classes/Accessory.yaml | 60 - .../engine/classes/AccessoryDescription.yaml | 232 - .../engine/classes/Accoutrement.yaml | 142 - .../en-us/reference/engine/classes/Actor.yaml | 158 - .../en-us/reference/engine/classes/AdGui.yaml | 121 - .../reference/engine/classes/AdPortal.yaml | 58 - .../reference/engine/classes/AdService.yaml | 192 - .../engine/classes/AdvancedDragger.yaml | 22 - .../engine/classes/AirController.yaml | 204 - .../engine/classes/AlignOrientation.yaml | 378 - .../engine/classes/AlignPosition.yaml | 350 - .../engine/classes/AnalyticsService.yaml | 946 - .../engine/classes/AngularVelocity.yaml | 138 - .../reference/engine/classes/Animation.yaml | 73 - .../engine/classes/AnimationClip.yaml | 91 - .../engine/classes/AnimationClipProvider.yaml | 262 - .../engine/classes/AnimationConstraint.yaml | 221 - .../engine/classes/AnimationController.yaml | 130 - .../AnimationFromVideoCreatorService.yaml | 21 - .../classes/AnimationNodeDefinition.yaml | 53 - .../engine/classes/AnimationRigData.yaml | 24 - .../engine/classes/AnimationTrack.yaml | 770 - .../reference/engine/classes/Animator.yaml | 300 - .../reference/engine/classes/Annotation.yaml | 20 - .../reference/engine/classes/ArcHandles.yaml | 148 - .../engine/classes/AssetDeliveryProxy.yaml | 70 - .../engine/classes/AssetPatchSettings.yaml | 69 - .../engine/classes/AssetService.yaml | 973 - .../reference/engine/classes/Atmosphere.yaml | 186 - .../engine/classes/AtmosphereSensor.yaml | 69 - .../reference/engine/classes/Attachment.yaml | 444 - .../engine/classes/AudioAnalyzer.yaml | 238 - .../engine/classes/AudioChannelMixer.yaml | 185 - .../engine/classes/AudioChannelSplitter.yaml | 190 - .../reference/engine/classes/AudioChorus.yaml | 212 - .../engine/classes/AudioCompressor.yaml | 271 - .../engine/classes/AudioDeviceInput.yaml | 331 - .../engine/classes/AudioDeviceOutput.yaml | 150 - .../engine/classes/AudioDistortion.yaml | 163 - .../reference/engine/classes/AudioEcho.yaml | 241 - .../engine/classes/AudioEmitter.yaml | 435 - .../engine/classes/AudioEqualizer.yaml | 234 - .../reference/engine/classes/AudioFader.yaml | 164 - .../reference/engine/classes/AudioFilter.yaml | 265 - .../engine/classes/AudioFlanger.yaml | 207 - .../reference/engine/classes/AudioGate.yaml | 189 - .../engine/classes/AudioLimiter.yaml | 189 - .../engine/classes/AudioListener.yaml | 432 - .../reference/engine/classes/AudioPages.yaml | 27 - .../engine/classes/AudioPitchShifter.yaml | 184 - .../reference/engine/classes/AudioPlayer.yaml | 574 - .../engine/classes/AudioRecorder.yaml | 273 - .../reference/engine/classes/AudioReverb.yaml | 392 - .../engine/classes/AudioSearchParams.yaml | 198 - .../engine/classes/AudioSpeechToText.yaml | 159 - .../engine/classes/AudioTextToSpeech.yaml | 465 - .../engine/classes/AudioTremolo.yaml | 266 - .../engine/classes/AvatarCreationService.yaml | 993 - .../engine/classes/AvatarEditorService.yaml | 1630 - .../reference/engine/classes/Backpack.yaml | 53 - .../engine/classes/BackpackItem.yaml | 75 - .../engine/classes/BadgeService.yaml | 375 - .../engine/classes/BallSocketConstraint.yaml | 232 - .../engine/classes/BanHistoryPages.yaml | 68 - .../classes/BaseCoreGuiConfiguration.yaml | 40 - .../reference/engine/classes/BasePart.yaml | 3136 - .../engine/classes/BasePlayerGui.yaml | 73 - .../engine/classes/BaseRemoteEvent.yaml | 22 - .../reference/engine/classes/BaseScript.yaml | 161 - .../reference/engine/classes/BaseWrap.yaml | 206 - .../en-us/reference/engine/classes/Beam.yaml | 646 - .../reference/engine/classes/BevelMesh.yaml | 33 - .../engine/classes/BillboardGui.yaml | 571 - .../engine/classes/BinaryStringValue.yaml | 49 - .../engine/classes/BindableEvent.yaml | 106 - .../engine/classes/BindableFunction.yaml | 127 - .../reference/engine/classes/BlockMesh.yaml | 44 - .../reference/engine/classes/BloomEffect.yaml | 97 - .../reference/engine/classes/BlurEffect.yaml | 53 - .../engine/classes/BodyAngularVelocity.yaml | 150 - .../reference/engine/classes/BodyColors.yaml | 283 - .../reference/engine/classes/BodyForce.yaml | 77 - .../reference/engine/classes/BodyGyro.yaml | 179 - .../reference/engine/classes/BodyMover.yaml | 47 - .../engine/classes/BodyPartDescription.yaml | 163 - .../engine/classes/BodyPosition.yaml | 230 - .../reference/engine/classes/BodyThrust.yaml | 119 - .../engine/classes/BodyVelocity.yaml | 185 - .../en-us/reference/engine/classes/Bone.yaml | 150 - .../reference/engine/classes/BoolValue.yaml | 83 - .../engine/classes/BoxHandleAdornment.yaml | 62 - .../engine/classes/BrickColorValue.yaml | 84 - .../engine/classes/BrowserService.yaml | 22 - .../classes/BubbleChatConfiguration.yaml | 345 - .../classes/BubbleChatMessageProperties.yaml | 131 - .../engine/classes/BuoyancySensor.yaml | 68 - .../reference/engine/classes/CFrameValue.yaml | 87 - .../classes/CacheableContentProvider.yaml | 32 - .../reference/engine/classes/Camera.yaml | 1490 - .../reference/engine/classes/CanvasGroup.yaml | 74 - .../reference/engine/classes/Capture.yaml | 139 - .../engine/classes/CaptureService.yaml | 486 - .../engine/classes/CapturesPages.yaml | 27 - .../classes/CapturesViewConfiguration.yaml | 37 - .../engine/classes/CatalogPages.yaml | 21 - .../engine/classes/ChangeHistoryService.yaml | 358 - .../classes/ChannelTabsConfiguration.yaml | 274 - .../engine/classes/CharacterAppearance.yaml | 29 - .../engine/classes/CharacterMesh.yaml | 153 - .../en-us/reference/engine/classes/Chat.yaml | 479 - .../classes/ChatInputBarConfiguration.yaml | 373 - .../classes/ChatWindowConfiguration.yaml | 362 - .../classes/ChatWindowMessageProperties.yaml | 161 - .../engine/classes/ChorusSoundEffect.yaml | 91 - .../engine/classes/ClickDetector.yaml | 272 - .../engine/classes/ClientReplicator.yaml | 23 - .../engine/classes/ClimbController.yaml | 111 - .../reference/engine/classes/Clothing.yaml | 55 - .../reference/engine/classes/Clouds.yaml | 118 - .../engine/classes/ClusterPacketCache.yaml | 25 - .../engine/classes/CollectionService.yaml | 436 - .../reference/engine/classes/Color3Value.yaml | 86 - .../engine/classes/ColorCorrectionEffect.yaml | 123 - .../engine/classes/ColorGradingEffect.yaml | 52 - .../engine/classes/CommerceService.yaml | 183 - .../engine/classes/CompositeValueCurve.yaml | 122 - .../engine/classes/CompressorSoundEffect.yaml | 187 - .../engine/classes/ConeHandleAdornment.yaml | 100 - .../engine/classes/ConfigService.yaml | 139 - .../engine/classes/ConfigSnapshot.yaml | 152 - .../engine/classes/Configuration.yaml | 66 - .../classes/ConfigureServerService.yaml | 21 - .../reference/engine/classes/Constraint.yaml | 203 - .../engine/classes/ContentProvider.yaml | 392 - .../engine/classes/ContextActionService.yaml | 859 - .../reference/engine/classes/Controller.yaml | 152 - .../engine/classes/ControllerBase.yaml | 78 - .../engine/classes/ControllerManager.yaml | 231 - .../engine/classes/ControllerPartSensor.yaml | 136 - .../engine/classes/ControllerSensor.yaml | 21 - .../engine/classes/ControllerService.yaml | 24 - .../engine/classes/CookiesService.yaml | 27 - .../reference/engine/classes/CoreGui.yaml | 76 - .../engine/classes/CoreGuiConfiguration.yaml | 70 - .../CoreScriptDebuggingManagerHelper.yaml | 21 - .../engine/classes/CornerWedgePart.yaml | 20 - .../engine/classes/CreatorStoreService.yaml | 21 - .../engine/classes/CurveAnimation.yaml | 71 - .../reference/engine/classes/CustomEvent.yaml | 101 - .../engine/classes/CustomEventReceiver.yaml | 121 - .../reference/engine/classes/CustomLog.yaml | 80 - .../classes/CylinderHandleAdornment.yaml | 131 - .../engine/classes/CylinderMesh.yaml | 64 - .../engine/classes/CylindricalConstraint.yaml | 473 - .../reference/engine/classes/DataModel.yaml | 1039 - .../engine/classes/DataModelMesh.yaml | 172 - .../engine/classes/DataModelSession.yaml | 20 - .../reference/engine/classes/DataStore.yaml | 241 - .../engine/classes/DataStoreGetOptions.yaml | 37 - .../classes/DataStoreIncrementOptions.yaml | 72 - .../engine/classes/DataStoreInfo.yaml | 98 - .../engine/classes/DataStoreKey.yaml | 58 - .../engine/classes/DataStoreKeyInfo.yaml | 137 - .../engine/classes/DataStoreKeyPages.yaml | 50 - .../engine/classes/DataStoreListingPages.yaml | 50 - .../classes/DataStoreObjectVersionInfo.yaml | 97 - .../engine/classes/DataStoreOptions.yaml | 66 - .../engine/classes/DataStorePages.yaml | 29 - .../engine/classes/DataStoreService.yaml | 222 - .../engine/classes/DataStoreSetOptions.yaml | 70 - .../engine/classes/DataStoreVersionPages.yaml | 32 - .../reference/engine/classes/Debris.yaml | 166 - .../engine/classes/DebugSettings.yaml | 186 - .../en-us/reference/engine/classes/Decal.yaml | 463 - .../engine/classes/DepthOfFieldEffect.yaml | 127 - .../reference/engine/classes/Dialog.yaml | 307 - .../engine/classes/DialogChoice.yaml | 104 - .../engine/classes/DistortionSoundEffect.yaml | 46 - .../engine/classes/DockWidgetPluginGui.yaml | 49 - .../classes/DoubleConstrainedValue.yaml | 157 - .../engine/classes/DraftsService.yaml | 22 - .../engine/classes/DragDetector.yaml | 1024 - .../reference/engine/classes/Dragger.yaml | 115 - .../engine/classes/DraggerService.yaml | 311 - .../engine/classes/DynamicRotate.yaml | 43 - .../engine/classes/EchoSoundEffect.yaml | 128 - .../engine/classes/EditableImage.yaml | 485 - .../engine/classes/EditableMesh.yaml | 2364 - .../reference/engine/classes/EmotesPages.yaml | 21 - .../engine/classes/EncodingService.yaml | 252 - .../engine/classes/EqualizerSoundEffect.yaml | 90 - .../engine/classes/EulerRotationCurve.yaml | 151 - .../classes/ExperienceInviteOptions.yaml | 114 - .../ExperienceNotificationService.yaml | 127 - .../reference/engine/classes/Explosion.yaml | 362 - .../engine/classes/FaceControls.yaml | 1119 - .../engine/classes/FaceInstance.yaml | 45 - .../reference/engine/classes/Feature.yaml | 108 - .../classes/FeatureRestrictionManager.yaml | 21 - .../en-us/reference/engine/classes/File.yaml | 95 - .../reference/engine/classes/FileMesh.yaml | 107 - .../en-us/reference/engine/classes/Fire.yaml | 258 - .../en-us/reference/engine/classes/Flag.yaml | 62 - .../reference/engine/classes/FlagStand.yaml | 75 - .../engine/classes/FlagStandService.yaml | 32 - .../engine/classes/FlangeSoundEffect.yaml | 88 - .../reference/engine/classes/FloatCurve.yaml | 214 - .../reference/engine/classes/FloorWire.yaml | 208 - .../engine/classes/FluidForceSensor.yaml | 131 - .../reference/engine/classes/Folder.yaml | 33 - .../reference/engine/classes/ForceField.yaml | 78 - .../engine/classes/FormFactorPart.yaml | 72 - .../en-us/reference/engine/classes/Frame.yaml | 57 - .../reference/engine/classes/FriendPages.yaml | 52 - .../engine/classes/FriendService.yaml | 26 - .../engine/classes/FunctionalTest.yaml | 142 - .../engine/classes/GamePassService.yaml | 104 - .../engine/classes/GameSettings.yaml | 42 - .../engine/classes/GamepadService.yaml | 150 - .../engine/classes/GenerationService.yaml | 193 - .../classes/GenericChallengeService.yaml | 21 - .../engine/classes/GenericSettings.yaml | 24 - .../reference/engine/classes/Geometry.yaml | 24 - .../engine/classes/GeometryService.yaml | 647 - .../engine/classes/GetTextBoundsParams.yaml | 124 - .../engine/classes/GlobalDataStore.yaml | 403 - .../engine/classes/GlobalSettings.yaml | 72 - .../en-us/reference/engine/classes/Glue.yaml | 103 - .../engine/classes/GroundController.yaml | 253 - .../engine/classes/GroupService.yaml | 353 - .../reference/engine/classes/GuiBase.yaml | 27 - .../reference/engine/classes/GuiBase2d.yaml | 356 - .../reference/engine/classes/GuiBase3d.yaml | 112 - .../reference/engine/classes/GuiButton.yaml | 372 - .../reference/engine/classes/GuiLabel.yaml | 28 - .../reference/engine/classes/GuiMain.yaml | 24 - .../reference/engine/classes/GuiObject.yaml | 1802 - .../reference/engine/classes/GuiService.yaml | 887 - .../engine/classes/GuidRegistryService.yaml | 23 - .../classes/HSRDataContentProvider.yaml | 22 - .../engine/classes/HandleAdornment.yaml | 227 - .../reference/engine/classes/Handles.yaml | 167 - .../reference/engine/classes/HandlesBase.yaml | 26 - .../engine/classes/HapticEffect.yaml | 307 - .../engine/classes/HapticService.yaml | 154 - .../en-us/reference/engine/classes/Hat.yaml | 23 - .../engine/classes/HeapProfilerService.yaml | 82 - .../classes/HeightmapImporterService.yaml | 21 - .../classes/HiddenSurfaceRemovalAsset.yaml | 19 - .../reference/engine/classes/Highlight.yaml | 339 - .../engine/classes/HingeConstraint.yaml | 428 - .../en-us/reference/engine/classes/Hint.yaml | 36 - .../en-us/reference/engine/classes/Hole.yaml | 23 - .../reference/engine/classes/Hopper.yaml | 27 - .../reference/engine/classes/HopperBin.yaml | 94 - .../engine/classes/HttpRbxApiService.yaml | 54 - .../reference/engine/classes/HttpService.yaml | 637 - .../reference/engine/classes/Humanoid.yaml | 3121 - .../engine/classes/HumanoidController.yaml | 29 - .../engine/classes/HumanoidDescription.yaml | 2033 - .../classes/HumanoidRigDescription.yaml | 1967 - .../reference/engine/classes/IKControl.yaml | 486 - .../engine/classes/ILegacyStudioBridge.yaml | 21 - .../reference/engine/classes/ImageButton.yaml | 427 - .../engine/classes/ImageHandleAdornment.yaml | 64 - .../reference/engine/classes/ImageLabel.yaml | 351 - .../classes/IncrementalPatchBuilder.yaml | 118 - .../reference/engine/classes/InputAction.yaml | 298 - .../engine/classes/InputBinding.yaml | 517 - .../engine/classes/InputContext.yaml | 96 - .../reference/engine/classes/InputObject.yaml | 212 - .../engine/classes/InsertService.yaml | 653 - .../reference/engine/classes/Instance.yaml | 2460 - .../engine/classes/InstanceAdornment.yaml | 44 - .../classes/InstanceFileSyncService.yaml | 114 - .../engine/classes/IntConstrainedValue.yaml | 153 - .../reference/engine/classes/IntValue.yaml | 97 - .../engine/classes/IntersectOperation.yaml | 26 - .../engine/classes/InventoryPages.yaml | 24 - .../engine/classes/JointInstance.yaml | 212 - .../engine/classes/JointsService.yaml | 133 - .../engine/classes/KeyboardService.yaml | 21 - .../reference/engine/classes/Keyframe.yaml | 289 - .../engine/classes/KeyframeMarker.yaml | 88 - .../engine/classes/KeyframeSequence.yaml | 152 - .../classes/KeyframeSequenceProvider.yaml | 249 - .../engine/classes/LayerCollector.yaml | 134 - .../en-us/reference/engine/classes/Light.yaml | 101 - .../reference/engine/classes/Lighting.yaml | 847 - .../reference/engine/classes/LineForce.yaml | 164 - .../engine/classes/LineHandleAdornment.yaml | 67 - .../engine/classes/LinearVelocity.yaml | 407 - .../reference/engine/classes/LocalScript.yaml | 31 - .../engine/classes/LocalizationService.yaml | 1110 - .../engine/classes/LocalizationTable.yaml | 658 - .../reference/engine/classes/LogService.yaml | 96 - .../engine/classes/LoginService.yaml | 24 - .../reference/engine/classes/LuaSettings.yaml | 25 - .../engine/classes/LuaSourceContainer.yaml | 27 - .../engine/classes/LuaWebService.yaml | 29 - .../reference/engine/classes/MLService.yaml | 40 - .../reference/engine/classes/MLSession.yaml | 39 - .../engine/classes/MakeupDescription.yaml | 102 - .../reference/engine/classes/ManualGlue.yaml | 24 - .../classes/ManualSurfaceJointInstance.yaml | 28 - .../reference/engine/classes/ManualWeld.yaml | 44 - .../reference/engine/classes/MarkerCurve.yaml | 144 - .../engine/classes/MarketplaceService.yaml | 1772 - .../engine/classes/MatchmakingService.yaml | 105 - .../engine/classes/MaterialService.yaml | 995 - .../engine/classes/MaterialVariant.yaml | 478 - .../engine/classes/MemStorageConnection.yaml | 34 - .../engine/classes/MemStorageService.yaml | 22 - .../engine/classes/MemoryStoreHashMap.yaml | 189 - .../classes/MemoryStoreHashMapPages.yaml | 28 - .../engine/classes/MemoryStoreQueue.yaml | 168 - .../engine/classes/MemoryStoreService.yaml | 108 - .../engine/classes/MemoryStoreSortedMap.yaml | 240 - .../engine/classes/MeshContentProvider.yaml | 26 - .../reference/engine/classes/MeshPart.yaml | 374 - .../reference/engine/classes/Message.yaml | 55 - .../engine/classes/MessagingService.yaml | 205 - .../engine/classes/MicroProfilerService.yaml | 38 - .../en-us/reference/engine/classes/Model.yaml | 857 - .../engine/classes/ModerationService.yaml | 97 - .../engine/classes/ModuleScript.yaml | 110 - .../en-us/reference/engine/classes/Motor.yaml | 103 - .../reference/engine/classes/Motor6D.yaml | 106 - .../engine/classes/MotorFeature.yaml | 24 - .../en-us/reference/engine/classes/Mouse.yaml | 1093 - .../engine/classes/MouseService.yaml | 22 - .../MultipleDocumentInterfaceInstance.yaml | 21 - .../engine/classes/NegateOperation.yaml | 32 - .../engine/classes/NetworkClient.yaml | 69 - .../engine/classes/NetworkMarker.yaml | 36 - .../reference/engine/classes/NetworkPeer.yaml | 46 - .../engine/classes/NetworkReplicator.yaml | 44 - .../engine/classes/NetworkServer.yaml | 47 - .../engine/classes/NetworkSettings.yaml | 302 - .../engine/classes/NoCollisionConstraint.yaml | 117 - .../engine/classes/NotificationService.yaml | 93 - .../reference/engine/classes/NumberPose.yaml | 67 - .../reference/engine/classes/NumberValue.yaml | 90 - .../reference/engine/classes/Object.yaml | 293 - .../reference/engine/classes/ObjectValue.yaml | 97 - .../engine/classes/OpenCloudApiV1.yaml | 67 - .../engine/classes/OpenCloudService.yaml | 71 - .../engine/classes/OrderedDataStore.yaml | 90 - .../reference/engine/classes/OutfitPages.yaml | 26 - .../reference/engine/classes/PVAdornment.yaml | 47 - .../reference/engine/classes/PVInstance.yaml | 131 - .../reference/engine/classes/PackageLink.yaml | 217 - .../engine/classes/PackageService.yaml | 22 - .../en-us/reference/engine/classes/Pages.yaml | 93 - .../en-us/reference/engine/classes/Pants.yaml | 72 - .../en-us/reference/engine/classes/Part.yaml | 69 - .../engine/classes/PartAdornment.yaml | 46 - .../engine/classes/PartOperation.yaml | 207 - .../engine/classes/PartOperationAsset.yaml | 23 - .../engine/classes/ParticleEmitter.yaml | 1097 - .../engine/classes/PatchBundlerFileWatch.yaml | 22 - .../engine/classes/PatchMapping.yaml | 69 - .../en-us/reference/engine/classes/Path.yaml | 218 - .../reference/engine/classes/Path2D.yaml | 478 - .../engine/classes/PathfindingLink.yaml | 103 - .../engine/classes/PathfindingModifier.yaml | 85 - .../engine/classes/PathfindingService.yaml | 267 - .../engine/classes/PermissionsService.yaml | 21 - .../engine/classes/PhysicsService.yaml | 513 - .../engine/classes/PhysicsSettings.yaml | 1081 - .../engine/classes/PitchShiftSoundEffect.yaml | 44 - .../engine/classes/PlacesService.yaml | 22 - .../en-us/reference/engine/classes/Plane.yaml | 28 - .../engine/classes/PlaneConstraint.yaml | 27 - .../reference/engine/classes/Platform.yaml | 39 - .../reference/engine/classes/Player.yaml | 2823 - .../reference/engine/classes/PlayerGui.yaml | 178 - .../classes/PlayerListConfiguration.yaml | 37 - .../reference/engine/classes/PlayerMouse.yaml | 37 - .../engine/classes/PlayerScripts.yaml | 197 - .../engine/classes/PlayerViewService.yaml | 59 - .../reference/engine/classes/Players.yaml | 1594 - .../reference/engine/classes/Plugin.yaml | 1014 - .../engine/classes/PluginAction.yaml | 125 - .../engine/classes/PluginCapabilities.yaml | 35 - .../engine/classes/PluginDebugService.yaml | 22 - .../engine/classes/PluginDragEvent.yaml | 93 - .../reference/engine/classes/PluginGui.yaml | 307 - .../engine/classes/PluginGuiService.yaml | 28 - .../classes/PluginManagementService.yaml | 22 - .../engine/classes/PluginManager.yaml | 85 - .../classes/PluginManagerInterface.yaml | 72 - .../reference/engine/classes/PluginMenu.yaml | 194 - .../reference/engine/classes/PluginMouse.yaml | 52 - .../engine/classes/PluginToolbar.yaml | 64 - .../engine/classes/PluginToolbarButton.yaml | 171 - .../reference/engine/classes/PointLight.yaml | 59 - .../engine/classes/PointsService.yaml | 206 - .../engine/classes/PolicyService.yaml | 199 - .../en-us/reference/engine/classes/Pose.yaml | 182 - .../reference/engine/classes/PoseBase.yaml | 81 - .../reference/engine/classes/PostEffect.yaml | 61 - .../engine/classes/PrismaticConstraint.yaml | 38 - .../ProcessInstancePhysicsService.yaml | 21 - .../engine/classes/ProximityPrompt.yaml | 613 - .../classes/ProximityPromptService.yaml | 276 - .../engine/classes/PublishService.yaml | 22 - .../classes/PyramidHandleAdornment.yaml | 103 - .../engine/classes/QWidgetPluginGui.yaml | 21 - .../reference/engine/classes/RayValue.yaml | 100 - .../engine/classes/RecommendationPages.yaml | 27 - .../engine/classes/RecommendationService.yaml | 450 - .../engine/classes/ReflectionMetadata.yaml | 23 - .../classes/ReflectionMetadataCallbacks.yaml | 29 - .../classes/ReflectionMetadataClass.yaml | 99 - .../classes/ReflectionMetadataClasses.yaml | 21 - .../classes/ReflectionMetadataEnum.yaml | 25 - .../classes/ReflectionMetadataEnumItem.yaml | 25 - .../classes/ReflectionMetadataEnums.yaml | 24 - .../classes/ReflectionMetadataEvents.yaml | 29 - .../classes/ReflectionMetadataFunctions.yaml | 29 - .../classes/ReflectionMetadataItem.yaml | 344 - .../classes/ReflectionMetadataMember.yaml | 22 - .../classes/ReflectionMetadataProperties.yaml | 29 - .../ReflectionMetadataYieldFunctions.yaml | 29 - .../engine/classes/ReflectionService.yaml | 419 - .../engine/classes/RemoteCommandService.yaml | 81 - .../engine/classes/RemoteDebuggerServer.yaml | 22 - .../reference/engine/classes/RemoteEvent.yaml | 209 - .../engine/classes/RemoteFunction.yaml | 233 - .../engine/classes/RenderSettings.yaml | 333 - .../engine/classes/RenderingTest.yaml | 280 - .../engine/classes/ReplicatedFirst.yaml | 65 - .../engine/classes/ReplicatedStorage.yaml | 52 - .../engine/classes/ReverbSoundEffect.yaml | 127 - .../engine/classes/RigidConstraint.yaml | 46 - .../engine/classes/RocketPropulsion.yaml | 359 - .../engine/classes/RodConstraint.yaml | 168 - .../engine/classes/RopeConstraint.yaml | 229 - .../reference/engine/classes/Rotate.yaml | 27 - .../reference/engine/classes/RotateP.yaml | 41 - .../reference/engine/classes/RotateV.yaml | 39 - .../engine/classes/RotationCurve.yaml | 216 - .../reference/engine/classes/RunService.yaml | 842 - .../classes/RunningAverageItemDouble.yaml | 23 - .../engine/classes/RunningAverageItemInt.yaml | 23 - .../RunningAverageTimeIntervalItem.yaml | 23 - .../reference/engine/classes/ScreenGui.yaml | 216 - .../engine/classes/ScreenshotCapture.yaml | 23 - .../engine/classes/ScreenshotHud.yaml | 231 - .../reference/engine/classes/Script.yaml | 70 - .../engine/classes/ScriptBuilder.yaml | 22 - .../engine/classes/ScriptContext.yaml | 67 - .../engine/classes/ScriptDocument.yaml | 511 - .../engine/classes/ScriptEditorService.yaml | 495 - .../engine/classes/ScriptProfilerService.yaml | 154 - .../engine/classes/ScriptService.yaml | 25 - .../engine/classes/ScrollingFrame.yaml | 519 - .../en-us/reference/engine/classes/Seat.yaml | 131 - .../reference/engine/classes/Selection.yaml | 186 - .../engine/classes/SelectionBox.yaml | 129 - .../classes/SelectionHighlightManager.yaml | 21 - .../engine/classes/SelectionLasso.yaml | 46 - .../engine/classes/SelectionPartLasso.yaml | 49 - .../engine/classes/SelectionPointLasso.yaml | 46 - .../engine/classes/SelectionSphere.yaml | 108 - .../engine/classes/SelfViewConfiguration.yaml | 37 - .../reference/engine/classes/SensorBase.yaml | 79 - .../engine/classes/SerializationService.yaml | 96 - .../engine/classes/ServerReplicator.yaml | 23 - .../engine/classes/ServerScriptService.yaml | 67 - .../engine/classes/ServerStorage.yaml | 47 - .../engine/classes/ServiceProvider.yaml | 169 - .../classes/ServiceVisibilityService.yaml | 53 - .../engine/classes/SessionCheckService.yaml | 21 - .../engine/classes/SharedTableRegistry.yaml | 94 - .../en-us/reference/engine/classes/Shirt.yaml | 71 - .../engine/classes/ShirtGraphic.yaml | 99 - .../engine/classes/SkateboardController.yaml | 88 - .../engine/classes/SkateboardPlatform.yaml | 301 - .../en-us/reference/engine/classes/Skin.yaml | 52 - .../en-us/reference/engine/classes/Sky.yaml | 452 - .../engine/classes/SlidingBallConstraint.yaml | 430 - .../engine/classes/SlimContentProvider.yaml | 21 - .../en-us/reference/engine/classes/Smoke.yaml | 231 - .../classes/SmoothVoxelsUpgraderService.yaml | 22 - .../en-us/reference/engine/classes/Snap.yaml | 45 - .../engine/classes/SocialService.yaml | 761 - .../classes/SolidModelContentProvider.yaml | 24 - .../en-us/reference/engine/classes/Sound.yaml | 1061 - .../reference/engine/classes/SoundEffect.yaml | 80 - .../reference/engine/classes/SoundGroup.yaml | 63 - .../engine/classes/SoundService.yaml | 479 - .../reference/engine/classes/Sparkles.yaml | 180 - .../engine/classes/SpawnLocation.yaml | 235 - .../engine/classes/SpawnerService.yaml | 27 - .../reference/engine/classes/SpecialMesh.yaml | 110 - .../engine/classes/SphereHandleAdornment.yaml | 62 - .../reference/engine/classes/SpotLight.yaml | 100 - .../engine/classes/SpringConstraint.yaml | 296 - .../classes/StandalonePluginScripts.yaml | 29 - .../engine/classes/StandardPages.yaml | 24 - .../classes/StarterCharacterScripts.yaml | 29 - .../reference/engine/classes/StarterGear.yaml | 79 - .../reference/engine/classes/StarterGui.yaml | 914 - .../reference/engine/classes/StarterPack.yaml | 51 - .../engine/classes/StarterPlayer.yaml | 771 - .../engine/classes/StarterPlayerScripts.yaml | 38 - .../engine/classes/StartupMessageService.yaml | 22 - .../en-us/reference/engine/classes/Stats.yaml | 733 - .../reference/engine/classes/StatsItem.yaml | 78 - .../reference/engine/classes/Status.yaml | 31 - .../engine/classes/StopWatchReporter.yaml | 22 - .../reference/engine/classes/StringValue.yaml | 88 - .../reference/engine/classes/Studio.yaml | 3159 - .../engine/classes/StudioService.yaml | 471 - .../engine/classes/StudioTestService.yaml | 171 - .../reference/engine/classes/StudioTheme.yaml | 57 - .../reference/engine/classes/StyleBase.yaml | 128 - .../reference/engine/classes/StyleDerive.yaml | 75 - .../reference/engine/classes/StyleLink.yaml | 49 - .../reference/engine/classes/StyleRule.yaml | 420 - .../reference/engine/classes/StyleSheet.yaml | 119 - .../engine/classes/SunRaysEffect.yaml | 73 - .../engine/classes/SurfaceAppearance.yaml | 405 - .../reference/engine/classes/SurfaceGui.yaml | 319 - .../engine/classes/SurfaceGuiBase.yaml | 93 - .../engine/classes/SurfaceLight.yaml | 95 - .../engine/classes/SurfaceSelection.yaml | 49 - .../engine/classes/SwimController.yaml | 122 - .../engine/classes/SyncScriptBuilder.yaml | 103 - .../engine/classes/TaskScheduler.yaml | 104 - .../en-us/reference/engine/classes/Team.yaml | 287 - .../engine/classes/TeamCreateData.yaml | 21 - .../engine/classes/TeamCreateService.yaml | 22 - .../en-us/reference/engine/classes/Teams.yaml | 110 - .../engine/classes/TeleportAsyncResult.yaml | 83 - .../engine/classes/TeleportOptions.yaml | 199 - .../engine/classes/TeleportService.yaml | 1124 - .../reference/engine/classes/Terrain.yaml | 1313 - .../engine/classes/TerrainDetail.yaml | 433 - .../classes/TerrainIterateOperation.yaml | 51 - .../classes/TerrainModifyOperation.yaml | 51 - .../engine/classes/TerrainReadOperation.yaml | 34 - .../engine/classes/TerrainRegion.yaml | 92 - .../engine/classes/TerrainWriteOperation.yaml | 52 - .../reference/engine/classes/TestService.yaml | 846 - .../reference/engine/classes/TextBox.yaml | 1102 - .../engine/classes/TextBoxService.yaml | 21 - .../reference/engine/classes/TextButton.yaml | 727 - .../reference/engine/classes/TextChannel.yaml | 331 - .../engine/classes/TextChatCommand.yaml | 154 - .../classes/TextChatConfigurations.yaml | 29 - .../engine/classes/TextChatMessage.yaml | 418 - .../classes/TextChatMessageProperties.yaml | 99 - .../engine/classes/TextChatService.yaml | 695 - .../engine/classes/TextFilterResult.yaml | 120 - .../classes/TextFilterTranslatedResult.yaml | 91 - .../engine/classes/TextGenerator.yaml | 230 - .../reference/engine/classes/TextLabel.yaml | 735 - .../reference/engine/classes/TextService.yaml | 278 - .../reference/engine/classes/TextSource.yaml | 83 - .../reference/engine/classes/Texture.yaml | 157 - .../engine/classes/TimerService.yaml | 25 - .../en-us/reference/engine/classes/Tool.yaml | 478 - .../reference/engine/classes/Torque.yaml | 88 - .../classes/TorsionSpringConstraint.yaml | 276 - .../classes/TotalCountTimeIntervalItem.yaml | 23 - .../engine/classes/TouchInputService.yaml | 23 - .../engine/classes/TouchTransmitter.yaml | 39 - .../en-us/reference/engine/classes/Trail.yaml | 536 - .../reference/engine/classes/Translator.yaml | 255 - .../engine/classes/TremoloSoundEffect.yaml | 89 - .../engine/classes/TriangleMeshPart.yaml | 95 - .../reference/engine/classes/TrussPart.yaml | 62 - .../en-us/reference/engine/classes/Tween.yaml | 82 - .../reference/engine/classes/TweenBase.yaml | 158 - .../engine/classes/TweenService.yaml | 193 - .../engine/classes/UGCValidationService.yaml | 22 - .../classes/UIAspectRatioConstraint.yaml | 106 - .../reference/engine/classes/UIBase.yaml | 23 - .../reference/engine/classes/UIComponent.yaml | 32 - .../engine/classes/UIConstraint.yaml | 25 - .../reference/engine/classes/UICorner.yaml | 72 - .../engine/classes/UIDragDetector.yaml | 819 - .../reference/engine/classes/UIFlexItem.yaml | 152 - .../reference/engine/classes/UIGradient.yaml | 193 - .../engine/classes/UIGridLayout.yaml | 198 - .../engine/classes/UIGridStyleLayout.yaml | 218 - .../reference/engine/classes/UILayout.yaml | 23 - .../engine/classes/UIListLayout.yaml | 330 - .../reference/engine/classes/UIPadding.yaml | 99 - .../engine/classes/UIPageLayout.yaml | 360 - .../reference/engine/classes/UIScale.yaml | 48 - .../engine/classes/UISizeConstraint.yaml | 76 - .../reference/engine/classes/UIStroke.yaml | 336 - .../engine/classes/UITableLayout.yaml | 151 - .../engine/classes/UITextSizeConstraint.yaml | 91 - .../engine/classes/UnionOperation.yaml | 27 - .../engine/classes/UniqueIdLookupService.yaml | 39 - .../engine/classes/UniversalConstraint.yaml | 130 - .../engine/classes/UnreliableRemoteEvent.yaml | 239 - .../engine/classes/UserGameSettings.yaml | 862 - .../engine/classes/UserInputService.yaml | 2463 - .../reference/engine/classes/UserService.yaml | 115 - .../engine/classes/UserSettings.yaml | 78 - .../reference/engine/classes/VRService.yaml | 558 - .../engine/classes/VRStatusService.yaml | 21 - .../reference/engine/classes/ValueBase.yaml | 35 - .../reference/engine/classes/ValueCurve.yaml | 295 - .../engine/classes/Vector3Curve.yaml | 109 - .../engine/classes/Vector3Value.yaml | 88 - .../reference/engine/classes/VectorForce.yaml | 122 - .../engine/classes/VehicleController.yaml | 21 - .../reference/engine/classes/VehicleSeat.yaml | 308 - .../engine/classes/VelocityMotor.yaml | 106 - .../engine/classes/VideoCapture.yaml | 61 - .../engine/classes/VideoCaptureService.yaml | 21 - .../engine/classes/VideoDisplay.yaml | 275 - .../reference/engine/classes/VideoFrame.yaml | 375 - .../reference/engine/classes/VideoPlayer.yaml | 490 - .../engine/classes/VideoSampler.yaml | 105 - .../engine/classes/VideoService.yaml | 57 - .../engine/classes/ViewportFrame.yaml | 190 - .../engine/classes/VirtualInputManager.yaml | 23 - .../reference/engine/classes/VirtualUser.yaml | 27 - .../classes/VisibilityCheckDispatcher.yaml | 21 - .../en-us/reference/engine/classes/Visit.yaml | 26 - .../engine/classes/VisualizationMode.yaml | 67 - .../classes/VisualizationModeCategory.yaml | 51 - .../classes/VisualizationModeService.yaml | 21 - .../engine/classes/VoiceChatService.yaml | 235 - .../engine/classes/WebStreamClient.yaml | 159 - .../reference/engine/classes/WedgePart.yaml | 27 - .../en-us/reference/engine/classes/Weld.yaml | 48 - .../engine/classes/WeldConstraint.yaml | 207 - .../en-us/reference/engine/classes/Wire.yaml | 171 - .../classes/WireframeHandleAdornment.yaml | 243 - .../reference/engine/classes/Workspace.yaml | 1577 - .../engine/classes/WorkspaceAnnotation.yaml | 19 - .../reference/engine/classes/WorldModel.yaml | 30 - .../reference/engine/classes/WorldRoot.yaml | 1068 - .../engine/classes/WrapDeformer.yaml | 108 - .../reference/engine/classes/WrapLayer.yaml | 313 - .../reference/engine/classes/WrapTarget.yaml | 101 - .../engine/classes/WrapTextureTransfer.yaml | 127 - .../en-us/reference/engine/datatypes.md | 4 - .../reference/engine/datatypes/Axes.yaml | 126 - .../engine/datatypes/BrickColor.yaml | 1698 - .../reference/engine/datatypes/CFrame.yaml | 1119 - .../engine/datatypes/CatalogSearchParams.yaml | 197 - .../reference/engine/datatypes/Color3.yaml | 276 - .../engine/datatypes/ColorSequence.yaml | 162 - .../datatypes/ColorSequenceKeypoint.yaml | 54 - .../reference/engine/datatypes/Content.yaml | 139 - .../reference/engine/datatypes/DateTime.yaml | 709 - .../datatypes/DockWidgetPluginGuiInfo.yaml | 139 - .../reference/engine/datatypes/Enum.yaml | 59 - .../reference/engine/datatypes/EnumItem.yaml | 50 - .../reference/engine/datatypes/Enums.yaml | 35 - .../reference/engine/datatypes/Faces.yaml | 107 - .../engine/datatypes/FloatCurveKey.yaml | 110 - .../reference/engine/datatypes/Font.yaml | 482 - .../reference/engine/datatypes/Instance.yaml | 81 - .../engine/datatypes/NumberRange.yaml | 77 - .../engine/datatypes/NumberSequence.yaml | 156 - .../datatypes/NumberSequenceKeypoint.yaml | 89 - .../engine/datatypes/OverlapParams.yaml | 149 - .../engine/datatypes/Path2DControlPoint.yaml | 95 - .../engine/datatypes/PathWaypoint.yaml | 126 - .../engine/datatypes/PhysicalProperties.yaml | 241 - .../engine/datatypes/RBXScriptConnection.yaml | 57 - .../engine/datatypes/RBXScriptSignal.yaml | 103 - .../reference/engine/datatypes/Random.yaml | 143 - .../en-us/reference/engine/datatypes/Ray.yaml | 108 - .../engine/datatypes/RaycastParams.yaml | 143 - .../engine/datatypes/RaycastResult.yaml | 77 - .../reference/engine/datatypes/Rect.yaml | 120 - .../reference/engine/datatypes/Region3.yaml | 94 - .../engine/datatypes/Region3int16.yaml | 97 - .../engine/datatypes/RotationCurveKey.yaml | 112 - .../reference/engine/datatypes/Secret.yaml | 84 - .../datatypes/SecurityCapabilities.yaml | 147 - .../engine/datatypes/SharedTable.yaml | 379 - .../reference/engine/datatypes/TweenInfo.yaml | 116 - .../reference/engine/datatypes/UDim.yaml | 84 - .../reference/engine/datatypes/UDim2.yaml | 220 - .../engine/datatypes/ValueCurveKey.yaml | 110 - .../reference/engine/datatypes/Vector2.yaml | 540 - .../engine/datatypes/Vector2int16.yaml | 239 - .../reference/engine/datatypes/Vector3.yaml | 621 - .../engine/datatypes/Vector3int16.yaml | 256 - .../roblox/en-us/reference/engine/enums.md | 4 - .../engine/enums/AccessModifierType.yaml | 22 - .../reference/engine/enums/AccessoryType.yaml | 140 - .../engine/enums/ActionOnAutoResumeSync.yaml | 27 - .../engine/enums/ActionOnStopSync.yaml | 27 - .../reference/engine/enums/ActionType.yaml | 37 - .../engine/enums/ActuatorRelativeTo.yaml | 32 - .../reference/engine/enums/ActuatorType.yaml | 34 - .../engine/enums/AdAvailabilityResult.yaml | 58 - .../reference/engine/enums/AdEventType.yaml | 57 - .../reference/engine/enums/AdFormat.yaml | 18 - .../en-us/reference/engine/enums/AdShape.yaml | 22 - .../engine/enums/AdTeleportMethod.yaml | 32 - .../reference/engine/enums/AdUIEventType.yaml | 57 - .../reference/engine/enums/AdUIType.yaml | 27 - .../reference/engine/enums/AdUnitStatus.yaml | 30 - .../engine/enums/AdornCullingMode.yaml | 26 - .../reference/engine/enums/AdornShading.yaml | 37 - .../reference/engine/enums/AlignType.yaml | 63 - .../reference/engine/enums/AlphaMode.yaml | 47 - .../enums/AnalyticsCustomFieldKeys.yaml | 39 - .../engine/enums/AnalyticsEconomyAction.yaml | 34 - .../enums/AnalyticsEconomyFlowType.yaml | 24 - .../AnalyticsEconomyTransactionType.yaml | 54 - .../engine/enums/AnalyticsLogLevel.yaml | 50 - .../enums/AnalyticsProgressionStatus.yaml | 48 - .../enums/AnalyticsProgressionType.yaml | 32 - .../enums/AnimationClipFromVideoStatus.yaml | 72 - .../engine/enums/AnimationNodeType.yaml | 82 - .../engine/enums/AnimationPriority.yaml | 83 - .../engine/enums/AnimatorRetargetingMode.yaml | 34 - .../engine/enums/AnnotationEditingMode.yaml | 27 - .../engine/enums/AnnotationRequestStatus.yaml | 37 - .../engine/enums/AnnotationRequestType.yaml | 37 - .../enums/AppLifecycleManagerState.yaml | 32 - .../engine/enums/AppShellActionType.yaml | 67 - .../engine/enums/AppShellFeature.yaml | 47 - .../engine/enums/AppUpdateStatus.yaml | 47 - .../engine/enums/ApplyStrokeMode.yaml | 29 - .../reference/engine/enums/AspectType.yaml | 28 - .../engine/enums/AssetCreatorType.yaml | 22 - .../engine/enums/AssetFetchStatus.yaml | 46 - .../reference/engine/enums/AssetType.yaml | 369 - .../engine/enums/AssetTypeVerification.yaml | 39 - .../engine/enums/AudioApiRollout.yaml | 37 - .../engine/enums/AudioCaptureMode.yaml | 12 - .../engine/enums/AudioChannelLayout.yaml | 92 - .../engine/enums/AudioFilterType.yaml | 99 - .../engine/enums/AudioSimulationFidelity.yaml | 31 - .../reference/engine/enums/AudioSubType.yaml | 22 - .../engine/enums/AudioWindowSize.yaml | 27 - .../reference/engine/enums/AuthorityMode.yaml | 28 - .../engine/enums/AutoIndentRule.yaml | 27 - .../reference/engine/enums/AutomaticSize.yaml | 51 - .../engine/enums/AvatarAssetType.yaml | 266 - .../enums/AvatarChatServiceFeature.yaml | 67 - .../engine/enums/AvatarContextMenuOption.yaml | 32 - .../engine/enums/AvatarItemType.yaml | 26 - .../engine/enums/AvatarPromptResult.yaml | 32 - .../AvatarSettingsAccessoryLimitMethod.yaml | 32 - .../enums/AvatarSettingsAccessoryMode.yaml | 22 - .../AvatarSettingsAnimationClipsMode.yaml | 22 - .../AvatarSettingsAnimationPacksMode.yaml | 27 - .../enums/AvatarSettingsAppearanceMode.yaml | 27 - .../engine/enums/AvatarSettingsBuildMode.yaml | 22 - .../enums/AvatarSettingsClothingMode.yaml | 22 - .../enums/AvatarSettingsCollisionMode.yaml | 27 - .../AvatarSettingsCustomAccessoryMode.yaml | 22 - .../enums/AvatarSettingsCustomBodyType.yaml | 22 - .../AvatarSettingsCustomClothingMode.yaml | 22 - ...vatarSettingsHitAndTouchDetectionMode.yaml | 22 - .../engine/enums/AvatarSettingsJumpMode.yaml | 22 - .../AvatarSettingsLegacyCollisionMode.yaml | 22 - .../engine/enums/AvatarSettingsScaleMode.yaml | 22 - .../AvatarThumbnailCustomizationType.yaml | 22 - .../engine/enums/AvatarUnificationMode.yaml | 27 - .../en-us/reference/engine/enums/Axis.yaml | 33 - .../reference/engine/enums/BenefitType.yaml | 27 - .../en-us/reference/engine/enums/BinType.yaml | 39 - .../reference/engine/enums/BodyPart.yaml | 51 - .../reference/engine/enums/BodyPartR15.yaml | 119 - .../reference/engine/enums/BorderMode.yaml | 39 - .../engine/enums/BorderStrokePosition.yaml | 37 - .../reference/engine/enums/BreakReason.yaml | 40 - .../engine/enums/BreakpointRemoveReason.yaml | 32 - .../reference/engine/enums/BulkMoveMode.yaml | 22 - .../reference/engine/enums/BundleType.yaml | 44 - .../en-us/reference/engine/enums/Button.yaml | 26 - .../reference/engine/enums/ButtonStyle.yaml | 57 - .../reference/engine/enums/CageType.yaml | 22 - .../reference/engine/enums/CameraMode.yaml | 48 - .../engine/enums/CameraNavigationModel.yaml | 22 - .../reference/engine/enums/CameraPanMode.yaml | 30 - .../enums/CameraSpeedAdjustBinding.yaml | 27 - .../reference/engine/enums/CameraType.yaml | 69 - .../enums/CaptureGalleryPermission.yaml | 19 - .../reference/engine/enums/CaptureType.yaml | 22 - .../engine/enums/CatalogCategoryFilter.yaml | 42 - .../engine/enums/CatalogSortAggregation.yaml | 42 - .../engine/enums/CatalogSortType.yaml | 42 - .../reference/engine/enums/CellBlock.yaml | 39 - .../reference/engine/enums/CellMaterial.yaml | 104 - .../engine/enums/CellOrientation.yaml | 34 - .../engine/enums/CenterDialogType.yaml | 32 - .../engine/enums/CharacterControlMode.yaml | 32 - .../engine/enums/ChatCallbackType.yaml | 32 - .../reference/engine/enums/ChatColor.yaml | 39 - .../reference/engine/enums/ChatMode.yaml | 25 - .../engine/enums/ChatPrivacyMode.yaml | 32 - .../engine/enums/ChatRestrictionStatus.yaml | 27 - .../reference/engine/enums/ChatStyle.yaml | 35 - .../reference/engine/enums/ChatVersion.yaml | 32 - .../enums/ClientAnimatorThrottlingMode.yaml | 32 - .../reference/engine/enums/CloseReason.yaml | 57 - .../engine/enums/CollaboratorStatus.yaml | 32 - .../engine/enums/CollisionFidelity.yaml | 48 - .../engine/enums/CommandPermission.yaml | 22 - .../reference/engine/enums/CompileTarget.yaml | 32 - .../enums/CompletionAcceptanceBehavior.yaml | 32 - .../engine/enums/CompletionItemKind.yaml | 137 - .../engine/enums/CompletionItemTag.yaml | 92 - .../engine/enums/CompletionTriggerKind.yaml | 27 - .../engine/enums/CompositeValueCurveType.yaml | 88 - .../engine/enums/CompressionAlgorithm.yaml | 22 - .../enums/ComputerCameraMovementMode.yaml | 47 - .../engine/enums/ComputerMovementMode.yaml | 34 - .../enums/ConfigSnapshotErrorState.yaml | 22 - .../engine/enums/ConnectionError.yaml | 477 - .../engine/enums/ConnectionState.yaml | 26 - .../engine/enums/ContentSourceType.yaml | 42 - .../engine/enums/ContextActionPriority.yaml | 33 - .../engine/enums/ContextActionResult.yaml | 36 - .../reference/engine/enums/ControlMode.yaml | 33 - .../reference/engine/enums/CoreGuiType.yaml | 72 - .../engine/enums/CreateAssetResult.yaml | 32 - .../engine/enums/CreateOutfitFailure.yaml | 27 - .../reference/engine/enums/CreatorType.yaml | 25 - .../engine/enums/CreatorTypeFilter.yaml | 27 - .../reference/engine/enums/CurrencyType.yaml | 36 - .../engine/enums/CustomCameraMode.yaml | 34 - .../engine/enums/DataStoreRequestType.yaml | 169 - .../engine/enums/DebuggerEndReason.yaml | 62 - .../enums/DebuggerExceptionBreakMode.yaml | 27 - .../engine/enums/DebuggerFrameType.yaml | 26 - .../engine/enums/DebuggerPauseReason.yaml | 51 - .../engine/enums/DebuggerStatus.yaml | 68 - .../enums/DefaultScriptSyncFileType.yaml | 22 - .../engine/enums/DevCameraOcclusionMode.yaml | 28 - .../enums/DevComputerCameraMovementMode.yaml | 47 - .../engine/enums/DevComputerMovementMode.yaml | 42 - .../enums/DevTouchCameraMovementMode.yaml | 40 - .../engine/enums/DevTouchMovementMode.yaml | 63 - .../engine/enums/DeveloperMemoryTag.yaml | 159 - .../engine/enums/DeviceFeatureType.yaml | 22 - .../reference/engine/enums/DeviceForm.yaml | 37 - .../reference/engine/enums/DeviceLevel.yaml | 27 - .../reference/engine/enums/DeviceType.yaml | 39 - .../engine/enums/DialogBehaviorType.yaml | 31 - .../reference/engine/enums/DialogPurpose.yaml | 32 - .../reference/engine/enums/DialogTone.yaml | 34 - .../enums/DigitsRigDescriptionSide.yaml | 27 - .../reference/engine/enums/DisplaySize.yaml | 35 - .../reference/engine/enums/DominantAxis.yaml | 28 - .../engine/enums/DraftStatusCode.yaml | 32 - .../engine/enums/DragDetectorDragStyle.yaml | 84 - .../enums/DragDetectorPermissionPolicy.yaml | 37 - .../enums/DragDetectorResponseStyle.yaml | 44 - .../engine/enums/DraggerCoordinateSpace.yaml | 22 - .../engine/enums/DraggerMovementMode.yaml | 22 - .../engine/enums/DraggingScrollBar.yaml | 27 - .../engine/enums/EasingDirection.yaml | 35 - .../reference/engine/enums/EasingStyle.yaml | 95 - .../engine/enums/ElasticBehavior.yaml | 36 - .../enums/EnviromentalPhysicsThrottle.yaml | 47 - .../engine/enums/ExperienceAuthScope.yaml | 22 - .../engine/enums/ExperienceEventStatus.yaml | 44 - .../reference/engine/enums/ExplosionType.yaml | 26 - .../reference/engine/enums/FACSDataLod.yaml | 27 - .../enums/FacialAgeEstimationResultType.yaml | 27 - .../enums/FacialAnimationStreamingState.yaml | 37 - .../engine/enums/FacsActionUnit.yaml | 262 - .../engine/enums/FieldOfViewMode.yaml | 27 - .../reference/engine/enums/FileMode.yaml | 22 - .../engine/enums/FileSystemWalkMode.yaml | 22 - .../reference/engine/enums/FillDirection.yaml | 28 - .../engine/enums/FilterErrorType.yaml | 107 - .../reference/engine/enums/FilterResult.yaml | 26 - .../enums/FinishRecordingOperation.yaml | 31 - .../reference/engine/enums/FluidFidelity.yaml | 38 - .../reference/engine/enums/FluidForces.yaml | 34 - .../en-us/reference/engine/enums/Font.yaml | 352 - .../reference/engine/enums/FontSize.yaml | 104 - .../reference/engine/enums/FontStyle.yaml | 27 - .../reference/engine/enums/FontWeight.yaml | 60 - .../engine/enums/ForceLimitMode.yaml | 33 - .../reference/engine/enums/FormFactor.yaml | 44 - .../reference/engine/enums/FrameStyle.yaml | 75 - .../engine/enums/FramerateManagerMode.yaml | 27 - .../engine/enums/FriendRequestEvent.yaml | 38 - .../reference/engine/enums/FriendStatus.yaml | 46 - .../engine/enums/FunctionalTestResult.yaml | 32 - .../engine/enums/GameAvatarType.yaml | 35 - .../reference/engine/enums/GamepadType.yaml | 32 - .../engine/enums/GearGenreSetting.yaml | 31 - .../reference/engine/enums/GearType.yaml | 81 - .../en-us/reference/engine/enums/Genre.yaml | 100 - .../reference/engine/enums/GraphicsMode.yaml | 52 - .../enums/GraphicsOptimizationMode.yaml | 27 - .../engine/enums/GroupMembershipStatus.yaml | 42 - .../reference/engine/enums/GuiState.yaml | 36 - .../en-us/reference/engine/enums/GuiType.yaml | 37 - .../reference/engine/enums/HandlesStyle.yaml | 22 - .../engine/enums/HapticEffectType.yaml | 62 - .../reference/engine/enums/HashAlgorithm.yaml | 51 - .../engine/enums/HighlightDepthMode.yaml | 38 - .../engine/enums/HorizontalAlignment.yaml | 34 - .../engine/enums/HoverAnimateSpeed.yaml | 43 - .../engine/enums/HttpCachePolicy.yaml | 37 - .../engine/enums/HttpCompression.yaml | 22 - .../engine/enums/HttpContentType.yaml | 46 - .../reference/engine/enums/HttpError.yaml | 102 - .../engine/enums/HttpRequestType.yaml | 47 - .../engine/enums/HumanoidCollisionType.yaml | 26 - .../enums/HumanoidDisplayDistanceType.yaml | 47 - .../enums/HumanoidHealthDisplayType.yaml | 37 - .../engine/enums/HumanoidRigType.yaml | 29 - .../engine/enums/HumanoidStateType.yaml | 139 - .../engine/enums/IKCollisionsMode.yaml | 39 - .../enums/IKControlConstraintSupport.yaml | 37 - .../reference/engine/enums/IKControlType.yaml | 46 - .../engine/enums/IXPLoadingStatus.yaml | 47 - .../engine/enums/ImageAlphaType.yaml | 34 - .../engine/enums/ImageCombineType.yaml | 51 - .../en-us/reference/engine/enums/InOut.yaml | 32 - .../reference/engine/enums/InfoType.yaml | 43 - .../engine/enums/InitialDockState.yaml | 45 - .../engine/enums/InputActionType.yaml | 70 - .../reference/engine/enums/InputType.yaml | 43 - .../engine/enums/InstanceFileSyncStatus.yaml | 46 - .../IntermediateMeshGenerationResult.yaml | 17 - .../enums/InterpolationThrottlingMode.yaml | 27 - .../reference/engine/enums/InviteState.yaml | 39 - .../engine/enums/ItemLineAlignment.yaml | 73 - .../reference/engine/enums/JoinSource.yaml | 17 - .../engine/enums/JointCreationMode.yaml | 34 - .../en-us/reference/engine/enums/KeyCode.yaml | 1684 - .../engine/enums/KeyInterpolationMode.yaml | 38 - .../engine/enums/KeywordFilterType.yaml | 26 - .../reference/engine/enums/Language.yaml | 17 - .../reference/engine/enums/LeftRight.yaml | 35 - .../reference/engine/enums/LexemeType.yaml | 107 - .../reference/engine/enums/LightingStyle.yaml | 28 - .../en-us/reference/engine/enums/Limb.yaml | 66 - .../reference/engine/enums/LineJoinMode.yaml | 43 - .../engine/enums/ListDisplayMode.yaml | 26 - .../engine/enums/ListenerLocation.yaml | 77 - .../reference/engine/enums/ListenerType.yaml | 42 - .../LiveEditingAtomicUpdateResponse.yaml | 32 - .../LiveEditingBroadcastMessageType.yaml | 27 - .../enums/LoadCharacterLayeredClothing.yaml | 41 - .../engine/enums/LoadDynamicHeads.yaml | 27 - .../reference/engine/enums/LocationType.yaml | 27 - .../engine/enums/LuauTypeCheckMode.yaml | 32 - .../reference/engine/enums/MakeupType.yaml | 27 - .../MarketplaceBulkPurchasePromptStatus.yaml | 33 - .../enums/MarketplaceItemPurchaseStatus.yaml | 98 - .../engine/enums/MarketplaceProductType.yaml | 28 - .../reference/engine/enums/MarkupKind.yaml | 22 - .../engine/enums/MatchmakingType.yaml | 34 - .../reference/engine/enums/Material.yaml | 297 - .../engine/enums/MaterialPattern.yaml | 26 - .../engine/enums/MembershipType.yaml | 44 - .../engine/enums/MeshPartDetailLevel.yaml | 51 - .../enums/MeshPartHeadsAndAccessories.yaml | 34 - .../reference/engine/enums/MeshScaleUnit.yaml | 42 - .../reference/engine/enums/MeshType.yaml | 91 - .../reference/engine/enums/MessageType.yaml | 40 - .../engine/enums/ModelLevelOfDetail.yaml | 44 - .../engine/enums/ModelStreamingBehavior.yaml | 44 - .../engine/enums/ModelStreamingMode.yaml | 55 - .../engine/enums/ModerationStatus.yaml | 37 - .../reference/engine/enums/ModifierKey.yaml | 32 - .../reference/engine/enums/MouseBehavior.yaml | 34 - .../reference/engine/enums/MoveState.yaml | 44 - .../MoverConstraintRootBehaviorMode.yaml | 40 - .../reference/engine/enums/MuteState.yaml | 22 - .../reference/engine/enums/NameOcclusion.yaml | 34 - .../enums/NegateOperationHiddenHistory.yaml | 27 - .../engine/enums/NetworkOwnership.yaml | 36 - .../reference/engine/enums/NetworkStatus.yaml | 27 - .../reference/engine/enums/NoiseType.yaml | 17 - .../reference/engine/enums/NormalId.yaml | 50 - .../engine/enums/NotificationButtonType.yaml | 22 - .../reference/engine/enums/OperationType.yaml | 37 - .../enums/OrientationAlignmentMode.yaml | 28 - .../reference/engine/enums/OutfitSource.yaml | 27 - .../reference/engine/enums/OutfitType.yaml | 32 - .../engine/enums/OutputLayoutMode.yaml | 26 - .../enums/OverrideMouseIconBehavior.yaml | 34 - .../engine/enums/PackagePermission.yaml | 55 - .../reference/engine/enums/PartType.yaml | 44 - .../engine/enums/ParticleEmitterShape.yaml | 32 - .../enums/ParticleEmitterShapeInOut.yaml | 27 - .../enums/ParticleEmitterShapeStyle.yaml | 22 - .../engine/enums/ParticleFlipbookLayout.yaml | 47 - .../engine/enums/ParticleFlipbookMode.yaml | 50 - .../ParticleFlipbookTextureCompatible.yaml | 27 - .../engine/enums/ParticleOrientation.yaml | 32 - .../reference/engine/enums/PathStatus.yaml | 55 - .../engine/enums/PathWaypointAction.yaml | 31 - .../enums/PathfindingUseImprovedSearch.yaml | 27 - .../engine/enums/PeoplePageLayout.yaml | 22 - .../engine/enums/PermissionLevelShown.yaml | 49 - .../engine/enums/PhysicsSimulationRate.yaml | 27 - .../engine/enums/PhysicsSteppingMethod.yaml | 33 - .../reference/engine/enums/Platform.yaml | 149 - .../reference/engine/enums/PlaybackState.yaml | 54 - .../reference/engine/enums/PlayerActions.yaml | 46 - .../enums/PlayerCharacterDestroyBehavior.yaml | 27 - .../engine/enums/PlayerChatType.yaml | 33 - .../engine/enums/PlayerDataErrorState.yaml | 32 - .../enums/PlayerDataLoadFailureBehavior.yaml | 27 - .../engine/enums/PlayerExitReason.yaml | 34 - .../engine/enums/PoseEasingDirection.yaml | 42 - .../engine/enums/PoseEasingStyle.yaml | 53 - .../engine/enums/PositionAlignmentMode.yaml | 28 - .../engine/enums/PredictionMode.yaml | 43 - .../engine/enums/PredictionStatus.yaml | 40 - .../engine/enums/PreferredInput.yaml | 36 - .../engine/enums/PreferredTextSize.yaml | 40 - .../engine/enums/PrimalPhysicsSolver.yaml | 27 - .../reference/engine/enums/PrimitiveType.yaml | 42 - .../reference/engine/enums/PrivilegeType.yaml | 39 - .../enums/ProductLocationRestriction.yaml | 31 - .../engine/enums/ProductPurchaseChannel.yaml | 43 - .../engine/enums/ProductPurchaseDecision.yaml | 29 - .../engine/enums/PromptCreateAssetResult.yaml | 62 - .../enums/PromptCreateAvatarResult.yaml | 72 - .../enums/PromptExperienceDetailsResult.yaml | 22 - .../enums/PromptPublishAssetResult.yaml | 42 - .../engine/enums/PropertyStatus.yaml | 27 - .../enums/ProximityPromptExclusivity.yaml | 30 - .../enums/ProximityPromptInputType.yaml | 27 - .../engine/enums/ProximityPromptStyle.yaml | 26 - .../reference/engine/enums/QualityLevel.yaml | 158 - .../engine/enums/R15CollisionType.yaml | 26 - .../engine/enums/RaycastFilterType.yaml | 32 - .../enums/ReadCapturesFromGalleryResult.yaml | 23 - .../enums/RecommendationActionType.yaml | 55 - .../enums/RecommendationDepartureIntent.yaml | 33 - .../enums/RecommendationImpressionType.yaml | 24 - .../enums/RecommendationItemContentType.yaml | 32 - .../enums/RecommendationItemVisibility.yaml | 22 - .../enums/RejectCharacterDeletions.yaml | 27 - .../engine/enums/RenderFidelity.yaml | 65 - .../engine/enums/RenderPriority.yaml | 47 - .../enums/RenderingCacheOptimizationMode.yaml | 27 - .../enums/RenderingTestComparisonMethod.yaml | 22 - .../ReplicateInstanceDestroySetting.yaml | 27 - .../reference/engine/enums/ResamplerMode.yaml | 26 - .../engine/enums/ReservedHighlightId.yaml | 37 - .../reference/engine/enums/RestPose.yaml | 27 - .../reference/engine/enums/ReturnKeyType.yaml | 42 - .../reference/engine/enums/ReverbType.yaml | 162 - .../reference/engine/enums/RibbonTool.yaml | 69 - .../reference/engine/enums/RigScale.yaml | 27 - .../en-us/reference/engine/enums/RigType.yaml | 37 - .../reference/engine/enums/RollOffMode.yaml | 56 - .../reference/engine/enums/RolloutState.yaml | 27 - .../reference/engine/enums/RotationOrder.yaml | 82 - .../reference/engine/enums/RotationType.yaml | 22 - .../reference/engine/enums/RsvpStatus.yaml | 27 - .../engine/enums/RtlTextSupport.yaml | 27 - .../reference/engine/enums/RunContext.yaml | 37 - .../reference/engine/enums/RunState.yaml | 27 - .../engine/enums/RuntimeUndoBehavior.yaml | 27 - .../engine/enums/SafeAreaCompatibility.yaml | 44 - .../engine/enums/SalesTypeFilter.yaml | 32 - .../engine/enums/SandboxedInstanceMode.yaml | 22 - ...veAvatarThumbnailCustomizationFailure.yaml | 42 - .../reference/engine/enums/SaveFilter.yaml | 36 - .../engine/enums/SavedQualitySetting.yaml | 67 - .../reference/engine/enums/ScaleType.yaml | 52 - .../engine/enums/ScopeCheckResult.yaml | 52 - .../reference/engine/enums/ScreenInsets.yaml | 62 - .../engine/enums/ScreenOrientation.yaml | 52 - .../engine/enums/ScrollBarInset.yaml | 41 - .../engine/enums/ScrollingDirection.yaml | 34 - .../engine/enums/SecurityCapability.yaml | 277 - .../engine/enums/SelectionBehavior.yaml | 30 - .../engine/enums/SelectionRenderMode.yaml | 27 - .../engine/enums/SelfViewPosition.yaml | 49 - .../reference/engine/enums/SensorMode.yaml | 22 - .../engine/enums/SensorUpdateType.yaml | 22 - .../engine/enums/ServerLiveEditingMode.yaml | 27 - .../engine/enums/ServiceVisibility.yaml | 27 - .../reference/engine/enums/Severity.yaml | 32 - .../reference/engine/enums/ShowAdResult.yaml | 51 - .../engine/enums/SignalBehavior.yaml | 46 - .../engine/enums/SizeConstraint.yaml | 32 - .../enums/SolverConvergenceMetricType.yaml | 22 - .../SolverConvergenceVisualizationMode.yaml | 27 - .../reference/engine/enums/SortDirection.yaml | 22 - .../reference/engine/enums/SortOrder.yaml | 39 - .../reference/engine/enums/SpecialKey.yaml | 42 - .../reference/engine/enums/StartCorner.yaml | 40 - .../engine/enums/StateObjectFieldType.yaml | 66 - .../en-us/reference/engine/enums/Status.yaml | 32 - .../reference/engine/enums/StepFrequency.yaml | 52 - .../engine/enums/StreamOutBehavior.yaml | 36 - .../engine/enums/StreamingIntegrityMode.yaml | 56 - .../engine/enums/StreamingPauseMode.yaml | 57 - .../engine/enums/StrokeSizingMode.yaml | 31 - .../engine/enums/StudioCloseMode.yaml | 32 - .../engine/enums/StudioDataModelType.yaml | 37 - .../enums/StudioPlaceUpdateFailureReason.yaml | 22 - .../StudioScriptEditorColorCategories.yaml | 247 - .../enums/StudioScriptEditorColorPresets.yaml | 32 - .../engine/enums/StudioStyleGuideColor.yaml | 691 - .../enums/StudioStyleGuideModifier.yaml | 37 - .../en-us/reference/engine/enums/Style.yaml | 34 - .../enums/SubscriptionExpirationReason.yaml | 42 - .../enums/SubscriptionPaymentStatus.yaml | 24 - .../engine/enums/SubscriptionPeriod.yaml | 17 - .../engine/enums/SubscriptionState.yaml | 42 - .../engine/enums/SurfaceConstraint.yaml | 42 - .../engine/enums/SurfaceGuiShape.yaml | 22 - .../engine/enums/SurfaceGuiSizingMode.yaml | 29 - .../reference/engine/enums/SurfaceType.yaml | 83 - .../engine/enums/SwipeDirection.yaml | 48 - .../engine/enums/SystemThemeValue.yaml | 37 - .../engine/enums/TableMajorAxis.yaml | 29 - .../engine/enums/TeamCreateErrorState.yaml | 32 - .../reference/engine/enums/Technology.yaml | 66 - .../engine/enums/TeleportMethod.yaml | 47 - .../engine/enums/TeleportResult.yaml | 62 - .../reference/engine/enums/TeleportState.yaml | 45 - .../reference/engine/enums/TeleportType.yaml | 45 - .../enums/TerrainAcquisitionMethod.yaml | 72 - .../reference/engine/enums/TerrainFace.yaml | 27 - .../engine/enums/TextChatMessageStatus.yaml | 69 - .../reference/engine/enums/TextDirection.yaml | 27 - .../engine/enums/TextFilterContext.yaml | 22 - .../reference/engine/enums/TextInputType.yaml | 67 - .../reference/engine/enums/TextTruncate.yaml | 52 - .../engine/enums/TextXAlignment.yaml | 37 - .../engine/enums/TextYAlignment.yaml | 37 - .../reference/engine/enums/TextureMode.yaml | 51 - .../engine/enums/TextureQueryType.yaml | 38 - .../engine/enums/ThreadPoolConfig.yaml | 82 - .../engine/enums/ThrottlingPriority.yaml | 32 - .../reference/engine/enums/ThumbnailSize.yaml | 56 - .../reference/engine/enums/ThumbnailType.yaml | 33 - .../engine/enums/TickCountSampleMethod.yaml | 33 - .../engine/enums/TonemapperPreset.yaml | 26 - .../reference/engine/enums/TopBottom.yaml | 32 - .../engine/enums/TouchCameraMovementMode.yaml | 42 - .../engine/enums/TouchMovementMode.yaml | 51 - .../reference/engine/enums/TrackerError.yaml | 67 - .../enums/TrackerExtrapolationFlagMode.yaml | 32 - .../enums/TrackerFaceTrackingStatus.yaml | 47 - .../engine/enums/TrackerLodFlagMode.yaml | 27 - .../engine/enums/TrackerLodValueMode.yaml | 27 - .../reference/engine/enums/TrackerMode.yaml | 32 - .../engine/enums/TrackerPromptEvent.yaml | 17 - .../reference/engine/enums/TrackerType.yaml | 27 - .../engine/enums/TriStateBoolean.yaml | 27 - .../reference/engine/enums/TweenStatus.yaml | 33 - .../reference/engine/enums/UICaptureMode.yaml | 26 - .../enums/UIDragDetectorBoundingBehavior.yaml | 39 - .../enums/UIDragDetectorDragRelativity.yaml | 34 - .../engine/enums/UIDragDetectorDragSpace.yaml | 46 - .../engine/enums/UIDragDetectorDragStyle.yaml | 44 - .../enums/UIDragDetectorResponseStyle.yaml | 48 - .../engine/enums/UIDragSpeedAxisMapping.yaml | 43 - .../engine/enums/UIFlexAlignment.yaml | 53 - .../reference/engine/enums/UIFlexMode.yaml | 58 - .../en-us/reference/engine/enums/UITheme.yaml | 27 - .../reference/engine/enums/UiMessageType.yaml | 26 - .../engine/enums/UploadCaptureResult.yaml | 43 - .../reference/engine/enums/UsageContext.yaml | 22 - .../reference/engine/enums/UserCFrame.yaml | 39 - .../engine/enums/UserInputState.yaml | 72 - .../reference/engine/enums/UserInputType.yaml | 146 - .../engine/enums/VRComfortSetting.yaml | 32 - .../engine/enums/VRControllerModelMode.yaml | 22 - .../reference/engine/enums/VRDeviceType.yaml | 37 - .../engine/enums/VRLaserPointerMode.yaml | 27 - .../engine/enums/VRSafetyBubbleMode.yaml | 27 - .../reference/engine/enums/VRScaling.yaml | 25 - .../engine/enums/VRSessionState.yaml | 37 - .../reference/engine/enums/VRTouchpad.yaml | 28 - .../engine/enums/VRTouchpadMode.yaml | 34 - .../engine/enums/VelocityConstraintMode.yaml | 63 - .../engine/enums/VerticalAlignment.yaml | 34 - .../enums/VerticalScrollBarPosition.yaml | 28 - .../engine/enums/VibrationMotor.yaml | 52 - .../engine/enums/VideoCaptureResult.yaml | 32 - .../enums/VideoCaptureStartedResult.yaml | 37 - .../enums/VideoDeviceCaptureQuality.yaml | 32 - .../reference/engine/enums/VideoError.yaml | 107 - .../engine/enums/VideoSampleSize.yaml | 36 - .../reference/engine/enums/ViewMode.yaml | 32 - .../engine/enums/VirtualCursorMode.yaml | 33 - .../engine/enums/VirtualInputMode.yaml | 27 - .../VoiceChatDistanceAttenuationType.yaml | 34 - .../engine/enums/VoiceChatState.yaml | 47 - .../engine/enums/VoiceControlPath.yaml | 27 - .../engine/enums/VolumetricAudio.yaml | 27 - .../engine/enums/WaterDirection.yaml | 46 - .../reference/engine/enums/WaterForce.yaml | 41 - .../engine/enums/WebSocketState.yaml | 32 - .../engine/enums/WebStreamClientState.yaml | 42 - .../engine/enums/WebStreamClientType.yaml | 41 - .../engine/enums/WeldConstraintPreserve.yaml | 33 - .../engine/enums/WhisperChatPrivacyMode.yaml | 22 - .../engine/enums/WrapLayerAutoSkin.yaml | 27 - .../engine/enums/WrapLayerDebugMode.yaml | 112 - .../engine/enums/WrapTargetDebugMode.yaml | 90 - .../engine/enums/ZIndexBehavior.yaml | 30 - .../roblox/en-us/reference/engine/globals.md | 4 - .../reference/engine/globals/LuaGlobals.yaml | 878 - .../engine/globals/RobloxGlobals.yaml | 439 - .../en-us/reference/engine/libraries.md | 4 - .../reference/engine/libraries/bit32.yaml | 491 - .../reference/engine/libraries/buffer.yaml | 727 - .../reference/engine/libraries/coroutine.yaml | 299 - .../reference/engine/libraries/debug.yaml | 409 - .../reference/engine/libraries/math.yaml | 822 - .../en-us/reference/engine/libraries/os.yaml | 334 - .../reference/engine/libraries/string.yaml | 773 - .../reference/engine/libraries/table.yaml | 530 - .../reference/engine/libraries/task.yaml | 266 - .../reference/engine/libraries/utf8.yaml | 247 - .../reference/engine/libraries/vector.yaml | 310 - .../roblox/en-us/reference/engine/overview.md | 4 - .../battle-royale/building-system.md | 156 - .../resources/battle-royale/core-scripts.md | 35 - .../en-us/resources/battle-royale/index.md | 39 - .../battle-royale/installation-and-setup.md | 313 - .../resources/battle-royale/minimap-system.md | 92 - .../resources/battle-royale/pickup-system.md | 127 - .../resources/battle-royale/run-the-game.md | 273 - .../resources/battle-royale/the-storm.md | 88 - .../beyond-the-dark/building-architecture.md | 186 - .../beyond-the-dark/custom-characters.md | 320 - .../en-us/resources/beyond-the-dark/index.md | 26 - .../beyond-the-dark/layered-clothing.md | 446 - .../resources/beyond-the-dark/sound-design.md | 81 - .../beyond-the-dark/user-interface.md | 229 - .../en-us/resources/builder-font-license.md | 17 - .../en-us/resources/city-people-cars.md | 25 - .../resources/feature-packages/bundles.md | 459 - .../resources/feature-packages/changelog.md | 83 - .../feature-packages/engagement-rewards.md | 168 - .../en-us/resources/feature-packages/index.md | 297 - .../resources/feature-packages/missions.md | 387 - .../feature-packages/season-passes.md | 244 - .../en-us/resources/feedback-guidelines.md | 26 - .../en-us/resources/limited-use-license.md | 23 - .../en-us/resources/modules/emote-bar.md | 569 - .../resources/modules/event-sequencer.md | 1146 - .../resources/modules/friends-locator.md | 268 - .../roblox/en-us/resources/modules/index.md | 59 - .../en-us/resources/modules/merch-booth.md | 1238 - .../en-us/resources/modules/photo-booth.md | 368 - .../en-us/resources/modules/profile-card.md | 215 - .../en-us/resources/modules/scavenger-hunt.md | 665 - .../en-us/resources/modules/selfie-mode.md | 754 - .../resources/modules/social-interactions.md | 296 - .../resources/modules/spawn-with-friends.md | 189 - .../en-us/resources/modules/surface-art.md | 586 - .../rules/roblox/en-us/resources/npc-kit.md | 308 - .../resources/plant-reference-project.md | 666 - .../roblox/en-us/resources/roblox-connect.md | 80 - .../rules/roblox/en-us/resources/templates.md | 208 - .../construct-the-house.md | 325 - .../design-dark-soundscapes.md | 115 - .../develop-a-moving-world.md | 582 - .../foundational-gameplay-systems.md | 247 - .../immersive-narrative.md | 142 - .../the-mystery-of-duvall-drive/index.md | 29 - .../main-design-requirements.md | 101 - .../materialize-the-world.md | 250 - .../stream-in-immersion.md | 59 - .../supporting-systems.md | 128 - .../technical-overview.md | 14 - .../roblox/en-us/resources/weapons-kit.md | 860 - .cursor/rules/roblox/en-us/safety.md | 87 - .cursor/rules/roblox/en-us/scale.md | 122 - .../roblox/en-us/scripting/attributes.md | 191 - .../roblox/en-us/scripting/capabilities.md | 268 - .../rules/roblox/en-us/scripting/debounce.md | 123 - .../roblox/en-us/scripting/events/bindable.md | 250 - .../roblox/en-us/scripting/events/deferred.md | 101 - .../roblox/en-us/scripting/events/index.md | 114 - .../roblox/en-us/scripting/events/remote.md | 584 - .cursor/rules/roblox/en-us/scripting/index.md | 153 - .../rules/roblox/en-us/scripting/locations.md | 51 - .../rules/roblox/en-us/scripting/module.md | 247 - .../roblox/en-us/scripting/multithreading.md | 333 - .../rules/roblox/en-us/scripting/scheduler.md | 95 - .../rules/roblox/en-us/scripting/scripts.md | 285 - .../scripting/security/access-control.md | 127 - .../security/client-server-boundary.md | 420 - .../scripting/security/defensive-design.md | 61 - .../scripting/security/network-ownership.md | 47 - .../scripting/security/security-tactics.md | 50 - .../security/server-side-detection.md | 81 - .../security/third-party-vulnerabilities.md | 32 - .../rules/roblox/en-us/scripting/services.md | 97 - .cursor/rules/roblox/en-us/scripting/sync.md | 107 - .../roblox/en-us/sound/dynamic-effects.md | 218 - .cursor/rules/roblox/en-us/sound/groups.md | 112 - .cursor/rules/roblox/en-us/sound/index.md | 24 - .cursor/rules/roblox/en-us/sound/objects.md | 295 - .../rules/roblox/en-us/studio/align-tool.md | 105 - .../roblox/en-us/studio/avatar-settings.md | 234 - .../en-us/studio/build-studio-widgets.md | 375 - .../rules/roblox/en-us/studio/debugging.md | 311 - .../roblox/en-us/studio/developer-console.md | 92 - .../en-us/studio/experience-settings.md | 276 - .cursor/rules/roblox/en-us/studio/explorer.md | 455 - .cursor/rules/roblox/en-us/studio/index.md | 207 - .../roblox/en-us/studio/material-generator.md | 80 - .../en-us/studio/optimization/memory-usage.md | 217 - .../studio/optimization/scriptprofiler.md | 169 - .cursor/rules/roblox/en-us/studio/output.md | 41 - .../rules/roblox/en-us/studio/pivot-tools.md | 156 - .cursor/rules/roblox/en-us/studio/plugins.md | 154 - .../rules/roblox/en-us/studio/properties.md | 147 - .../rules/roblox/en-us/studio/rig-builder.md | 20 - .../roblox/en-us/studio/script-editor.md | 586 - .cursor/rules/roblox/en-us/studio/setup.md | 49 - .../roblox/en-us/studio/terrain-editor.md | 660 - .../roblox/en-us/studio/testing-modes.md | 309 - .../roblox/en-us/studio/texture-generator.md | 210 - .../rules/roblox/en-us/studio/ui-overview.md | 449 - .../curriculums/animator/get-started.md | 89 - .../tutorials/curriculums/animator/index.md | 88 - .../curriculums/animator/next-steps.md | 58 - .../animator/play-your-animation.md | 81 - .../curriculums/animator/test-and-save.md | 72 - .../work-with-the-animation-editor.md | 190 - .../curriculums/artist/get-started.md | 93 - .../tutorials/curriculums/artist/index.md | 77 - .../curriculums/artist/next-steps.md | 63 - .../curriculums/artist/test-and-save.md | 64 - .../artist/work-with-particle-emitters.md | 268 - .../building/code-with-assistant.md | 143 - .../curriculums/building/get-started.md | 83 - .../tutorials/curriculums/building/index.md | 88 - .../curriculums/building/next-steps.md | 52 - .../curriculums/building/test-and-save.md | 58 - .../curriculums/building/work-with-parts.md | 182 - .../curriculums/coding/customize-strings.md | 113 - .../curriculums/coding/get-started.md | 65 - .../tutorials/curriculums/coding/index.md | 88 - .../curriculums/coding/next-steps.md | 40 - .../curriculums/coding/test-and-save.md | 102 - .../curriculums/coding/work-with-variables.md | 140 - .../core/building/apply-polished-assets.md | 1176 - .../core/building/create-a-project.md | 30 - .../create-an-environment-with-terrain.md | 203 - .../building/create-basic-visual-effects.md | 215 - .../building/customize-global-lighting.md | 203 - .../core/building/greybox-a-playable-area.md | 437 - .../en-us/tutorials/curriculums/core/index.md | 113 - .../core/scripting/create-player-hazards.md | 176 - .../record-and-display-player-data.md | 386 - .../scripting/script-an-upgrade-button.md | 316 - .../core/scripting/script-game-behavior.md | 234 - .../curriculums/curriculum-overview.md | 239 - .../assemble-an-asset-library.md | 307 - .../environmental-art/construct-your-world.md | 4187 - .../develop-polished-assets.md | 184 - .../greybox-your-environment.md | 1081 - .../curriculums/environmental-art/index.md | 143 - .../optimize-your-experience.md | 92 - .../gameplay-scripting/add-rounds.md | 236 - .../gameplay-scripting/create-teams.md | 214 - .../gameplay-scripting/detect-hits.md | 233 - .../gameplay-scripting/implement-blasters.md | 212 - .../curriculums/gameplay-scripting/index.md | 82 - .../gameplay-scripting/spawn-respawn.md | 381 - .../curriculums/studio/create-account.md | 30 - .../curriculums/studio/explore-ui.md | 93 - .../tutorials/curriculums/studio/index.md | 73 - .../curriculums/studio/install-studio.md | 35 - .../curriculums/studio/next-steps.md | 42 - .../choose-an-art-style.md | 204 - .../implement-designs-in-studio.md | 2531 - .../user-interface-design/index.md | 79 - .../wireframe-your-layouts.md | 160 - .../en-us/tutorials/first-experience/index.md | 325 - .../coding-1/coding-fundamentals.md | 48 - .../fundamentals/coding-1/create-a-script.md | 172 - .../fundamentals/coding-1/landing.md | 58 - .../coding-1/object-properties.md | 98 - .../coding-1/parents-and-children.md | 64 - .../fundamentals/coding-2/code-a-function.md | 105 - .../coding-2/functions-and-events.md | 69 - .../multiple-parameters-and-arguments.md | 157 - .../coding-2/parameters-practice-buttons.md | 111 - .../coding-2/use-parameters-and-events.md | 124 - .../fundamentals/coding-3/give-points.md | 447 - .../coding-3/intro-to-if-statements.md | 163 - .../fundamentals/coding-3/landing.md | 64 - .../coding-3/multiple-conditions.md | 353 - .../coding-3/powerups-with-if-statements.md | 140 - .../coding-3/traps-with-if-statements.md | 163 - .../coding-4/create-a-timed-bridge.md | 320 - .../coding-4/glow-lights-with-for-loops.md | 186 - .../coding-4/intro-to-for-loops.md | 145 - .../fundamentals/coding-4/landing.md | 66 - .../fundamentals/coding-4/nested-loops.md | 362 - .../coding-4/repeat-code-with-while-loops.md | 194 - .../fundamentals/coding-5/intro-to-arrays.md | 271 - .../coding-5/intro-to-dictionaries.md | 267 - .../fundamentals/coding-5/landing.md | 65 - .../fundamentals/coding-5/loops-and-arrays.md | 234 - .../coding-5/make-changes-to-arrays.md | 240 - .../fundamentals/coding-5/pairs-and-ipairs.md | 165 - .../coding-5/return-values-from-tables.md | 68 - .../coding-6/coding-concept-abstraction.md | 102 - .../coding-6/coding-concept-algorithms.md | 133 - .../coding-6/create-with-module-scripts.md | 520 - .../coding-6/intro-to-module-scripts.md | 175 - .../fundamentals/coding-6/landing.md | 62 - .cursor/rules/roblox/en-us/tutorials/index.md | 292 - .../animation/create-an-animation.md | 527 - .../animation/play-character-animations.md | 285 - .../use-case-tutorials/audio/add-2D-audio.md | 384 - .../use-case-tutorials/audio/add-3D-audio.md | 480 - .../audio/add-text-to-speech.md | 436 - .../audio/add-voice-chat.md | 249 - .../audio/in-game-sounds.md | 154 - .../audio/play-background-music.md | 80 - .../audio/speech-to-text.md | 155 - .../data-storage/create-leaderboard.md | 618 - .../data-storage/save-player-data.md | 477 - .../control-the-users-camera.md | 271 - .../input-and-camera/detect-user-input.md | 204 - .../lighting/create-flickering-lights.md | 177 - .../lighting/enhance-indoor-environments.md | 447 - .../lighting/enhance-outdoor-environments.md | 249 - .../lighting/light-with-props.md | 148 - .../modeling/assemble-modular-environments.md | 202 - .../modeling/create-neon-signs.md | 115 - .../physics/build-a-ferris-wheel.md | 99 - .../physics/build-a-hinged-door.md | 164 - .../physics/create-elevators.md | 171 - .../physics/create-moving-objects.md | 294 - .../physics/create-spinning-objects.md | 283 - .../scripting/basic-scripting/deadly-lava.md | 168 - .../scripting/basic-scripting/fading-trap.md | 225 - .../basic-scripting/intro-to-scripting.md | 247 - .../scripting/basic-scripting/score-points.md | 375 - .../create-a-health-pickup.md | 265 - .../create-player-tools.md | 191 - .../hit-detection-with-lasers.md | 1156 - .../intermediate-scripting/save-data.md | 288 - .../ui/create-a-score-bar.md | 133 - .../ui/create-hud-meters.md | 728 - .../use-case-tutorials/ui/interactive-ui.md | 832 - .../ui/proximity-prompts.md | 173 - .../use-case-tutorial-overview.md | 848 - .../vfx/basic-particle-effects.md | 143 - .../vfx/create-volcanoes.md | 674 - .../vfx/create-waterfalls.md | 565 - .../vfx/custom-particle-effects.md | 137 - .../vfx/laser-traps-with-beams.md | 170 - .../vfx/use-particles-for-explosions.md | 170 - .cursor/rules/roblox/en-us/ui/2D-paths.md | 241 - .../roblox/en-us/ui/3D-drag-detectors.md | 493 - .cursor/rules/roblox/en-us/ui/9-slice.md | 113 - .cursor/rules/roblox/en-us/ui/animation.md | 595 - .../roblox/en-us/ui/appearance-modifiers.md | 334 - .cursor/rules/roblox/en-us/ui/buttons.md | 108 - .cursor/rules/roblox/en-us/ui/frames.md | 26 - .../roblox/en-us/ui/grid-table-layouts.md | 89 - .../en-us/ui/in-experience-containers.md | 152 - .cursor/rules/roblox/en-us/ui/index.md | 101 - .cursor/rules/roblox/en-us/ui/labels.md | 77 - .../roblox/en-us/ui/list-flex-layouts.md | 127 - .../roblox/en-us/ui/on-screen-containers.md | 100 - .cursor/rules/roblox/en-us/ui/page-layouts.md | 60 - .../roblox/en-us/ui/position-and-size.md | 207 - .../roblox/en-us/ui/proximity-prompts.md | 179 - .cursor/rules/roblox/en-us/ui/rich-text.md | 285 - .../rules/roblox/en-us/ui/scrolling-frames.md | 74 - .../rules/roblox/en-us/ui/size-modifiers.md | 112 - .../roblox/en-us/ui/styling/compatibility.md | 1012 - .../en-us/ui/styling/css-comparisons.md | 593 - .../rules/roblox/en-us/ui/styling/editor.md | 458 - .../rules/roblox/en-us/ui/styling/index.md | 322 - .../rules/roblox/en-us/ui/text-filtering.md | 101 - .cursor/rules/roblox/en-us/ui/text-input.md | 93 - .../roblox/en-us/ui/ui-drag-detectors.md | 367 - .cursor/rules/roblox/en-us/ui/video-frames.md | 70 - .../rules/roblox/en-us/ui/viewport-frames.md | 153 - .cursor/rules/roblox/en-us/unity.md | 136 - .cursor/rules/roblox/en-us/unreal.md | 139 - .cursor/rules/roblox/en-us/what-is-roblox.md | 242 - .../rules/roblox/en-us/workspace/camera.md | 148 - .../rules/roblox/en-us/workspace/cframes.md | 264 - .../roblox/en-us/workspace/collisions.md | 369 - .cursor/rules/roblox/en-us/workspace/index.md | 116 - .../roblox/en-us/workspace/raycasting.md | 158 - .../rules/roblox/en-us/workspace/streaming.md | 509 - .cursor/rules/shared | 1 + .cursor/rules/vide/.vitepress/config.ts | 83 - .cursor/rules/vide/.vitepress/theme/index.css | 25 - .cursor/rules/vide/.vitepress/theme/index.js | 8 - .cursor/rules/vide/.vitepress/theme/vars.css | 52 - .cursor/rules/vide/api/animation.md | 50 - .cursor/rules/vide/api/creation.md | 152 - .cursor/rules/vide/api/reactivity-core.md | 155 - .cursor/rules/vide/api/reactivity-dynamic.md | 229 - .cursor/rules/vide/api/reactivity-utility.md | 158 - .cursor/rules/vide/api/strict-mode.md | 37 - .cursor/rules/vide/index.md | 22 - .cursor/rules/vide/package.json | 12 - .cursor/rules/vide/public/full_logo.svg | 67 - .cursor/rules/vide/public/logo.svg | 33 - .../rules/vide/tut/advanced/dynamic-scopes.md | 148 - .../vide/tut/crash-course/1-introduction.md | 21 - .../rules/vide/tut/crash-course/10-cleanup.md | 38 - .../tut/crash-course/11-dynamic-scopes.md | 211 - .../rules/vide/tut/crash-course/12-actions.md | 55 - .../vide/tut/crash-course/13-strict-mode.md | 36 - .../vide/tut/crash-course/14-concepts.md | 113 - .../rules/vide/tut/crash-course/2-creation.md | 38 - .../vide/tut/crash-course/3-components.md | 65 - .../rules/vide/tut/crash-course/4-source.md | 38 - .../rules/vide/tut/crash-course/5-effect.md | 71 - .../rules/vide/tut/crash-course/6-scope.md | 88 - .../tut/crash-course/7-reactive-component.md | 60 - .../tut/crash-course/8-implicit-effect.md | 83 - .../vide/tut/crash-course/9-derived-source.md | 93 - .cursor/skills/atlas-playtest/SKILL.md | 120 - .cursor/skills/atlas-push/SKILL.md | 254 - .cursor/skills/shared | 1 + .cursor/sync-sources.ps1 | 155 - .cursor/sync-sources.sh | 120 - .gitmodules | 12 + 9364 files changed, 16 insertions(+), 748422 deletions(-) delete mode 100644 .cursor/commands/luau-optimize.md create mode 160000 .cursor/commands/shared create mode 160000 .cursor/docs/shared delete mode 100644 .cursor/logs/.gitignore delete mode 100644 .cursor/plans/ambiguous_path_handling_f2eaef11.plan.md delete mode 100644 .cursor/plans/ambiguous_paths_audit_fixes_9d3ed6da.plan.md delete mode 100644 .cursor/plans/atlas_daemon_python_bot_be6b0651.plan.md delete mode 100644 .cursor/plans/atlas_fork_isolation_ef1d08fd.plan.md delete mode 100644 .cursor/plans/audit_ambiguous_path_handling_30e99d9a.plan.md delete mode 100644 .cursor/plans/audit_ambiguous_paths_d9495fcc.plan.md delete mode 100644 .cursor/plans/audit_ambiguous_paths_followup_00831072.plan.md delete mode 100644 .cursor/plans/audit_ref_path_system_c21fc130.plan.md delete mode 100644 .cursor/plans/audit_ref_two-way_sync_9e8ce7a8.plan.md delete mode 100644 .cursor/plans/audit_slugify_branch_e913b7dc.plan.md delete mode 100644 .cursor/plans/audit_slugify_pass_3_b11f65a1.plan.md delete mode 100644 .cursor/plans/bump_sync_logging_to_info_3e39ff81.plan.md delete mode 100644 .cursor/plans/cargo_dependency_upgrades_9b14d945.plan.md delete mode 100644 .cursor/plans/changebatcher_encoding_audit_bade61c8.plan.md delete mode 100644 .cursor/plans/compact_json5_arrays_36a8cfab.plan.md delete mode 100644 .cursor/plans/comprehensive_plugin_tests_bdd5b47c.plan.md delete mode 100644 .cursor/plans/connected_mode_test_expansion_5b0c39a3.plan.md delete mode 100644 .cursor/plans/consolidate_filesystem_name_for_f2bdef69.plan.md delete mode 100644 .cursor/plans/dedup_suffix_start_at_2_89e66bf2.plan.md delete mode 100644 .cursor/plans/destructive_syncback_mode_acb8cb54.plan.md delete mode 100644 .cursor/plans/extension-free_ref_paths_b9a68637.plan.md delete mode 100644 .cursor/plans/fix_audit_findings_ca70f773.plan.md delete mode 100644 .cursor/plans/fix_audit_pass_2_c72b80c5.plan.md delete mode 100644 .cursor/plans/fix_infinity_comparison_71fd9057.plan.md delete mode 100644 .cursor/plans/fix_live_syncback_service_properties_d7c2c927.plan.md delete mode 100644 .cursor/plans/fix_ref_audit_issues_746c0c25.plan.md delete mode 100644 .cursor/plans/fix_ref_audit_round_2_07d615d1.plan.md delete mode 100644 .cursor/plans/fix_ref_audit_round_3_f8ae0e39.plan.md delete mode 100644 .cursor/plans/fix_stale_tree_desync_9e74f718.plan.md delete mode 100644 .cursor/plans/fix_stem-level_dedup_8fa9a015.plan.md delete mode 100644 .cursor/plans/fix_sync_system_issues_e569840d.plan.md delete mode 100644 .cursor/plans/fix_test_port_toctou_86726cb4.plan.md delete mode 100644 .cursor/plans/git-based_sync_defaults_be6371b6.plan.md delete mode 100644 .cursor/plans/git-style_change_metadata_9d8c8345.plan.md delete mode 100644 .cursor/plans/git_sync_defaults_audit_557237e0.plan.md delete mode 100644 .cursor/plans/live_syncback_audit_fixes_561d17c7.plan.md delete mode 100644 .cursor/plans/live_syncback_float_precision_1be79350.plan.md delete mode 100644 .cursor/plans/luau-optimize_cursor_command_ce1448a8.plan.md delete mode 100644 .cursor/plans/luau-style_ref_paths_845083e1.plan.md delete mode 100644 .cursor/plans/matching_algorithm_parity_01524d4c.plan.md delete mode 100644 .cursor/plans/matching_cost_semantics_376e45e2.plan.md delete mode 100644 .cursor/plans/matching_session_caching_cbfa7bda.plan.md delete mode 100644 .cursor/plans/mcp_get_script_endpoint_4c4e80af.plan.md delete mode 100644 .cursor/plans/mcp_sync_endpoint_enhancement_20ff55ce.plan.md delete mode 100644 .cursor/plans/merge_plugin_upload_workflow_0943cf6c.plan.md delete mode 100644 .cursor/plans/merge_ui_button_changes_6608afe8.plan.md delete mode 100644 .cursor/plans/nuke_path_encoding_migration_7dfffc4d.plan.md delete mode 100644 .cursor/plans/parallel_filesystem_io_39399341.plan.md delete mode 100644 .cursor/plans/parallel_io_audit_fixes_35f49f83.plan.md delete mode 100644 .cursor/plans/port_mcp_studio_tools_5135a181.plan.md delete mode 100644 .cursor/plans/pull_removed_scripts_feature_dd790311.plan.md delete mode 100644 .cursor/plans/reconciler_robustness_overhaul_2f440e06.plan.md delete mode 100644 .cursor/plans/ref_audit_round_4_test_coverage.plan.md delete mode 100644 .cursor/plans/ref_path_and_dedup_integration_81a47dfe.plan.md delete mode 100644 .cursor/plans/remove_plugin_animations_f4a43647.plan.md delete mode 100644 .cursor/plans/rewrite_matching_algorithm_df45bbe1.plan.md delete mode 100644 .cursor/plans/rojo_syncback_architecture_fix_bc0c13ab.plan.md delete mode 100644 .cursor/plans/rokit_install_audit_fixes_e465275a.plan.md delete mode 100644 .cursor/plans/schema_struct_refactor_6dddb54b.plan.md delete mode 100644 .cursor/plans/script_index_pruning_999b5d04.plan.md delete mode 100644 .cursor/plans/script_naming_refactor_424e3277.plan.md delete mode 100644 .cursor/plans/stress_tests_two-way_sync_baeda112.plan.md delete mode 100644 .cursor/plans/strip_dedup_suffix_automatically_3d35c847.plan.md delete mode 100644 .cursor/plans/sync_vscode-rojo_schemas_6f3a7b26.plan.md delete mode 100644 .cursor/plans/syncback_auto-downloader_0508b4bb.plan.md delete mode 100644 .cursor/plans/syncback_roundtrip_tests_f980a65b.plan.md delete mode 100644 .cursor/plans/syncback_via_rbxm_ad0231a7.plan.md delete mode 100644 .cursor/plans/two-way_sync_integration_tests_0e4e4dfc.plan.md delete mode 100644 .cursor/plans/two-way_sync_refs_6e154eef.plan.md delete mode 100644 .cursor/plans/update_audit_and_rules_0625423a.plan.md delete mode 100644 .cursor/plans/vfs_staleness_test_fixtures_dcde048f.plan.md delete mode 100644 .cursor/prompts/Ambiguous Path Handling.txt delete mode 100644 .cursor/rules/luau-rfcs/CNAME delete mode 100644 .cursor/rules/luau-rfcs/_config.yml delete mode 100644 .cursor/rules/luau-rfcs/abstract-module-paths-and-init-dot-luau.md delete mode 100644 .cursor/rules/luau-rfcs/amended-require-resolution.md delete mode 100644 .cursor/rules/luau-rfcs/behavior-eq-metamethod.md delete mode 100644 .cursor/rules/luau-rfcs/behavior-stricter-utf8-library.md delete mode 100644 .cursor/rules/luau-rfcs/change-global-version.md delete mode 100644 .cursor/rules/luau-rfcs/config-luauconfig.md delete mode 100644 .cursor/rules/luau-rfcs/config-luaurc.md delete mode 100644 .cursor/rules/luau-rfcs/const-keyword.md delete mode 100644 .cursor/rules/luau-rfcs/deprecate-getfenv-setfenv.md delete mode 100644 .cursor/rules/luau-rfcs/deprecate-table-getn-foreach.md delete mode 100644 .cursor/rules/luau-rfcs/disallow-proposals-leading-to-ambiguity-in-grammar.md delete mode 100644 .cursor/rules/luau-rfcs/explicit-type-parameter-instantiation.md delete mode 100644 .cursor/rules/luau-rfcs/function-bit32-byteswap.md delete mode 100644 .cursor/rules/luau-rfcs/function-bit32-countlz-countrz.md delete mode 100644 .cursor/rules/luau-rfcs/function-buffer-bits.md delete mode 100644 .cursor/rules/luau-rfcs/function-coroutine-close.md delete mode 100644 .cursor/rules/luau-rfcs/function-debug-info.md delete mode 100644 .cursor/rules/luau-rfcs/function-inlining.md delete mode 100644 .cursor/rules/luau-rfcs/function-math-lerp.md delete mode 100644 .cursor/rules/luau-rfcs/function-math-map.md delete mode 100644 .cursor/rules/luau-rfcs/function-string-pack-unpack.md delete mode 100644 .cursor/rules/luau-rfcs/function-table-clear.md delete mode 100644 .cursor/rules/luau-rfcs/function-table-clone.md delete mode 100644 .cursor/rules/luau-rfcs/function-table-create-find.md delete mode 100644 .cursor/rules/luau-rfcs/function-table-freeze.md delete mode 100644 .cursor/rules/luau-rfcs/function-vector-lerp.md delete mode 100644 .cursor/rules/luau-rfcs/generalized-iteration.md delete mode 100644 .cursor/rules/luau-rfcs/generic-function-subtyping.md delete mode 100644 .cursor/rules/luau-rfcs/generic-functions.md delete mode 100644 .cursor/rules/luau-rfcs/index-type-operator.md delete mode 100644 .cursor/rules/luau-rfcs/index.md delete mode 100644 .cursor/rules/luau-rfcs/keyof-type-operator.md delete mode 100644 .cursor/rules/luau-rfcs/len-metamethod-rawlen.md delete mode 100644 .cursor/rules/luau-rfcs/local-type-inference.md delete mode 100644 .cursor/rules/luau-rfcs/lower-bounds-calculation.md delete mode 100644 .cursor/rules/luau-rfcs/luau-mascot.md delete mode 100644 .cursor/rules/luau-rfcs/mascot.png delete mode 100644 .cursor/rules/luau-rfcs/math-constants.md delete mode 100644 .cursor/rules/luau-rfcs/math-isnan-isfinite-isinf.md delete mode 100644 .cursor/rules/luau-rfcs/metatable-type-functions.md delete mode 100644 .cursor/rules/luau-rfcs/method-type-issubtypeof.md delete mode 100644 .cursor/rules/luau-rfcs/negation-types.md delete mode 100644 .cursor/rules/luau-rfcs/never-and-unknown-types.md delete mode 100644 .cursor/rules/luau-rfcs/new-nonstrict.md delete mode 100644 .cursor/rules/luau-rfcs/new-require-by-string-semantics.md delete mode 100644 .cursor/rules/luau-rfcs/property-readonly.md delete mode 100644 .cursor/rules/luau-rfcs/property-writeonly.md delete mode 100644 .cursor/rules/luau-rfcs/rawget-type-operator.md delete mode 100644 .cursor/rules/luau-rfcs/recursive-type-restriction.md delete mode 100644 .cursor/rules/luau-rfcs/relax-recursive-type-restriction.md delete mode 100644 .cursor/rules/luau-rfcs/require-by-string-aliases.md delete mode 100644 .cursor/rules/luau-rfcs/reserve-dollar-sign.md delete mode 100644 .cursor/rules/luau-rfcs/sealed-table-subtyping.md delete mode 100644 .cursor/rules/luau-rfcs/shared-self-types.md delete mode 100644 .cursor/rules/luau-rfcs/support-for-generic-function-types-in-user-defined-type-functions.md delete mode 100644 .cursor/rules/luau-rfcs/support-for-thread-and-buffer-types-in-user-defined-type-functions.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-array-like-table-types.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-attribute-functions-deprecated.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-attribute-functions-native.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-attributes-functions-parameters.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-attributes-functions.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-compound-assignment.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-continue-statement.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-default-type-alias-type-parameters.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-floor-division-operator.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-if-expression.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-leading-bar-and-ampersand.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-named-function-type-args.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-number-literals.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-property-access-modifiers.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-singleton-types.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-string-interpolation.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-type-alias-type-packs.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-type-ascription-bidi.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-type-ascription.md delete mode 100644 .cursor/rules/luau-rfcs/syntax-typed-variadics.md delete mode 100644 .cursor/rules/luau-rfcs/type-ascription-by-inhabitance.md delete mode 100644 .cursor/rules/luau-rfcs/type-byte-buffer.md delete mode 100644 .cursor/rules/luau-rfcs/type-error-suppression.md delete mode 100644 .cursor/rules/luau-rfcs/type-long-integer.md delete mode 100644 .cursor/rules/luau-rfcs/types-library-optional.md delete mode 100644 .cursor/rules/luau-rfcs/udtf-is-extern.md delete mode 100644 .cursor/rules/luau-rfcs/unsealed-table-assign-optional-property.md delete mode 100644 .cursor/rules/luau-rfcs/unsealed-table-literals.md delete mode 100644 .cursor/rules/luau-rfcs/unsealed-table-subtyping-strips-optional-properties.md delete mode 100644 .cursor/rules/luau-rfcs/user-defined-type-functions.md delete mode 100644 .cursor/rules/luau-rfcs/vector-library-vector2-constructor.md delete mode 100644 .cursor/rules/luau-rfcs/vector-library.md delete mode 100644 .cursor/rules/luau.mdc delete mode 100644 .cursor/rules/luau/getting-started/compatibility.md delete mode 100644 .cursor/rules/luau/getting-started/intro.md delete mode 100644 .cursor/rules/luau/getting-started/lint.md delete mode 100644 .cursor/rules/luau/getting-started/syntax.md delete mode 100644 .cursor/rules/luau/getting-started/why.md delete mode 100644 .cursor/rules/luau/guides/performance.md delete mode 100644 .cursor/rules/luau/guides/profile.md delete mode 100644 .cursor/rules/luau/guides/sandbox.md delete mode 100644 .cursor/rules/luau/index.mdx delete mode 100644 .cursor/rules/luau/reference/grammar.md delete mode 100644 .cursor/rules/luau/reference/library.md delete mode 100644 .cursor/rules/luau/reference/types-library.md delete mode 100644 .cursor/rules/luau/types/basic-types.md delete mode 100644 .cursor/rules/luau/types/considerations.md delete mode 100644 .cursor/rules/luau/types/generics.md delete mode 100644 .cursor/rules/luau/types/object-oriented-programs.md delete mode 100644 .cursor/rules/luau/types/overview.md delete mode 100644 .cursor/rules/luau/types/refinements.md delete mode 100644 .cursor/rules/luau/types/roblox-types.md delete mode 100644 .cursor/rules/luau/types/tables.md delete mode 100644 .cursor/rules/luau/types/type-functions.md delete mode 100644 .cursor/rules/luau/types/unions-and-intersections.md delete mode 100644 .cursor/rules/persona.mdc delete mode 100644 .cursor/rules/python.mdc delete mode 100644 .cursor/rules/roblox-api/Full-API-Dump.json delete mode 100644 .cursor/rules/roblox.mdc delete mode 100644 .cursor/rules/roblox/common/navigation/analytics.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/assets.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/avatar/guides.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/avatar/tutorials-accessories.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/avatar/tutorials-bodies.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/avatar/tutorials-clothing.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/avatar/tutorials.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/cloud/guides.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/cloud/reference.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/documentation.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/education.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/guides.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/reference.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/resources.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/studio.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-animator.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-artist.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-building.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-coding.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-core.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-ea.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-fundamentals.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-gs.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-studio.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials-ui.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/engine/tutorials.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/monetize.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/platform.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/programs.yaml delete mode 100644 .cursor/rules/roblox/common/navigation/scale.yaml delete mode 100644 .cursor/rules/roblox/en-us/affiliates.md delete mode 100644 .cursor/rules/roblox/en-us/ai-data-sharing.md delete mode 100644 .cursor/rules/roblox/en-us/animation/capture.md delete mode 100644 .cursor/rules/roblox/en-us/animation/curve-editor.md delete mode 100644 .cursor/rules/roblox/en-us/animation/editor.md delete mode 100644 .cursor/rules/roblox/en-us/animation/events.md delete mode 100644 .cursor/rules/roblox/en-us/animation/index.md delete mode 100644 .cursor/rules/roblox/en-us/animation/inverse-kinematics.md delete mode 100644 .cursor/rules/roblox/en-us/animation/using.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/accessory-fitting-tool.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/automatic-skinning-transfer.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/body-scale.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/caging-best-practices.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/clothing-export-settings.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/clothing-specifications.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating-rigid/converting.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating-rigid/exporting.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating-rigid/importing.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating-rigid/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating-rigid/modeling-setup.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating-rigid/publishing.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating-rigid/texturing.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/armature-setup.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/caging-setup.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/converting.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/exporting.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/importing.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/modeling-setup.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/modify-cage.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/sculpting.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/test-poses.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/texture-map.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/texture-painting.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/trimming.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/unwrapping.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/creating/watertight.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/export-settings.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/from-existing.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/import-clothing.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/importing.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/layered-clothing.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/project-files.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/publish-eyebrows-eyelashes.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/rig-and-cage-existing-models.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/specifications.md delete mode 100644 .cursor/rules/roblox/en-us/art/accessories/validation-tool.md delete mode 100644 .cursor/rules/roblox/en-us/art/blender.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/blender-configurations.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/caging.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/combine-head-geometry.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/export-character.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/export-textures.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/final-checks.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/head-objects.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/modeling-best-practices.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/modeling-tips.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/remove-extra-bones.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/sculpting.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/template-files.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/texturing-eyes.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/texturing-face.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/texturing-pbr.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/texturing-setup.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/creating/verify-attachments.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/export-avatar-animations-from-maya.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/export-settings.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/face-caging-best-practices.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/facial-animation/animate-heads.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/facial-animation/create-basic-heads.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/facial-animation/create-face-accessories.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/facial-animation/facs-poses-reference.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/facial-animation/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/facial-animation/moods.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/facial-animation/use-heads-in-studio.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/head-comparison.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/head-specifications.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/head-validation.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/import.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/manually-update-catalog-heads.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/project-files.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/specifications.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/testing/blender.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/testing/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/testing/studio.md delete mode 100644 .cursor/rules/roblox/en-us/art/characters/validation-tool.md delete mode 100644 .cursor/rules/roblox/en-us/art/classic-clothing.md delete mode 100644 .cursor/rules/roblox/en-us/art/emotes/export-settings.md delete mode 100644 .cursor/rules/roblox/en-us/art/emotes/import.md delete mode 100644 .cursor/rules/roblox/en-us/art/emotes/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/emotes/specifications.md delete mode 100644 .cursor/rules/roblox/en-us/art/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/3d-importer.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/assign-textures.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/calisthenics-tool.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/export-requirements.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/gltf-export.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/index.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/material-reference.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/project-files.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/reimport.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/rig-a-humanoid-model.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/rig-a-simple-mesh.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/rigging.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/roblox-blender-plugin.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/skin-a-humanoid-model.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/skin-a-simple-mesh.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/specifications.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/surface-appearance.md delete mode 100644 .cursor/rules/roblox/en-us/art/modeling/texture-specifications.md delete mode 100644 .cursor/rules/roblox/en-us/art/overview-dcc.md delete mode 100644 .cursor/rules/roblox/en-us/art/overview-studio.md delete mode 100644 .cursor/rules/roblox/en-us/art/reaper.md delete mode 100644 .cursor/rules/roblox/en-us/art/test-classic-clothing.md delete mode 100644 .cursor/rules/roblox/en-us/art/upload-classic-clothing.md delete mode 100644 .cursor/rules/roblox/en-us/art/validation-errors.md delete mode 100644 .cursor/rules/roblox/en-us/assets.md delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/1_lc-blender-unhide-cages.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/2_lc-blender-import-tshirt.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/3_lc-blender-parenting-a-mesh.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/4_lc-blender-outliner-cleanup.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/5_lc-blender-adjusting-viewport-settings.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/6_lc-blender-adjusting-outer-cage-vertices.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/7_lc-adjusting-multiple-vertices.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/8_lc-blender-finished-outer-cage.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/Avatar-Item-Creation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/Layered-Clothing-Banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/Layered-Clothing-Banner2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Accessory-Setup-Menu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Animation-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Animation-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Asset-Type-Dropdown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Autoskin-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Body-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Body-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Bounding-Box-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Bounding-Box-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Cage-Editing-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Cage-Editing-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Center-Mannequin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Clothing-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Clothing-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Custom-Asset-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Custom-Asset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Edit-Vertex-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Expand-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Generate-Legacy-Accessory.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/LC-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Layered-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/MeshPart-Selected.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Preview-Display.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Rigid-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Rigid-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/1-Uneven-Cage-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/1-Uneven-Cage-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/10-Even-Spacing-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/10-Even-Spacing-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/11-Positioning-Along-Joints.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/13-Cage-Missing-Parts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/14-Outer-Inside-Inner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/15-Orbitting-Accessory-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/15-Orbitting-Accessory-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/3-Clothing-Under-Inner-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/3-Clothing-Under-Inner-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/4-Outer-Not-Fully-Covering-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/4-Outer-Not-Fully-Covering-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/6-Oversized-Cage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/8-Symmetry.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/9-Stacking-Vertices.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Block-Avatar-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Block-Avatar-Dressed.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Classic-Clothing-Templates.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Pants-Template-Bad.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Pants-Template-Good.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Template-Pants-R15.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Template-Shirts-R15.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Types-of-classic-clothing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-blender-append-cages.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-blender-append.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-blender-hide-symbol.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-blender-selecting-cage-in-outlier.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-blender-template-opened.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-blender-workspace-cages.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-requirements-innercage-outliner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-requirements-innercage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-requirements-maya-settings-with-animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-requirements-maya-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-requirements-outercage-outliner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/lc-requirements-outercage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/reference-files/Additional-FBX-assets.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/reference-files/Bow-rigid.rbxm delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/reference-files/Caging-examples.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/reference-files/Tshirt-caged.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/reference-files/Tshirt-model.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Add-On-Preferences.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Enable-Add-On.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Failed-Check-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Failed-Check-Viewport.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Sidebar-Indicator.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Validation-Tool-Opened.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Validation-Tool.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Mac-Right-Click-Install.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Command-Prompt-Success.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Install-Prompt-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Install-Python-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Script-Editor-Menu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Script-Editor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Shortcut.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Validation-Tool-Opened.png delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/ValidationTool_Blender.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/accessories/validation-tool/ValidationTool_Maya.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/acquisition/New-Users-Funnel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/acquisition/Qualified-Play-Through-Rate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/acquisition/Share-Link-Acquisition-Dashboard.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/acquisition/Unique-Users-by-Source.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/acquisition/conversion.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/acquisition/qualified-playthrough-rate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/acquisition/traffic-sources.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Explore-Mode-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Explore-Mode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Metrics-Unavailable.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/benchmark-similar-exp.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/benchmark-transition.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/bans/bans-overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/configs-history.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/configs-overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/configs-publish.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/configs-studio.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/experiment-confidence.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/experiment-details.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/experiment-mde.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/experiment-overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/experiment-results.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/experiment-variant-place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/configs/experiment-variant.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/demographics/analytics-demographics.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/developer-stats/Chart-Visits.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/developer-stats/Live-Stats.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/discovery/Below-Benchmark-Charts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/discovery/Daily-Benchmark-Graphs.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/discovery/Experience-Overview-Graph.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/discovery/Explore-And-Expand-Graph.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/discovery/Home-Recommendation-Impressions.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/discovery/Qualified-Play-Through-Impressions.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/discovery/Qualified-Play-Through-Rate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/discovery/Retrieval-And-Ranking-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/discovery/Similar-Experiences.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/error-report/error-report-graph.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/error-report/error-report-table.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/All-Sources-Sinks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Average-Wallet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Aggregations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Breakdown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Graph.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Event-Tracking.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Overview-Economy-Funnels.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Funnel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Prompts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Warning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Top-Sources-Sinks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/event-types/Total-Sources-Sinks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/AnalyticsAssistantFeedbackReport.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/AnalyticsFeedbackAssistant.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/Date-Range-Selector.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/Detailed-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/Export-Chart-Data.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/Export-Detailed-Data.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Breakdown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Options-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Widget.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/feedback/Relative-Percentage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/monetization/monetization-overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/Achievements.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsAssistantInsights.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsAssistantReport.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsInsights.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/Benchmarks-Similar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/Insights.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/Roblox_Analytics_Insights.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/avatar-sales-and-revenue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/step1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/step2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/step3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/overview/watchlist.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/client-api-calls.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/client-performance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/perf-client-crashes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-dev.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-drilldown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-filter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-micro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-ui.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/perf-place-version-filter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/performance/server-stats.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/retention/AnalyticsRetentionChart.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/retention/CohortAnalysis.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/retention/CohortAnalysis2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/sales-data-calendar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/analytics/sales-of-good.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Add-Multiple-Keyframes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Add-Event.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Bar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Edit-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-In-Timeline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-Pasted.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-Selected.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Poses.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Animation-Name.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-File-Menu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-First-Key.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Last-Key.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Looping.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Next-Key.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Pause.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Position-Indicator.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Preview-Reverse.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Previous-Key.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Create-Animation-Dialog.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Easing-Cubic.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Easing-Linear.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Editor-Sections-Labeled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Migrate-Animations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimization-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimization-Slider.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimize-Keyframes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Saved-Animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Scrubber-0-15.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Final-Keyframe.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Multiple-Keyframes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Single-Keyframe.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Expand-Contract.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Keyframe.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Options-Menu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Scrubber-Bar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Time-Units.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-Keyframe-Added.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Add-Tracks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-IK-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Rig-Name.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Track-Name.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Track-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Convert-Euler-Angles.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Convert-Quaternion-Angles.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Curve-Editor-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Dope-Sheet-Editor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Euler-Angle-Curve-Tangents.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Euler-Angle-Curve.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Gear-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Interpolation-Mode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Opening-Curve-Editor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Quaternion-Curve-Interpolation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Quaternion-Curve-Tangents.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/Tangent.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/curve-editor/UI-Overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Bake-Animation.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Export-All.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/FBX-File-Format.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Importing-From-FBX-Animation.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Loaded-and-AutoLoad-Radio-Buttons.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Moving-Rig.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Mute-Selected.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Muted-TranslateZ.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Opening-GraphEditor-and-TimeSlider.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Overview-Mannequin.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Plugin-Manager.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/R15-Mannequin-Rig.ma delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Time-Marker.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/face-recorder/Countdown-Button.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/face-recorder/Face-Recorder-Button.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/face-recorder/Face-Recorder.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/face-recorder/Ready-Button.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Birdcaller-Imported.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Custom-Puffer-Blender.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Hierarchy-Birdcaller-Blender-Bones.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Hierarchy-Custom-Blender-Bones.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Add-Attachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Body-Part.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Drag-Accessory.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Drag-Hand.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Explorer-Humanoid.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Humanoid-Add.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-IKControl-Property.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Move-Attachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Place-Hand.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Uneven-Surfaces.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/ball-socket-constraint.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-natural-pose.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-primary-axis.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-unnatural-pose.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/hinge-constraint.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-cone.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-primary-axis.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-unnatural-pose.png delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/live-animation-creator/Live-Animation-Creator.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/animation/live-animation-creator/Media-Playback-Controls.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/After-Unwrap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Before-Unwrap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/BlenderFileView-Export.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/BlenderFileView-Import.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/ColorAttribute.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/CubeMap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/CubeProjection.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Edge.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/ExampleTexture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Face.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/FollowActiveQuads.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Layout_Workspace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/MM-Tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/MS-Seams-Gun.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/MS-UVMap-Gun.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Modeling_Workspace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/NavigationGizmo.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/NoTexture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Sculpting_Workspace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/SmartUVProject.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Snapping.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Studio-Import.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Subdivide-Panel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/TexturePaint_Workspace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/UV-Cube.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/UVEditing_Workspace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-NoColor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-WithColor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-WithTexture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/Vertex.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/ViewSelector.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/WithTexture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/bel-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/delete-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/dissolve-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/extrude-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/fill-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/grab-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/inset-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/nffe-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/snap-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/blender/subdivide-tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/ArrangeArea.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-CompressionBar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-ReaComp.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-Threshold.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compression.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/EQ.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Equalize-ReaEQ.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Equalize-Type.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/FXPlugins.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-Crop.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-CurveType.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-Transition.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/FileRender.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-LoopPoint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-MoveClips.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-Play.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-Split.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loops.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/MixerControlPanel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoCompression.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoEQ.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoLoops.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoNoiseReduction.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoTransitions.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoVariations.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Noise-ReaFir.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Noise-Subtract.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoiseReduction.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/RenderToFileSettings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Timeline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Toolbar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/TrackControlPanel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Transitions.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/TransportBar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations-Copies.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations-ItemProperties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations.ogg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Additional-Caging-Examples.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Basic-Mesh-Combined-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Basic-Mesh-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Basic-Texture-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Body-Scale-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Cap-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Cap-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Cap-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Cap-D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Generic-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Helmet-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Helmet-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Helmet-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Helmet-D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Helmet-E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/RobloxBlenderPluginDemo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Shrine-Detailed.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Thumbnail-Buttes.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Thumbnail-Looping.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Thumbnail-Radial.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Thumbnail-Shrine.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Thumbnail-Tinting.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/Traffic-Cone.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/ValidationTool_V2.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/AFT-Eyebrows-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Anime-Girl-Eyebrows-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Attachment-Data-Model-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Attachment-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Eyebrows-Eyelashes-Only.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Face-Accessory-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Inner-Cage-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Mesh-Bow-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Mesh-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Nature-Girl-No-Accessories.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Nature-Girl-With-Face-Accessories.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Outer-Cage-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Rigging-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Rigging-Pose-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Texture-Applied-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Texture-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Workflow-Layered.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/Workflow-Rigid.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/3D-Importer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Add-Avatar-Panel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Select-Mesh.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Select-Type.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-New-Material.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-PBR.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-Surface-Appearance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Albedo-Node.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Apply-Transforms.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Empty-Node.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Mask-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-New-Material.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Scale-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Blender.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Modeling-Complete.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Studio.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Texturing-Complete.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Texturing-Complete.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Complete-Border.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Converting.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Copy-Marketplace-URL.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Exporting.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Fitting-Mask.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/General-Shape.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Horizontal-Loop-Cuts.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Importing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Marketplace-Listing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Marking-3d-Object.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Metal-Node.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Modeling-Complete.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Normal-Node.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Outliner-Save-To-Roblox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Painting-2d-Map.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing-Moderation-Pending.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing-Ready-For-Sale.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Export.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Model-Only.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Textures.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Texturing-Completed.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rough-Node.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rounded-Lid.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Scaling-FBX-Import.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Side-Insets.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Studio-Mask-Preview-Cropped.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Studio-Mask-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Surface-Appearance-Asset-Dropdown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_ALB.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_MET.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_NOR.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_RGH.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Testing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Texturing-Complete.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/UV-Projecting.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Validation-Successful.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Vertical-Loop-Cuts.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Complete.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Outer-Cage-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Outliner-Setup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_02.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_03.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Example-Product.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Accessory-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Clothing-In-Studio.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Clothing-in-Studio-Highlight.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Long_Sleeve_Export.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Cage-Copied.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Cages-Selected.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Clear-Vertex-Colors.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Complete-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Mannequin-Start.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-No-Modifier.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Positioning-and-Scaling.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-SubDiv-Modifier.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Wireframe-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_00.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_02.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_03.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_04.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_05.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_06.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_07.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_08.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Append-Browser.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Armature-Appended.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Auto-Weights.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Bones-In-Front.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Freeze-Transforms.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Pose-Tests.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_02.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_03.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Add-Base.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Add-Image.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Complete-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Complete.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Start.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-UV-Maps.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_02.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_03.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_04.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Watertight-Bottom.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/accessories/creating/Watertight-Top.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antenna.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antlers-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antlers-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Demon-Horns-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Demon-Horns-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Feathers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Glasses.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Horn-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Horn-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Robot-Arms.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Skin-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Sunglasses.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tail-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tail-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tattoos.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Whiskers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Wings-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Acc-Wings-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Attachments-Data-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Attachments-Visual.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Avatar-3D-Importer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Data-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Item-Creation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Rig-Scale.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Roughness-Map.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Studio-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Surface-Appearance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Blender-Save-Image-Workaround.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Blocky-All.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Blocky-Cage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Blocky-Head.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Bodies-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Bodies-Tutorial.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Body-Parts-Data-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Body-Parts-Visual.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Face-Offset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmarks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Mesh-Data-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Mesh-Visual.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Reference-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Reference-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-Template-Lineup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Cage-With-Landmarks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Cages.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Collapsed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Joints.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Classic-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Tutorial-Blender.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Tutorial-Studio.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Component-Attachments.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Component-Body-Parts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Component-Cage-Mesh.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Component-Facial-Animation-Data.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Component-Rigging.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Component-Texture-Map.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/DCC-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Delete-Vertex-Colors.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Eye-Closed-Success.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Face-Default.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Face-Landmarks-Poor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Face-Landmarks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Facial-Animation-Timeline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Facial-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Facial-Rig-Visual.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Horn-All.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Horn-Cage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Horn-Head.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Invalid-Visibility.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Landmarks-Fail-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Landmarks-Fail-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-F.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Missing-Landmarks-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Missing-Landmarks-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-C-Cyber.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-C-Giga.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Claire.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Clawed-Companion.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-D-Greaser.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-D-Tela.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-E-Great-Bear.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-E-Polar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-F-Scare.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-F-Scarlett.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-G-Dragon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-G-Teddy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Gang-O-Fries.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-H-Bungling.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-H-Pumpkin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Ivory.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Mr-Toilet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Skeleton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Upper-Torso-Back.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Variations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Mouth-Vertices-Warning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Projection-Side.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Rigging-Data-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Rigging-Visual.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Rigid-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Tattoo-Samy-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Tattoo-Samy-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Textures-Blue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Textures-Brown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Tutorial-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Valid-Visibility.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool-Test.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Workflow-Bodies-Templates.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/Workflow-Bodies-Traditional.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Blender-Animation-Start-End.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging-Outer-Cage-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging-Symmetry-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_02.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_03.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_04.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Disconnect-Node.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Mix-Node.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Node-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Object-Select.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_01-1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_02.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Color_Picker_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyebrow-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyebrow-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyes-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyes-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Mouth-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Mouth-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Nasolabial-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Nasolabial-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Export-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Exporting-Pack-Resources.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Exporting_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Attachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Caging.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Sculpting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Tutorial.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Attachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Caging.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Sculpting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Texturing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Tutorial.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting-Crash-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_02.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_03.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_04.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_06.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_07.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Select-Bone-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Select-Joint-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Template-Face-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-3d-Importer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Animation-Timeline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Asset-Upload.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Avatar-Test-Place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Clothing-Try-On.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Clothing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Custom-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Emotes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Face-Animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Lighting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Outdoor-Environment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Ramps.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Rig-Type.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Skin-Tone.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-StarterPlayer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Studio.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Surface-Appearance-Applied.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Surface-Appearance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Clothing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Emote.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Face.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Lighting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Movement.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Skin-Tone.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Water.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_02.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_03.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Resolution-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Resolution-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Symmetry-Tool-Setting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Inner-Eye.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Outer-Brush-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Pupil-Brush-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Shadow-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Wireframe-Toggle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-X-Symmetry.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_01.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_02.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_03.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_04.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_05.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_06.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_07.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_08.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_09.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_10.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_11.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/20_406000958.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/8bitHeartFace_2568799765.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AdorablePuppy_11389372.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Adoration_28878297.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Aghast_9250633.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AlexandraNinniflipFace_2553655919.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AlienAmbassador_11913700.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Alien_31317701.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Alright_7131541.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AmeliaFace_293302465.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AndThenWellTakeOverTheWorld_12732366.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Angelic_45084008.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AngryZombie_173789114.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Anguished_8560975.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AnimeSurprise_416846300.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AstralIsleClanWindsorTheBlueFace_2627730985.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AtlanteanWarriorFace_3241221587.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AuroraSparkFace_2979703241.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwesomeFace_30394850.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwkwardEyeroll_150182378.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwkwardGrin_150182501.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BadDog_10678423.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BadNewsFace_268603331.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bakonette_7243836687.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BallerinaFace_2571850406.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bandage_20418682.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BattleReadyKenjiFace_3116216863.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BeastMode_128992838.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BeekeeperFace_2553407112.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BigGrinTaiVerdes_7987180607.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BigSadEyes_391496223.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BiohazardFirstResponderFace_4927805902.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BirdOfPrey_10907547.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Biteymcface_743690770.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Blerg_12777646.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bling_25975243.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Blinky_7506135.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlizzardBeastMode_209995252.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueAmazeface_835095003.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueBubbleTrouble_330296924.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueEyeroll_323191979.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueGalaxyGaze_440739518.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueGoof_1191162013.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueMoonstruck_878941449.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueRockStarSmile_1428409936.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueStarface_119812715.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueStarrySight_2222775067.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueTrance_244160970.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueUltimateDragonFace_1772529256.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueWistfulWink_583721561.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueeyedAwesomeFace_386188363.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bluffing_147144673.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bored_66330106.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Braces_30394484.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BubbleTrouble_19264845.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Butterfly_24727929.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Camoface_24441888.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CaretUnderscoreCaret_15366173.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CaseysFace_301827157.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CatEyeZaraLarsson_7893455671.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CatchingSnowflakes_1213472762.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChampionOfTheTideFace_3381167752.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CheerfulGrin_33321848.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CheerfulHello_362051644.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChesterFinkletonFace_2648884861.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChichiriTheWiseYoukaiFace_3210252812.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChillMccool_376813144.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Chill_7074764.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChippyMctooth_7317769.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Chubs_7076110.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CityLifeManFace_2490662812.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CityLifeWomanFace_2492678267.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClairesFace_301827089.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicAlienFace_159199178.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicFemaleFace_4018627046.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicFemaleV2Face_4637266368.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicGoof_7074661.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicMaleFace_4018617474.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicVampire_7074836.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClownFace_23644960.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClownSchoolDropout_21392863.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonApostropheCloseParenthesis_15133453.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashBackslash_15471035.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashO_7317773.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashQuestionMark_15858152.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashSlash_7075469.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonOpenBracket_15470193.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Commando_10527010.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Concerned_9250660.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CountryMorning_51241522.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrankAndZapMechFace_5885801791.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrazyAbstractArtist_10907546.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrazyHappy_45515121.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Crazybot10000_554650579.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonEvilEye_1016184756.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonLaserVision_45514606.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonStarface_162200633.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Crybaby_2620506513.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cuckookrazybot10000_554663025.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CuteKitty_11389441.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cutiemouse_15885121.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cyanskeleface_2845815452.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CyndiFace_2535415411.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/D1_16132514.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/D_14812981.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DaringBeard_110288809.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DaringBlondeBeardFace_323191430.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Daring_8329690.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DarkAgeApprenticeFace_2510119972.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DashUnderscoreDash_15637848.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Daydreaming_29296146.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DdottySmile_667681953.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DeathsGrin_880471415.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DementedMouse_12188176.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dequal_17138027.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DesertCommando_323191683.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DevilNasXLilNasXLNX_7657657626.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DevilishSmile24kGoldn_9156271739.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DexsFace_807335973.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DiamondGrillLilNasXLNX_7657627637.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DigitalArtistFace_2936946480.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DigitalShockArtistFace_2936946480.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DisapprovingUnibrow_66330360.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DisbeliefFace_34186804.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Disbelief_20337343.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DistaughtAlienInvader_11913668.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DiyCardboardKnightFace_2517411290.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DizzyFace_10907551.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DjDatabazeFace_3091071034.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DollarDotDollar_10831558.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DominoDeckardFace_6653133806.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DontWakeMeUp_343619993.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Downcast_21352013.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dr.FiaTyfoidFace_3410486318.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrBuntonMadmindFace_2807218396.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrLaurenArtifactExcavatorFace_2510140104.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dragonface_12908359.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrillSergeant_141728899.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DroolingNoob_24067718.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DruidOfTheStagFace_3131093524.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EggCrazed_233616117.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EggOnYourFace_110207471.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EitaTheEnviousYoukaiFace_3210252000.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ElegantEveningDressFace_4916129740.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ElfGuardianOfTheNorthernBorderFace_2510329394.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Embarrassed_21272995.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldAmbassador_66330060.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldArchfeyVisage_2830499980.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldEvilEye_1016185535.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldLaserVision_66330165.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmotionallyDistressedZombie_7506136.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Emperor_25267538.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EpicFace_42070576.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EpicVampireFace_181651981.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EqualCloseParenthesis_14817393.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ErisyphiaFace_3141356565.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Err_20418658.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EvilSkeptic_110336757.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ExclamationFace_35168581.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ExistentialAngst_7074814.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Extreme_10831454.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EyesOfEverflame_362051773.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EyesOfEverfrost_22972723.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EzebelFace_293303927.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Facepalm_30394594.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FancifulLeprechaunFace_2907641479.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Fang_7075142.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FashionFace_2274764091.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FastCar_22587894.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FawkesFace_134522901.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FearlessOceanDiverFace_5238862364.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Fearless_7074991.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FestiveBeekeeperFace_2553407112.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FinnMcCool_10907549.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FootballPlayerFace_2773409880.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FreckledCheeks_25556219.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Freckles_12145366.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyCyclops_30394438.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyGrin_25321961.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyPirate_19366445.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyPuppy_27725434.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlySmile_616381207.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyTrustingSmile_402304145.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FrighteningUnibrow_8560985.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Frightful_7699193.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FuriousFinnFace_295492723.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FuriousGeorge_277950647.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FutureglamBountyHunterFace_3013806177.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GenniTheSnailKnighterrantFace_2628039027.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ghostface_12467159.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Gigglypuff_35397243.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Glee_7074729.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GlidedDiverFace_5238862364.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GloryOnTheGridiron_21802396.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenBlingBraces_1191136166.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenEvilEye_1016185809.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenEyes24kGoldn_9156275069.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenLightningSpeaker_66330231.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenShinyTeeth_66319941.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoodIntentioned_7317793.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Goofball_27134344.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrandmasLipstick_51241480.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreaterThanUnderScoreLessThan_15324577.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreaterThanUnderscoreGreaterThan_16387711.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenAmazeface_835094544.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenBubbleTrouble_380754227.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenDroolAngryZombie_406001532.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGalaxyGaze_440739783.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGlowingEyes_398676450.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGoof_1191162539.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenStarface_119812738.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenSuperHappyJoy_323191596.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenTrance_260303894.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenUltimateDragonFace_1772531407.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenWhatchooTalkinBout_323191787.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenWistfulWink_583722932.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreeneyedAwesomeFace_66330144.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrittyBombo_406000562.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrumpyBlox_173789498.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GwenAxeAngelRosewoodFace_2859557339.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HappyGirlFace_293226229.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HappyWink_236399287.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HeartGazeZaraLarsson_7893468574.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Heeeeeey_21635565.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hilarious_27861352.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hmmm_7076076.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HockeyFace_142464206.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HoldItIn_2222771916.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Huh_150182466.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HutHutHike_15470849.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hypnoface_10770436.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/I3NewSiteTheme_32723404.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IAmNotAmused_7131886.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IDidntEatThatCookie_116042990.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IHateNoobs_14030577.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ILackPersonalConfidence_7506144.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IWuvU_10907545.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Iface_100290429.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ilovefootboll_15470861.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Imagine_30394316.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Isabella_7243933492.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ItsGoTime_7506141.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ItsSoBeautiful_26674400.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JackFrostFace_19396123.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JacobTheStormBreakerFace_599913343.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JesterEquinoxFace_2962660233.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JohnsFace_301827199.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JoyfulSmile_209995366.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JoyousSurprise_28999228.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JungleCommando_16678138.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JustTrouble_244160766.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KandisSprinkleFace_8666865667.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightOfChivalryFace_2510299324.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightOfSplinteredSkiesAscendantFace_2506721000.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightofCourageFace_2535711033.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnowitallGrin_26424808.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KrezakFace_293309580.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KromaBlitzFace_2979689790.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LadyDarkshadeFace_2807183388.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LadyLashes_29348122.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LaughingFun_226217449.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LavenderAmazeface_835095306.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LazyEye_7075502.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LightningSpeaker_22588801.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LinsFace_301826803.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Lion_11956548.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LookAtMyNose_23311761.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LynnFace_2610492664.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Madbot10000_554658475.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MagicalDragon_34871168.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ManFace_86487700.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Manicbot10000_554663566.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ManlierFace_76383151.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Masque_22432782.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MclarenBigGrin_9062637857.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MclarenSmile_9062620353.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Meanie_9250643.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Meow_10907529.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MercilessNinjaFace_6652985701.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MermaidMystique_8664096393.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MickMccann_23264604.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MildlyIrritatedFace_280988393.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MinervaBrightFace_2608317303.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Mischievous_9250654.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MissScarlet_334656210.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MixologistsSmile_4645966393.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonCheriFace_7243931574.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonarchButterflySmile_383607653.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterFace_49045351.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterGrumpyFace_7243924005.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterSmile_398675917.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrBubbles_31616411.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrChuckles_10907541.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrOinkers_11123827.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrToiletFace_4416933495.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Muttdawg_11647324.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Mysterious_7132035.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NegationUnderscoreNegation_13038375.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NeoclassicFemaleV2Face_4637166178.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Nervous_23219981.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NethackAddict_16357383.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NibblesDevourerOfWorlds_11913734.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ninja_11453609.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NoZ_14405720.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NorikoTheGentleYoukaiFace_3210253450.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NotAgain_28119051.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NotSoFriendlyEviscerator_66330204.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Notsureif_173789324.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Nowai_51241862.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OakleysFace_301827237.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Obvious_Wink_51241537.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OchreOgre_16723499.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OctaviaTheIvorySpiderGirlFace_2986536321.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OgreFace_391495894.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OhDeer_12145328.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OhNoesAnotherDog_13038397.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OldManJenkins_13335647.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OldTimer_27003636.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OliZigzagFace_2979331491.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Oo1_7074595.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Oo_66330265.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Optimist_21024661.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OrangeStarface_162200666.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OrangeTrance_260303960.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Otakufaic_1665638148.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverjoyedSmile_1428416217.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverseerAssassinFace_2761366151.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverseerProphetFace_3040321462.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Owl_11123805.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/P_14861743.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PaintballEnthusiast_23310997.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PerformingMime_5122343618.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PersephonesGirlGlam_7243865988.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PiefaceJellyfreckles_19381787.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkGalaxyGaze_440738448.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkMermaidPrincess_1428418448.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkMoonstruck_878940145.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkShadesMccool_323192138.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkWistfulWink_583721990.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PizzaFace_2845812591.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PlayfulVampire_2409285794.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoisonousBeastMode_2606177838.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoliceOfficerNashFace_2506787960.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PonyFace_13656095.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoorMan_7699183.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PopQueenSmilestarSpectacusmile_2274754557.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Prankster_20052135.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PridefulSmile_3267564334.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PrincessAlexis_6590375198.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Puck_20298988.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PunkFace_119812659.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleAlien_323192193.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleBubbleTrouble_362051999.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleButterflySmile_238983270.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleGalaxyGaze_440739240.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleMermaidPrincess_1428424821.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleMoonstruck_878942257.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleStarface_119812765.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleSuperHappyJoy_376812961.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleTrance_260304187.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleWistfulWink_583722710.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PwndaFace_28281786.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/QuackfaceMcgraw_11647296.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Quijibo_10907532.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ROAR_406001167.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Raccoon_27052537.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RachFace_2608325060.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RadioactiveBeastMode_2225761296.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RaigFace_209994783.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RainbowBarfFace_1665629400.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RainbowSpiritFace_8666744565.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Rawr_7076224.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ReallyEmbarrassed_376812736.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedFang_16722419.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedGlowingEyes_180660043.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedGoof_1191125008.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedLipTateMcRae_9650713776.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedRawr_66330295.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedRockStarSmile_376809691.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedSeriousScarFace_406000421.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedTango_16652251.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedUltimateDragonFace_1772530315.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedWhiteAndStarface_445117183.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Redonkulous_10907534.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RetroSmiley_10770432.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RobloxMadnessFace_130213380.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RockStarSingerFace_2517188619.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RodeoVampireLilNasXlnx_5917448278.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RogueEraMagusFace_2499710871.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RogueishGoodLooks_1665511048.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoseAmazeface_835095880.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoseySmile_116043052.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoyalEyeOfHorusFace_2803774919.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RubyArchfeyVisage_2830505884.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Rudolph_19397594.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SadClown_250654457.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SadZombie_7131361.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sad_7699177.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sadfaic_117522793.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SaieyeTylerJosephTwentyOnePilots_7389910081.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SamanthaFace_2535487974.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SammySlickWitterFace_2907754927.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireArchfeyVisage_2830502330.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireEvilEye_1016184964.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireLaserVision_209994074.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ScarecrowFace_14721869.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Scarecrow_26260927.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SecretService_20612949.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeeingStars_27599954.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SemiColonOpenParen_16179646.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SerenasFace_301826957.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousCat_10678414.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousDog_10678418.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousRedEyeScar_494299198.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousScarFace_255827175.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharkbaitFace_3258567315.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharpninesFaceOfDisappointment_209994270.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharpninesFaceOfJoy_406002032.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SheriffBuffingtonFace_2761348544.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Shhh_7076159.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShinyTeeth_20722130.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Shocked_147144644.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShutterShadesTheFace_34673712.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShyLady_10831438.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SickDay_26619096.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Silence_10860397.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SillyFun_7699174.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SilverPunkFace_387256603.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Singing_66330310.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SirRichMcmoneystonIII_10831390.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SkaterBoiFace_2739812348.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SkaterGurlFace_2739787309.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Skeletar_10770395.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Skeptic_31117267.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Slickfang_7317765.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Slithering_Smile_2830646491.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlobberyVillain_10907536.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlyCat_10678407.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlyGuyFace_238983378.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmilNasXLilNasXLNX_5917459717.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Smile_144075659.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmilingGirl_209994875.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmithMccool_27412825.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SneakyGreeneyedSnake_334656353.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SneakySteve_823012694.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sniffles_14516578.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowQueenSmile_2569005011.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowSamuraiFace_5762596362.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowflakeEyes_76233968067050.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowmanFace_19396550.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoFunny_32058239.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedBlue_2569001052.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedPink_2568801198.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedPurple_2568804274.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SophisticatedSpectacles_25930613.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SororityStarFace_3690515434.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SparkleTimeSparkleEyes_2620507161.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SparklingsFriendlyWink_6532619915.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SpecterInformantFace_2608277633.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SpringBunny_110207437.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquadGhoulsZoeSaberhagenFace_2517100778.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquareEyes_22119034.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquiggleMouth_25166274.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquintyAssassinFace_880474146.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Stare_8560971.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Starface_32873408.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StarryEyed_19959140.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StarryEyesSparkling_7243903012.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SteampunkInventorFace_5762596362.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StinkEye_416846143.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Stitchface_8329679.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunnyFun_51241171.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunriseEyesTaiVerdes_7987201392.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunstarFace_2506403983.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperHappyJoy_280988698.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperPinkHeartMakeup_6590371677.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperSuperHappyFace_494291269.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Surprise_23261769.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Suspicious_209994929.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SweatItOut_20909103.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Tango_16101765.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Tattletale_26343188.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TealMermaidQueen_1428417334.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TealRockStarSmile_334656546.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TearsOfSorrow_5122309127.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TerrainAssaultSpecialistFace_2573925976.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheBigDog_10860384.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheBirdcallerFace_2884418268.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheDogWhisperer_34764447.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheFirstTimeIEverPlayedRoblox_22070623.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheFriendlyEviscerator_22500129.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ThePhantomPhalanxCygnus34Face_2628025496.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheSoupIsDry_2845990750.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheWinningSmile_616380929.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TigerChaseFearFace_258198928.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TimmyMcpwnage_22023062.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TiredFace_141728790.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TixVision_385889916.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TooMuchCandy_295763789.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Toothless_19399752.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ToothyDrool_8560980.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ToothyGrin_7075434.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheBlueOrc_2830496106.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheGreenOrc_2830497827.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheRedOrc_2830493868.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Trance_29109681.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Troublemaker_22920501.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TrueLoveSmile_362051405.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TsundereExpression_4645952767.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TwoGuysOnABoat_14127171.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UhOh_7074944.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UpToSomething_1016186364.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UpsideDownFace_1772578399.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ValkyrieOfTheSplinteredSkiesFace_2907632781.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ValorousKnightFace_3258576172.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Vampire_29532363.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VansCheckerboardBlueEyes_8247356154.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VioletFang_362051899.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VioletStarrySight_2222775930.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VisualStudioSeizedUpFor45SecondsAgain_14083380.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WalkThePlankYouScurvyDogs_13478124.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WarpaintJoshDunTwentyOnePilots_7389923463.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whaaaaaa_14127194.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WhatchooTalkinBout_7075089.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WhereAreTheEggs_24975496.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whistle_22877700.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whuut_274338458.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WickedWebbedBerserkerFace_3993282075.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WilliamBigBillConnerFace_2833509821.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Winkblink_22828351.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WinningSmile_880469676.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Winter_22587828.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Woebegone_21755022.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WomanFace_86487766.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Wonder_Womans_Golden_Armor_Face_6029816756.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WweSethRollinsFace_3016138770.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WyldfireFairyFace_2517242922.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xd20_406001052.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xd_15054426.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/XtremeHappy_20644021.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xx_15395327.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yaaawwn_162068415.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yawn_20010377.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YellowGlowingEyes_416846000.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YellowStarface_162200696.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YouAtedMyCaik_21635583.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yuck_10907531.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZedFace_5122355742.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZipIt_24126147.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZoeyFace_807339121.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZombieFace_133360789.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZomgHatSelling_16413496.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Zomg_8329682.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Anime-Templates.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Caricature-Templates.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Custom-Skin-Tones.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Concepts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Head-Templates.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Prototype.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Concepts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Head-Templates.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Prototype.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/SemiRealistic-Templates.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Square-Head-Templates.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Stylized-Templates.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/avatar/templates/Texture-Map.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/3DCursor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/3DViewport.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/ActiveSwatch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Blender-Project-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Data-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Disabled-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Edit-Mode.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Face-Bones.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Face-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Modes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Modifiers-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Object-Mode.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Object-Select-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Disabled-Enabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Filter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Menu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Scene-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Sculpt-Mode.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/TexturePaint-Mode.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Timeline-Frames.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Toolbar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/VertexPaint-Mode.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Viewport-Shading-Setting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/ViewportShading-Solid.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Visibility-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/WeightPaint-Mode.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/Workspaces.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/blender-ui/scene-tab.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/AnimeFemale-Studio-Ready.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/AnimeFemale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/AnimeMale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/Caricature.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/ClassicMannequin.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/ClassicMannequin_With-Cages.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/Eyebrows.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/Eyelashes.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/HeadCages.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/MuzzleFemale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/MuzzleMale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/NatureArcherGirl-AutoSetup.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/NatureArcherGirl.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/RoundFemale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/RoundMale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/RthroMannequin.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/RthroMannequin_With-Cages.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/RthroSlenderMannequin.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/RthroSlenderMannequin_With-Cages.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/SemiRealisticFemale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/SemiRealisticMale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/Snow.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/SquareFemale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/SquareMale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/StylizedHuman.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/StylizedMale-AutoSetup.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/StylizedMaleWithClothing.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/1_Goblin-sculpted.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/1_LongSleeve-Modeling-Complete.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/2_Goblin-textured.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/2_LongSleeve-Texturing-Complete.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/3_Goblin-caged.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/3_LongSleeve-Rigging-Complete.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/4_LongSleeve-Caging-Complete.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Archer-Girl-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Blocky-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Body-Cages-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Classic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Rthro-Normal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Rthro-Slender.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Clothing-Cage-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Creature-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Fish-Person-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Goblin-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Lola-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Rig-And-Attachments-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Shoebot-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/StylizedMale-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Tree-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/resources/Tshirt-Resource.png delete mode 100644 .cursor/rules/roblox/en-us/assets/art/staff-articles/PBR-Textures-Substance-Painter.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/staff-articles/PBR-Textures-Substance-Sampler.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/staff-articles/Rock-Sculpting-References.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/staff-articles/Tileable_Textures_Photoshop_Sampler.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/staff-articles/Transparency_Maps_Substance_Sampler.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/art/staff-articles/ZBrushProject_Radial_Symmetry.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/AssistantDocumentationSite.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/AssistantStudioExample.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/BYOK.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/Documentation-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/Documentation-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/Documentation-Prompts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/Studio-Explain-Code.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/Studio-General-UI.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/Studio-Generated-Green-Dragon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/Studio-Object-Insert.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/Studio-Quick-Styling-Material.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/Studio-Script-Insert.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt1.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt10.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt11.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt12.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt13.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt14.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt15.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt16.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt17.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt18.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt19.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt2.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt20.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt21.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt3.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt4.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt5.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt7.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt8.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/assistant/prompt9.webm delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/2D-Audio-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/3D-Audio-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/Australian-Female-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/Australian-Male-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/British-Female-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/British-Male-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/DistanceAttenuation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/French-Female-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/French-Male-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/German-Female-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/German-Male-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/Italian-Female-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/Italian-Male-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/Narrator-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/Retro-Voice-1.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/Retro-Voice-2.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/STT-Audio-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/Spanish-Female-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/Spanish-Male-Voice.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/TTS2D-Audio-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/TTS3D-Audio-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Female-Voice-1.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Female-Voice-2.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Male-Voice-1.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Male-Voice-2.wav delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/chorus.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/compressor.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/distortion.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/echo.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/equalizer.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/flange.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/no-effect.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/pitch-shift.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/reverb.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/dynamic-effects/tremolo.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Layered.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Multiple.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Single.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-groups/Dynamic-Effect-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-groups/Mix-Tree.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_DoubleSpeed.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_HalfSpeed.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_NormalSpeed.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-objects/RollOffMode-Chart.png delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Point-RollOff.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Point-Source.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Volumetric-RollOff.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-objects/Volumetric-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/audio/sound-objects/Volumetric-Sound-Diagram.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/2k-Texture-Renders.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/AvatarSample.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Assign-Joints-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Assign-Joints-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/HRD-Select.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Import-Custom-Humanoid.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Test-Animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tool-Select.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Toolbar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Display.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Rotation-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Rotation-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Access-Items.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Equip-Items.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Save-Outfit.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Curve-Animation-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Curve-Prompt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Import-From-Roblox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Import.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Publish.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Avatar-Emotes.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Explorer-Upload.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Generate-Asset-ID-Success.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Attribution.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Confirmation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Format.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Prompt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Token-Creation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Token-Id.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Add-Object.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Assymetry.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Auto-Setup-Scaling.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Auto-Setup-Start.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Avatar-Setup-Example-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Avatar-Setup-Example-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Cage-Edit-Panel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Folder-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/I-pose.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Inorganic-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Long-Neck.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/No-Neck.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Contiguous.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Humanoid-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Proportional-Limbs.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-All-Rigged.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-Body-Rigged.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-Head-Rigged.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-None-Rigged.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Skin-Tone-Selector.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Supported-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Test-Face-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Test-Face-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Testing-Interface.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-Banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-Character-Model-Data.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-In-Editor-Window.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/character-customization/Basic-Character-Model-Data.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/character-customization/R15-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/character-customization/R6-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/context-menu/ACM-Sections-Labeled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/context-menu/ACM-User-Selector.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/context-menu/Custom-ACM.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Blocky-Reference.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Blocky_And_Goblin_Dynamic_Heads.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Goblin-Reference.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Animation-Track-Values-Input.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/FACS-Popup.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Face-Button.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/videos/1-Face-Controls-Example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/videos/2-Face-Controls-Example-Goblin.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Frame-Range.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Offset-Importing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Timeline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Custom-Properties-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Eyelid-Naming.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Mapping-New-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Mapping-Popup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Open-Project.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.ma delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Bones-Skinned.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Poses-Mapped.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Model-Only.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie_Head_ALB.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/10_Skinning_Eyelids.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/11_Testing_Eyelids.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/12_Creating_Controller_Bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/13_Creating_Bone_Constraints.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/14_Assigning_Custom_Shapes.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/15_Coloring_Control_bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/16_Testing_Controllers.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/17-Posing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/18_Mapping.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/1_Adding_RootFaceJoint.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/2_Mapping_RootFaceJoint.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/3_Adding_Eye_Bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/4_Positioning_Eye_Bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/5_Parenting_Eye_Bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/6_Adding_And_Positioning_Eyelids.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/7_Skinning_LeftEye.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/8_Testing_LeftEye.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/9_Skinning_and_Testing_RightEye.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example4.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example5.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example6.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Automatic-Skinning-Transfer-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Beard-Humanoid-Cage.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Eyebrows-Follower-Vertices.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Eyebrows-Leader-Vertices.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Full-Body-Cage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Head-Cage-Only.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Cage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Cubie.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Eyebrows.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Jacket-Cage-Comparison.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Assign.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Follower.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Leader.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Transfer-Off.mov delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Transfer-On.mov delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Creating-Face-Accessories-Reference-Files.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Cubie-Cage-Only.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Cubie-Eyebrow-Rigged-And-Caged.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieEyebrow_Geo.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieHawkHair_Geo.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/AutoSkin-With-Full-Cage.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/AutoSkin-With-Specific-Cage.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Editing-Outer-Cage.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Jacket-Collar-Issue.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Parent-Armature.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Removing-Character-Cage.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Removing-Extra-Objects.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserUpperLipA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserUpperLipB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/CorrugatorA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/CorrugatorB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookDownA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookDownB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookLeftA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookLeftB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookRightA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookRightB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookUpA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookUpB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FlatPuckerA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FlatPuckerB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FunnelerA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FunnelerB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawDropA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawDropB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawLeftA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawLeftB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawRightA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawRightB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftBrowLowererA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftBrowLowererB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekPuffA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekPuffB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftDimplerA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftDimplerB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeClosedA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeClosedB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeUpperLidRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeUpperLidRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftInnerBrowRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftInnerBrowRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerDownA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerDownB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerPullerA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerPullerB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipStretcherA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipStretcherB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLowerLipDepressorA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLowerLipDepressorB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftNoseWrinklerA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftNoseWrinklerB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftOuterBrowRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftOuterBrowRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftUpperLipRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftUpperLipRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipPresserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipPresserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LowerLipSuckA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LowerLipSuckB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthLeftA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthLeftB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthRightA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthRightB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/PuckerA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/PuckerB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightBrowLowererA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightBrowLowererB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekPuffA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekPuffB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightDimplerA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightDimplerB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeClosedA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeClosedB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeUpperLidRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeUpperLidRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightInnerBrowRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightInnerBrowRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerDownA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerDownB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerPullerA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerPullerB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipStretcherA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipStretcherB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLowerLipDepressorA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLowerLipDepressorB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightNoseWrinklerA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightNoseWrinklerB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightOuterBrowRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightOuterBrowRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightUpperLipRaiserA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightUpperLipRaiserB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueDown.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueOut.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueUp.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/UpperLipSuckA.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/UpperLipSuckB.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Animation-ID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/HappyMood.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Overview-Default-Mood.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Overview-Open-Mouth-Mood.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/animate-localscript-hierarchy.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Blocky-Face-Accessories.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/BlockyCharacter.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/BlockyCharacter.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Editor.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Schema.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Fish-Person.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/GoblinCharacter.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/FaceControls-In-Explorer.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/FaceControls-In-Property-Panel.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Facial-Accessory-In-Property-Panel.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Facial-Accessory-In-Viewport.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Importing-Facial-Accessory-Final-Result.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/Customize-NPC.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/Display-Indicated.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-None.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-Subject.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-Viewer.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-AlwaysOff.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-AlwaysOn.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-DisplayWhenDamaged.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/Humanoid-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-EnemyOcclusion.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-NoOcclusion.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-OccludeAll.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Boat-Path.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Bridge-Path.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/DoorPassThrough-Block.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/DoorPassThrough-PathfindingModifier-PassThrough.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-Block.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-Path.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-PathfindingModifier-Label.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Navigation-Labels.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Navigation-Mesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Path-Start-End.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Path-TrussPart.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Attachments-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Attachments.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-In-World.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Label.png delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Path.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Paths-Shortest-Best.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Simple-Path.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Waypoints.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/avatar/pathfinding/Zombie-Full-Path.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Add-Collaborators.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Add-Experiences.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Avatar-Restricted.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Avatar-Success.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Decals-Warning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Make-OpenUse.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-OpenUse.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Privacy-Beta.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Toggle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Creations-Events-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Edit-Button-Experience.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Event-Context-Menu-Copy-Event-Details-URL.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Event-Context-Menu-Delete-Event.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Experience-Change-Start-Place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Create-Group-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Assign-Role.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Invite-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Remove-Member.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Unassign-Role.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-One-Time.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-Split-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-Splits-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Add-Members.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Permissions-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Role-Color.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Settings-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Manage-Thumbnails.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Asset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Badge.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Developer-Product.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Experience-Private.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Experience-Public.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Pass.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Permissions-Collaborators.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Permissions-Experiences.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Places-Start-Place-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-dashboard/Places-Start-Place-No-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/creator-programs/partner-program.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-API-Status.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-API.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-Status.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Compare-Versions.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Key-Entry.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Page.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Memory-Usage-Critical.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Memory-Usage-Warning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Priority-Queue-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Regular-Queue-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Request-Failure-Critical.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/memory-store/Request-Throttled-Critical.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/player-data-purchasing/Sample-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-load-diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-save-diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-warning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/player-data-purchasing/retry-diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/player-data-purchasing/sample-architecture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/player-data-purchasing/session-lock-diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/secrets-store/LocalSecrets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/secrets-store/LocalSecrets_Edit.png delete mode 100644 .cursor/rules/roblox/en-us/assets/data/secrets-store/local-secrets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image10.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image11.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image12.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image13.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image14.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image15.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image16.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image17.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image18.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image19.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image20.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image21.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image22.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image23.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image24.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image25.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image26.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image27.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image28.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image29.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image30.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image31.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image32.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image33.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image34.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image35.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image36.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image37.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image38.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image39.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image40.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image41.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image42.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image43.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image44.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image45.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image46.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image47.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image48.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image49.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image50.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image51.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image7.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image8.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-jumpstart/image9.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Mega-Emote.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Script-ConfigureEmotes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/BlankScene-Folder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Edit-Concert-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Inline-BoolValue-Enabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Inline-BoolValue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Lighting-Service-Instances.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/ReplicatedStorage-BlankScene-Folder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Lighting-Attributes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Lighting-Instances.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Terrain-TerrainRegion.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Scene-Attribute-TimeLength.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Seek-Bar-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Seek-Bar.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Terrain-Class.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Objects-In-Frame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Portrait-DisplayName.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-ScreenGui-Disabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/LocalScript-ConfigureFriendsLocator.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Testing-On-Client.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Item-URL-Asset-ID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/LocalScript-ConfigureMerchBooth.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/LocalScript-In-StarterPlayerScripts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Proximity-Prompts.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Collision.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Part.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Transparency.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Regions.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/UI-Catalog-Button.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/UI-Visual-Customization.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Bundled-Mesh-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Bundled-Mesh-Workspace.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Changed-Message.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/LocalScript-ConfigurePhotoBooth.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Other-Card-Status-Empty.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Other-Card-Status-Set.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Empty.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Entering.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Invalid.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Set.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Icon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Region-Structure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token-BasePart-Structure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token-Model-Structure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token1-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Depth-Of-Field-Off.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Depth-Of-Field-On.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Dramatic.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Monochrome.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Soft.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Flossing.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Louder.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Twirl.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/LocalScript-ConfigureSocialInteractions.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Restricted-Block.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Bundled-Mesh-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Canvas-Attribute.png delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Position-Canvas.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Showcase-SM.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/surface-art/SurfaceArt-UI.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Toolbox-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/addToolExample.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-addToolScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-game-examplevideo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-gameThumbnail.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-harvestItemFull.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-harvestItemShort.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-item-example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-empty.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-finished.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-withItem.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellItems.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellPlatform.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellingItemsHero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-show-boolTrue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-show-group.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showClickDetector.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showSellScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showUpgradePurchase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-testedTool.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-toolWithPlayer.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventureGameTerrain02.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure_leaderboard_addtoServerScriptService.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/createdBoolValue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/crystalPart.rbxm delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/heroBanner_titlePage.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/map-crystals.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/paintToolOptimized.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/starterTool.rbxm delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/subtractToolExample.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/tools_starterPackClick.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setAnchorPoint.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setOffset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setPos.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setScale.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addClickDetector.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addSurfaceGUI.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_changeGUIFace.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_partCreate.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_showTextLabelAlt.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/Strucid_thumbnail.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_circle.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_square.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_terrain.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaIntro_lobby.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaObstacles_advanced_topDown.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaObstacles_sideBySide.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showClientServerWindows_client.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showClientServerWindows_server.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showFinishedOutput.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showGameManagerCreated.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showGameSettingsCreated.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showFinalResult.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showRepeatArena.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showSendToMatch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_4_outputFinished.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_4_showBindableEvents.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_addLocalScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showFinalizedGameLoop.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showGUITest.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showIntValuesCreated.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showLabelCreated.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showMovingScaleGUI.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showReadyDisplay.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showTimerDisplay.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showEndGame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showGameEndFoundWinner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showGameTimerError.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showPlayersDefeated_inLobby.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showPlayersDefeated_showPlayerAttacked.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showStatusCreated.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showDifferentGUI_foundWinner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showDifferentGUI_timeOut.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showPlayerWeapons_withWeapon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showPlayerWeapons_withoutWeapon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_addedSpawns.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_createPlayerManager.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_createTimer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_finishedProject_arenaHero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_cleanup.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_compete.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_intermission.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_playtestGraybox_cropped.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_showWeapon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/battleRoyal_webFinal.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/islandRoyale_example_2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/playerShowcase_Jandel.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/playerShowcase_luxeyes.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_grayboxExample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_hero_lesson8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_balanced.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_simple.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_tooComplex.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_thumbnail_alt.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/show-weapon-spawned.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_arenaSteps_finalizedLayoutMap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_example_obstacle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_playerSpawns.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/beta-testing-edu-experiences/BetaTestingGame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/beta-testing-edu-experiences/alo-feedback-form.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/CreateAndDestroy_template.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ExpandedMap_920x640.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/FilterWorkspace_920x640.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/GameSettingsFoundpsd.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/GameSettingsSearch_640x300.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/PlaceCustomBuilding_930x640.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/PlacedHalfMap.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/SpawnLocation_Select_920x600.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_backpack.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_head.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_wing.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/buildingExamples_large.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/buildingExamples_props.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_bannerTerrain.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_heroBanner_overCity.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_introVideo_final_webOptimize.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_moveFirstBuilding.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_moveSpawnLocation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_quizGamePage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_quizGameScreenshot.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showCameraControlsBuilding.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showDuplicateCity.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showSelectDragCity.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_switchBackTop.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_thumbnail_312x200.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_addTerrain.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_changeShapeSize.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainSmooth.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainTools_paint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainTools_subtract.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/changeViewSelectorSide_updated.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/clickViewSelectorToTop.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/exampleCustomBuildings.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/firstHalfSetup_800x450.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/islandBlankExample_800x450.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/islandTerrainAdded_600x600.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonBanner_3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_1_360x360.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_2_360x360.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_3_360x360.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/playersOverlookingCity_banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/playtestRunCenter.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/roadsPlacedExample_600x450.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/show-terrain-360px.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showFocusBuilding.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showIslandExamples_600x600.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showIslandPainted_600x600.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showPropsPlaced.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showSpawnLocations_800x450.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showTerrainAdd.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showThumbnailCameraAngle.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/spawnLocations_2placed.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/hero-new-assets.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/hero-ring-hat.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/new-parts-design-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/new-parts-design-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/show-assets-added.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/find-garage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/paste-into-garage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/rename-model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/move-wing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/rotate-wing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/scale-wing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/wing-example.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/work-area-correct.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/work-area-wrong.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/add-image.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/body-highlighted.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/callout-textureid.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/colored-ships.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/new-texture.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/original-texture.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/scrapper-backpack.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-blue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-rust.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-teal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/compare-speeder-speeds.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/hero-group.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/open-explorer-garage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/speed300.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/speed50.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/hero-jetpack.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/hero-winter.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/junkbot-hero.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/paint-terrain-snow.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/paint-tool-snow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/select-snow-material.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/select-terrain-explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/show-terrain-color-change.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-editor-edit-tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-expand-materials.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-winter-version.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Decorative-Parts-Parts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Decorative-Parts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Starting-Bodies-Parts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Starting-Bodies.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Wing-Sets-Parts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Wing-Sets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/move-camera-to-focus.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/move-camera-to-focus.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-3.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/decorated-version-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/decorated-version-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/duplicated-wing.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/rotate-compare.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/scrapyard-decorations.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/second-wing.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/second-wing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-extension.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-3.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/get-off-the-ground/galactic-speedway-template.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/get-off-the-ground/lesson-banner.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-3.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/next-steps-particles.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/next-steps-share.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/going-for-a-race/hero-race.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/going-for-a-race/testing-plane.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/group-select.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/grouping.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/test-grouping.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-3.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/overview-video.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/show-quiz-game-example.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/move-body.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-3.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/DistributeonCS.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/GetModelButton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/LinktoCD.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/hero-garage-racer.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-flight/interact-robot.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-flight/show-selection-gui.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-2/quiz-game-page.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-2/scrapper-hat.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-3/hero-alien-friend.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge/hero-pauldron.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge/show-quiz-npc.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/explorer-correct.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/explorer-wrong.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/select-speeder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/test-speeder.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/addKeyframes.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi-tier2-showButtonSetup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_nav_button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickFrame2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickFrame3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickLooping.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickPlay.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_createRig_showRig.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_lessonSamples_lesson1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_lessonSamples_lesson2alt.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_selectFirstFrame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_selectPartHierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showExportedAnimation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showFrame3_front.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showFrame3_side.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showLastFrames.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showPartsFolder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_touchedPartExamples_obby.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_touchedPartExamples_treasure.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_tier2_extension_gameThubmanil.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_tier2_extension_partSetup.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_changeLength.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_clickAEPlus.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_clickOptions.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_createAnimationName.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_exportedAnimationWeb_alt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_01.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_selectKeyframeExamples_selectAll.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_selectKeyframeExamples_single.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_showDurationCurrent.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/exampleProject_tweeningButtonDoor.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/exampleProject_tweeningPetRotate.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/example_allTweens.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showAnimationIDScript.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showChangeFrameDifference_opt.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showFinalAnimation_singleAlt.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showFinalVictoryPose_simple.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showImprovedAnimationMoreFrames_improved_optimized.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showMoveBody.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showNPCAnimationsFeedback_noFeedback.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showNPCAnimationsFeedback_withFeedback.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showOverallAnimationTimelapse_optimized.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showPose2TimeLapse_optimized.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showRotateArms_web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showScaleTween.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenColor.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenMove_Wrong.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenMove_correct.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/victoryPose_finalSingleObbyExample_web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-new-models/show-new-assets.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/full-swim-animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/press-loop-button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/set-timeline-middle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/show-full-swim-animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/show-middle-timelapse.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-3.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/overview.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/show-game-hub.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint-2/game-redeem-npc.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint-3/game-redeem-npc.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint/game-redeem-npc.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/Animations-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/CopyAssetID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/finished-animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/search-walk-select.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/set-animation-value.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/click-upper-arm.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-crouch.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-dance.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-swim.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/rotate-upper-arm.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/timelapse-first-pose.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/AnimationExample.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/highlight-figure.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/rig-selected.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/show-animation-breakdown.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/show-move-camera.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/exporting-animations/hero-banner.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/adding-new-models.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/hero-banner.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/learn-coding.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/personalize-the-game.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/share-animations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/invite-friends-to-play/hero-banner.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/Scrubber.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/Timeline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/added-last-pose.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/change-duration-to-end.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/select-first-pose-diamond.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/overview-game-progress.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/show-template-pick.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/template-example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/atmosphere.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/open-game-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/particle-effects.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-explorer.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-rename-after.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-rename-before.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/terrain.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/publish-animations/Publish-Highlight.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/publish-animations/publish-copy-id.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/save-and-publish/hero-banner.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/save-and-publish/save-animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/animation-keyframe.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/click-options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/hero-banner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/select-animation-saves.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/select-animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-game-button.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-npc.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-play-game.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-events.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-particles-folder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-manager.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-particles.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/delete-test-player.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/final-example-2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/final-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/move-tutorial-beam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/game-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/template-overview.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/template-overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/beginner-avatar-items.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-1-thumbnail.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-2-thumbnail.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-3-thumbnail.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/trailer.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2/avatar-items.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2/prize-avatar.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3/avatar-items.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3/prize-avatar.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/avatar-items-hero.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/prize-avatar.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/prize-avatar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/attachment0-to-player.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/beam-texture-change.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/default-beam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/face-camera-off.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/face-camera-on.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/finished-beam-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-face-camera.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-goal-attachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-texture-mode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/show-static-beam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/add-delete-colors.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/avatar-items.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/click-sparkler-particles.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/cut-staff.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-example.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-staff.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/move-colors.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/non-selected-arrow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/paste-staff.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/select-color-property.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/select-color.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/show-sparklers.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/show-texture.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/beam-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-beam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-goal-attachments.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-player-attachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/edit-place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/open-template.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/open-template.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/template-overview.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/ux-example-bad.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/ux-example-good.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/experienced-landing-page/example-full-game.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/change-size-example.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/change-size.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/locked-to-part.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/set-locked-to-part.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/show-shot-color.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/invite-friends/hero-image.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/beginner.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/experienced.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/header.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/prizes-beginner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/prizes-experienced.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/change-explode-size.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/change-speed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/explosion-final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/lifetime-new.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/lifetime.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-0.5.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-0.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-1.0.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/newsizecomparison.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/rotation-speed-new.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/rotation-speed.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/show-random-options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/size-comparison.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/size-comparison_1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explode-color.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explode-texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explosion-color-texture.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/final-shot-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/search-explosion.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps-advanced/hero-image.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/extension-cards-sparkler.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/hero-final.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/terrain.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Fire-Video.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Portal-Video.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Rock-Video.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Short-Arrow-Down.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-flame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-holder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-portal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-star.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-blaster-shot.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-blaster-shot.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-color.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-explosion.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/set-color.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/show-color-change.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/show-color-change.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/test-and-play/game-health.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/test-and-play/start-game.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/before-after-particle-settings.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/create-particle-emitter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/default-particle-stream.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/energy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/gem.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/heart.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/leaf.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/particle-interaction.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/paw.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/potion.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/set-enabled-off.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/show-particle-texture.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/show-texture-color-size.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/spread-angle.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/star.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/ticket.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/circle-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/circle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/heart.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/particle-texture-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/paste-texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/scratch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/show-texture-property.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/smoke.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/spark.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/swirl.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/texture-changed.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/texture-changed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/trace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/triangle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-1/coding-1-output-window_800.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-1/color-changer_400x216.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-1/color-picker_800x140.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-1/helloworld-output_800x150.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-1/hover-over-serverscriptservice_400x400.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-1/part-properties_400.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-1/practice-part_400.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-1/scriptParent_finalExample_web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-2/parameters-and-events_trap.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-2/red-button.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-2/transparent-bridge.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-3/coding3Hero_ifElseIf.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-3/coding3_colorPointBlockFinalizedExample.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_loopingColors.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_showParticles_web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_showPointChange_web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-3/raceCourse_showDistanceBetween.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-3/raceCourse_showPartCraeted.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-3/trap-exampleFinal.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/CupCakeBloopers_Compressed.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/Fade_480x320.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/LoopingTower2_Compressed.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/NestedLoopsDiagram300x500.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/florLoop_lightAdded.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge-finishedCountdown.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge_addTextLabel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge_bridgeSetup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/forLoop_annotatedExample.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/forLoop_outputError.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-finished.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-increase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-singleLoop.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/glowing-lights-lightPart.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/glowing-lights-setClockTime.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/loops-and-parts-finishedPart.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/nestedLoop-finalExample.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-4/timedBridgePresentation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/Making_Changes_to_Arrays_-_Final_Project.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/TemplateNPC.rbxm delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/coding4_arrayFunctions.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/coding4_introToTables.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/disappearingHero_16_9web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/introArray_showDialogIndexes_optimized.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_projectTotal_optimized.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_showFullLoopIndexes_optimized.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_showSpeech.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/showPathDisappearFirst_web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-5/showPathDisappearIndexed_web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/abstraction-backpacks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/backpack-violet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/backpack-yellow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/no-abstraction-backpacks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-algorithms/square-and-child-squares.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/Intro_to_Module_Scripts_-_Starter_Project.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/create-module-script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/creating-modules-hero.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/final-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/get-first-key.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/module-template-example.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/show-leaderboard-key.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/coding-6/intro-to-module-scripts/create-module-script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/developer/Designing-Educational-Experiences.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/developer/petGame-pets.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/developer/thumbnail-luaLearning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/developer/thumbnail-missionMars.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/developer/thumbnail-untamedAnimals.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/edu-landingPages/bipi_lessonPlan_thumbnail_312x200.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/edu-landingPages/ccw2019_thumbnail_312x200px.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/edu-landingPages/introToGameDesign_thumbnail.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/edu-landingPages/introToStudio_thumbnail.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/edu-landingPages/newGettingStartedThumbnails-develop.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/edu-landingPages/newGettingStartedThumbnails-games.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_adventureRthroAlt_312x200.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_remoteLearning.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_traps_312x200.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educator-onboarding/Handout_-_Getting_Ready.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educator-onboarding/hero-banner-classroom.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educator-onboarding/hero-robloxHQ.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/Bianca-Riviera.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/Code-Wiz.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/EDMO-Round-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/Genius-Academy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/Large_Code_Ninjas-_White_Horizontal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/Natalie-Clabo.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/The-Math-Obby.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/WGFactory.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/alvinblox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/code-kingdom-logo.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/educators-page/id-tech-logo.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/first-safety-and-civility-game/Create-Your-First-Civil-and-Safe-Game.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/first-safety-and-civility-game/civility.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Anchor-Tool.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Move-Tool.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Rotate-Tool.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Scale-Tool.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Galactic-Speedway.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Island-Of-Move.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Mansion-Of-Wonder.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Story-Games.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/Toolbox-Inventory.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/play-button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/general/stop-button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/Handout-CollaborationGuidelines.docx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/Roblox_Classroom_Kit.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/animation-feedback.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/digital-safety-presentation.pptx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/digital-safety-scavenger.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/introToCoding-cheatsheet.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/introToStudio-cheatsheet.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/project-feedback-presentation.pptx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/project-feedback.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/handouts/upstander-roleplay.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/Upstander_Situations_Handout.docx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_onlineCommunityHero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_showNPC_bully.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_showNPC_noBully.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/hero_digitalCitizenshipIntro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/Digital_Safety_Scavenger_Hunt_Handout.docx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/Intro_to_Digital_Safety_Lesson_Slides.pptx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_gameHero.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_heroImage.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_reportClick.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_showReport.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_youtube.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/ConfigureServer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Handout-CollaborationGuidelines.docx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Handout-CollabrationGuidelines.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Computer_Science_Quiz.docx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Computer_Science_Quiz.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Getting_Ready.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Project_Rubric.docx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Project_Rubric.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Roblox_Client_Quick_Start_Guide.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Roblox_Glossary.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/NameServer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/RobloxStudio-Cheatsheet.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Account_Creation_(Student_Handout).pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Assessment_Handouts.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Classroom_Kit.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Safety_education_brochure.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/ServersTab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/Twitterheader1500x500.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/VIPGamePage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/cityScape_312x200.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/classroomThumbnail_312x200.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/coding4_loopingArraysThumbnail.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/collabrationArticle_heroBanner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devStarted-allowCopying.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devStarted-clickCreate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devStarted-createNewGame.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devStarted-editPlace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devStarted-editTemplate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devStarted-gameSettings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devStarted-setCreator.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-BrandingExample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-assetKit-01.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-assetKit-02.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-mansions-byjus.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-mansions-original.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-newTemplates-city.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-newTemplates-spaceship.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/hero-banner-peopleTalking.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/hero-classroomLab.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/impactPage_hero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/introToGameDesign_thumbnail.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/introToStudio_thumbnail.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/knnoss-palace-example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module1-exampleStudio.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module1-gameExamples-normalCurve.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module1-gameExamples-ocean.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module2-addEmail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module2-capture.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module2-clickPlay.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module2-finishedTraining.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module2-gamePage copy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module2-gamePage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module2-homepage.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module2-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module2-trainingExample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module3-signinScreen.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module4-luaLearningQuiz.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module4-showChat.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module5-gameImages-450x250-lua.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/module5-gameImages-450x250-ocean.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/plane-crazy.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/thumbnail_digitalCitizenship.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/thumbnail_digitalCitizenship_312x200.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/legacy/worldbuilding_thumbnail.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/adventureGameReferenceHandout.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/adventureGameVisionHandout.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-evaluation.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-hero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-presentation.pptx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/createAndDestroy-hero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/createAndDestroy-presentation.pptx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/galactic-speedway-hero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-evaluationHandout.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-presentation.pptx delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-quizQuestions.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/introToGameDesign-brainstormHandout.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/introToGames-hero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/robloxDeveloper-hero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/storyGames-hero.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/lesson-plans/storyGames-overviewVideo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/stock-graphics/edu-marketing.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-robloxHighSchool.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-robloxUsersPark.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-spaceStudents.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-studentTeaching.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/stock-graphics/thumbnail-studentTeaching.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/stock-graphics/thumbnail-teacherInClassroom.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/StoryExample.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/StoryManager.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/Story_Games_Template.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/wcc2018_annotatedStory.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/wcc2018_quizGameExample_900x500.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/wccVideo_final_wSound.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroOverhead.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroPedestal.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroUsing.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/ArcHandles/ArcHandles-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/Beam/Curvature-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/DeviceSafeAreaVsFullscreen.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/NearPlaneZ.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/ViewportPointToRayOrigin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/DepthOfFieldEffect/Depth-Of-Field-Diagram.svg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/GetAdjacentTriangles.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/GetAdjacentVertices.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/Winding.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/GuiBase2d/AbsolutePositionCoordinateSystem.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/HapticEffect/Position-Radius.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenGui/ClipToDeviceSafeArea-False.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenGui/ClipToDeviceSafeArea-True.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenshotHud/Diagram.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FillDirection.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Fill.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Grow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Shrink.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Cross-Direction.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Tabs-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Tabs-6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment-Start.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment-Stretch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/SortOrder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalAlignment-Center.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalFlex-Cross-Direction.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalFlex-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/Wraps.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Accanthis-ADF-Std.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Amatic-SC.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Arimo.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Balthazar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Bangers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Extended.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Mono.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Sans.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Comic-Neue-Angular.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Creepster.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Denk-One.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Fondamento.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Fredoka-One.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Grenze-Gotisch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Guru.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Highway-Gothic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Inconsolata.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Indie-Flower.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Josefin-Sans.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Jura.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Kalam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Luckiest-Guy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Merriweather.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Michroma.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Montserrat.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Nunito.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Oswald.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Patrick-Hand.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Permanent-Marker.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Press-Start-2P.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto-Condensed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto-Mono.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roman-Antique.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Sarpanch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Source-Sans-Pro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Special-Elite.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Titillium-Web.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Ubuntu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Zekton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/AlphaMode/Fern-Cutout.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/AlphaMode/Fern-Overlay.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Mono.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Quad.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Stereo.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_5_1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_7_1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_7_1_4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-In.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-InOut.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-Out.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/AmaticSC.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Antique.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Arcade.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Arimo.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/ArimoBold.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Bangers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Bodoni.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSans.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansBold.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansExtraBold.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansMedium.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Cartoon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Code.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Creepster.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/DenkOne.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Fantasy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Fondamento.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/FredokaOne.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Garamond.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/GrenzeGotisch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Highway.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/IndieFlower.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/JosefinSans.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Jura.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Kalam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Legacy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/LuckiestGuy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Merriweather.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Michroma.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Nunito.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Oswald.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/PatrickHand.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/PermanentMarker.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Roboto.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/RobotoCondensed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/RobotoMono.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Sarpanch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SciFi.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSans.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansBold.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansItalic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansLight.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansSemibold.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SpecialElite.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/TitilliumWeb.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Ubuntu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/CoreUISafeInsets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/DeviceSafeInsets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/Inset-Regions-All.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/None.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/Top-Bar-Cutout.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/TopbarSafeInsets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/TextureMode/Stretch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/enums/TextureMode/Wrap-Static.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/32-Bit-Restriction.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/AND.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/LSHIFT.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/NOT.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/OR.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/RSHIFT.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/XOR.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-comparisons/Studio-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-comparisons/Unity-Editor-Layout.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-comparisons/Unreal-Details-Panel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/engine-comparisons/Unreal-Editor-Layout.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/ads_manager.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/advertising.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/age-based-chat.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/age_chat.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/analytics_essentials.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/animations.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/asset_repo.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/assets.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/audio_speaker.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/autosetup.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/avatar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/avatar_items.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/avatars.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/bans_dash.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/blender_stream.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/boots.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/browse_store_dark.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/browse_store_light.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/caging.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/camera_manip.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/character_specs.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/characters.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/client_mem.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/clothing.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/code_org.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/collaboration.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/content_updates.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/core_loops.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/create_sliding_door.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/creator_hub.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/data_model.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/datamodel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/datastores_mmo.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/debugger.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/debugging.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/developer_console.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/dynamic_cloth.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/engine.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/enyu.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/event_sequencer.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/events.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/forum_widget_thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/forum_widget_thumbnail@2x.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/fps_design.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/friend_invite.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/game_design.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/generate_textures_with_ai.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/getting_started_ugc.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/graybox.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/halloween_game_jam.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/heads.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/input.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/laser_beam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/laser_beam_tutorial.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/layered_clothing.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/lighting_effects.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/lighting_terrain.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/localization.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/lod.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/luau_oop.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/luau_time.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/make_hair.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/making-a-bag.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/matchmaking.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/memory_leaks.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/microprofiler.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/microprofiler_advanced.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/microprofiler_how_to.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/microprofiler_memory_profiling.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/modulescripts_sleit.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/npc_kit.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/obby_chat.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/performance_basics.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/physics_101.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/players.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/plugins.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/polarcub_store.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/polish_environment.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/promotion.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/real_world_optimization.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/rewarded_ads.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/rigging.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/rigid_accessory.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/robloxYoutubeAvatar.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/roblox_studio.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/rp_interview.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/rp_modeling.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/rp_texturing.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/rush_ugc.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/script_editor.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/script_locations.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/scripting.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/shoes.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/single_multi_script.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/sketch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/smooth_damp.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/social_design.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/stephen_remotes.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/studio_comments.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/studio_icon.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/studio_shortcuts.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/studio_tour.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/studio_upsell.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/subscription_design.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/terrain_editor.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/tutorials.png delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/ugc_homestore.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/ui_style.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/user_base.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/validation.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/version_control.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/video_previews.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/workspace.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/feeds/world_building.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/content-update/content-update1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/content-update/content-update2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/content-update/content-update3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/content-update/content-update4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/content-update/content-update5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/content-update/content-update6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-12.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-13.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-7.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-8.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-9.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-10.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-11.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-7.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-8.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-9.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/live-ops-planning/live-ops-communication.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/live-ops-planning/live-ops-planning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-10.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-11.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-12.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-13.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-14.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-15.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-16.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-17.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-18.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-19.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-20.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-21.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-22.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-23.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-24.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-7.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-8.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-9.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-7.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-10.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-12.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-13.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-14.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-7.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-8.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-9.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-ui1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-ui2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-spreadsheet-.xlsx delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-ui.pdf delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-10.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-11.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-12.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-13.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-14.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-15.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-16.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-17.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-18-video.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-7.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-8.png delete mode 100644 .cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-9.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Catapult.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Platform.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Projectiles.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Viewport.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Baseplate-Template-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Baseplate-Tile.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Course-Completed.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Course-Gravity.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Course-No-Baseplate.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/DataModel-End.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/DataModel-Start.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/DataModel-Workspace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Experience-Page-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/First-Inserted-Part.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/First-Part-Moved.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/First-Part-Rotated.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/First-Part-Scaled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/First-Part-Styled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/ModernCity-Tile.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/New-Template-With-Spawn-Location.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Overview.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Projectile-TooClose.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Projectile-TooFar.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Projectiles-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Projectiles-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Projectiles-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Publish-2A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Publish-2B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Racing-Tile.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Scripts-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Scripts-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Scripts-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Scripts-5B.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Scripts-5C.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Targets-1B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Targets-1C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Targets-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Targets-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/Workspace-Baseplate-Selected.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/developing-on-roblox/Global-User-Community-Chart.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/developing-on-roblox/Percentage-O13-Users-Chart.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Community.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Everything-You-Need.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Everything-You-Need.png delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Instant-Global-Access.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Rapid-Iteration.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Rapid-Iteration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/AddIPToIPFamily.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/AddLicense.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/AddLicenseStep.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/AvailableLicenses.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/BlueLockLogo.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily_NoFlow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily_YesFlow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/CreateLicense.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/CreateListing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/CreateListingStep.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/ExploreLicenses.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/Fall.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/IPFamilies.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/IPLicensing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/IPRegistrationFlow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/IPRegistrationPage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/LicenseListing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/LicensesCatalog.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/LicensesPage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/bluelock.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/catalog.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/kodansha.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/lionsgate.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/logo-dark.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/logo-light.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ip-licensing/rivals.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/Avatar_Banner_Landing.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/Cloud_Banner_Landing.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/Data-Model-Mapping.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/Exp_Banner_Landing.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/Growth_Banner_Landing.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/affiliate-link.webp delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/aged-up-avatar.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/app.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/assets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/avatar-play.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/blender-logo.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/chat-translation.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/cloud/banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/core-experience.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/datamodel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/device-family.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/discovery.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/ebp.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/education/banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/engine-simulation.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/engine/banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/get-started/Laser-Tag-Template.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/get-started/Platformer-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/get-started/Racing-Detailed.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/get-started/baseplate-template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/get-started/first-experience.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/get-started/modern-city-template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/get-started/racing-template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/get-started/studio.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/get-started/video-interviews.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/groups.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/guides/banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/articleBanner_announcements.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/articleBanner_avatar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/articleBanner_building_visuals.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/articleBanner_education_tutorials.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/articleBanner_open_cloud.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/articleBanner_production.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/articleBanner_scripting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/articleBanner_studio.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/creator-store.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/discover.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/started_creator_dashboard.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/started_studio.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/topic_avatar.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/topic_building_visuals.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/topic_education.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/topic_production.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/home/topic_scripting.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/hub-home.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/in-exp-monetization.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/limited-items.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/marketplace.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/monetization/hero.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/monetization/testimonial1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/monetization/testimonial2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/monetization/testimonial3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/monetization/testimonial4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/plugins.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/price-floors.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/scripting-animation.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/scripting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/sponsored-items.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/store.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/landing/ugchomestore.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Gusts.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Particles.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Wind-Direction-Widget.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Color-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Color-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Decay-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Decay-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Density-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Density-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Glare-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Glare-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Haze-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Haze-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Offset-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Offset-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Sahara-Sunset.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Showcase.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Attachments-Rotated.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/ColorSequence-Applied.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Curves-Applied.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Default-Beam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/FaceCamera.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Texture-Applied.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Transparency-Applied.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Width-Adjusted.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Color-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Color-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Cover-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Cover-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Density-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Density-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-10.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-50.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-0-255-125.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-255-100-50.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-75-150-255.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Shadows-False.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Shadows-True.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/PointLight-Range-12.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/PointLight-Range-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Showcase.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Angle-30.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Angle-75.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Face-Bottom.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Face-Left.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Angle-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Face-Bottom.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Face-Right.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-0-0-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-160-80-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-25-0-125.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-0.5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-1.5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-3.75.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Bottom-0-255-190.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Bottom-255-0-220.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Top-0-100-255.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Top-255-60-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentDiffuseScale-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentDiffuseScale-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentSpecularScale-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentSpecularScale-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation--1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation-1.25.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Geographic-Latitude.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/GlobalShadows-False.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/GlobalShadows-True.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/LightingStyle-Realistic.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/LightingStyle-Soft.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-0-175-255.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-200-150-240.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-255-150-50.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ShadowSoftness-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ShadowSoftness-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-17.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-6.3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/8x8-Explosion.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Color-Examples.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-ShapePartial-0.5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-ShapePartial-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-Surface.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-Volume.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Disc-ShapePartial-0.1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Disc-ShapePartial-0.5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Emission-Direction.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Flipbook.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/LightEmission.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Orientation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Box.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Cylinder.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Disc.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Sphere.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/ShapeInOut.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Size-Envelope.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Speed.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Sphere-ShapePartial-0.5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/SpreadAngle.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Squash.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Texture-Examples.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Texture-Indicated.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Transparency.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BloomEffect-With.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BloomEffect-Without.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BlurEffect-With.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BlurEffect-Without.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorCorrectionEffect-With.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorCorrectionEffect-Without.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorGrading-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorGrading-Retro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/DepthOfFieldEffect-With.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/DepthOfFieldEffect-Without.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/Sun-Rays-Effect.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Folded.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Orientation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Property-Faces.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Unfolded.png delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Attachment-Width-Between.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Color-Static-Gradient.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Lifetime.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Textures.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/ATC-Studio-Disabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/ATC-Studio-Enabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Add-Languages-Menu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Add-Languages.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Automatic-Translation-Quotas.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Change-Source-Language-Dropdown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Concept-Banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Experience-Page-Configure-Localization.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Game-Settings-Configure-Localization.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/In-Experience-Language-Switcher-Modal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/In-Experience-Language-Switcher.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Invite-User-As-Translator.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Locale-Left-Nav.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Locale-Source.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Locale-Translation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Localized-Image-English.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Localized-Image-Portuguese.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Localized-Image-Spanish.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Lock-Translations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Parameter-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Add-Source-String.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Information-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Information.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Product.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Adding-String.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Automatic-Translation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Clear-Strings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Enable-ATC-Auto.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Enable-ATC.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Manually-Remove.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Translate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Portal-Use-Translated-Content.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Translation-Reports.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Translator-Portal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Translators-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/localization/Update-Log.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Blender_Screenshot.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Imported-DataModel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Blender-Datamodel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Character-Folders.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Acc.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Accessory-Datamodel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Section.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Face-No-Highlights.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Face-Section.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Full-Render.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Mouth-Section.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/Makeup-Studio-Datamodel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Anthro-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Anthro-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Creatures-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Creatures-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Ears-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Ears-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Equidistant-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Equidistant-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eye-Enclosed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eye-Inner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-Layered-Clothing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-Textured.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-head-tail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Inorganic-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Inorganic-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Middle-axis.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-Eyebrows.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-Regions.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Mouth.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Neck-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Neck-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Non-Vertex-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Non-Vertex-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Nose.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Paint-on-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Paint-on-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Primary-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Primary-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Tight-Cage-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Tight-Cage-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Vertex-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/caging-examples/Vertex-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Assign-New.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Expected-Nodes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Select-Region.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Unlink-Image.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Fbx-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Blender.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Fbx-Gltf.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Maya.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Textures-Photoshop_Gimp.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Textures-SubstancePainter.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Expected-Nodes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Replace-Texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Select-Graph-Network.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Select-Hypershade.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Photoshop-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/makeup/resources/Substance-Thumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/matchmaking/CustomConfiguration_List.png delete mode 100644 .cursor/rules/roblox/en-us/assets/matchmaking/Custom_Matchmaking.png delete mode 100644 .cursor/rules/roblox/en-us/assets/matchmaking/Default_Matchmaking.png delete mode 100644 .cursor/rules/roblox/en-us/assets/matchmaking/MatchmakingAnalytics.png delete mode 100644 .cursor/rules/roblox/en-us/assets/matchmaking/Matchmaking_Analytics_Chart.png delete mode 100644 .cursor/rules/roblox/en-us/assets/matchmaking/Matchmaking_Simulation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/matchmaking/Player_Attribute.png delete mode 100644 .cursor/rules/roblox/en-us/assets/matchmaking/Preview_Custom_Signal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/matchmaking/Server_Attribute.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Arrow-High.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Arrow-Higher.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Arrow-Highest.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Arrow-Low.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Arrow-Lower.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Arrow-Lowest.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Arrow-Neutral.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Audio-Error-Popup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Box-Label-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Box-Label-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Box-Label-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Box-Label-D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Box-Label-E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Box-Label-F.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Box-Label-G.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Data-Share-Dialog.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Busy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Crosshair.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Forbidden.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-GrabbingHand.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-IBeam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-OpenHand.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Pointer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-PointingHand.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeAll.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeEW.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNESW.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNS.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNWSE.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeSplitH.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeSplitV.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Wait.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/SA-Icon-Laser-Tag.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/SA-Icon-Racing.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/SA-Icon-Soccer.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Todays-Picks-Home.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Todays-Picks-Marketplace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Webhooks-Bot-Workflow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Webhooks-Example-Message-Body.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/Webhooks-Sample-Notification.png delete mode 100644 .cursor/rules/roblox/en-us/assets/misc/blog_evergreen.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Front-Face-Pointing-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Front-Face-Pointing-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Lerp-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Lerp-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Offset-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Offset-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Relative-Position-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Relative-Position-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Offset-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Offset-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Rotate-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Rotate-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Position-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Position-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Rotation-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Rotation-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Top-Face-Pointing-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Top-Face-Pointing-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Explorer-MaterialVariant-Instances.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1D.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2D.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3D.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4D.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Expanded-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Preview-On-Part.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Preview.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Material-And-MaterialVariant.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Part-CustomPhysicalProperties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Physical-Overridden.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/materials/Properties-View-Override.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/3d-Import-Queue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/3d-Importer-Panels.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Base-Mesh-In-Marketplace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Beyond-The-Dark-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Blender-Scale-Examples.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Collar-Attachment-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Collar-Attachment-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Grip_Attachments.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Mesh-SurfaceAppearance.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Mesh-Textured.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Modeling-Requirements-Caps.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Mystery-of-Duvall-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Properties-TextureID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Reimport-menu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-High.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-Low.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-Medium.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Warning-Mouse-Over.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/Warning-Settings-Panel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Compositor-Example-Optimized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Compositor-Example-Poor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Beige.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Blue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Brown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Pink.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Transparent.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Island-Optimized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Island-Poor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Layout-Optimized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Layout-Poor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_1024.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_256.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_512.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Body_Cage_Templates.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Combined_Templates.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-base-model.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-rigged-r15.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-skinned-s15.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/shoebot-base-model.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/shoebot-rigged-model.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/1-resizing-base-model.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/2-bone-visualization.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/3-x-axis-mirror.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/4-repositioning-bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/5-inspect-bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/6-parenting-bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/7-assign-influence-head.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/8-assign-influence.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/9-test-bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/1-setting-up-blender.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/2-adding-armature.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.1-positioning-bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.2-positioning-bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.3-positioning-bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/4-rename-bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/5-parenting-armature.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.1-assigning-vertices.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.2-assigning-vertices.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.3-assigning-vertices.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/7-testing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/rigging-r1-imported.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/1-bone-visualizations.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/10-weight-paint-lower-arm.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/11-switch-to-upper-arm.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/12-weight-paint-upper-arm.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/13-switch-to-upper-torso.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/14-weight-paint-upper-torso.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/2-auto-normalize.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/3-select-head.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/4-weight-paint-head.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/5-test-head.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/6-select-hand-and-test.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/7-weight-paint-hand.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/8-test-hand.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/9-switch-to-lower-arm.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/Candywrap-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/autonormalize-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/autonormalize-example2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/head-example-headbone-selected.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/head-example-uppertorso-selected.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-generation/Behaviors.rbxm delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-generation/Green-Dragon-Car-Driving.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-generation/Green-Dragon-Car.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Actual.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Imposter.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Original.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Slim.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-StreamingMesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Example-3D.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Example-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Group-Simple.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Block.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Corner-Wedge.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Cylinder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Sphere.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Wedge.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Material-Neon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Material-SmoothPlastic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Mesh-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Move-Local-Orientation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Move-World-Orientation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Part-Example-CSG.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Cursor-Drag-Snap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Cursor-Drag-T-R.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Indicator.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Pivot-Snap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Ruler-Snap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-SM.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Rotate-SM.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Rotate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Scale-SM.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Scale.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Adding-Armature.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Animation-Editor-Add-Tracks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Scene-Units-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Scene-Units-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Bone-In-Front.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Bone-Visualization.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Brush-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Clothing-Data-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/CreatureModel.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Enabling-Autonormalize.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Extrude-Last-Bone.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Extrude-Second-Bone.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Head-Rigid-Example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Head-Skinned-Example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Import-Model.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Lola.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleLeafTree.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleLeafTree_S3.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleTreeS1.blend delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Bottom-Bone.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Middle-Bone.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Top-Bone.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Parenting-Armature.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Position-First-Bone.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Renaming-Bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Bone-Visualization.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Constraint-Details.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Hierarchy-Blender.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Hierarchy-Maya.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Setting-Projected-Brush.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Shoe-Data-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Stick-Visualization.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Test-Bones.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Test-Bottom-Bone.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-AE.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-Default.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-Skinned.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Weight-Painting-Example-Gradient.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/1_Hide-Armature.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/2_Set-Armature-Test.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/3_Fix-Skinning-Example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Blender-Preferences.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Calisthenics-Tool-Addon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Calisthenics-Tool-Open.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/CalisthenicsTool.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Exporting-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Fish-Character-No-FACS.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Movement-Reference.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Normal-Reference.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Running-Reference.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Slender-Reference.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Toolbar-Slider.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Walking-Reference.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/solid-modeling/CSG-SmoothingAngle-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/solid-modeling/CSG-SmoothingAngle-50.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Intersect-Result.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Negate-Result.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Negated-Part-To-Union.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Intersect.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Subtract.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Union.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Union-Result.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/010_SilkSatin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/011_VelvetSuede.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/012_GlossyLeather.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/013_WornLeather.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/014_Fur.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/015_Scales.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/016_Bone.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/017_Skin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/018_Wax.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/019_Marble.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/01_GlossyPlastic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/020_Jade.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/021_PaintedMetal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/022_PureMetals.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/023_WornMetals.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/024_GlassMirror.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/02_MattePlastic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/03_Rubber.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/04_Latex.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/05_GlossyWood.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/06_WornWood.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/07_CottonCanvasDenim.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/08_PolyesterNylon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/09_WoolLinen.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Custom-Skin-Tone-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Custom-Skin-Tone-Map.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Denim-Jacket-Sp.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Denim-Jacket-St.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Gold-Puffy-Jacket-Sp.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Gold-Puffy-Jacket-St.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Green-Jacket-Sp.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Green-Jacket-St.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Layered-Clothing-Example-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Layered-Clothing-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Leather-Jacket-Sp.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Leather-Jacket-St.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-Half.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Half.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-Half.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-Half.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-Half.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-Half.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-Metalness-Matrix.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-ColorMap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-Overlay.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-TintMask.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-Transparency.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Overlay.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks-Albedo.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks-Alpha.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap-After.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap-Before.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Example-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Example-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap-After.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap-Before.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap-After.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap-Before.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-After.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-Before.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-ColorMap.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap-After.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap-Before.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-Green.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-None.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-Red.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Custom-Colors-Fantasy.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Custom-Colors-Tundra.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Air.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Asphalt.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Basalt.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Brick.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Cobblestone.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Concrete.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Cracked-Lava.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Glacier.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Grass.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Ground.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Ice.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Leafy-Grass.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Limestone.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Mud.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Pavement.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Rock.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Salt.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Sand.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Sandstone.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Slate.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Snow.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Water.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Wood-Planks.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/RobloxColorMapIndex.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Showcase.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Colormap-Result.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Colormap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-GrassLength.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Heightmap.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/terrain/Water-Appearance.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Animated-Textures.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Add-Image-Texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Add-Normal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Create-New-Material.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Image-Texture-No-Assignment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Material-Check.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Shading-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-On-Surface.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-Texture-Sample-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-Texture-Sample-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Assign-Material.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Bump-2D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Connect-Nodes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Create-Surface.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Tangent-Space-Normals.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Orientation-Indicator.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Color3-255-0-100.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Example-Grafitti04.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Face-Front.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Face-Top.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-On-Surface.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Offset-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Offset-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Scale-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Scale-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Transparency-0.4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/avatar-creation-tokens/Avatar-Creation-Token-Copy-ID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/avatar-creation-tokens/Avatar-Creation-Token-Prices.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/avatar-items/Avatar-Items-Enable.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/avatar-items/Linked-Avatar-Items-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-item-analytics-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-items-analytics-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-items-analytics.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-ID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Metafield-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-PDP-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Put-On-Sale.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Virtual-Benefits.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/creator-rewards/dashboard.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/creator-rewards/share-links.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/developer-products/Buy-Product-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/developer-products/RankedItems.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/developer-products/StoreTopPicks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/developer-products/developer-products-analytics-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/developer-products/developer-products-analytics.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/earning/Average-Cash-Payouts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/earning/Earning-Flowchart.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/earning/Economy-Stats-Creator-Earnings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/earning/Economy-Stats-DAU.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/earning/Monetization-Growth-CAGR.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/earning/Percentages-Clothes-Accessories.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/earning/Percentages-Reselling-Limiteds.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/earning/Virtual-Items-Odds.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/Modal-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/Premium-Banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/engagement-based-payouts-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Active.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Inactive.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Invalid.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Sample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Inserting-ImageAd.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Inserting-PortalAd.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-ImageAd.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-PortalAd.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserA.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserB.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserC.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Portal-Ads-BasePortal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Portal-Ads-Decorative.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Active.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Inactive.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Invalid.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Sample1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Sample2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ViewingMetrics-Graph.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/immersive-ads/immersive-ads-eligibility.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/paid-access/Buy-Access-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/Circular-Trimming-Bad.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/Circular-Trimming-Good.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/Configure-For-Sale-Toggle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/Configure-Sales-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/Configure-Set-Price.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/Open-In-New-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/PromotedPass.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/PromotedPass2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/passes-analytics-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/passes-analytics.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/passes/passes-sample.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/price-optimization/Price-Optimization-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/private-servers/Example-Purchase-Dialog.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/LikelySpenders.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/OpportunityCalculator.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/Placements.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/RVAAnalytics.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/Example-Subscriptions.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-activate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-analytics-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-analytics.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-my-transaction.png delete mode 100644 .cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-pay-out.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Analytics-Itemized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Analytics-Summary.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-F.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Move-Package.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Notification-Stream.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Toolbox-Package.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/guides/datastore-perms.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/instance-api-beta.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/instance-api.png delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/open-cloud-nodejs-sample-oauth2-main.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/open-cloud-potion-shop-demo.ods delete mode 100644 .cursor/rules/roblox/en-us/assets/open-cloud/protocol-flow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.drawio delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.svg delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/chicken-rocket.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/RaycastSpam.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/custom-profile.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-counter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-counters-mode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-detailed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame-diff.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame-diff2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-frame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-frames.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-graph.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-group.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-groups-mode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-mobile.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-asset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-events.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-extra.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-panning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-save-to-file.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-server.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-spike.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-studio-flame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-threads-mode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-timeline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-timers-mode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-bar-graph.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-explorer-filter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-framerate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-framerate2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-localscript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-raycast-label.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-spam.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-stepped.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-xray.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/perf-hud.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Default.svg delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Character.svg delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Non-Spatial.svg delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Spatial.svg delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/streaming/ModelStreamingMode-Atomic.svg delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/streaming/ModelStreamingMode-Persistent.svg delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/streaming/Technical-Behavior.svg delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/task-scheduler/scheduler-priority.png delete mode 100644 .cursor/rules/roblox/en-us/assets/optimization/task-scheduler/task-scheduler.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping-Microprofiler-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping-Microprofiler-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Diagram-Labels.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/PhysicsSteppingMethod-Adaptive.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Settings-Are-Timesteps-Shown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Avatar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Block.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Ship.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/assemblies/Sleep-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-ControllerManager.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-Controllers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-Core-Setup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-RootPart-ClimbSensor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-RootPart-GroundSensor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Linking-References.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-ClimbSensor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-GroundController.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-GroundSensor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-Testing-ControllerManager.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-Testing-GroundController.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/character-controller/Testing-Labeled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/collisions/BasePart-CollisionGroup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Box.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Hull.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-MeshPart.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Precise.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Groups.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-AlignType.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-RigidityEnabled.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AlignPosition-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AlignPosition-ReactionForceEnabled.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-RelativeTo-Attachment1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-RelativeTo-World.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-IsKinematic.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-Transform.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Limits-Tilt.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Limits-Twist.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Constraint-AlignPosition-Labeled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Constraint-AngularVelocity-Labeled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Creation-Diagram.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-InclinationAngle-30.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-InclinationAngle-90.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Limits-Angular.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Limits-Linear.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-ActuatorType-Motor.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-ActuatorType-Servo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ApplyAtCenterOfMass-False.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ApplyAtCenterOfMass-True.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-InverseSquareLaw-False.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-InverseSquareLaw-True.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ReactionForceEnabled-False.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ReactionForceEnabled-True.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Link-Attachment0-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Link-Attachment0-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-RelativeTo-Attachment0.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-RelativeTo-World.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Attachment0-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Attachment0-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-ActuatorType-Motor.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-ActuatorType-Servo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Rod-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Rope-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Stiffness-25.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Stiffness-500.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/SpringConstraint-Link-Attachment0-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/SpringConstraint-Link-Attachment0-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Torque-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Torque-RelativeTo-Attachment0.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Torque-RelativeTo-World.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Damping-0.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Damping-50.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Attachments-Correct.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Attachments-Incorrect.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-ApplyAtCenterOfMass-False.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-ApplyAtCenterOfMass-True.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-RelativeTo-Attachment0.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-RelativeTo-World.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/physics/network-ownership/Visualization-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Advanced-Bubble.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-NPC.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Rich-Text.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-System.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Tag-VIP.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-User-Name-Colored.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-User-Name-Gradient.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Window-Components.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Workflow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Low-Health-Bubble.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Player-Conversation-Bubbles.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Text-Custom-Command.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChat-Group-Tag.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatCommand-Aliases.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-BubbleChatConfiguration-Enabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-BubbleChatConfiguration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-Callbacks.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-Configuration-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/VIP-Bubble.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Grip-Correct.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Grip-Incorrect.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Handle-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Inventory-Non-Physical.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Inventory.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboard-On-Screen.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboard-Stat-Name.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboards-Insert-Script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboards-Multiple-Players.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/teleport-access-control.png delete mode 100644 .cursor/rules/roblox/en-us/assets/players/voice-chat/In-Experience-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Credits.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Placement.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Bidding.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Gender-Ages-Devices.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Locations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Name-Next.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Upload-Widget.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerMetricCards.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerReporting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerReportingTable.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsOverview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Brand-Suitability.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Budget-Schedule.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Create.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Name-Next.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Objective.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Set-End-Date.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Create-Ad-Account.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/EnableRewardedVideoAdsToggle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Image-Ad-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Live-Preview-Experience.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Menu-Payment-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Payment-Activity-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Portal Ad Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Portal-Ad-Destination-Experience.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Ad-Sets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Ads.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Campaigns.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign-Ad-Set.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign-Ad.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/Sponsored-Experience.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/ads-manager/campaign-payment-method.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/Dedicated-Event-Page-Copy-URL.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/Dedicated-Event-Page-Live.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/Experience-Page-Promotion.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-About-Tab.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-Events-Tab.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-Feature-Event.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Lock-Screen.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Roblox-App.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Update.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/off-platform-featuring.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/experience-events/submit-for-featuring.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-App-Notification-Stream.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-From-Experience.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-Phone-Lock-Screen.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/BadContent.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/BadDisclosure.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Banner-Ad-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Guidelines-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Mobile-Enable-Notifications.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Mobile-Share.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Page-Enable-Notifications.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Experiences-Sorted-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/GoodContent.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/GoodDisclosure.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/In-Experience-Enable-Notifications.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Model-Tab-Material-Manager.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-Blocky.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-BloodyEyes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-NoFlesh.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Social-Links-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Sponsored-Items.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/Updates-Listing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/User-Ad-Templates.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/User-Safety-O13.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/misc/User-Safety-U13.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Flow-Referral-System.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Flow.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Friends.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/referral-system/Invitee-Flow-Referral-System.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/referral-system/Reward-Details.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/referral-system/Reward-Details.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/search-ads/Ad-Set-Search.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/search-ads/Edit-Ad-Creative.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/search-ads/Edit-Ad-Name.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/search-ads/Keyword-Bidding.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/promotion/search-ads/Select-Keywords.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/Description-Peek-Mobile.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/Google-Game-Search-Result.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Audio-Volume.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Contrast-High.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Contrast-Low.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Grayscale.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Normal.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Symbols-Grayscale.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Symbols-Normal.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Default.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Full.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Half.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Labels.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Sound-Reliance.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-LG-Blur.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-LG.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-SM-Blur.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-SM.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/account-verification/Account-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/account-verification/Add-Phone.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/account-verification/Phone-Verified.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-Birthday.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-My-Age.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-Phone-Dialog.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-With-ID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/badges/Badge-Experience-Page.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/badges/Badges-Inventory.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/badges/Circular-Trimming-Bad.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/badges/Circular-Trimming-Good.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/badges/Reorder-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/badges/Reordering.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/console/10ft-Experience.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/console/Haptic-Feedback.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/console/Progressive-Disclosure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/console/TV-Safe-Area.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/console/UI-Navigation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonA-PS.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonA-Xbox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonX-PS.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonX-Xbox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Large.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Medium.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Small.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Input-Actions-Jump.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Gamepad.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Keyboard.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Touch.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Position-Scale.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Responsive-Layout-Landscape.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Responsive-Layout-Portrait.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/cross-platform/Screen-Size-Themes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Genre-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Action.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Camping.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-High-Res.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Low-Res.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Not-Square.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Ocean.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Theme-Park-Symbol.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Theme-Park.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-High-Res.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Home-Page-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Impressions-Graph.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Not-16-9.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Theme-Comical.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Theme-Horror.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Unclear.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Urban-Rush.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Video-Accurate.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Video-Inaccurate.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Edit-Place-In-Studio.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Experience-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Experience-Page-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Maturity-Label-Strong-Language.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Publish-Window-Select-Start-Place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Dropdown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page-Limited.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page-Sale.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Catalog-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Creation-Page.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Enable-Third-Party-Sales.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Error-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Item-Attributes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Manage-Item-Page.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Mannequin-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Mannequin-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Pricing-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Body.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Clothes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Item.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/ReplicatedStorage-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Sale-Location.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Sale-Toggle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/ServerScriptStorage-Readme.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Configuration-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Example-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Example-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Bulk-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Bulk-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Mobile-Marketplace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Per-Item.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/marketplace/Transaction-Report.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/safety/Abuse-Reports-Per-Category.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/safety/Automated-Insights.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/safety/Filter-by-channel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/safety/Submitters-Per-Hours.png delete mode 100644 .cursor/rules/roblox/en-us/assets/publishing/vr/Auto-Quality-Mode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-Building-View.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-New-Tile-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-New-Tile-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Octant-Cube.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-AM-Select-Places-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Edit-Place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Gameplay-Close.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Close.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Copy-ID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Set-Name.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-View.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-MainConfiguration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-Names.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-Overwrite.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Place-Server-Fill-Maximum.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Publish-Update-Existing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Publish-Window-Create-New-Game.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/RobloxBattleRoyale.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/introduction/Battle-Royale-Slide-B.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/minimap-system/Battle-Royale-Minimap-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/minimap-system/Battle-Royale-Minimap.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Common.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Epic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Legendary.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Rare.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Special.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Uncommon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-New-Pickup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-New-Weapon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-PickupSpawners.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Pickups.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Weapon-Pickup.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Weapons.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Battle-Royale-Lobby-Open-Place-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Battle-Royale-Lobby-Open-Place-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Studio-Recent-Games.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/battle-royale/the-storm/Battle-Royale-Storm.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/btd-banner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture-Overview.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_3.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_4.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_7.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_8.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Modular_Trim_Sheet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Packages_Example_1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Packages_Example_2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Surface_Appearance_Example_1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Surface_Appearance_Example_2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Example_2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Final_1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Final_2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Animation-Example.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Animation-Import-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Bad_Skinning_Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature-Eyes.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature-In-Maya.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature_Banner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature_Front.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Custom-Import-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Final-Result.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Glowing-Creature.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/In-Studio-VFX.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Light-Emission.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Particle-Emitter.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Rigging_Neutral_1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Rigging_Neutral_2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Script-Example.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Smooth_Skinning_Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Spotlights.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Surface-Appearance-Transparency.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Surface-Appearance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-3.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-4.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessories-In-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Tool-Mannequin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Adding-Surface-Appearance-2.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Adding-Surface-Appearance.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Caging-With-Gloves.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-And-Suit-Overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-Model-Exploded.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Design-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Design-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Outer-Cage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Posing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Custom-Character-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Glass-Surface-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Attachments.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Equipped-Final.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Silhouette.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Texture-Map.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Importing-Helmet-Mesh.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Layerable-Suit-Comparison.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Motion-Test.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Replacing-Hands-And-Feet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Seams-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Seams-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Shoulder-Seams-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Shoulder-Seams-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Silhouette-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Silhouette-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Movement.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Lighting-Test-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Lighting-Test.gif delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Texture-Comparisons.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Texturing-Showcase.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Unique-Characters.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Vertex-Influence-Example-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Vertex-Influence-Example-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/In-Explorer-Sound.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/In-Studio-Sound.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Banner.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Structure-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Structure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Final-UI.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Light-Properties.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Parallax-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Proximity-Prompt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/StarterGui-Adornee.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UI-Export.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UI-Mock.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UITweenModule.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/city-people-cars/CPC-Slide-D.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/city-people-cars/CityPeopleCars.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Intro copy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Small.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/feature-packages/Missions/Missions-Condensed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/feature-packages/Missions/Missions-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/feature-packages/Season-Passes/Season-Passes-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/feature-packages/engagement/rewards-annotated.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/feature-packages/engagement/rewards.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/armillary-asset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/armillary-model-package.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/asset-storage-place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/assigning-textures-crow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-attic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-dining.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-foyer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-second-floor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-whole-house.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/convert-to-package-dialog.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/crow-cleaned-up.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/crow-notes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/decimation-crow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/decimation-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/earliest-version-toolbox-house.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-concept-approach-house.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-draft-playable-area.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-shot-driveway-approach.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-candle-asset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-content-versions.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-crow-asset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-foyer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/freeform-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/furniture-spreadsheet.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-boxed-versions.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-front.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-side.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-top-down.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/hand-draw-crow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/metal-surface-appearance-package.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-automated-uvs.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-candle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-crow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/overlapping-crow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-corrupt-state.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-entire-bedroom.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-normal-state.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/pbr-textures-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/pbr-textures-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/retopologized-candle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/retopologized-crow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-final.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-inside.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-outside.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-candle-final.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-crow-final.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-texture-1.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-texture-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/zremesher-crow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/zremesher-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/audio-volume.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/car-part-volume.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/compressorsoundeffect-properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/exterior-audio-hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/main-audio-mixer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/sound-emitters-hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/volumetric-audio-emitter-greenhouse.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/volumetric-audio-immersive.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/animated-trees.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/base-piece.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/beechwood-joint-animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-billboard.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-shading.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-texture-on-parts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/collision-fidelity-treehouse.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/debris-volumes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/eye-of-the-storm-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/eye-of-the-storm-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/false-wall.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/fog-particle-volume.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/fog-particle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/forest-pack.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/friends-spinning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/high-poly-sculpt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/hingeconstraint-properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/illusion-image.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/layered-cloud-meshes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/leaf-particle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/lightning-bolt-photoshop-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/lightning-bolts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/low-poly-mesh-with-normal-info.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/low-poly-mesh.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/main-vortex-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/movement-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/obstacle-course.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/pantry-corrupt-state.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/pantry-movement.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/part-volumes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/particle-emitter-properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/particle-emitter-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/redwood-tree-animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/show-decomposition-geometry-disabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/show-decomposition-geometry-enabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/single-cloud-mesh.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/son-puzzle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/spinning-elements.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/squash-20.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/squash-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/target-closed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-animation-import.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-joints.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/treehouse-mesh.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/treehouse-texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/unanchored-platform.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/vertex-painting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/yellow-part-volume.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-interrupt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-purple.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-white.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-yellow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/barn-owl-thought-bubbles.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/blank-textlabel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/chalkboard.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/dog-statue-lore.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/dog-statue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/example-script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/grandfather-room.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/jacob-photo-album.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overlay-back-button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-announcement.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-thought-bubble.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-visual-cues.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/power-line.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/richtext-thought-bubble.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/storynote-object.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/1-1-texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/after-override.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/alpha-merge-substance-designer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/backyard-terrain-materials.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/backyard-wet-material-variants.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/basecolor-rgb.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/before-override.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/cleaner-texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/couch-surface-appearance-set.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/craftsman-reference-images.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/edit-variant-dialog.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/final-alpha.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/final-surface-on-couch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/furniture-set-stain.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/height-map.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/leather-couch-settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/leather-trim-texture-set.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/material-variant-overrides.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/mesh-in-foreground.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/only-colormap-and-mesh-color.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/rgba-in-combination.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/scratches-and-wear-mask.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/set-override.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/tiling-texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/too-much-detail-texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/transform-2d-node.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/trim-texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-asset-place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-assets-in-place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-texture-set.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/overview/overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/1024-max-distance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/64-max-distance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/content-streaming.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/perspective-house.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/perspective-treelines.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/winding-path.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/cutscene.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/interpolation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/key-grabbing-system.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/respawning-players.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/simple-lobby.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-NP-C-9000-Robots.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-RO-01-Robots.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-Soldiers.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-Zombie.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/plant/Architecture-Systems.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/plant/Architecture-UI.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/plant/Project-Banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-Cinematic.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-PiP.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-Switcher.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/roblox-connect/CanSendCallingInviteAsync.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/roblox-connect/Emote-Bar.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/roblox-connect/Environment-Switcher.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/roblox-connect/GetDeviceCameraCFrame.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/roblox-connect/PromptPhoneBook.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/roblox-connect/ShowHideSelfView.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Baseplate-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/CTF-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Castle-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Classic-Baseplate-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Classic-Racing-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Combat-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Concert-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/FFA-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/FPS-System-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Flat-Terrain-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Homestore-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Laser-Tag-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Line-Runner-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/MIS-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/MOW-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Obby-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Pirate-Island-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Platformer-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Racing-Template-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Racing-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Starting-Place-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Suburban-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/templates/Village-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-AR.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Crossbow.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Grenade-Launcher.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Pistol.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Railgun.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Rocket-Launcher.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Shotgun.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Sniper-Rifle.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Submachine-Gun.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapons-Banner.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Move-WeaponsSystem-Folder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Sprint-Zoom-Configurations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-BulletHole.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children-Grenade-Launcher.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children-Railgun.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-BaseParts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants-Crossbow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants-Railgun.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-MuzzleParticles.png delete mode 100644 .cursor/rules/roblox/en-us/assets/resources/weapons-kit/WeaponsSystem-Structure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/client-server/Client-Script-Containers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/client-server/Client-Server-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/client-server/Data-Model-Mapping.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Client-Server-Client.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Client-Server.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-All-Clients.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-Client-Server.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-Client.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/apostrophe.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/backspace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/comma.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/dpadDown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/dpadLeft.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/dpadRight.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/dpadUp.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/graveaccent.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/period.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/return.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/shift.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/spacebar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxA.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxB.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxLB.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxLS.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxLSDirectional.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxLT.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxRB.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxRS.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxRSDirectional.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxRT.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxView.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxX.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxY.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/controls/xboxmenu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-rojo-plugin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-rojo-sync.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-vscode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/input/Gamepad-Inputs-PS.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/input/Gamepad-Inputs-Xbox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/scripts/Actor-Tree.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/scripts/FewerVsMoreActorsDark.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/scripts/ImmediateVsDeferredEvents.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/scripts/Parallel-Luau.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/scripts/ParallelExecutionDark.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/scripts/Scope-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/scripts/Touched-Event-No-Debounce.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/scripts/multi-thread.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/scripts/single-thread.png delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/security/Movement-Validation-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/security/Movement-Validation-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/scripting/security/Remote-Purchase-Flow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-Before.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-Local-Z.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-World-Z.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Center.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Max.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Min.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Center.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Max.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Min.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Before.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Max-X.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Min-X.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Before.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Max-X.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Min-X.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/Asset-Inspect-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/Asset-Type-Filters.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/Display-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/Grid-View-Ordering.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/Grid-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/Import-Button-V1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/Import-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/Inventory-Sorts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/List-View-Ordering.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/asset-manager/View-Toggle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Collaborative-Session.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Collaborator-Search.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Comments-Cursor.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Comments-Window.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Commit.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Compare.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Diff-Result.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Merge.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Restore.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Window.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Edit-Permission-All-Group-Experiences.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Edit-Permission-Per-Experience.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Disable.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Join.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Status.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Toggle-Selections.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Scripting-Cursors.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/User-Color-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collaboration/User-Color-Parts.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Add-To-Group.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Configure-Groups-List-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Configure-Groups-Table-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/List-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/New-Group-List-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/New-Group-Table-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Rename-Group.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/StudioSelectable-Off.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Table-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/Callgraph.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/Client-Server-Dropdown.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/Console-Summary-Bar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/Export-Window.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/Functions.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/Graph-View.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/Log-Sections.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/LuauHeap-Native-Annotation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/LuauHeap-Open.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/Memory-Open.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Expand-Root.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Native-Annotation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Open.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Start.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Units.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/console/Unique-Reference-View.jpeg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Breakpoints-Window-Contexts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Breakpoints-Window.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Call-Stack-Flow-Script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Call-Stack-Flow-Window.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-3D-Client.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-3D-Server.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-Explorer-Client.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-Explorer-Server.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Active.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Conditional.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Disabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Logpoint-Disabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Logpoint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Native-Code-Size-Analysis.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Script-Editor-Mouseover-Table.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Server-Authority-Simulation-Radius.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Expressions-Script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Expressions-Window.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Variables-Script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Variables-Window.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Branch-Expanded.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/CSS-Test-Setup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Chat-Descendants.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Context-Menu-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Context-Menu-Service.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Drag-Select-Searched.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Example-Maps-In-Workspace-ServerStorage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Example-Organized-Folders-In-Workspace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Folder-Children.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Insert-Object-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Lighting-Atmosphere.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Lighting-Sky.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/LinearVelocity.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/LocalScript-In-TextButton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/MeshPart-ParticleEmitter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/MeshPart-SurfaceAppearance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Model-Beam-Setup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Model-DragDetector.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Model-Generation-Behaviors.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Model-Generation-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Parent-Child-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Part-Attachment-BillboardGui-ImageLabel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Part-BillboardGui-ImageLabel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Part-SurfaceGui-ImageLabel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Part-Trail-Setup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Created.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Empty-Script-Adder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Inserted-Script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Reparent-Object.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Server-Authority.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Tools.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Clothing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Shirt-Graphic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Script-Parent-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Script-Parent-ReplicatedStorage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Script-Sync.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Search-By-Name.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Search-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Select-All-Searched.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/ServerScriptService-Actor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Non-Searched-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Non-Searched-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Searched.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/SoundService-SoundGroup-ReverbSoundEffect.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/SoundService-SoundGroup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/SpringConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-BindableEvent-ContextEvent.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-All.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-GamepadBinding.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-KeyboardBinding.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-TouchBinding.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-LocalScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-LocalScript-UpdateContext.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-HUDContainer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-MenuFrame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-Path2D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-SprintButton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-StyleLink.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-TextButton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-VideoFrame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-SurfaceGui.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-UIDragDetector.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterPack-Tools.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StarterPlayer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/StyleLink-Propagation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Styling-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Teams-Team.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Terrain-Clouds.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChannelTabsConfiguration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChatInputBarConfiguration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChatWindowConfiguration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-TextChatCommand.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/UIGradient.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/UIGridLayout.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/UIPageLayout.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/UITableLayout.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/VoiceChatService.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Add-Object.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Baseplate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Terrain.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Tool.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/explorer/Workspace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/3D-Asset-Preview.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Activity-History.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Boom-Impact.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-Cyan-Purple.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-Purple.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-White.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-White-Keypoints-Labeled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-White.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Command-Bar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Controller-Emulator-VR.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Controller-Emulator.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Device-Emulator-Phone.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Device-Emulator-Tablet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Docking-Expand-Collapse.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Docking-Grouped-Tabs.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Docking-Pinned-Tabs.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Empty.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Left.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Right.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Editor-Window-Emulation-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Editor-Window-Object-Selection.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Editor-Window.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Emulator-Viewport-VR.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Manage-Tabs-Popup-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Manage-Tabs-Popup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Resume-Scripts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Stop.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Tools.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Default-Tabs.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Right.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Client.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Controls.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-End-Session.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Run.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Server-Clients.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Team-Test.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Test-Here.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Test.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Pause.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Server.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Step-Forward.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Stop.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0-1-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0.5-0.5-Keypoints-Labeled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0.5-0.5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-Envelope.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Output-Window-Client-Server-Labels.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Output-Window-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Output-Window.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Party-Simulator.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Preview-Panel-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Selected-Object-Bounding-Box.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Selection-Cycling.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Studio-Layout.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Studio-Logo-Blue.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Studio-Splash.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Add-Custom-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Align.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Anchor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Assistant.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Avatar-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Avatar-Setup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Character.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Collaborate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Color-Picker.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Comments.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Constraint-Pickers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Current-Collaborators.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Plugin-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Tab-Add-Tool.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Tab-Filled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Debugging-Tools.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Group.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Insert-Part-Widget.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Lock.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Manage-Collaborators.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Material-Color.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Material-Picker.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Mezzanine.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Mode-Physical.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Pivot-Reset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Pivot.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Solid-Modeling.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Style-Editor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Terrain-Editor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Toolbox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Transform-Snapping.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Transform-Tools.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Update-Available.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Touch-Simulation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/general/Visualization-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Apply-To-Selected-Parts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Base-Material-Selected.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Create-Material-Variant.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Custom-Material-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Disable-Material-Override-Specific.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Paint-Parts-With-Selected-Material.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Physical-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Set-Override-Disabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Set-Override-Enabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Terrain-Details-Create-Buttons.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/material-manager/Terrain-Details-Edit.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/packages/Compare-Versions-Selector.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/packages/Package-Configured-Attributes-Reset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/packages/Package-Configured-Attributes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/packages/Package-Modified.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/packages/Package-Structure-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/packages/Package-Update-Available.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/packages/PackageLink-Explorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/packages/Script-Unlock-Link.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Center-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Corner-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Outside-A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/Hotspots-Model.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/Hotspots-Part.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Add-Attribute-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Add-Tag-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/AnchorPoint-Default.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/AnchorPoint-Overridden.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Appearance-Color3-Picker.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Appearance-Color3-RGB-Entry.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Attributes-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Color-Input-Options.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Color-Open-Sequence.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Color-Picker.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Color-RGB-Entry.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Default-Properties-Toast.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Enter-Private-Asset-ID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Folder-Sandboxed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-AnchorPoint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-AutomaticSize.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-Position.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-Size.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-ZIndex.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Input-Combined.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Input-Expanded.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/InputAction-Type-Bool.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-KeyCode-ButtonY.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-KeyCode-LeftShift.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-UIButton-SprintButton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Instance-Filtered.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/LinearVelocity-Attachment0-Unassigned.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Model-LevelOfDetail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Model-ModelStreamingMode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/ParticleEmitter-WindAffectsDrag.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Path2D-SelectedControlPointData-Expanded.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Path2D-SelectedControlPointData.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Remove-Tag-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Rename-Delete-Attribute-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/ScreenGui-ScreenInsets-DeviceSafeInsets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Script-RunContext.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Sections-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Set-Attribute.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Set-Tag.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Size-Open-Sequence.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Sound-SoundGroup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Sound-SoundId.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/SpawnLocation-TeamColor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/SpringConstraint-Attachment0-Unassigned.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/StarterPlayer-Camera-Group.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/StarterPlayer-EnableMouseLockOption-Off.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/StyleLink-StyleSheet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Styling-Modified-Property.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/SurfaceGui-Adornee-Face.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/SurfaceGui-Face-Top.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Team-AutoAssignable-Disabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Team-Name-TeamColor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Terrain-Decoration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Terrain-GrassLength.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Terrain-MaterialColors-Expand.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/TextChatService-ChatVersion-LegacyChatService.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/TextChatService-ChatVersion-TextChatService.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Tool-Grip.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Tool-RequiresHandle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Transparency-Open-Sequence.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/UICorner-CornerRadius.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/UIGradient-Open-ColorSequence-Window.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/UIGradient-Open-NumberSequence-Window.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/VideoFrame-Looped-Playing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Workspace-GlobalWind.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Workspace-ModelStreamingBehavior-Default.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Workspace-ModelStreamingBehavior-Improved.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Workspace-Streaming-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/properties/Workspace-StreamingEnabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/AddAboveBelow.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/AddToAllMatches.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/AddToNextPrevMatch.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/AddWithClick.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/AddWithDrag.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-API.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-CustomDocs.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Data-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Diagnostics.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Signature.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Suggestions.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Variable.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Code-Assist.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/ColumnBlockSelect.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/CopyPaste.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Find-Match-Case-Whole-Word.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Find-Replace-Widget-Labeled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Go-To-Declaration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/MatchCaseWholeWord1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/MatchCaseWholeWord2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/OnTypeFormatting.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/RemoveWithClick.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Analysis-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Analysis-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Functions-Filter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/Shortcut-Edit-Select-Prev.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/SplitSelectionsIntoLines.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/script-editor/UndoRecentCursor.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Brush-Shape-Icons.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Brush-Shape-Size.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Clear.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Generate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Import.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Draw-Tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Detail-Tools.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Draw.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Fill.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Flatten.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Paint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Sculpt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Sea-Level.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Select.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Smooth.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Transform.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Fill-Region.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Flatten-Mode-Icons.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Flatten-Tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Generate-Tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Import-Tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Paint-Tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Sculpt-Tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Sea-Level-Tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Select-Region-Labeled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Smooth-Tool.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/terrain-editor/Transform-Region-Labeled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Art-Style.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Angle-Bad.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Angle-Good.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Mossy-Stone.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Post-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Rusted-Metal-Charred.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Snow-Covered-Ice.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Untextured.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Saved-Textures-List.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Bad-Back.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Bad-Front.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Good-Back.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Good-Front.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/texture-generator/Texture-Applied.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Asset-Inspect-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creations-Group-Packages.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creations-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Advanced-Filter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Audio-Discovery.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Audio.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Categories-Ads.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Categories-See-All.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Category-Selector.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Scene-Manager-Plugin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Inventory-My-Packages.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Inventory-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Model-Search-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/studio/toolbox/Recent-Tab.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/.gitkeep delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Background-Music.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Box-Modeling.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Creating-Animations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Creating-HUD-Meters.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Events.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/First-Person-Camera.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Humanoid-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Indoor-Lighting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Interactive-UI.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Isometric-Camera.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Laser-Beams.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Modular-Environments.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Moving-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Neon-Signs.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Outdoor-Lighting.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Part-Interfaces.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Player-Input.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Positional-Audio.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Properties-Attributes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Proximity-Prompts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Saving-Data.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Score-Bars.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Script-Types-Locations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Scripting-Avatar-Animations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Services.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Side-Scrolling-Camera.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Simple-Mesh.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Spinning-Objects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Text-to-Speech.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Vertex-Coloring.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Voice-Chat.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Volcanoes.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Waterfalls.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Button-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Button-Pressed.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Feedback-DataModel.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Feedback-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/In-Focus-State.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Looping-DataModel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Looping-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Metal-Track.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/On-Hover-State.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Selected-State.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/UI-DataModel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/UI-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/With-Looping.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Without-Looping.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/game-state-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Button-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Button-Pressed.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/CharacterDialogue-DataModel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Dialogue-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/EventFeedback-DataModel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Experience-Object-Representations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Feedback-DataModel.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Feedback-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Looping-DataModel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Looping-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/ObjectInteraction-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Plant-Example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Realworld-Object-Representations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Space-Bark.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Volume-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/event-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/looping-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/ContextTTS-final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/GreenGumdrop.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/RedGumdrop.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/YellowGumdrop.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp1.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp2.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp3.mp3 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/add-voice-chat/DisabledScripts.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Additional-Mesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Core-Mesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Making-A-Building.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Overlapping-Meshes.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-MassSelection.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-MaterialVariants.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-NewColor.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-NewCustomMaterial.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/DecorativeProps-Building.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Overview-Asset-Kit.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Overview-City-Template.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Aligned-Diagram.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Aligned.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Awning.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Cornice.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned-Diagram.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned-TopView.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Railing.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Stud-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Snapping-Behavior-Values.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Concrete.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-DefaultTrim.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Delete.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Final.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-NewColor.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-NewTrim.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Objects.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Wood.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Textures-Building.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/WithTexture.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/WithoutTexture.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/basicParticleFinished.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/basicParticleNoLight.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/defaultParticles.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/explorerMeshPart.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/meshProperties.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleColor.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleColorGame.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleLifetime.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleLifetimeGame.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleRate.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleRateGame.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpeed.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpreadAngle.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpreadAngleGame.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/rotatingParticleEffect.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/scalingParticleEffect.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Add-Platforms-Final.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Add-Platforms-Greybox.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Add-Folder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Add-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Character-Humanoid.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Model-Renamed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Final-Platforms.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/First-Platform.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Final.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Negate.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Start.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Union.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Humanoid-Jump-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/New-Part-As-Child-Of-Model.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Part-Picker.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Platform-Levels.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Platforms-Aligned-Underwater.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/playable-area-walk.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/Ferris-Wheel-Edit-Place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/ferrisWheel-finalExample.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/ferrisWheel-inContext.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_actuatorType.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_angularVelocity.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_mainMotor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_mainMotorAttachments.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_motorMaxTorque.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_moveMainSupport.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_movedSupportAttachment.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_movedWheelAttachment.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_originalPosition.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_rotateWheelAttachment.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_supportAttachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_wheelAttachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints-showDoorCreated.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsConnected.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsCreated.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsRenamed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_doorSwingingWrong.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalDoor.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalDoor_WithLimits.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalExample.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_limitAnglesV2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_limitsEnabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_primaryAxis.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_secondaryAxisArrow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectAnchored.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectAttachment0.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectFrameAttachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAttachementsMoved.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAttachmentAxis.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAxisArc.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showCreateHingeConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showLimitsSet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showMoveAttachment.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_snapRotate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Mezzanine-Assistant.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/ObbyThumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Studio-Setup.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Texture-On-Surface.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/anchor-demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/createPrompt-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/insert-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/insert-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/materials.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/building-lesson/part-picker.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/coding-lesson/StoryGameThumb.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/CameraManagerScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/CameraModeProperty.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/FirstPersonCameraExample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/IsometricCameraExample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/SidescrollingCameraExample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/StarterPlayerSelection.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/ThirdPersonCameraExample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/VectorComponentDemonstration.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Coins-Final.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Mountains-Final.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Organization-Structure.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Platforms-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Platforms-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-10.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-11.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-12.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-13.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-14.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-15.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-16.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-17.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-18.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-7.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-9.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Asset-Library-Complete-With-Materials.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Asset-Library-Complete.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Baseplate-Deleted.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Coin-Mesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Completed-Sea-Stack.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-AirParticleDensity.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Color.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Offset.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Shadows.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-SunPosition.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-Color.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-Shadows.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-SunPosition.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Dust-Motes-Sky.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustMotes-NumberSequence-Size.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustMotes-NumberSequence-Transparency.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustParticles-1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Coin.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Flare.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Polished-Assets.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/First-Platform.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-NumberSequence-Size.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-NumberSequence-Transparency.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-With-PointLight.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Lighting-Post-Customization.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Lighting-Pre-Customization.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/LightingStyle-Realistic.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/LightingStyle-Soft.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/MaterialService-Contents.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Mountain-Mesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Mountain-Meshes-Stacked.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-A-Model.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-B-Model.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-Types.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Pre-Polished-Assets.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stack-Cave-Mesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stack-Mesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stacks.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Adding-First-Sphere.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Draw-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Fill-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Flatten-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Paint-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Sculpt-Settings.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Filling-Water.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Flattening-Sphere.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Painting-Grass.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Sculpting-Edges.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/create-an-environment-with-terrain-spawn.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/create-an-environment-with-terrain-walking.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/Hazard-Part-On-Water.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/New-Hazard-Part.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/player-hazards-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/Showdown-Town-Edit-Place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/dangerousVent.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/finalHealthPickup.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/finalHealthPickupTest.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/forLoop.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/fullHealthPickupEffect.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/healthPickupExplorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/healthPickupGame.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Device-Emulator-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Device-Emulator-Setup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-2A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-2B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Diagram2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Horizontal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Vertical.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Icon-1B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Icon-2E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Score-Bar-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Text-1B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Text-2H.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/bipi_t2_showFrame3_front.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/bipi_t2_showFrame3_side.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_exportedAnimationWeb_alt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_01.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-AddKeyframe.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-changeExactTime.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-clickAddAll.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-clickMenuButton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-exportAnim.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-exportCopy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-partHierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-pasteLastFrame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-rigCreated.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-selectFirst.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-setToMidFrame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-setToThirdFrame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/intro-to-animations-victoryPoseFinal.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showFinalVictoryPose_simple.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showMoveBody.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showPose2TimeLapse_optimized.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showRotateArms_web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Add-Rig-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Creations-Animations.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ellipsis-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Feminine-Rthro-Rig.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Final-Animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Gear-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/InterpolationExample.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-2A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-2C.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-3A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-4A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-4B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-5A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-5B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-6A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-2A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-2B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-3A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-5A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-5B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-2A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-2B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-3A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-5A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-5B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-2A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-2B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-3A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-5A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-5B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/LeftStepSequence.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Masculine-Block-Rig.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Masculine-Skinned-Rig.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Publish-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-All.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Feet.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Head.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Masculine-Rig.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-3A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-4A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-4B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-5A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-5B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-3A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-3B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-4A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-4B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-5A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-5B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-3A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-4A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-4B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-5A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-5B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-3A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-4A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-4B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-5A.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-5B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/RightStepReference.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Test-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Test-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Constraint-Details-Scale.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Constraint-Details.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-Platform-Track-Hierarchy.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-Platform-Track-Parts.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-PrismaticConstraint-Attachments.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-PrismaticConstraint.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-ProximityPrompt.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Elevator-Comparison.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Elevator-Stud-Visualization.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Moving-Attachments.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Overview.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Rotating-Attachments.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BankersLamp.rbxm delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Attribute.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Menu.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Importing-Sample-Lamp.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/LoopDuration-Attribute.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Overview.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Scripting-Light-Flicker.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Default-Health-Meter-Disabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Default-Health-Meter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Phone-Constrained.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Tablet-Constrained.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Tablet-Unconstrained.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Damage-Effect.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Static.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Tweened.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-CoreUISafeInsets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Components.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Finalized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Large.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Colored.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Resized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Rounded.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Anchor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Opaque.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Repositioned.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Resized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Rounded.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Stroked.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-DeviceSafeInsets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/ScreenGui-Axis-Ranges.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/ScreenGui-With-Padding.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon-UIAspectRatioConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-InnerFill-UICorner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-InnerFill.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UICorner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UISizeConstraint-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UISizeConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UIStroke.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-UIPadding-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-UIPadding.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterCharacterScripts-UpdateCustomMeter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterCharacterScripts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterPlayerScripts-HideDefaultHealthMeter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterPlayerScripts.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Big-Triangle.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Impulse-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Intro.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-4.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Attachment-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Attachment-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Intro.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Move-Block.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Movement-Axis.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/One-Stud.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-4.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Intro.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Plate-Friction.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Plate-Friction.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Small-Triangle.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Wind-Block.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Backboard.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Border-Moved.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Border.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Duplicate-Border.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Final-Sign.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Moving-Border.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/NegativePart.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Overview.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/neon-sign-baseplate.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/open-text.obj delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-MeshPart.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-blaster.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-equipped-character.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-handle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-sounds.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-starterpack.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-toolcontroller.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-unequipped.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/properties-MeshPart.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/property-grippos.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/title-image.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/video-collection.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-blaster-icon-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-blaster-icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-mesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-tooltip.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-weapon-pos-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-weapon-pos-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Attachment-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Attachment-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Constraint-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Constraint-2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Attachment-Visual-Aids.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Big-Block.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Big-Triangle.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Dirt-Friction.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Dirt-Propeller.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Impulse-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Impulse-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Little-Triangle.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Overview.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller-HingeConstraint-Method.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller-Scripting-Method.fbx delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Rotational-Axis.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Rotational-Axis.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Stop-Propeller.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Using-HingeConstraints.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Using-Scripts.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Bottom-Layer.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Crust-Texture.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Custom-Lighting.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Default-Lighting.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/DenseSplash-Texture.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Color.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Size.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Squash.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Transparency.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-Texture.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-7.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-10.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-11.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7Color.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7Transparency.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-9.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-9Transparency.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Middle-Layer.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-4Color.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-4Transparency.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-5.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-2B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-2C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DColor.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DSize.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DTransparency.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Sample-Components.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5Size.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5Squash.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6Size.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6Squash.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7Size.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7Transparency.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Top-Layer.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Complete.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Components.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-NoComponents.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Start.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/WebbySplash-Texture.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-Bloom.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-LocalLighting.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-SurfaceRipples.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-Bloom.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-LocalLighting.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-SurfaceRipples.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1F.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1G1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1G2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2F.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G11.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G8.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G9.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-MainDrop.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-SecondDrop.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-Unnatural.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Falls-Components.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Falls-NoComponents.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2D3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2D4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-Texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Intro.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-4.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-Texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-4B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-4D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-Texture.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Sample-Components.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Snoqualmie-Falls.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5B2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5B3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Dense.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Droplets.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-WhiteWater.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4A3.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4A4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5B1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5B2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/Treasure-Island-Edit-Place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/accelerationParticles.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/centerLavaLocation.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceDefault.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceGradient.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceParticles.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/fadingParticles.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/finishedDistantVolcano.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/finishedVolcanoClose.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/newTextureVolcano.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/openSizeSequence.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/openTransparencySequence.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleEmitterInsertionVolcano.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleEmitterInsertionWorkspace.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleExamples.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/sizeSequence.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/sizeSequenceParticles.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/textureProperty.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/transparencyDefault.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/transparencySequence.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/data-storage/DataStoreTutorial.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/data-storage/DataStoreTutorial2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/lavaFloorGameplay.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/lavaProperties.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/partInserted.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/propertiesSet.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/scriptExplorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ReloadingSymbol.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ReloadingSymbolZoomInOnly.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ToolControllerExplorer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-Custom.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-Default.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-Final.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-NoParts.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-WithParts.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-4.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-WithPL.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-WithoutPL.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Contrast-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Deer-SpotLight.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Deer-SurfaceLight.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Density-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-Brightness.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-ExposureCompensation.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-NoChange.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/HighDensity.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/LightingStyle-Realistic.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/LowDensity.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-PointLight.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-Realistic.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-Soft.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-SpotLight.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Sample-Complete.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Sample-Start.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Skybox-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxBk.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxDn.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxFt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxLf.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxRt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxUp.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SunRays-Custom.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SunRays-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/TimeOfDay-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/WithReflections.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/WithoutReflections.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Adjusting-Brightness-Color.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Ambient-Default.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Ambient-New.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Bad-Skybox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Color-85-78-54.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Default-Sun-Position.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.272.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Enabling-Shadows.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/EnvironmentScale-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/EnvironmentScale-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Forest_EveningLightingExample.rbxl delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Good-Skybox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Haze-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Increasing-Range.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Intro-After.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Intro-Before.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/LightingStyle-Realistic.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/LightingStyle-Soft.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/New-PointLight-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/New-Sun-Position.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/No-PointLight.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Yes-PointLight.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-Intro1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-Intro2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CreatingPlayableAreas-Intro1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CreatingPlayableAreas-Intro2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralExterior-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralFloor-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralPerimeter-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralSpawnZone-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Placeholder-Left.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Placeholder-Right.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/PlaceholderMaterials.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-ExitPoints.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-CrossLanes.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-IntersectingPoints.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-PrimaryLanes.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-SpawnZones.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Art-Style.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningModularKits-ModularKit.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningModularKits-Snapping.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningProps-PropsKit.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningProps-Scale.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Moss.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-MossFlowers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-MossStones.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-NoElement.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Part.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Stones.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-WithElement.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheetTextureMaps.zip delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Albedo.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Ceiling.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Doorway.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Metalness.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Normal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Reader.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Roughness.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Trimsheet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CastShadow-Disabled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CastShadow-Enabled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Box.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-BoxTop.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Doorway.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Hull.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-WallMesh.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/ConvertingAssets-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/ConvertingAssets-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-7a.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-7b.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-9.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/DoubleSided-Disabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/DoubleSided-Enabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Importing-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Importing-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-7.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CanCollide.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CanTouch.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CastShadow1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ApplyingLibraryDiagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-Intro1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-Intro2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Ceiling-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Ceiling-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CloudVid1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CloudVid2.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-10.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-11.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-12.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-13.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-14.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-15.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-16.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-7.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-9.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ContainingPlayableArea-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DeletingGeo-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DeletingGeo-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Doors-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Doors-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticles-4b.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticles-4d.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticlesVid-1.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-7.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-4a.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-4b.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralColumns-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralCombatPockets-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralCombatPockets-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralTowers-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-3a.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-Intro1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-Intro2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-10.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-11.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-7.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-9.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Roof-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-7.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpecialEffects-Intro.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-10.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-4.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-6.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-9.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-7.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-9.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Towers-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Towers-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/LayeredTransparencies-Left.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/LayeredTransparencies-Right.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/OptimizingGeo-Towers.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/Overview.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/RemovingTextures-Firehydrants.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/ReviewingParameters-Disabled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/ReviewingParameters-Enabled.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/fading-trap/completedFadingTrap.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/fading-trap/forLoop.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/fading-trap/multipleFadingTraps.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/fading-trap/partInPlace.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/fading-trap/scriptInPlace.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Defeat-UI.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Large-Prompt.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Placeholder-Prompt.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Rounds-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Victory-UI.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Blaster-Behavior/Custom-BlastState.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Blaster-Behavior/Normal-BlastState.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team-Players.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Leaderboard-Indicator.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Name-Tint.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Objective-UI.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team-Players.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Player-Indicator.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Team-Indicator.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Detecting-Hits/Reduce-Player-Health.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Detecting-Hits/Two-Rays.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Find-All.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/First-Person-Visuals.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Neutral.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Reset-Character-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Respawn-Screen.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/TeamASpawn.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/TeamBSpawn.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Third-Person-Visuals.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/CFrame-Render.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Client-Laser-Communication-Video.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Character-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ClientLaserManager.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Damage-Character.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Events-Folder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-LaserFired.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-LaserRenderer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ServerLaserManager.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ToolController.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Introduction-Video.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Laser-Render-Video.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Output-Video.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Ray-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-collectablePage.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-collectables.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-createFeedbackSound.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-looping.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-rollOffDistance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-rollOffMode.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-soundID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfall-web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfallExample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfallSound.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Handle-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Interactive-UI-Final.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Link-UIDragDetector-BoundingUI.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/ReplicatedStorage-SliderController.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/ReplicatedStorage-StatefulObjectController.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Components.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Finalized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Initial.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Handle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Initial.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Inner-Fill.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Measurements.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button-Finalized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button-Initial.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Components.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Parent-Frame-Finalized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Parent-Frame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Range-Frame-Measurements.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Range-Frame-Outline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Frame-Measurements.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Handle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Icon-Finalized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Inner-Fill-Finalized.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Inner-Fill.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Sliders-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UIAspectRatioConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UISizeConstraint-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UISizeConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-Icon-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-Handle-UIStroke-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-Handle-UIStroke.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-InnerFill-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-InnerFill.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-CloseButton-UIAspectRatioConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-CloseButton.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Full.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Icon-UIAspectRatioConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Icon.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle-UIDragDetector-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle-UIDragDetector.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill-UICorner-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill-UICorner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-UIListLayout.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UIAspectRatioConstraint-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UIAspectRatioConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UICorner-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UICorner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UISizeConstraint-Values.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UISizeConstraint.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/intro-to-saving-data/ServerScriptService-GoldManager.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/alternatingPlatforms.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/anchoredProperty.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/canCollide.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/finishedSinglePlatformShort.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/partInPlace.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/scriptInPlace.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/transparency.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/Animation.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/AnimationThumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/BuildingThumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/Camera.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/CodingThumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/Effects.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/Physics.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/Physics.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/Scripting.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/StudioThumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/UI.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/landing/VFXArtThumbnail.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Beam-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Beam-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/LaserBlasterAsset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Script.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542021.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542158.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542252.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_beamExamples.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_setAttachment0.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_testFinalLaser.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_addBeamObject.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_anchorPart.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamColor.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamDifferentAngles_left.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamDifferentAngles_top.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamWidthLarger.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_changeColor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_collisionBox.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_constraintDetails.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_createCollisionBox.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_drawOnTop.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_pasteTextureID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_setWidth.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showAttachments.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showAttachmentsSet.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showBeamLightEmission.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showBeamWithTexture.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showPartsCreated.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showSetup_alt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showTrapPart.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_toggleFaceCamera.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_transparencyLightEmission.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Billboard-Select-Model.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Billboard-Select-SurfaceLight.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightCasing-Material-Property.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightCasing-Material.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Add-Light.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Add-Light.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Select-LightCasing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Select-Model.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Misty-Harbor-Banner.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Misty-Harbor-Edit-Place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Brightness.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Color.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Range-12.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Range-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Angle-30.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Angle-75.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Face-Bottom.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Face-Left.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/StreetLight-Select-Model.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/StreetLight-Select-SpotLight.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Angle-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Angle-60.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Face-Bottom.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/introToSound_bgMusic_web.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_changeProperties_looped.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_changeProperties_volume.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_createSoundInSoundService.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_pressPreview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_soundID.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Add-Animation-3.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Custom-Walk-Animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Climb-Animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Fall-Animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Swim-Animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Walk-Animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Insert-Volume-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Pose-Example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Replace-AssetID-2B.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Volume-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Dungeon-Delve-Edit-Place.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/HoldDuration.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/PromptsShowcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Insert-PromptAttachment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Insert-ProximityPrompt.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-MaxActivationDistance-View.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptAttachment-Position.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptAttachment-View.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptEvents-Script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-Door-View.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-Door.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-PrisonDoor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-ActionText.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-HoldDuration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-MaxActivationDistance.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-ObjectText.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/Insert-ModuleScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/ModuleScript-Renamed-Leaderboard.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/ModuleScript-Renamed-PlayerData.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/record-and-display-player-data-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scoring-points/finishedScoringPointsSolo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scoring-points/leaderboard.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scoring-points/leaderboardCounting.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scoring-points/sceneInPlace.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scoring-points/setupPointsScript.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-an-upgrade-button/Insert-RemoteFunction.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-an-upgrade-button/script-an-upgrade-button-example.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Duplicated-Coins.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Insert-Script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Multiple-Coins-In-Level.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/New-Single-Coin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Output-Collect-Coin.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Rename-New-Script.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Single-Coin-In-Viewport.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/script-game-behavior-coin-collection.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalDefaultRunExample.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalEventAnimation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalExamples-default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalExamples-event.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ServerScriptChangeDefault.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ShockButtonModel.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ShockPlayerScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/3D-Viewport.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Explorer.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Mezzanine.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Properties.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Toolbar.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Toolbox.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/BlasterFlow.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/BlasterInteractionOrder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/GreenLeft.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/ObjectivePromptPreview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/PinkRight.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/PlayerInfoPreview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/RespawningPreview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/MobileBlockIn.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/PCBlockIn.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/UserFlowChart.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/VisualHierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-1A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-1B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-2B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-3B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-3E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-4B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-4C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-5E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-8C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonComponent.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonIcon-Default.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonIcon-Pressed.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-1C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterUI-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Border-Fade.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-2D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-3C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-4B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-5B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-9A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-Intro.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Crosshair-1C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Crosshair-2F.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CrosshairIcon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Device-Emulator-Preview.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Device-Emulator-Setup.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Fade.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/GreenTeamIcon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hexagon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/HitMarker-Icon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hitmarker-1C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hitmarker-2F.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-1C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-2E.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Ai.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Av1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Av2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Cii1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Cii2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-6A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-6C.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-Complete.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Multi-Directional-Fade.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterConfiguration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterIcon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterIcon2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-3B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-3E.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-4B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-4E.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7E.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7F.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-8.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ObjectiveComponent.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ObjectiveUI-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-3.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-4B.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-4D.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6B1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6B2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6C.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PickABlasterComponent.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PinkTeamIcon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PlayerInfoComponent.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PlayerUI-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ResolutionDropdown.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1F.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-2B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-2D.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-Complete.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ScreenGuiContainers.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ScreenGuiContainers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SelectionArrowIcon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SingleBlasterConfiguration.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SingleBlasterIcon.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SurfaceGuiContainers.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-2.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-4.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-5.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-6.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-1.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-2.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-6.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-Intro.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Team-Indicator-Intro.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Trapezoid-Reverse.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Trapezoid.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_finalInContext.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_genericFinal.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_testParticleEmit.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_colorSequence.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_confirmPluginInstall.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_createExplosion.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_enterEmitRate.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_explorerCreateScript.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_partExample.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_pluginInstall.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_toggleEnabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_transparencyGradient.png delete mode 100644 .cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_transparencyGradientExample.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Control-Point-Relativity.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Point-Between.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Point-From-End.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Tangent.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Adjust-Tangent.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Break-Tangents.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Clear-Tangents.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Create-Basic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Delete-Point.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Delete-Tangent.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Move-Point.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Thick-Red.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Thin-Grey.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-ZIndex-Layering.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Path2D.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Tangents.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Add-Point.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Add-Tangent.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Select.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Balance-Tower.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Color-Slider.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Desk-Drawers.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Marionette.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Comparison-With.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Comparison-Without.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Concept-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Editor-View.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-A-Editor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-A-ImageLabel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-B-Editor.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-B-ImageLabel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Intro-Examples.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Offset-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-Image.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-ScaleType.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-SliceCenter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/automatic-sizing/Intro-Frame.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-anchorpoint.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-size-0.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-size-100.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-textwrapping.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-Screen-New.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Hover.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Normal.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Pressed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-SurfaceGui-New.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/button-text-input/Sprint-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/button-text-input/Sprint-Demo.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Adding-Highlight.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/DepthMode-AlwaysOnTop.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/DepthMode-Occluded.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Blue.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Green.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Red.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-Half.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Blue.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Green.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Red.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineTransparency-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineTransparency-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Overview-Yellow-Interior.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Overview-Yellow-Outline.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-Diagram.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-LightInfluence-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-LightInfluence-1.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-Sizing-Positioning.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/in-experience/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Brightness-0.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Brightness-10.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Diagram.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Sizing.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Anchor-Point-Scaling.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Anchor-Points.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Contextual-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/CoreGui-Elements.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Custom-Buttons-Near-Jump.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Loading-Animation.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Roblox-Menu-Button.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Scale-Offset-Positioning.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Scale-Sizing.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Phone-Non-Reachable.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Phone-Reachable.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Tablet-Non-Reachable.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Tablet-Reachable.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/Touch-Reserved-Zones.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/TouchGui-Elements.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/misc/UDim2-Components.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-AlwaysShow.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-OneGlobally.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-OnePerButton.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/proximity-prompt/HoldDuration.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/proximity-prompt/MaxActivationDistance.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Prompt-Diagram.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/proximity-prompt/ProximityPrompt-New.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/proximity-prompt/RequiresLineOfSight.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Enable-Rich-Text.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Bold.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Color.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Comment.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Font-Face.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Highlighted.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Italic.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Line-Break.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Size.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Small-Caps.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Strikethrough.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Stroke.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Transparency.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Underline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Uppercase.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Weight.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-animation/Easing-Direction.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-animation/Easing-Style.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-animation/ModuleScript-AnimateUI.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-animation/Text-Typewriter.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Grid-Drag.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/GridDrag.rbxm delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Hue-Rotator.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/HueRotator.rbxm delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Showcase.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Transparency-Slider.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/TransparencySlider.rbxm delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/Frame-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/ScreenGui-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/ScreenGuis-Enabled.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Canvas-Inset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Canvas-No-Inset.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Scroll-Bar-Elements.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/StarterGui-To-PlayerGui.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/TextBox-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-CornerRadius-Properties.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Offset-32.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Offset-64.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Scale-0.25.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Scale-0.5.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIFlexItem-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIFlexItem-Hierarchy.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-Neg-0.25.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-Pos-0.25.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-0.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-Neg-90.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-Pos-45.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGridLayout-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIListLayout-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Default.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Offset-Negative.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Offset-Positive.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIScale-Example.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-As-Border.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-As-Text-Outline.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderOffset-In.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderOffset-Out.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Center.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Inner.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Outer.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Color-Gradient.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Color-Solid.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Bevel.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Miter.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Round.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Stroke-Mode-Border.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Thickness-12.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Thickness-4.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Transparency-A.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Transparency-B.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UITableLayout-Example.jpg delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-objects/UITextSizeConstraint.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Configure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-New-Class.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Result.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Tokens.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Create-Design-Entry.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Initial-Config.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Configure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-New-Class.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-Created.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-New.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-Tokens.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Result.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Tokens.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Created.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-New-Class.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-New.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Result.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Tokens.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Apply-Tag.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Configure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-New.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Renamed.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Result.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Tokens.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Class-Tokens.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Duplicated-Theme.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Class.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Folder.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Theme.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Swapping-ThemeA.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Swapping-ThemeB.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Theme-Configure.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeA-Result.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeA-Tokens.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeB-Result.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeB-Tokens.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-TokenSheet-New.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-TokenSheet-Tokens.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Class.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Modifier.png delete mode 100644 .cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Tag.png delete mode 100644 .cursor/rules/roblox/en-us/assets/workspace/camera/Camera-Occlusion.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assets/workspace/raycasting/Laser-Maze.mp4 delete mode 100644 .cursor/rules/roblox/en-us/assistant/guide.md delete mode 100644 .cursor/rules/roblox/en-us/assistant/mcp.md delete mode 100644 .cursor/rules/roblox/en-us/assistant/overview.md delete mode 100644 .cursor/rules/roblox/en-us/assistant/prompt-engineering.md delete mode 100644 .cursor/rules/roblox/en-us/audio/assets.md delete mode 100644 .cursor/rules/roblox/en-us/audio/effects.md delete mode 100644 .cursor/rules/roblox/en-us/audio/index.md delete mode 100644 .cursor/rules/roblox/en-us/audio/objects.md delete mode 100644 .cursor/rules/roblox/en-us/avatar-setup/auto-setup-requirements.md delete mode 100644 .cursor/rules/roblox/en-us/avatar-setup/auto-setup.md delete mode 100644 .cursor/rules/roblox/en-us/avatar-setup/index.md delete mode 100644 .cursor/rules/roblox/en-us/avatar-setup/tools.md delete mode 100644 .cursor/rules/roblox/en-us/avatar/avatar-generation.md delete mode 100644 .cursor/rules/roblox/en-us/avatar/in-experience-creation.md delete mode 100644 .cursor/rules/roblox/en-us/avatar/index.md delete mode 100644 .cursor/rules/roblox/en-us/avatar/resources.md delete mode 100644 .cursor/rules/roblox/en-us/avatar/tutorials.md delete mode 100644 .cursor/rules/roblox/en-us/characters/adaptive-animation.md delete mode 100644 .cursor/rules/roblox/en-us/characters/appearance.md delete mode 100644 .cursor/rules/roblox/en-us/characters/emotes.md delete mode 100644 .cursor/rules/roblox/en-us/characters/index.md delete mode 100644 .cursor/rules/roblox/en-us/characters/name-health-display.md delete mode 100644 .cursor/rules/roblox/en-us/characters/pathfinding.md delete mode 100644 .cursor/rules/roblox/en-us/characters/r6-to-r15-adapter.md delete mode 100644 .cursor/rules/roblox/en-us/chat/bubble-chat.md delete mode 100644 .cursor/rules/roblox/en-us/chat/chat-window.md delete mode 100644 .cursor/rules/roblox/en-us/chat/examples/custom-text-chat-commands.md delete mode 100644 .cursor/rules/roblox/en-us/chat/examples/group-chat-tags.md delete mode 100644 .cursor/rules/roblox/en-us/chat/examples/proximity-chat.md delete mode 100644 .cursor/rules/roblox/en-us/chat/examples/rate-limit-public-text-inputs.md delete mode 100644 .cursor/rules/roblox/en-us/chat/examples/simple-custom-frontend-ui.md delete mode 100644 .cursor/rules/roblox/en-us/chat/guidelines.md delete mode 100644 .cursor/rules/roblox/en-us/chat/in-experience-text-chat.md delete mode 100644 .cursor/rules/roblox/en-us/chat/voice-chat.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/cross-server-messaging.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/data-stores-vs-memory-stores.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/data-stores/best-practices.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/data-stores/data-stores-manager.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/data-stores/error-codes-and-limits.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/data-stores/index.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/data-stores/observability.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/data-stores/player-data-purchasing.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/data-stores/versioning-listing-and-caching.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/extended-services.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/http-service.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/memory-stores/best-practices.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/memory-stores/hash-map.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/memory-stores/index.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/memory-stores/observability.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/memory-stores/per-partition-limits.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/memory-stores/queue.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/memory-stores/sorted-map.md delete mode 100644 .cursor/rules/roblox/en-us/cloud-services/secrets.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/auth/api-keys.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/auth/oauth2-develop.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/auth/oauth2-overview.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/auth/oauth2-reference.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/auth/oauth2-registration.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/auth/oauth2-sample.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/configs.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/data-stores/index.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/data-stores/request-handling.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/data-stores/throttling.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/experience-notifications.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/index.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/instance.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/inventory.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/secrets-store.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/usage-assets.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/usage-messaging.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/guides/usage-place-publishing.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/index.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/reference/errors.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/reference/openapi.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/reference/patterns.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/reference/rate-limits.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/reference/risk-levels.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/reference/scopes.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/reference/types.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/webhooks/automate-right-to-erasure.md delete mode 100644 .cursor/rules/roblox/en-us/cloud/webhooks/webhook-notifications.md delete mode 100644 .cursor/rules/roblox/en-us/creation.md delete mode 100644 .cursor/rules/roblox/en-us/creator-fund.md delete mode 100644 .cursor/rules/roblox/en-us/creator-hub.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/brand-developer-directory.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/creator-affiliate.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/creator-events.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/developer-awards.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/feedback.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/index.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/innovation-awards.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/inspire.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/learn-explore-sort.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/managed-brand-integrations.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/notable-translators.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/rdc.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/research-panel.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/safety-council.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/spotlights.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/todays-picks-home.md delete mode 100644 .cursor/rules/roblox/en-us/creator-programs/todays-picks-marketplace.md delete mode 100644 .cursor/rules/roblox/en-us/creator-rewards.md delete mode 100644 .cursor/rules/roblox/en-us/discovery.md delete mode 100644 .cursor/rules/roblox/en-us/education/adventure-game-series/buying-upgrades.md delete mode 100644 .cursor/rules/roblox/en-us/education/adventure-game-series/code-the-leaderboard.md delete mode 100644 .cursor/rules/roblox/en-us/education/adventure-game-series/collect-items.md delete mode 100644 .cursor/rules/roblox/en-us/education/adventure-game-series/create-the-map.md delete mode 100644 .cursor/rules/roblox/en-us/education/adventure-game-series/finishing-the-project.md delete mode 100644 .cursor/rules/roblox/en-us/education/adventure-game-series/landing.md delete mode 100644 .cursor/rules/roblox/en-us/education/adventure-game-series/selling-items.md delete mode 100644 .cursor/rules/roblox/en-us/education/battle-royale-series/cleanup-and-reset.md delete mode 100644 .cursor/rules/roblox/en-us/education/battle-royale-series/coding-the-game-loop.md delete mode 100644 .cursor/rules/roblox/en-us/education/battle-royale-series/creating-a-gui.md delete mode 100644 .cursor/rules/roblox/en-us/education/battle-royale-series/ending-matches.md delete mode 100644 .cursor/rules/roblox/en-us/education/battle-royale-series/finishing-the-project.md delete mode 100644 .cursor/rules/roblox/en-us/education/battle-royale-series/landing.md delete mode 100644 .cursor/rules/roblox/en-us/education/battle-royale-series/managing-players.md delete mode 100644 .cursor/rules/roblox/en-us/education/battle-royale-series/project-setup.md delete mode 100644 .cursor/rules/roblox/en-us/education/battle-royale-series/timers-and-events.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/build-one-half.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/build-the-roads.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/buildings-and-props.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/challenge-1.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/challenge-2.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/challenge-3.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/change-the-script.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/complete-the-city.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/designing-a-map.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/finish-the-challenge.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/island-terrain.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/landing.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/playtest-the-map.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/save-and-publish.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/snap-to-grid.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-create-and-destroy/terrain-tools.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/add-new-models.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/add-to-the-garage.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/adding-wings.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/colors-and-textures.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/customize-and-share.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/design-the-world.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/designing-your-speeder.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/duplicate-and-design.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/get-off-the-ground.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/going-for-a-race.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/grouping-the-parts.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/main-page.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/moving-the-body.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/save-and-publish.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/sharing-your-speeders.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/take-flight.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/take-the-challenge-2.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/take-the-challenge-3.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/take-the-challenge.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-galactic-speedway/test-the-speeder.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/adding-animations.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/adding-new-models.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/adding-the-second-pose.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/animating-parts.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/animations-and-feedback.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/beginner-landing-page.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/challenge-checkpoint-2.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/challenge-checkpoint-3.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/challenge-checkpoint.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/change-the-animation.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/create-the-first-pose.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/creating-animations.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/designing-poses.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/exporting-animations.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/go-beyond-the-challenge.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/invite-friends-to-play.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/landing.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/looping-animations.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/opening-the-template.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/personalize-the-game.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/save-and-publish.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/sharing-animations.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-island-of-move/test-the-game.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/adding-scripts.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/become-an-artist.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/beginner-landing-page.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/connect-the-beam.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/experienced-landing-page.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/finish-the-blast.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/invite-friends.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/landing-page.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/make-final-touches.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/making-an-explosion.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/next-steps-advanced.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/next-steps.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/particle-emitters.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/save-by-publishing.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/test-and-play.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-mansion-of-wonder/using-textures.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/code-the-story.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/coding-a-question.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/complete-the-challenge.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/finish-and-add.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/first-challenge.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/landing.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/opening-the-template.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/second-challenge.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/start-coding.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/test-and-save.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/third-challenge.md delete mode 100644 .cursor/rules/roblox/en-us/education/build-it-play-it-story-games/writing-the-story.md delete mode 100644 .cursor/rules/roblox/en-us/education/collaboration/collaborating-in-roblox-landing-page.md delete mode 100644 .cursor/rules/roblox/en-us/education/collaboration/collaboration-best-practices.md delete mode 100644 .cursor/rules/roblox/en-us/education/developer/beta-testing-experiences.md delete mode 100644 .cursor/rules/roblox/en-us/education/developer/designing-educational-experiences.md delete mode 100644 .cursor/rules/roblox/en-us/education/developer/planning-for-educational-settings.md delete mode 100644 .cursor/rules/roblox/en-us/education/edu-templates/classroom-collection.md delete mode 100644 .cursor/rules/roblox/en-us/education/edu-templates/edu-lesson-plan-template.md delete mode 100644 .cursor/rules/roblox/en-us/education/edu-templates/edu-styles.md delete mode 100644 .cursor/rules/roblox/en-us/education/edu-templates/series-template.md delete mode 100644 .cursor/rules/roblox/en-us/education/educator-onboarding/1-intro-to-roblox.md delete mode 100644 .cursor/rules/roblox/en-us/education/educator-onboarding/2-playing-on-roblox.md delete mode 100644 .cursor/rules/roblox/en-us/education/educator-onboarding/3-setting-up-a-roblox-classroom.md delete mode 100644 .cursor/rules/roblox/en-us/education/educator-onboarding/4-running-classrooms.md delete mode 100644 .cursor/rules/roblox/en-us/education/educator-onboarding/5-next-steps.md delete mode 100644 .cursor/rules/roblox/en-us/education/educator-onboarding/landing.md delete mode 100644 .cursor/rules/roblox/en-us/education/landing-pages/build-it-play-it.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/animate-in-roblox-lesson.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/build-an-obby-lesson.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/create-and-destroy-lesson.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/digital-citizenship/animating-characters.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/digital-citizenship/being-a-digital-citizen.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/digital-citizenship/civil-and-safe-game.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/digital-citizenship/coding-fundamentals.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/digital-citizenship/finishing-projects.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/digital-citizenship/intro-to-roblox.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/digital-citizenship/landing.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/digital-citizenship/lights-and-polish.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/galactic-speedway-lesson.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/intro-to-game-and-coding.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/roblox-developer-lesson.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/roblox-developer/landing.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/roblox-developer/roblox-developer-1.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/roblox-developer/roblox-developer-2.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/roblox-developer/roblox-developer-3.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/roblox-developer/roblox-developer-4.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/roblox-developer/roblox-developer-5.md delete mode 100644 .cursor/rules/roblox/en-us/education/lesson-plans/story-games-lesson.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/classroom-best-practices.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/coding-concept-abstraction.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/coding-concept-algorithms.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/collaboration-best-practices.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/frequently-asked-questions-education.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/getting-started-for-developers-education.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/intro-to-digital-civility.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/intro-to-digital-safety.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/marketing-materials.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/resources-landing.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/roblox-educators.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/roblox-for-the-ap-csp-create-performance-task.md delete mode 100644 .cursor/rules/roblox/en-us/education/resources/teaching-remotely.md delete mode 100644 .cursor/rules/roblox/en-us/education/support/creating-bundled-installers.md delete mode 100644 .cursor/rules/roblox/en-us/education/support/designing-studio-templates.md delete mode 100644 .cursor/rules/roblox/en-us/education/support/education-contact-form.md delete mode 100644 .cursor/rules/roblox/en-us/education/support/education-content.md delete mode 100644 .cursor/rules/roblox/en-us/education/support/education-getting-started.md delete mode 100644 .cursor/rules/roblox/en-us/education/support/private-servers-for-classroom-use.md delete mode 100644 .cursor/rules/roblox/en-us/education/support/roblox-account-creation.md delete mode 100644 .cursor/rules/roblox/en-us/effects/beams.md delete mode 100644 .cursor/rules/roblox/en-us/effects/highlighting.md delete mode 100644 .cursor/rules/roblox/en-us/effects/index.md delete mode 100644 .cursor/rules/roblox/en-us/effects/light-sources.md delete mode 100644 .cursor/rules/roblox/en-us/effects/particle-emitters.md delete mode 100644 .cursor/rules/roblox/en-us/effects/trails.md delete mode 100644 .cursor/rules/roblox/en-us/environment/atmosphere.md delete mode 100644 .cursor/rules/roblox/en-us/environment/clouds.md delete mode 100644 .cursor/rules/roblox/en-us/environment/global-wind.md delete mode 100644 .cursor/rules/roblox/en-us/environment/index.md delete mode 100644 .cursor/rules/roblox/en-us/environment/lighting.md delete mode 100644 .cursor/rules/roblox/en-us/environment/post-processing-effects.md delete mode 100644 .cursor/rules/roblox/en-us/environment/skybox.md delete mode 100644 .cursor/rules/roblox/en-us/experiences.md delete mode 100644 .cursor/rules/roblox/en-us/get-started/creating.md delete mode 100644 .cursor/rules/roblox/en-us/get-started/how-is-roblox-different.md delete mode 100644 .cursor/rules/roblox/en-us/get-started/index.md delete mode 100644 .cursor/rules/roblox/en-us/get-started/monetization.md delete mode 100644 .cursor/rules/roblox/en-us/get-started/resources.md delete mode 100644 .cursor/rules/roblox/en-us/get-started/strategies.md delete mode 100644 .cursor/rules/roblox/en-us/get-started/tools.md delete mode 100644 .cursor/rules/roblox/en-us/get-started/why-build-on-roblox.md delete mode 100644 .cursor/rules/roblox/en-us/includes/beta-features/beta-alert.md delete mode 100644 .cursor/rules/roblox/en-us/includes/cloud/legacy-note.md delete mode 100644 .cursor/rules/roblox/en-us/includes/cloud/legacy-warning.md delete mode 100644 .cursor/rules/roblox/en-us/includes/default-bindings.md delete mode 100644 .cursor/rules/roblox/en-us/includes/developer-console/opening-developer-console.md delete mode 100644 .cursor/rules/roblox/en-us/includes/engine-comparisons/fishing-pole-code-sample.md delete mode 100644 .cursor/rules/roblox/en-us/includes/engine-comparisons/script-locations.md delete mode 100644 .cursor/rules/roblox/en-us/includes/engine-comparisons/script-types.md delete mode 100644 .cursor/rules/roblox/en-us/includes/engine-comparisons/transforms.md delete mode 100644 .cursor/rules/roblox/en-us/includes/experience-notifications/analytics-itemized-stats.md delete mode 100644 .cursor/rules/roblox/en-us/includes/experience-notifications/analytics-notification-summary.md delete mode 100644 .cursor/rules/roblox/en-us/includes/experience-notifications/analytics-overview.md delete mode 100644 .cursor/rules/roblox/en-us/includes/experience-notifications/delivery-system.md delete mode 100644 .cursor/rules/roblox/en-us/includes/experience-notifications/eligibility.md delete mode 100644 .cursor/rules/roblox/en-us/includes/experience-notifications/guidelines.md delete mode 100644 .cursor/rules/roblox/en-us/includes/experience-notifications/implementation-create-notification-string.md delete mode 100644 .cursor/rules/roblox/en-us/includes/experience-notifications/intro.md delete mode 100644 .cursor/rules/roblox/en-us/includes/studio/camera-controls.md delete mode 100644 .cursor/rules/roblox/en-us/includes/studio/constraint-simulation.md delete mode 100644 .cursor/rules/roblox/en-us/includes/studio/constraint-visualization.md delete mode 100644 .cursor/rules/roblox/en-us/includes/studio/controller-emulator.md delete mode 100644 .cursor/rules/roblox/en-us/includes/studio/device-emulator.md delete mode 100644 .cursor/rules/roblox/en-us/includes/studio/playtest-modes.md delete mode 100644 .cursor/rules/roblox/en-us/includes/studio/system-reqs.md delete mode 100644 .cursor/rules/roblox/en-us/includes/studio/toolbox-find-use.md delete mode 100644 .cursor/rules/roblox/en-us/includes/studio/touch-simulation.md delete mode 100644 .cursor/rules/roblox/en-us/includes/text-filtering/text-filtering.md delete mode 100644 .cursor/rules/roblox/en-us/includes/ui/default-ui.md delete mode 100644 .cursor/rules/roblox/en-us/includes/ui/screen-insets.md delete mode 100644 .cursor/rules/roblox/en-us/input/gamepad.md delete mode 100644 .cursor/rules/roblox/en-us/input/index.md delete mode 100644 .cursor/rules/roblox/en-us/input/input-action-system.md delete mode 100644 .cursor/rules/roblox/en-us/input/mobile.md delete mode 100644 .cursor/rules/roblox/en-us/input/mouse-and-keyboard.md delete mode 100644 .cursor/rules/roblox/en-us/ip-licensing/creators.md delete mode 100644 .cursor/rules/roblox/en-us/ip-licensing/faq.md delete mode 100644 .cursor/rules/roblox/en-us/ip-licensing/get-started.md delete mode 100644 .cursor/rules/roblox/en-us/ip-licensing/glossary.md delete mode 100644 .cursor/rules/roblox/en-us/ip-licensing/index.md delete mode 100644 .cursor/rules/roblox/en-us/ip-licensing/license-manager.md delete mode 100644 .cursor/rules/roblox/en-us/luau/booleans.md delete mode 100644 .cursor/rules/roblox/en-us/luau/comments.md delete mode 100644 .cursor/rules/roblox/en-us/luau/control-structures.md delete mode 100644 .cursor/rules/roblox/en-us/luau/enums.md delete mode 100644 .cursor/rules/roblox/en-us/luau/functions.md delete mode 100644 .cursor/rules/roblox/en-us/luau/index.md delete mode 100644 .cursor/rules/roblox/en-us/luau/luau-csharp-comparison.md delete mode 100644 .cursor/rules/roblox/en-us/luau/metatables.md delete mode 100644 .cursor/rules/roblox/en-us/luau/native-code-gen.md delete mode 100644 .cursor/rules/roblox/en-us/luau/nil.md delete mode 100644 .cursor/rules/roblox/en-us/luau/numbers.md delete mode 100644 .cursor/rules/roblox/en-us/luau/operators.md delete mode 100644 .cursor/rules/roblox/en-us/luau/queues.md delete mode 100644 .cursor/rules/roblox/en-us/luau/scope.md delete mode 100644 .cursor/rules/roblox/en-us/luau/stacks.md delete mode 100644 .cursor/rules/roblox/en-us/luau/strings.md delete mode 100644 .cursor/rules/roblox/en-us/luau/tables.md delete mode 100644 .cursor/rules/roblox/en-us/luau/tuples.md delete mode 100644 .cursor/rules/roblox/en-us/luau/type-checking.md delete mode 100644 .cursor/rules/roblox/en-us/luau/type-coercion.md delete mode 100644 .cursor/rules/roblox/en-us/luau/userdata.md delete mode 100644 .cursor/rules/roblox/en-us/luau/variables.md delete mode 100644 .cursor/rules/roblox/en-us/makeup/import.md delete mode 100644 .cursor/rules/roblox/en-us/makeup/index.md delete mode 100644 .cursor/rules/roblox/en-us/makeup/reassign-textures.md delete mode 100644 .cursor/rules/roblox/en-us/makeup/specifications.md delete mode 100644 .cursor/rules/roblox/en-us/marketplace/custom-thumbnails.md delete mode 100644 .cursor/rules/roblox/en-us/marketplace/frequently-asked-questions.md delete mode 100644 .cursor/rules/roblox/en-us/marketplace/homestore.md delete mode 100644 .cursor/rules/roblox/en-us/marketplace/index.md delete mode 100644 .cursor/rules/roblox/en-us/marketplace/intellectual-property.md delete mode 100644 .cursor/rules/roblox/en-us/marketplace/marketplace-fees-and-commissions.md delete mode 100644 .cursor/rules/roblox/en-us/marketplace/marketplace-policy.md delete mode 100644 .cursor/rules/roblox/en-us/marketplace/moderation.md delete mode 100644 .cursor/rules/roblox/en-us/marketplace/publish-to-marketplace.md delete mode 100644 .cursor/rules/roblox/en-us/matchmaking/analytics.md delete mode 100644 .cursor/rules/roblox/en-us/matchmaking/attributes-and-signals.md delete mode 100644 .cursor/rules/roblox/en-us/matchmaking/customize-matchmaking.md delete mode 100644 .cursor/rules/roblox/en-us/matchmaking/glossary.md delete mode 100644 .cursor/rules/roblox/en-us/matchmaking/index.md delete mode 100644 .cursor/rules/roblox/en-us/matchmaking/scoring.md delete mode 100644 .cursor/rules/roblox/en-us/parts/index.md delete mode 100644 .cursor/rules/roblox/en-us/parts/materials.md delete mode 100644 .cursor/rules/roblox/en-us/parts/meshes.md delete mode 100644 .cursor/rules/roblox/en-us/parts/model-generation.md delete mode 100644 .cursor/rules/roblox/en-us/parts/models.md delete mode 100644 .cursor/rules/roblox/en-us/parts/solid-modeling.md delete mode 100644 .cursor/rules/roblox/en-us/parts/terrain.md delete mode 100644 .cursor/rules/roblox/en-us/parts/textures-decals.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/design.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/identify.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/improve.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/index.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/microprofiler/index.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/microprofiler/modes.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/microprofiler/network.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/microprofiler/tag-table.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/microprofiler/task-scheduler.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/microprofiler/use-microprofiler.md delete mode 100644 .cursor/rules/roblox/en-us/performance-optimization/monitor.md delete mode 100644 .cursor/rules/roblox/en-us/physics/adaptive-timestepping.md delete mode 100644 .cursor/rules/roblox/en-us/physics/assemblies.md delete mode 100644 .cursor/rules/roblox/en-us/physics/character-controllers.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/align-orientation.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/align-position.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/angular-velocity.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/animation.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/ball-socket.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/cylindrical.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/hinge.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/line-force.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/linear-velocity.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/no-collision.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/plane.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/prismatic.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/rigid.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/rod.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/rope.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/spring.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/torque.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/torsion-spring.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/universal.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/vector-force.md delete mode 100644 .cursor/rules/roblox/en-us/physics/constraints/weld.md delete mode 100644 .cursor/rules/roblox/en-us/physics/index.md delete mode 100644 .cursor/rules/roblox/en-us/physics/mechanical-constraints.md delete mode 100644 .cursor/rules/roblox/en-us/physics/mover-constraints.md delete mode 100644 .cursor/rules/roblox/en-us/physics/network-ownership.md delete mode 100644 .cursor/rules/roblox/en-us/physics/sleep-system.md delete mode 100644 .cursor/rules/roblox/en-us/physics/units.md delete mode 100644 .cursor/rules/roblox/en-us/platform.md delete mode 100644 .cursor/rules/roblox/en-us/players/avatar-context-menu.md delete mode 100644 .cursor/rules/roblox/en-us/players/avatar-editor.md delete mode 100644 .cursor/rules/roblox/en-us/players/avatar-inspect-menu.md delete mode 100644 .cursor/rules/roblox/en-us/players/disable-ui.md delete mode 100644 .cursor/rules/roblox/en-us/players/index.md delete mode 100644 .cursor/rules/roblox/en-us/players/leaderboards.md delete mode 100644 .cursor/rules/roblox/en-us/players/loading-screens.md delete mode 100644 .cursor/rules/roblox/en-us/players/teams.md delete mode 100644 .cursor/rules/roblox/en-us/players/tools.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/acquisition.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/analytics-dashboard.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/custom-events.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/custom-fields.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/demographics.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/economy-events.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/engagement.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/error-report.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/event-types.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/feedback.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/funnel-events.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/index.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/insights.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/monetization.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/performance.md delete mode 100644 .cursor/rules/roblox/en-us/production/analytics/retention.md delete mode 100644 .cursor/rules/roblox/en-us/production/bans.md delete mode 100644 .cursor/rules/roblox/en-us/production/configs.md delete mode 100644 .cursor/rules/roblox/en-us/production/creator-store.md delete mode 100644 .cursor/rules/roblox/en-us/production/experiments.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/analytics-essentials.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/balance-virtual-economies.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/content-updates.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/contextual-purchases.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/core-loops.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/design-for-roblox.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/index.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/introduction-to-quest-design.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/liveops-essentials.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/liveops-planning.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/monetization-foundations.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/onboarding-techniques.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/onboarding.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/prototyping.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/season-pass-design.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/starter-pack-design.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/subscription-design.md delete mode 100644 .cursor/rules/roblox/en-us/production/game-design/ui-ux-design.md delete mode 100644 .cursor/rules/roblox/en-us/production/index.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/add-source-content.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/add-translations.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/auto-translate-dynamic-content.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/automatic-translations.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/index.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/language-codes.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/localize-with-scripting.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/manual-translations.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/remove-content.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/translate-dynamic-content.md delete mode 100644 .cursor/rules/roblox/en-us/production/localization/work-with-translators.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/avatar-creation-token.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/avatar-items.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/commerce-products.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/developer-products.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/engagement-based-payouts.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/immersive-ads.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/index.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/paid-access-local-currency.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/paid-access-robux.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/passes.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/price-optimization.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/private-servers.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/regional-pricing.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/subscriptions.md delete mode 100644 .cursor/rules/roblox/en-us/production/monetization/virtual-items.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/ads-manager.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/advertise-on-roblox.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/advertise.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/comply-with-advertising-standards.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/content-maturity.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/deeplinks.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/experience-events.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/experience-guidelines.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/experience-notifications.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/index.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/invite-prompts.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/referral-system.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/regional-content-availability.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/reporting-and-billing.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/rewarded-video-ads.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/search-ads.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/share-links.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/social-media-links.md delete mode 100644 .cursor/rules/roblox/en-us/production/promotion/sponsor-items.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/about-GDPR-and-CCPA.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/accessibility.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/account-verification.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/adaptive-design.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/badges.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/console-guidelines.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/descriptions.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/dmca-guidelines.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/experience-genres.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/experience-icons.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/publish-experiences-and-places.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/rights-manager.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/thumbnails.md delete mode 100644 .cursor/rules/roblox/en-us/production/publishing/vr-guidelines.md delete mode 100644 .cursor/rules/roblox/en-us/production/roblox-user-base.md delete mode 100644 .cursor/rules/roblox/en-us/production/sell-on-creator-store.md delete mode 100644 .cursor/rules/roblox/en-us/projects/activity-history.md delete mode 100644 .cursor/rules/roblox/en-us/projects/assets/api.md delete mode 100644 .cursor/rules/roblox/en-us/projects/assets/in-experience-asset-creation.md delete mode 100644 .cursor/rules/roblox/en-us/projects/assets/index.md delete mode 100644 .cursor/rules/roblox/en-us/projects/assets/manager.md delete mode 100644 .cursor/rules/roblox/en-us/projects/assets/monetize.md delete mode 100644 .cursor/rules/roblox/en-us/projects/assets/packages.md delete mode 100644 .cursor/rules/roblox/en-us/projects/assets/privacy.md delete mode 100644 .cursor/rules/roblox/en-us/projects/assets/toolbox.md delete mode 100644 .cursor/rules/roblox/en-us/projects/client-server.md delete mode 100644 .cursor/rules/roblox/en-us/projects/collaboration.md delete mode 100644 .cursor/rules/roblox/en-us/projects/configure-experiences.md delete mode 100644 .cursor/rules/roblox/en-us/projects/cross-platform.md delete mode 100644 .cursor/rules/roblox/en-us/projects/data-model.md delete mode 100644 .cursor/rules/roblox/en-us/projects/experience-ownership-transfer.md delete mode 100644 .cursor/rules/roblox/en-us/projects/external-tools.md delete mode 100644 .cursor/rules/roblox/en-us/projects/group-guidelines.md delete mode 100644 .cursor/rules/roblox/en-us/projects/groups.md delete mode 100644 .cursor/rules/roblox/en-us/projects/index.md delete mode 100644 .cursor/rules/roblox/en-us/projects/place-files.md delete mode 100644 .cursor/rules/roblox/en-us/projects/server-authority/index.md delete mode 100644 .cursor/rules/roblox/en-us/projects/server-authority/techniques.md delete mode 100644 .cursor/rules/roblox/en-us/projects/teleport.md delete mode 100644 .cursor/rules/roblox/en-us/projects/update-experiences.md delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/README.md delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/asset-permissions-api/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/assets/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/cloud.docs.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/datastores-api/ordered-v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/datastores-api/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/developer-products-api/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/game-passes-http-service/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/messaging-service/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/open-eval-api/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/openapi.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/secrets-store-service/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/toolbox-service/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/cloud/universes-api/v1.json delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/README.md delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/STUDIO_VERSION delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes.md delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Accessory.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AccessoryDescription.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Accoutrement.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Actor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AdGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AdPortal.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AdService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AdvancedDragger.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AirController.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AlignOrientation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AlignPosition.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AnalyticsService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AngularVelocity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Animation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AnimationClip.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AnimationClipProvider.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AnimationConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AnimationController.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AnimationFromVideoCreatorService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AnimationNodeDefinition.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AnimationRigData.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AnimationTrack.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Animator.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Annotation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ArcHandles.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AssetDeliveryProxy.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AssetPatchSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AssetService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Atmosphere.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AtmosphereSensor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Attachment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioAnalyzer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioChannelMixer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioChannelSplitter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioChorus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioCompressor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioDeviceInput.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioDeviceOutput.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioDistortion.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioEcho.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioEmitter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioEqualizer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioFader.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioFilter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioFlanger.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioGate.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioLimiter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioListener.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioPitchShifter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioPlayer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioRecorder.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioReverb.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioSearchParams.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioSpeechToText.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioTextToSpeech.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AudioTremolo.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AvatarCreationService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/AvatarEditorService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Backpack.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BackpackItem.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BadgeService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BallSocketConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BanHistoryPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BaseCoreGuiConfiguration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BasePart.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BasePlayerGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BaseRemoteEvent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BaseScript.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BaseWrap.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Beam.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BevelMesh.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BillboardGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BinaryStringValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BindableEvent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BindableFunction.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BlockMesh.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BloomEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BlurEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BodyAngularVelocity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BodyColors.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BodyForce.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BodyGyro.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BodyMover.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BodyPartDescription.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BodyPosition.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BodyThrust.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BodyVelocity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Bone.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BoolValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BoxHandleAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BrickColorValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BrowserService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BubbleChatConfiguration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BubbleChatMessageProperties.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/BuoyancySensor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CFrameValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CacheableContentProvider.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Camera.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CanvasGroup.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Capture.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CaptureService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CapturesPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CapturesViewConfiguration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CatalogPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ChangeHistoryService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ChannelTabsConfiguration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CharacterAppearance.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CharacterMesh.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Chat.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ChatInputBarConfiguration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ChatWindowConfiguration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ChatWindowMessageProperties.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ChorusSoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ClickDetector.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ClientReplicator.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ClimbController.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Clothing.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Clouds.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ClusterPacketCache.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CollectionService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Color3Value.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ColorCorrectionEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ColorGradingEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CommerceService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CompositeValueCurve.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CompressorSoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ConeHandleAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ConfigService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ConfigSnapshot.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Configuration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ConfigureServerService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Constraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ContentProvider.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ContextActionService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Controller.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ControllerBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ControllerManager.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ControllerPartSensor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ControllerSensor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ControllerService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CookiesService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CoreGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CoreGuiConfiguration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CoreScriptDebuggingManagerHelper.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CornerWedgePart.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CreatorStoreService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CurveAnimation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CustomEvent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CustomEventReceiver.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CustomLog.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CylinderHandleAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CylinderMesh.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/CylindricalConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataModel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataModelMesh.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataModelSession.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStore.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreGetOptions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreIncrementOptions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreInfo.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreKey.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreKeyInfo.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreKeyPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreListingPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreObjectVersionInfo.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreOptions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStorePages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreSetOptions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DataStoreVersionPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Debris.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DebugSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Decal.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DepthOfFieldEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Dialog.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DialogChoice.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DistortionSoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DockWidgetPluginGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DoubleConstrainedValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DraftsService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DragDetector.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Dragger.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DraggerService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/DynamicRotate.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/EchoSoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/EditableImage.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/EditableMesh.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/EmotesPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/EncodingService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/EqualizerSoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/EulerRotationCurve.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ExperienceInviteOptions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ExperienceNotificationService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Explosion.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FaceControls.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FaceInstance.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Feature.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FeatureRestrictionManager.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/File.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FileMesh.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Fire.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Flag.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FlagStand.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FlagStandService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FlangeSoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FloatCurve.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FloorWire.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FluidForceSensor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Folder.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ForceField.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FormFactorPart.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Frame.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FriendPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FriendService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/FunctionalTest.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GamePassService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GameSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GamepadService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GenerationService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GenericChallengeService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GenericSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Geometry.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GeometryService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GetTextBoundsParams.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GlobalDataStore.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GlobalSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Glue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GroundController.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GroupService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GuiBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GuiBase2d.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GuiBase3d.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GuiButton.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GuiLabel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GuiMain.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GuiObject.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GuiService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/GuidRegistryService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HSRDataContentProvider.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HandleAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Handles.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HandlesBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HapticEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HapticService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Hat.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HeapProfilerService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HeightmapImporterService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HiddenSurfaceRemovalAsset.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Highlight.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HingeConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Hint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Hole.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Hopper.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HopperBin.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HttpRbxApiService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HttpService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Humanoid.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HumanoidController.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HumanoidDescription.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/HumanoidRigDescription.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/IKControl.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ILegacyStudioBridge.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ImageButton.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ImageHandleAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ImageLabel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/IncrementalPatchBuilder.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/InputAction.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/InputBinding.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/InputContext.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/InputObject.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/InsertService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Instance.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/InstanceAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/InstanceFileSyncService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/IntConstrainedValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/IntValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/IntersectOperation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/InventoryPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/JointInstance.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/JointsService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/KeyboardService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Keyframe.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/KeyframeMarker.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/KeyframeSequence.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/KeyframeSequenceProvider.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LayerCollector.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Light.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Lighting.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LineForce.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LineHandleAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LinearVelocity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LocalScript.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LocalizationService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LocalizationTable.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LogService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LoginService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LuaSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LuaSourceContainer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/LuaWebService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MLService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MLSession.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MakeupDescription.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ManualGlue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ManualSurfaceJointInstance.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ManualWeld.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MarkerCurve.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MarketplaceService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MatchmakingService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MaterialService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MaterialVariant.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MemStorageConnection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MemStorageService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MemoryStoreHashMap.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MemoryStoreHashMapPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MemoryStoreQueue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MemoryStoreService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MemoryStoreSortedMap.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MeshContentProvider.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MeshPart.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Message.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MessagingService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MicroProfilerService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Model.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ModerationService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ModuleScript.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Motor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Motor6D.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MotorFeature.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Mouse.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MouseService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/MultipleDocumentInterfaceInstance.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NegateOperation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NetworkClient.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NetworkMarker.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NetworkPeer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NetworkReplicator.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NetworkServer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NetworkSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NoCollisionConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NotificationService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NumberPose.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/NumberValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Object.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ObjectValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/OpenCloudApiV1.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/OpenCloudService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/OrderedDataStore.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/OutfitPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PVAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PVInstance.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PackageLink.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PackageService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Pages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Pants.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Part.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PartAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PartOperation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PartOperationAsset.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ParticleEmitter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PatchBundlerFileWatch.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PatchMapping.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Path.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Path2D.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PathfindingLink.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PathfindingModifier.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PathfindingService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PermissionsService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PhysicsService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PhysicsSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PitchShiftSoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PlacesService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Plane.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PlaneConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Platform.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Player.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PlayerGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PlayerListConfiguration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PlayerMouse.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PlayerScripts.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PlayerViewService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Players.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Plugin.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginAction.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginCapabilities.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginDebugService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginDragEvent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginGuiService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginManagementService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginManager.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginManagerInterface.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginMenu.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginMouse.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginToolbar.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PluginToolbarButton.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PointLight.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PointsService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PolicyService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Pose.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PoseBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PostEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PrismaticConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ProcessInstancePhysicsService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ProximityPrompt.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ProximityPromptService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PublishService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/PyramidHandleAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/QWidgetPluginGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RayValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RecommendationPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RecommendationService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadata.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataCallbacks.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataClass.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataClasses.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataEnum.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataEnumItem.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataEnums.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataEvents.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataFunctions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataItem.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataMember.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataProperties.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionMetadataYieldFunctions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReflectionService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RemoteCommandService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RemoteDebuggerServer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RemoteEvent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RemoteFunction.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RenderSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RenderingTest.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReplicatedFirst.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReplicatedStorage.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ReverbSoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RigidConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RocketPropulsion.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RodConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RopeConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Rotate.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RotateP.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RotateV.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RotationCurve.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RunService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RunningAverageItemDouble.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RunningAverageItemInt.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/RunningAverageTimeIntervalItem.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScreenGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScreenshotCapture.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScreenshotHud.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Script.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScriptBuilder.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScriptContext.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScriptDocument.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScriptEditorService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScriptProfilerService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScriptService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ScrollingFrame.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Seat.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Selection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SelectionBox.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SelectionHighlightManager.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SelectionLasso.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SelectionPartLasso.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SelectionPointLasso.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SelectionSphere.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SelfViewConfiguration.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SensorBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SerializationService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ServerReplicator.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ServerScriptService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ServerStorage.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ServiceProvider.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ServiceVisibilityService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SessionCheckService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SharedTableRegistry.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Shirt.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ShirtGraphic.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SkateboardController.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SkateboardPlatform.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Skin.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Sky.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SlidingBallConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SlimContentProvider.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Smoke.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SmoothVoxelsUpgraderService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Snap.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SocialService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SolidModelContentProvider.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Sound.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SoundGroup.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SoundService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Sparkles.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SpawnLocation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SpawnerService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SpecialMesh.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SphereHandleAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SpotLight.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SpringConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StandalonePluginScripts.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StandardPages.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StarterCharacterScripts.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StarterGear.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StarterGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StarterPack.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StarterPlayer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StarterPlayerScripts.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StartupMessageService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Stats.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StatsItem.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Status.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StopWatchReporter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StringValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Studio.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StudioService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StudioTestService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StudioTheme.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StyleBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StyleDerive.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StyleLink.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StyleRule.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/StyleSheet.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SunRaysEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SurfaceAppearance.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SurfaceGui.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SurfaceGuiBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SurfaceLight.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SurfaceSelection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SwimController.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/SyncScriptBuilder.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TaskScheduler.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Team.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TeamCreateData.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TeamCreateService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Teams.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TeleportAsyncResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TeleportOptions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TeleportService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Terrain.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TerrainDetail.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TerrainIterateOperation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TerrainModifyOperation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TerrainReadOperation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TerrainRegion.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TerrainWriteOperation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TestService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextBox.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextBoxService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextButton.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextChannel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextChatCommand.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextChatConfigurations.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextChatMessage.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextChatMessageProperties.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextChatService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextFilterResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextFilterTranslatedResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextGenerator.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextLabel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TextSource.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Texture.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TimerService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Tool.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Torque.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TorsionSpringConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TotalCountTimeIntervalItem.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TouchInputService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TouchTransmitter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Trail.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Translator.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TremoloSoundEffect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TriangleMeshPart.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TrussPart.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Tween.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TweenBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/TweenService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UGCValidationService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIAspectRatioConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIComponent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UICorner.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIDragDetector.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIFlexItem.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIGradient.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIGridLayout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIGridStyleLayout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UILayout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIListLayout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIPadding.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIPageLayout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIScale.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UISizeConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UIStroke.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UITableLayout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UITextSizeConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UnionOperation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UniqueIdLookupService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UniversalConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UnreliableRemoteEvent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UserGameSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UserInputService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UserService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/UserSettings.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VRService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VRStatusService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ValueBase.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ValueCurve.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Vector3Curve.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Vector3Value.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VectorForce.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VehicleController.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VehicleSeat.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VelocityMotor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VideoCapture.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VideoCaptureService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VideoDisplay.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VideoFrame.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VideoPlayer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VideoSampler.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VideoService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/ViewportFrame.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VirtualInputManager.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VirtualUser.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VisibilityCheckDispatcher.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Visit.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VisualizationMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VisualizationModeCategory.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VisualizationModeService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/VoiceChatService.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WebStreamClient.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WedgePart.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Weld.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WeldConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Wire.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WireframeHandleAdornment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/Workspace.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WorkspaceAnnotation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WorldModel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WorldRoot.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WrapDeformer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WrapLayer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WrapTarget.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/classes/WrapTextureTransfer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes.md delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Axes.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/BrickColor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/CFrame.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/CatalogSearchParams.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Color3.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/ColorSequence.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/ColorSequenceKeypoint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Content.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/DateTime.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/DockWidgetPluginGuiInfo.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Enum.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/EnumItem.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Enums.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Faces.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/FloatCurveKey.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Font.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Instance.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/NumberRange.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/NumberSequence.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/NumberSequenceKeypoint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/OverlapParams.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Path2DControlPoint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/PathWaypoint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/PhysicalProperties.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/RBXScriptConnection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/RBXScriptSignal.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Random.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Ray.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/RaycastParams.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/RaycastResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Rect.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Region3.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Region3int16.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/RotationCurveKey.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Secret.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/SecurityCapabilities.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/SharedTable.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/TweenInfo.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/UDim.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/UDim2.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/ValueCurveKey.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Vector2.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Vector2int16.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Vector3.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/datatypes/Vector3int16.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums.md delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AccessModifierType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AccessoryType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ActionOnAutoResumeSync.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ActionOnStopSync.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ActionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ActuatorRelativeTo.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ActuatorType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdAvailabilityResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdEventType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdFormat.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdShape.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdTeleportMethod.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdUIEventType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdUIType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdUnitStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdornCullingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AdornShading.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AlignType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AlphaMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnalyticsCustomFieldKeys.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnalyticsEconomyAction.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnalyticsEconomyFlowType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnalyticsEconomyTransactionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnalyticsLogLevel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnalyticsProgressionStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnalyticsProgressionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnimationClipFromVideoStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnimationNodeType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnimationPriority.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnimatorRetargetingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnnotationEditingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnnotationRequestStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AnnotationRequestType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AppLifecycleManagerState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AppShellActionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AppShellFeature.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AppUpdateStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ApplyStrokeMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AspectType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AssetCreatorType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AssetFetchStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AssetType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AssetTypeVerification.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AudioApiRollout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AudioCaptureMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AudioChannelLayout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AudioFilterType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AudioSimulationFidelity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AudioSubType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AudioWindowSize.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AuthorityMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AutoIndentRule.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AutomaticSize.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarAssetType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarChatServiceFeature.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarContextMenuOption.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarItemType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarPromptResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsAccessoryLimitMethod.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsAccessoryMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsAnimationClipsMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsAnimationPacksMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsAppearanceMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsBuildMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsClothingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsCollisionMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsCustomAccessoryMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsCustomBodyType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsCustomClothingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsHitAndTouchDetectionMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsJumpMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsLegacyCollisionMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarSettingsScaleMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarThumbnailCustomizationType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/AvatarUnificationMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Axis.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BenefitType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BinType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BodyPart.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BodyPartR15.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BorderMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BorderStrokePosition.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BreakReason.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BreakpointRemoveReason.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BulkMoveMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/BundleType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Button.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ButtonStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CageType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CameraMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CameraNavigationModel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CameraPanMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CameraSpeedAdjustBinding.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CameraType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CaptureGalleryPermission.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CaptureType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CatalogCategoryFilter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CatalogSortAggregation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CatalogSortType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CellBlock.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CellMaterial.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CellOrientation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CenterDialogType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CharacterControlMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ChatCallbackType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ChatColor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ChatMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ChatPrivacyMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ChatRestrictionStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ChatStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ChatVersion.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ClientAnimatorThrottlingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CloseReason.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CollaboratorStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CollisionFidelity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CommandPermission.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CompileTarget.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CompletionAcceptanceBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CompletionItemKind.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CompletionItemTag.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CompletionTriggerKind.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CompositeValueCurveType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CompressionAlgorithm.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ComputerCameraMovementMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ComputerMovementMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ConfigSnapshotErrorState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ConnectionError.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ConnectionState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ContentSourceType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ContextActionPriority.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ContextActionResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ControlMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CoreGuiType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CreateAssetResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CreateOutfitFailure.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CreatorType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CreatorTypeFilter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CurrencyType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/CustomCameraMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DataStoreRequestType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DebuggerEndReason.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DebuggerExceptionBreakMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DebuggerFrameType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DebuggerPauseReason.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DebuggerStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DefaultScriptSyncFileType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DevCameraOcclusionMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DevComputerCameraMovementMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DevComputerMovementMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DevTouchCameraMovementMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DevTouchMovementMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DeveloperMemoryTag.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DeviceFeatureType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DeviceForm.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DeviceLevel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DeviceType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DialogBehaviorType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DialogPurpose.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DialogTone.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DigitsRigDescriptionSide.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DisplaySize.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DominantAxis.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DraftStatusCode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DragDetectorDragStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DragDetectorPermissionPolicy.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DragDetectorResponseStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DraggerCoordinateSpace.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DraggerMovementMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/DraggingScrollBar.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/EasingDirection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/EasingStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ElasticBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/EnviromentalPhysicsThrottle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ExperienceAuthScope.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ExperienceEventStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ExplosionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FACSDataLod.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FacialAgeEstimationResultType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FacialAnimationStreamingState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FacsActionUnit.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FieldOfViewMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FileMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FileSystemWalkMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FillDirection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FilterErrorType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FilterResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FinishRecordingOperation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FluidFidelity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FluidForces.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Font.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FontSize.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FontStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FontWeight.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ForceLimitMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FormFactor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FrameStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FramerateManagerMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FriendRequestEvent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FriendStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/FunctionalTestResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/GameAvatarType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/GamepadType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/GearGenreSetting.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/GearType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Genre.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/GraphicsMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/GraphicsOptimizationMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/GroupMembershipStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/GuiState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/GuiType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HandlesStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HapticEffectType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HashAlgorithm.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HighlightDepthMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HorizontalAlignment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HoverAnimateSpeed.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HttpCachePolicy.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HttpCompression.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HttpContentType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HttpError.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HttpRequestType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HumanoidCollisionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HumanoidDisplayDistanceType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HumanoidHealthDisplayType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HumanoidRigType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/HumanoidStateType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/IKCollisionsMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/IKControlConstraintSupport.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/IKControlType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/IXPLoadingStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ImageAlphaType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ImageCombineType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/InOut.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/InfoType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/InitialDockState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/InputActionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/InputType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/InstanceFileSyncStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/IntermediateMeshGenerationResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/InterpolationThrottlingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/InviteState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ItemLineAlignment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/JoinSource.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/JointCreationMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/KeyCode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/KeyInterpolationMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/KeywordFilterType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Language.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LeftRight.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LexemeType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LightingStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Limb.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LineJoinMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ListDisplayMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ListenerLocation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ListenerType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LiveEditingAtomicUpdateResponse.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LiveEditingBroadcastMessageType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LoadCharacterLayeredClothing.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LoadDynamicHeads.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LocationType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/LuauTypeCheckMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MakeupType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MarketplaceBulkPurchasePromptStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MarketplaceItemPurchaseStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MarketplaceProductType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MarkupKind.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MatchmakingType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Material.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MaterialPattern.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MembershipType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MeshPartDetailLevel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MeshPartHeadsAndAccessories.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MeshScaleUnit.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MeshType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MessageType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ModelLevelOfDetail.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ModelStreamingBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ModelStreamingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ModerationStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ModifierKey.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MouseBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MoveState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MoverConstraintRootBehaviorMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/MuteState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/NameOcclusion.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/NegateOperationHiddenHistory.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/NetworkOwnership.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/NetworkStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/NoiseType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/NormalId.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/NotificationButtonType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/OperationType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/OrientationAlignmentMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/OutfitSource.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/OutfitType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/OutputLayoutMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/OverrideMouseIconBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PackagePermission.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PartType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ParticleEmitterShape.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ParticleEmitterShapeInOut.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ParticleEmitterShapeStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ParticleFlipbookLayout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ParticleFlipbookMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ParticleFlipbookTextureCompatible.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ParticleOrientation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PathStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PathWaypointAction.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PathfindingUseImprovedSearch.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PeoplePageLayout.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PermissionLevelShown.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PhysicsSimulationRate.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PhysicsSteppingMethod.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Platform.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PlaybackState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PlayerActions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PlayerCharacterDestroyBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PlayerChatType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PlayerDataErrorState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PlayerDataLoadFailureBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PlayerExitReason.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PoseEasingDirection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PoseEasingStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PositionAlignmentMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PredictionMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PredictionStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PreferredInput.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PreferredTextSize.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PrimalPhysicsSolver.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PrimitiveType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PrivilegeType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ProductLocationRestriction.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ProductPurchaseChannel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ProductPurchaseDecision.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PromptCreateAssetResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PromptCreateAvatarResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PromptExperienceDetailsResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PromptPublishAssetResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/PropertyStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ProximityPromptExclusivity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ProximityPromptInputType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ProximityPromptStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/QualityLevel.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/R15CollisionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RaycastFilterType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ReadCapturesFromGalleryResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RecommendationActionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RecommendationDepartureIntent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RecommendationImpressionType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RecommendationItemContentType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RecommendationItemVisibility.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RejectCharacterDeletions.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RenderFidelity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RenderPriority.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RenderingCacheOptimizationMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RenderingTestComparisonMethod.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ReplicateInstanceDestroySetting.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ResamplerMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ReservedHighlightId.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RestPose.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ReturnKeyType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ReverbType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RibbonTool.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RigScale.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RigType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RollOffMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RolloutState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RotationOrder.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RotationType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RsvpStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RtlTextSupport.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RunContext.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RunState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/RuntimeUndoBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SafeAreaCompatibility.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SalesTypeFilter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SandboxedInstanceMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SaveAvatarThumbnailCustomizationFailure.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SaveFilter.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SavedQualitySetting.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ScaleType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ScopeCheckResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ScreenInsets.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ScreenOrientation.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ScrollBarInset.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ScrollingDirection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SecurityCapability.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SelectionBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SelectionRenderMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SelfViewPosition.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SensorMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SensorUpdateType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ServerLiveEditingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ServiceVisibility.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Severity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ShowAdResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SignalBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SizeConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SolverConvergenceMetricType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SolverConvergenceVisualizationMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SortDirection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SortOrder.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SpecialKey.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StartCorner.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StateObjectFieldType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Status.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StepFrequency.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StreamOutBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StreamingIntegrityMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StreamingPauseMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StrokeSizingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StudioCloseMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StudioDataModelType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StudioPlaceUpdateFailureReason.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StudioScriptEditorColorCategories.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StudioScriptEditorColorPresets.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StudioStyleGuideColor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/StudioStyleGuideModifier.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Style.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SubscriptionExpirationReason.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SubscriptionPaymentStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SubscriptionPeriod.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SubscriptionState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SurfaceConstraint.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SurfaceGuiShape.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SurfaceGuiSizingMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SurfaceType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SwipeDirection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/SystemThemeValue.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TableMajorAxis.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TeamCreateErrorState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/Technology.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TeleportMethod.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TeleportResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TeleportState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TeleportType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TerrainAcquisitionMethod.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TerrainFace.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TextChatMessageStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TextDirection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TextFilterContext.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TextInputType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TextTruncate.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TextXAlignment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TextYAlignment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TextureMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TextureQueryType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ThreadPoolConfig.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ThrottlingPriority.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ThumbnailSize.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ThumbnailType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TickCountSampleMethod.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TonemapperPreset.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TopBottom.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TouchCameraMovementMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TouchMovementMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TrackerError.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TrackerExtrapolationFlagMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TrackerFaceTrackingStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TrackerLodFlagMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TrackerLodValueMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TrackerMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TrackerPromptEvent.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TrackerType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TriStateBoolean.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/TweenStatus.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UICaptureMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UIDragDetectorBoundingBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UIDragDetectorDragRelativity.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UIDragDetectorDragSpace.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UIDragDetectorDragStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UIDragDetectorResponseStyle.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UIDragSpeedAxisMapping.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UIFlexAlignment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UIFlexMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UITheme.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UiMessageType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UploadCaptureResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UsageContext.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UserCFrame.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UserInputState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/UserInputType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VRComfortSetting.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VRControllerModelMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VRDeviceType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VRLaserPointerMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VRSafetyBubbleMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VRScaling.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VRSessionState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VRTouchpad.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VRTouchpadMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VelocityConstraintMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VerticalAlignment.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VerticalScrollBarPosition.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VibrationMotor.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VideoCaptureResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VideoCaptureStartedResult.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VideoDeviceCaptureQuality.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VideoError.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VideoSampleSize.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ViewMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VirtualCursorMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VirtualInputMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VoiceChatDistanceAttenuationType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VoiceChatState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VoiceControlPath.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/VolumetricAudio.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WaterDirection.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WaterForce.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WebSocketState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WebStreamClientState.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WebStreamClientType.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WeldConstraintPreserve.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WhisperChatPrivacyMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WrapLayerAutoSkin.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WrapLayerDebugMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/WrapTargetDebugMode.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/enums/ZIndexBehavior.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/globals.md delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/globals/LuaGlobals.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/globals/RobloxGlobals.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries.md delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/bit32.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/buffer.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/coroutine.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/debug.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/math.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/os.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/string.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/table.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/task.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/utf8.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/libraries/vector.yaml delete mode 100644 .cursor/rules/roblox/en-us/reference/engine/overview.md delete mode 100644 .cursor/rules/roblox/en-us/resources/battle-royale/building-system.md delete mode 100644 .cursor/rules/roblox/en-us/resources/battle-royale/core-scripts.md delete mode 100644 .cursor/rules/roblox/en-us/resources/battle-royale/index.md delete mode 100644 .cursor/rules/roblox/en-us/resources/battle-royale/installation-and-setup.md delete mode 100644 .cursor/rules/roblox/en-us/resources/battle-royale/minimap-system.md delete mode 100644 .cursor/rules/roblox/en-us/resources/battle-royale/pickup-system.md delete mode 100644 .cursor/rules/roblox/en-us/resources/battle-royale/run-the-game.md delete mode 100644 .cursor/rules/roblox/en-us/resources/battle-royale/the-storm.md delete mode 100644 .cursor/rules/roblox/en-us/resources/beyond-the-dark/building-architecture.md delete mode 100644 .cursor/rules/roblox/en-us/resources/beyond-the-dark/custom-characters.md delete mode 100644 .cursor/rules/roblox/en-us/resources/beyond-the-dark/index.md delete mode 100644 .cursor/rules/roblox/en-us/resources/beyond-the-dark/layered-clothing.md delete mode 100644 .cursor/rules/roblox/en-us/resources/beyond-the-dark/sound-design.md delete mode 100644 .cursor/rules/roblox/en-us/resources/beyond-the-dark/user-interface.md delete mode 100644 .cursor/rules/roblox/en-us/resources/builder-font-license.md delete mode 100644 .cursor/rules/roblox/en-us/resources/city-people-cars.md delete mode 100644 .cursor/rules/roblox/en-us/resources/feature-packages/bundles.md delete mode 100644 .cursor/rules/roblox/en-us/resources/feature-packages/changelog.md delete mode 100644 .cursor/rules/roblox/en-us/resources/feature-packages/engagement-rewards.md delete mode 100644 .cursor/rules/roblox/en-us/resources/feature-packages/index.md delete mode 100644 .cursor/rules/roblox/en-us/resources/feature-packages/missions.md delete mode 100644 .cursor/rules/roblox/en-us/resources/feature-packages/season-passes.md delete mode 100644 .cursor/rules/roblox/en-us/resources/feedback-guidelines.md delete mode 100644 .cursor/rules/roblox/en-us/resources/limited-use-license.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/emote-bar.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/event-sequencer.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/friends-locator.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/index.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/merch-booth.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/photo-booth.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/profile-card.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/scavenger-hunt.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/selfie-mode.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/social-interactions.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/spawn-with-friends.md delete mode 100644 .cursor/rules/roblox/en-us/resources/modules/surface-art.md delete mode 100644 .cursor/rules/roblox/en-us/resources/npc-kit.md delete mode 100644 .cursor/rules/roblox/en-us/resources/plant-reference-project.md delete mode 100644 .cursor/rules/roblox/en-us/resources/roblox-connect.md delete mode 100644 .cursor/rules/roblox/en-us/resources/templates.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/construct-the-house.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/design-dark-soundscapes.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/develop-a-moving-world.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/foundational-gameplay-systems.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/immersive-narrative.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/index.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/main-design-requirements.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/materialize-the-world.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/stream-in-immersion.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/supporting-systems.md delete mode 100644 .cursor/rules/roblox/en-us/resources/the-mystery-of-duvall-drive/technical-overview.md delete mode 100644 .cursor/rules/roblox/en-us/resources/weapons-kit.md delete mode 100644 .cursor/rules/roblox/en-us/safety.md delete mode 100644 .cursor/rules/roblox/en-us/scale.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/attributes.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/capabilities.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/debounce.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/events/bindable.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/events/deferred.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/events/index.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/events/remote.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/index.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/locations.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/module.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/multithreading.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/scheduler.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/scripts.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/security/access-control.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/security/client-server-boundary.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/security/defensive-design.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/security/network-ownership.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/security/security-tactics.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/security/server-side-detection.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/security/third-party-vulnerabilities.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/services.md delete mode 100644 .cursor/rules/roblox/en-us/scripting/sync.md delete mode 100644 .cursor/rules/roblox/en-us/sound/dynamic-effects.md delete mode 100644 .cursor/rules/roblox/en-us/sound/groups.md delete mode 100644 .cursor/rules/roblox/en-us/sound/index.md delete mode 100644 .cursor/rules/roblox/en-us/sound/objects.md delete mode 100644 .cursor/rules/roblox/en-us/studio/align-tool.md delete mode 100644 .cursor/rules/roblox/en-us/studio/avatar-settings.md delete mode 100644 .cursor/rules/roblox/en-us/studio/build-studio-widgets.md delete mode 100644 .cursor/rules/roblox/en-us/studio/debugging.md delete mode 100644 .cursor/rules/roblox/en-us/studio/developer-console.md delete mode 100644 .cursor/rules/roblox/en-us/studio/experience-settings.md delete mode 100644 .cursor/rules/roblox/en-us/studio/explorer.md delete mode 100644 .cursor/rules/roblox/en-us/studio/index.md delete mode 100644 .cursor/rules/roblox/en-us/studio/material-generator.md delete mode 100644 .cursor/rules/roblox/en-us/studio/optimization/memory-usage.md delete mode 100644 .cursor/rules/roblox/en-us/studio/optimization/scriptprofiler.md delete mode 100644 .cursor/rules/roblox/en-us/studio/output.md delete mode 100644 .cursor/rules/roblox/en-us/studio/pivot-tools.md delete mode 100644 .cursor/rules/roblox/en-us/studio/plugins.md delete mode 100644 .cursor/rules/roblox/en-us/studio/properties.md delete mode 100644 .cursor/rules/roblox/en-us/studio/rig-builder.md delete mode 100644 .cursor/rules/roblox/en-us/studio/script-editor.md delete mode 100644 .cursor/rules/roblox/en-us/studio/setup.md delete mode 100644 .cursor/rules/roblox/en-us/studio/terrain-editor.md delete mode 100644 .cursor/rules/roblox/en-us/studio/testing-modes.md delete mode 100644 .cursor/rules/roblox/en-us/studio/texture-generator.md delete mode 100644 .cursor/rules/roblox/en-us/studio/ui-overview.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/animator/get-started.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/animator/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/animator/next-steps.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/animator/play-your-animation.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/animator/test-and-save.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/animator/work-with-the-animation-editor.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/artist/get-started.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/artist/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/artist/next-steps.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/artist/test-and-save.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/artist/work-with-particle-emitters.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/building/code-with-assistant.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/building/get-started.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/building/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/building/next-steps.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/building/test-and-save.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/building/work-with-parts.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/coding/customize-strings.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/coding/get-started.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/coding/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/coding/next-steps.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/coding/test-and-save.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/coding/work-with-variables.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/building/apply-polished-assets.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/building/create-a-project.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/building/create-an-environment-with-terrain.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/building/create-basic-visual-effects.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/building/customize-global-lighting.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/building/greybox-a-playable-area.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/scripting/create-player-hazards.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/scripting/record-and-display-player-data.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/scripting/script-an-upgrade-button.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/core/scripting/script-game-behavior.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/curriculum-overview.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/environmental-art/assemble-an-asset-library.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/environmental-art/construct-your-world.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/environmental-art/develop-polished-assets.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/environmental-art/greybox-your-environment.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/environmental-art/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/environmental-art/optimize-your-experience.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/gameplay-scripting/add-rounds.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/gameplay-scripting/create-teams.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/gameplay-scripting/detect-hits.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/gameplay-scripting/implement-blasters.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/gameplay-scripting/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/gameplay-scripting/spawn-respawn.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/studio/create-account.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/studio/explore-ui.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/studio/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/studio/install-studio.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/studio/next-steps.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/user-interface-design/choose-an-art-style.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/user-interface-design/implement-designs-in-studio.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/user-interface-design/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/curriculums/user-interface-design/wireframe-your-layouts.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/first-experience/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-1/coding-fundamentals.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-1/create-a-script.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-1/landing.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-1/object-properties.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-1/parents-and-children.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-2/code-a-function.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-2/functions-and-events.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-2/multiple-parameters-and-arguments.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-2/parameters-practice-buttons.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-2/use-parameters-and-events.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-3/give-points.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-3/intro-to-if-statements.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-3/landing.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-3/multiple-conditions.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-3/powerups-with-if-statements.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-3/traps-with-if-statements.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-4/create-a-timed-bridge.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-4/glow-lights-with-for-loops.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-4/intro-to-for-loops.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-4/landing.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-4/nested-loops.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-4/repeat-code-with-while-loops.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-5/intro-to-arrays.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-5/intro-to-dictionaries.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-5/landing.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-5/loops-and-arrays.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-5/make-changes-to-arrays.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-5/pairs-and-ipairs.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-5/return-values-from-tables.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-6/coding-concept-abstraction.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-6/coding-concept-algorithms.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-6/create-with-module-scripts.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-6/intro-to-module-scripts.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/fundamentals/coding-6/landing.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/index.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/animation/create-an-animation.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/animation/play-character-animations.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/audio/add-2D-audio.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/audio/add-3D-audio.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/audio/add-text-to-speech.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/audio/add-voice-chat.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/audio/in-game-sounds.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/audio/play-background-music.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/audio/speech-to-text.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/data-storage/create-leaderboard.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/data-storage/save-player-data.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/input-and-camera/control-the-users-camera.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/input-and-camera/detect-user-input.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/lighting/create-flickering-lights.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/lighting/enhance-indoor-environments.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/lighting/enhance-outdoor-environments.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/lighting/light-with-props.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/modeling/assemble-modular-environments.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/modeling/create-neon-signs.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/physics/build-a-ferris-wheel.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/physics/build-a-hinged-door.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/physics/create-elevators.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/physics/create-moving-objects.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/physics/create-spinning-objects.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/deadly-lava.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/fading-trap.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/intro-to-scripting.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/scripting/basic-scripting/score-points.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/create-a-health-pickup.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/create-player-tools.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/hit-detection-with-lasers.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/scripting/intermediate-scripting/save-data.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/ui/create-a-score-bar.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/ui/create-hud-meters.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/ui/interactive-ui.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/ui/proximity-prompts.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/use-case-tutorial-overview.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/vfx/basic-particle-effects.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/vfx/create-volcanoes.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/vfx/create-waterfalls.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/vfx/custom-particle-effects.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/vfx/laser-traps-with-beams.md delete mode 100644 .cursor/rules/roblox/en-us/tutorials/use-case-tutorials/vfx/use-particles-for-explosions.md delete mode 100644 .cursor/rules/roblox/en-us/ui/2D-paths.md delete mode 100644 .cursor/rules/roblox/en-us/ui/3D-drag-detectors.md delete mode 100644 .cursor/rules/roblox/en-us/ui/9-slice.md delete mode 100644 .cursor/rules/roblox/en-us/ui/animation.md delete mode 100644 .cursor/rules/roblox/en-us/ui/appearance-modifiers.md delete mode 100644 .cursor/rules/roblox/en-us/ui/buttons.md delete mode 100644 .cursor/rules/roblox/en-us/ui/frames.md delete mode 100644 .cursor/rules/roblox/en-us/ui/grid-table-layouts.md delete mode 100644 .cursor/rules/roblox/en-us/ui/in-experience-containers.md delete mode 100644 .cursor/rules/roblox/en-us/ui/index.md delete mode 100644 .cursor/rules/roblox/en-us/ui/labels.md delete mode 100644 .cursor/rules/roblox/en-us/ui/list-flex-layouts.md delete mode 100644 .cursor/rules/roblox/en-us/ui/on-screen-containers.md delete mode 100644 .cursor/rules/roblox/en-us/ui/page-layouts.md delete mode 100644 .cursor/rules/roblox/en-us/ui/position-and-size.md delete mode 100644 .cursor/rules/roblox/en-us/ui/proximity-prompts.md delete mode 100644 .cursor/rules/roblox/en-us/ui/rich-text.md delete mode 100644 .cursor/rules/roblox/en-us/ui/scrolling-frames.md delete mode 100644 .cursor/rules/roblox/en-us/ui/size-modifiers.md delete mode 100644 .cursor/rules/roblox/en-us/ui/styling/compatibility.md delete mode 100644 .cursor/rules/roblox/en-us/ui/styling/css-comparisons.md delete mode 100644 .cursor/rules/roblox/en-us/ui/styling/editor.md delete mode 100644 .cursor/rules/roblox/en-us/ui/styling/index.md delete mode 100644 .cursor/rules/roblox/en-us/ui/text-filtering.md delete mode 100644 .cursor/rules/roblox/en-us/ui/text-input.md delete mode 100644 .cursor/rules/roblox/en-us/ui/ui-drag-detectors.md delete mode 100644 .cursor/rules/roblox/en-us/ui/video-frames.md delete mode 100644 .cursor/rules/roblox/en-us/ui/viewport-frames.md delete mode 100644 .cursor/rules/roblox/en-us/unity.md delete mode 100644 .cursor/rules/roblox/en-us/unreal.md delete mode 100644 .cursor/rules/roblox/en-us/what-is-roblox.md delete mode 100644 .cursor/rules/roblox/en-us/workspace/camera.md delete mode 100644 .cursor/rules/roblox/en-us/workspace/cframes.md delete mode 100644 .cursor/rules/roblox/en-us/workspace/collisions.md delete mode 100644 .cursor/rules/roblox/en-us/workspace/index.md delete mode 100644 .cursor/rules/roblox/en-us/workspace/raycasting.md delete mode 100644 .cursor/rules/roblox/en-us/workspace/streaming.md create mode 160000 .cursor/rules/shared delete mode 100644 .cursor/rules/vide/.vitepress/config.ts delete mode 100644 .cursor/rules/vide/.vitepress/theme/index.css delete mode 100644 .cursor/rules/vide/.vitepress/theme/index.js delete mode 100644 .cursor/rules/vide/.vitepress/theme/vars.css delete mode 100644 .cursor/rules/vide/api/animation.md delete mode 100644 .cursor/rules/vide/api/creation.md delete mode 100644 .cursor/rules/vide/api/reactivity-core.md delete mode 100644 .cursor/rules/vide/api/reactivity-dynamic.md delete mode 100644 .cursor/rules/vide/api/reactivity-utility.md delete mode 100644 .cursor/rules/vide/api/strict-mode.md delete mode 100644 .cursor/rules/vide/index.md delete mode 100644 .cursor/rules/vide/package.json delete mode 100644 .cursor/rules/vide/public/full_logo.svg delete mode 100644 .cursor/rules/vide/public/logo.svg delete mode 100644 .cursor/rules/vide/tut/advanced/dynamic-scopes.md delete mode 100644 .cursor/rules/vide/tut/crash-course/1-introduction.md delete mode 100644 .cursor/rules/vide/tut/crash-course/10-cleanup.md delete mode 100644 .cursor/rules/vide/tut/crash-course/11-dynamic-scopes.md delete mode 100644 .cursor/rules/vide/tut/crash-course/12-actions.md delete mode 100644 .cursor/rules/vide/tut/crash-course/13-strict-mode.md delete mode 100644 .cursor/rules/vide/tut/crash-course/14-concepts.md delete mode 100644 .cursor/rules/vide/tut/crash-course/2-creation.md delete mode 100644 .cursor/rules/vide/tut/crash-course/3-components.md delete mode 100644 .cursor/rules/vide/tut/crash-course/4-source.md delete mode 100644 .cursor/rules/vide/tut/crash-course/5-effect.md delete mode 100644 .cursor/rules/vide/tut/crash-course/6-scope.md delete mode 100644 .cursor/rules/vide/tut/crash-course/7-reactive-component.md delete mode 100644 .cursor/rules/vide/tut/crash-course/8-implicit-effect.md delete mode 100644 .cursor/rules/vide/tut/crash-course/9-derived-source.md delete mode 100644 .cursor/skills/atlas-playtest/SKILL.md delete mode 100644 .cursor/skills/atlas-push/SKILL.md create mode 160000 .cursor/skills/shared delete mode 100644 .cursor/sync-sources.ps1 delete mode 100644 .cursor/sync-sources.sh diff --git a/.cursor/commands/luau-optimize.md b/.cursor/commands/luau-optimize.md deleted file mode 100644 index 66a89daa..00000000 --- a/.cursor/commands/luau-optimize.md +++ /dev/null @@ -1,623 +0,0 @@ -# /luau-optimize - Roblox Luau Performance Optimization - -Optimize Roblox Luau files for maximum performance, type safety, and native codegen quality using `luau-compile`, `luau-analyze`, `luau-ast`, and the `luau` CLI. - -All scripts are **Roblox Luau**. Roblox APIs are always available. The vector type is `Vector3` (Roblox userdata). We are NOT using the new type solver. Studio testing uses `--!optimize 1` by default; live experiences use `--!optimize 2`. All `luau-compile` invocations must include `--vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3`. Prefer `.luau` extension over `.lua` everywhere. - -**Workspace hygiene:** CLI tools generate residual files (`stats.json`, `profile.out`, `coverage.out`, `trace.json`). At the start of execution, create a temp working directory and use it for all tool output: - -``` -# Windows -$LUAU_TMP = New-Item -ItemType Directory -Path "$env:TEMP\luau-optimize-$(Get-Random)" -# Linux/Mac -LUAU_TMP=$(mktemp -d) -``` - -Route all output there: `--stats-file=$LUAU_TMP\stats.json`, write benchmark files to `$LUAU_TMP\bench.luau`, run profiling/coverage tools with `$LUAU_TMP` as working directory. The OS handles cleanup -- no manual deletion needed. - ---- - -## Phase 0 -- Scope Resolution and Configuration - -### Resolve target - -- If user specifies a file: optimize that file. -- If user specifies a directory: discover all `.luau`/`.lua` files, enter Phase 6 (multi-file mode). -- If no argument: optimize the currently open file. - -### Infer script context - -Check in this order: - -1. **Filename suffix** (highest priority): - - `*.server.luau` / `*.server.lua` -> **server** (native codegen budget is server-side; benefit depends on code content) - - `*.client.luau` / `*.client.lua` -> **client** (native codegen less effective due to device architecture diversity) - - `*.legacy.luau` / `*.legacy.lua` -> **ambiguous** (could be cloned/moved at runtime). Ask the user. - - `*.luau` / `*.lua` (no suffix) -> ModuleScript, fall through to path check. -2. **Path-based inference** (for ModuleScripts and ambiguous cases): - - `ServerScriptService`/`ServerStorage` in path -> server-side module - - `StarterPlayer`/`StarterGui`/`StarterCharacterScripts`/`ReplicatedFirst` in path -> client-side module - - `ReplicatedStorage`/`shared` in path -> shared module - - Ambiguous or outside Roblox project -> ask the user - -### Quiz the user - -Use the AskQuestion tool with these three questions: - -**Question 1: "Compilation optimization intensity"** -- `minimal` -- Headers (`--!strict`/`--!optimize 2`), type annotations on all function signatures, deprecated pattern replacements, native codegen analysis -- `moderate` -- + function restructuring for inlining, import hoisting, compound operators, fastcall enablement, allocation reduction -- `insane` -- + every micro-optimization from the pattern catalog, full bytecode analysis, register pressure optimization, closure caching analysis - -**Question 2: "Algorithm optimization"** -- `none` -- Don't touch logic or data flow -- `low hanging fruit` -- Obvious O(n^2)->dict, redundant iterations, missing caches -- `moderate` -- + data structure changes, caching strategies, event-driven refactors, loop fusion -- `insane` -- + full algorithmic redesign where beneficial, dynamic programming, architectural restructuring - -**Question 3: "Benchmarking"** -- `yes` -- Benchmark all non-trivial changes with `luau` CLI (when function is standalone) -- `no` -- Trust bytecode/codegen metrics only -- `+EV only` -- Benchmark only when algorithmic changes or ambiguous bytecode results warrant it - -### Derived behavior - -| Setting | minimal | moderate | insane | -|---|---|---|---| -| Headers | Always | Always | Always | -| Type annotations | Function signatures | + hot path locals | + all locals | -| Pattern replacements | Deprecated only | Full Priority 2 | + Priority 4 | -| Function restructuring | No | Yes (Priority 3) | Aggressive splitting | -| Bytecode verification | After all changes | After each priority | After each change | -| Algorithmic changes | Per algo quiz | Per algo quiz | Per algo quiz | -| Native codegen strategy | Per-function analysis; `@native` on beneficial functions; `--!native` only if most are native-worthy | Selective `@native` on hot computational functions | Full per-function cost/benefit with budget tracking | - -**Restructuring scope** scales with compilation intensity: -- **minimal**: No restructuring. Only additive changes (headers, annotations, pattern swaps). -- **moderate**: Break up monoliths, reorder locals for inlining, hoist imports. Preserve exports/API. -- **insane**: Aggressive restructuring permitted. May change internal function boundaries, rewrite data flow. - ---- - -## Phase 1 -- Deep Code Read and Algorithmic Analysis - -This phase comes FIRST. Algorithmic improvements produce order-of-magnitude speedups that dwarf any bytecode optimization. This is also the largest code change, so it must happen before any bytecode-level work. - -Read the entire source file thoroughly before touching any CLI tools. - -### Step 1 -- Structural decomposition - -Monolithic functions hide their algorithmic structure behind interleaved concerns. Before analyzing complexity, understand what the code is *actually doing*: - -- **Identify responsibilities**: A 200-line function usually contains 3-5 logical steps that should be separate functions. -- **Trace data flow**: What goes in, what comes out, what is mutated along the way. -- **Separate concerns**: Validation, transformation, I/O, state management, error handling are often tangled. Separating them reveals the core algorithm. -- **Name the steps**: If you can't name what a code block does in 3-5 words, it's doing too much. -- **Look for hidden abstractions**: Repeated "iterate, filter, transform, collect" patterns that could be a single helper. - -When the quiz allows restructuring (moderate/insane): -- Physically decompose monoliths into focused local functions. Each does one thing. -- This decomposition often *reveals* optimization opportunities invisible in the monolith: step 2 recomputes what step 1 already knew, or an inner loop could be a lookup table built in the outer loop. -- Smaller functions are easier for the compiler to inline at `-O2` -- clearer code AND better bytecode. -- Preserve the original function as a thin orchestrator calling the decomposed pieces. - -Even at "minimal" intensity, still perform this mental decomposition to inform the analysis below. - -### Step 2 -- Algorithmic analysis - -With the structure understood (or cleaned up), analyze: - -**Complexity analysis** -- Identify time complexity of every significant function: -- O(n^2) or worse: nested loops, repeated linear searches, quadratic string building -- O(n) where O(1) is possible: linear search replaceable with dictionary/set lookup -- Repeated work: same computation done multiple times, cacheable/memoizable -- Unnecessary copies: cloning data that could be referenced or mutated in place -- Hidden quadratics: O(n) function that calls another O(n) function inside a loop - -**Data structure fitness** -- Is the right data structure being used? -- Array for membership testing -> set (dictionary with `true` values) -- Linear scan for lookup by key -> dictionary -- Repeated sort of mostly-sorted data -> maintain sorted order on insert -- Flat list with frequent removal from middle -> swap-and-pop -- Large string built incrementally -> `table.concat` pattern or `buffer` -- Multiple parallel arrays -> single array of structs (table of tables) -- Unbounded growth without cleanup -> size limits, LRU eviction, periodic pruning - -**Caching and memoization:** -- Pure functions called repeatedly with same args -> memoize -- Expensive property reads in loops -> cache in local before loop -- Computed values unchanged within a scope -> hoist out -- Derived state recomputed from scratch on every access -> maintain incrementally - -**Redundant work elimination:** -- Multiple passes over same data -> fuse into one -- Recomputing derived state -> maintain incrementally -- Sort/filter that could be done once and reused -- Deep clone where shallow clone or reference suffices -- Intermediate result immediately discarded after extracting one field - -**Architectural patterns:** -- Per-frame polling where event-driven would work (RunService events are expensive) -- Synchronous work that could be chunked across frames with `task.wait()` -- Undisconnected event connections (memory leak + wasted computation) -- Rebuilding entire state on small change -> incremental update -- God-object owning too much state -> split responsibilities - -**Hot path identification:** -- Event handlers on RunService (PreAnimation, PreRender, PreSimulation, PostSimulation, Heartbeat) -- Functions called inside loops -- Recursive functions -- Functions called from other hot functions - -### Step 3 -- Present findings and quiz the user - -Before applying any changes, present a summary of all findings organized by impact. For each finding: - -- **What**: One-line description of the issue -- **Where**: Function name / line range -- **Why**: What makes it slow (e.g., "O(n^2) nested scan on every frame") -- **Fix**: Proposed change in plain language -- **Impact**: Estimated improvement (order-of-magnitude, constant-factor, or clarity-only) - -Then quiz the user using the AskQuestion tool: - -- For fewer than 5 findings: one question per finding with options `apply` / `skip` / `modify` -- For 5+ findings: group by category with options `apply all` / `cherry-pick` / `skip all`: - - Structural decomposition - - Data structure changes - - Algorithm changes - - Architectural changes - -If the algorithm quiz from Phase 0 was "none", present findings as informational only (no apply options). The user still sees what was found. - -If the user selects "modify", wait for their input before proceeding with that specific change. - -### Step 4 -- Apply approved changes - -Apply only user-approved changes, in this order (dependencies flow downward): - -1. **Structural decomposition** -- break monoliths into focused functions (foundation for everything else) -2. **Data structure changes** -- swap arrays for dicts, add indexes, etc. -3. **Algorithm changes** -- replace O(n^2) with O(n), add caching/memoization -4. **Architectural changes** -- event-driven refactors, incremental updates - -Benchmark algorithmic changes if the benchmarking quiz warrants it (see Phase 4.5). - ---- - -## Phase 2 -- Baseline Capture - -Run all diagnostic tools on the code (post-algorithmic changes if any were applied in Phase 1). These metrics are the baseline for bytecode optimization phases. - -### Tools to run - -Detect OS: use `--target=x64_ms` on Windows, `--target=x64` on Linux/Mac. Route stats output to temp directory. - -``` -luau-analyze --mode=strict -luau-analyze --annotate -luau-compile --remarks -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 -luau-compile --text -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 -luau-compile --codegen --target=x64_ms --record-stats=function --stats-file=$LUAU_TMP\stats.json -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 -``` - -### Metrics to capture - -- Total bytecode instruction count (from `--text`) -- Allocation count: NEWTABLE, NEWCLOSURE occurrences (from `--remarks`) -- Inlining success/failure count (from `--remarks`: "inlining succeeded"/"inlining failed") -- Type coverage: count of `any` types in `--annotate` output -- Register spills and skipped functions (from `--record-stats` JSON `lowerStats`) -- Lint warning count (from `--mode=strict`) - ---- - -## Phase 3 -- Compilation-Level Code Analysis - -Using both the source (already read in Phase 1) and tool output from Phase 2, identify bytecode-level optimization opportunities: - -- **Missing types**: `any` inferences hurting native codegen (especially `Vector3`, `CFrame`, `buffer` params). JIT uses annotations directly -- no runtime type analysis. Unannotated params assumed to be tables. -- **Import patterns**: `math.max` resolved at load time via GETIMPORT. Broken by `getfenv`/`setfenv`/`loadstring` (marks env "impure"). -- **Allocation in loops**: NEWTABLE, NEWCLOSURE in hot loops. High allocation rate = more GC assist work. -- **Closure caching**: Repeated function expressions cached when: no upvalues, or all upvalues immutable and module-scope. Mutable captures prevent caching. -- **Upvalue mutability**: ~90% immutable in typical code. Immutable = no allocation, no closing, faster access. Mutable = extra object. -- **Method call patterns**: `obj:Method()` uses fast method call instruction. Avoid `obj.Method(obj)`. `__index` should point at a table directly (not function or deep chain). -- **Inline caching**: Best when field name known at compile time, no metatables, uniform shapes. -- **pcall in hot paths**: Prevents native codegen optimization. -- **String concatenation**: `..` in loops -> `table.concat` or string interpolation. -- **Deoptimizing APIs**: `getfenv`/`setfenv` (even read-only!), `loadstring` disable ALL import optimization and fastcalls. -- **Builtin global writes**: `math = ...` disables fastcall. Lint `BuiltinGlobalWrite` catches this. -- **Metamethod cost**: `__eq` always called on `==`/`~=` even for rawequal values. -- **GC pressure**: Incremental GC with "GC assists" -- allocating code pays proportional GC work. - ---- - -## Phase 4 -- Compilation Optimization - -Apply changes in priority order. Re-run `luau-compile --remarks -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 ` after structural changes to verify the compiler benefits. - -### Priority 1 -- Headers, type safety, and native codegen (always apply) - -**Add headers:** -- `--!strict` / `--!optimize 2`. (`--!optimize 2` is default in live but not Studio testing.) -- **Do NOT blindly add `--!native`.** Native codegen is analyzed separately (see "Native codegen strategy" below). - -**Remove deoptimizers:** -- Replace `getfenv`/`setfenv` -- disables builtins, imports, and optimizations globally. -- Replace `table.getn` -> `#t`, `table.foreach`/`table.foreachi` -> `for..in`. - -**Type accuracy -- the first big battle:** - -Getting the file to pass `--!strict` cleanly is the single most impactful compilation change. Every `any` type is a function the native codegen cannot specialize. But the goal is *accurate* types, not silencing errors with casts: - -- Run `luau-analyze --annotate` and identify every `any` inference. These are the targets. -- Add real type annotations to function signatures first (parameters and return types). This has the highest leverage -- it propagates type info to every caller and every local inside the function. -- Then annotate locals in hot paths where inference still falls to `any`. -- Annotate `Vector3`, `CFrame`, `buffer` params explicitly -- native codegen generates specialized vector code. Unannotated params are assumed to be generic tables with extra type checks. -- **Do NOT paper over type errors with `:: any` casts.** A cast to `any` is worse than no annotation -- it actively tells the compiler to give up. If a type error is hard to fix, use the narrowest cast possible (`:: SpecificType`), or restructure the code so the type flows naturally. -- **Narrow `any` in dictionaries.** `{[string]: any}` is common but hurts codegen. Ask: what values actually go in there? If it's a known set of types, use a union: `{[string]: string | number | boolean}`. If the dictionary has known keys, use a typed table: `{name: string, score: number}`. Only fall back to `any` when the value type is genuinely unbounded (e.g., serialized data from an external source). -- Use type refinements (`type()`, `typeof()`, `:IsA()`, `assert()`) to provide type info from runtime checks instead of casts. -- For OOP patterns: use `typeof(setmetatable(...))` with explicit `self: ClassName` on methods (old typechecker compatible). -- For generic code: use proper generics (``) instead of `any`. If the function truly accepts anything, use `unknown` and narrow explicitly. -- Track type coverage: count `any` in `--annotate` output. The goal is zero (or as close as practical). - -**Native codegen strategy -- `--!native` vs `@native` vs neither:** - -Native codegen has two limits: a 1M instruction cap per module and a per-experience memory ceiling shared across all native scripts. Applying `--!native` indiscriminately wastes both budgets on functions that don't benefit, crowding out functions that would. - -1. **Classify every function** in the file by its dominant work: - - **Native-worthy**: Tight computational loops, math-heavy logic (`Vector3`/`CFrame` arithmetic, `buffer` ops, `bit32` ops, numerical algorithms, physics calculations). These get genuine speedups from JIT compilation. - - **Not native-worthy**: Roblox API calls (`Instance:Clone()`, `:FindFirstChild()`, `:GetChildren()`, event connections), table construction without computation (allocation-bound), heavy Luau library calls (`string.format`, pattern matching -- C implementations native codegen can't speed up), one-shot initialization, coroutine/task scheduling. The dominant cost is the API/library call or GC, not Luau instruction dispatch. - -2. **Decision matrix**: - - **All/most functions are native-worthy** (math utility modules, physics solvers, buffer serializers): Use `--!native` on the whole file. - - **Some functions are native-worthy** (mixed scripts with hot computational loops alongside API-heavy code): Use `@native` on individual functions that benefit. **This is the common case for real game scripts.** - - **No functions are native-worthy** (typical game scripts: event handlers, UI logic, Roblox API orchestration): Skip native codegen entirely. Don't waste the budget. - -3. **`@native` placement rules**: - - Place `@native` directly above the function declaration. - - Inner/nested functions do NOT inherit `@native` -- annotate them individually if needed. - - Top-level module code runs once at `require()` time; `@native` has no meaningful benefit there. - - Prioritize functions identified as hot paths in Phase 1 (RunService handlers, loop bodies, recursive functions) -- but only if their work is computational, not API-bound. - -4. **Budget awareness**: Check native codegen stats from `--record-stats`. If the module's native instruction count is high, be more selective with `@native` to leave budget for other scripts in the experience. - -### Priority 2 -- Low-hanging structural wins - -- Hoist library functions: `local floor = math.floor` enables GETIMPORT fastcall. Fastcall builtins: `assert`, `type`, `typeof`, `rawget`/`rawset`/`rawequal`, `getmetatable`/`setmetatable`, `tonumber`/`tostring`, most `math.*` (not `noise`, `random`/`randomseed`), `bit32.*`, some `string.*`/`table.*`. Partial specializations: `assert` (unused return + truthy), `bit32.extract` (constant field/width), `select(n, ...)` O(1). -- Replace `pairs(t)`/`ipairs(t)` -> `for k, v in t do`. Generalized iteration skips the `pairs()` call. `for i=1,#t` is slightly slower. -- `math.floor(a / b)` -> `a // b` (dedicated VM opcode, `//=` compound form). -- Use compound assignment (`+=`, `-=`, `*=`, `//=`, `..=`) -- LHS evaluated once. -- String concat in loops -> `table.concat` or backtick interpolation (lowers to optimized `string.format`). -- `table.create(n)` for known-size arrays. Sequential fill: `local t = table.create(N); for i=1,N do t[i] = ... end`. -- `table.insert(t, v)` for unknown-size append -- `#t` is O(1) cached, worst case O(log N). -- `a + (b - a) * t` -> `math.lerp(a, b, t)` (exact at endpoints, monotonic). -- Manual byte swap -> `bit32.byteswap(n)` (CPU bswap). -- Manual log2 -> `bit32.countlz(n)` (CPU instruction, ~8x faster). -- Manual linear search -> `table.find(t, v)`. -- Manual `pairs` clone -> `table.clone(t)`. -- Manual `string.byte`/`string.char` -> `string.pack`/`string.unpack`. -- `rawlen(t)` when metamethods not needed. -- Explicit `./`/`../`/`@` prefixes in `require()`. - -### Priority 3 -- Function structure for inlining - -- Break monoliths into small local functions (compiler inlines at `-O2`). -- Inlining requirements: local, non-mutated, non-recursive, not OOP (`:` syntax), not metamethod. Disabled by `getfenv`/`setfenv`. -- Inlining + constant folding cascade: `local function double(x) return x*2 end; local y = double(5)` folds to `y = 10`. -- Create local function wrappers for frequently-called imported module methods. -- Move `pcall` out of hot loops. -- Use `obj:Method()` not `obj.Method(obj)` -- fast method call instruction. -- `__index` should point at a table directly for inline caching. -- Reduce mutable upvalue captures in loop closures. Immutable upvalues = no allocation, no closing. -- Set all table fields at once (compiler infers hash capacity from subsequent assignments). -- Loop unrolling: constant bounds only, simple body. -- Native codegen size limits: 64K instructions/block, 32K blocks/function, 1M instructions/module. Split if exceeded. - -### Priority 4 -- Micro-optimizations (hot paths only) - -- Table shape consistency (same fields, same order) -- inline caching predicts hash slots. -- `buffer` for binary data (fixed-size, offset-based, efficient native lowering). -- `buffer.readu32` + `bit32` over `buffer.readbits` when schema known. -- Strength reduction: `* 2^n` -> `bit32.lshift`, `/ 2^n` -> `bit32.rshift`. -- Minimize `tostring`/`tonumber` in tight loops. -- `table.freeze` for readonly config (avoids proxy `__index` overhead). -- Keep `__eq` cheap -- fires on every `==`/`~=` and `table.find`. -- `math.isfinite`/`math.isnan`/`math.isinf` over `x ~= x`. -- Annotate `Vector3` params for native specialization. -- `if expr then A else B` over `cond and A or B` (one branch, falsy-safe). - ---- - -## Phase 4.5 -- Benchmark with `luau` CLI - -When a non-trivial optimization is applied to an isolated, pure-logic function (no Roblox API dependencies), write a small benchmark harness: - -```luau -local function original(...) - -- paste original implementation -end - -local function optimized(...) - -- paste optimized implementation -end - -local ITERATIONS = 1_000_000 -local clock = os.clock - -for _ = 1, 1000 do original(...) end -for _ = 1, 1000 do optimized(...) end - -local t0 = clock() -for _ = 1, ITERATIONS do original(...) end -local t1 = clock() -for _ = 1, ITERATIONS do optimized(...) end -local t2 = clock() - -print(`Original: {t1 - t0:.4f}s`) -print(`Optimized: {t2 - t1:.4f}s`) -print(`Speedup: {(t1 - t0) / (t2 - t1):.2f}x`) -``` - -Run with both paths: - -``` -luau -O2 bench.luau -luau -O2 --codegen bench.luau -``` - -**When to benchmark:** Self-contained function, algorithmic/data structure change, ambiguous bytecode diff, tiebreak between approaches. - -**When NOT to benchmark:** Roblox API dependencies (use Studio Script Profiler instead), purely additive changes, cold code. - -Write the benchmark file to `$LUAU_TMP\bench.luau`, not the project directory. Run `luau` from `$LUAU_TMP` as working directory so `profile.out` and other residuals land there too. - ---- - -## Phase 5 -- Verification - -Re-run all Phase 2 tools and present a before/after comparison: - -- Bytecode instruction count delta -- Allocation count delta -- Inlining success rate delta -- Type coverage improvement (fewer `any` types) -- Register spill delta -- Lint warning delta -- Benchmark results (if Phase 4.5 was used) - -If any metric regressed, investigate and explain why (or revert). - ---- - -## Phase 6 -- Multi-file Mode - -When optimizing a directory: - -1. Run Phase 1 (code read) on all files to identify algorithmic improvement potential. -2. Run Phase 2 (baseline) on all files to identify bytecode optimization potential. -3. Prioritize by: worst algorithmic complexity, most lint warnings, most `any` types, most allocations, most failed inlines. -4. Process files one at a time through Phases 1-5. -5. Present aggregate metrics at the end. - ---- - -## Key Principles - -These principles govern every optimization decision: - -- **Same implementation, better performance** -- behavioral equivalence is non-negotiable. Never change what the code does, only how fast it does it. -- **Algorithms first, bytecode second** -- an O(n) algorithm with unoptimized bytecode beats an O(n^2) algorithm with perfect bytecode every time. -- **Low-hanging fruit first** -- headers and types before restructuring, restructuring before micro-optimizations. -- **Compiler feedback loop** -- verify each structural change with `luau-compile --remarks`. If the compiler didn't benefit, the change wasn't worth it. -- **Small functions over monoliths** -- easier for the compiler to inline, easier for humans to maintain, easier to reason about algorithmically. -- **Local functions for inlining** -- even at the cost of duplicating imported behavior in high-traffic code. -- **Quantify everything** -- before/after metrics for every optimization pass. No "I think this is faster" -- prove it. -- **Type annotations drive native codegen quality** -- every `any` type is a missed specialization opportunity. The JIT uses annotations directly with no runtime analysis. -- **Native codegen is a budget, not a checkbox** -- `--!native` on every file wastes the per-experience native code memory limit on functions that don't benefit. Apply `@native` selectively to computational hot functions; reserve `--!native` for genuinely math-heavy modules. -- **Event-driven over polling** -- avoid per-frame calculations when events suffice. - ---- - -## Reference: Type System (Old Typechecker Only) - -**Available NOW:** -- `--!strict` / `--!nonstrict` / `--!nocheck` -- Basic annotations: `local x: number`, `function f(a: string): boolean` -- Optional: `string?`, Union: `number | string`, Intersection: `T1 & T2` -- Generics: `function id(x: T): T`, explicit instantiation: `f<>()` -- Cast: `x :: string` -- Array: `{number}`, Dict: `{[string]: number}`, Table: `type T = { field: type }` -- `typeof()`, `export type`, typed variadics, alias defaults, singletons -- `never`, `unknown`, `read`/`write` modifiers -- Type refinements: `type()`, `typeof()`, `:IsA()`, truthiness, equality, `assert()` - -**DO NOT recommend (requires new typechecker):** -- `keyof`, `index`, `rawkeyof`, `rawget` -- `getmetatable`, `setmetatable` -- User-defined type functions, negation types (`~T`) -- Relaxed recursive type restrictions - -## Reference: Type Refinement Patterns - -The compiler narrows types after certain checks, improving both type safety and native codegen. Use refinements to provide type information without explicit annotations where the type is known from a runtime check: - -- **Truthiness:** `if x then` narrows `x` from falsy (`nil`/`false`) -- **Type guards:** `if type(x) == "number" then` narrows `x` to `number` -- **Typeof guards (Roblox):** `if typeof(x) == "Vector3" then` narrows to `Vector3`; `x:IsA("TextLabel")` narrows `Instance` to subclass -- **Equality:** `if x == "hello" then` narrows `x` to singleton `"hello"` -- **Assert:** `assert(type(x) == "string")` narrows `x` to `string` after the call -- **Composition:** Supports `and`, `or`, `not` for compound refinements - -## Reference: Deprecated Patterns - -| Deprecated | Replacement | Impact | -|---|---|---| -| `getfenv()` / `setfenv()` | `debug.info(i, "snl")` | Disables ALL optimizations. Even read-only `getfenv()` deoptimizes. | -| `loadstring()` | Restructure with `require` | Marks env "impure", disables imports | -| `table.getn(t)` | `#t` | Slower | -| `table.foreach(t, f)` | `for k, v in t do` | Slower | -| `table.foreachi(t, f)` | `for i, v in t do` | Slower | -| `wait()` | `task.wait()` | Deprecated Roblox API | -| `obj.Method(obj, ...)` | `obj:Method(...)` | Misses fast method call instruction | -| `string:method()` | `string.method(s)` | Fastcall: `string.byte(s)` faster than `s:byte()` | - -## Reference: Lint Rules - -| Lint | Name | Optimization impact | -|---|---|---| -| 10 | BuiltinGlobalWrite | Overwriting builtins disables fastcall | -| 22 | DeprecatedApi | Deprecated APIs: perf/correctness issues | -| 23 | TableOperations | Wrong index, redundant insert, `#` on non-arrays | -| 3 | GlobalUsedAsLocal | Global in one function -> should be local | -| 7 | LocalUnused | Dead locals | -| 12 | UnreachableCode | Dead code | -| 25 | MisleadingAndOr | `a and false or c` bugs | - -## Reference: Bytecode Pattern Catalog - -| Slow | Fast | Why | -|---|---|---| -| `math.floor(a / b)` | `a // b` | Dedicated VM opcode | -| `data[i].x = data[i].x + 1` | `data[i].x += 1` | LHS evaluated once | -| `a + (b - a) * t` | `math.lerp(a, b, t)` | Exact at endpoints, monotonic | -| `"pre" .. v .. "suf"` | `` `pre{v}suf` `` | Optimized `string.format` | -| Manual byte swap | `bit32.byteswap(n)` | CPU bswap | -| Manual log2 loop | `bit32.countlz(n)` | CPU instruction, ~8x faster | -| `cond and A or B` | `if cond then A else B` | Safe for falsy, one branch | - -## Reference: Allocation Reduction - -| Slow | Fast | Why | -|---|---|---| -| `local t = {}` in loop | `table.clear(t)` + reuse | Avoids GC pressure | -| Repeated `table.insert` | `table.create(n)` + indexed writes | Preallocated | -| Manual `pairs` clone | `table.clone(t)` | Faster, copies layout | -| `string.byte`/`char` loops | `string.pack`/`unpack` | Native implementation | -| String binary data | `buffer` type | Fixed-size, efficient | - -## Reference: Inlining Rules - -| Blocks inlining | Enables inlining | Why | -|---|---|---| -| `function Module.foo()` | `local function foo()` | Mutable table prevents | -| `function Obj:method()` | `local function method(self)` | OOP syntax not inlineable | -| Recursive function | Split base/recursive | Recursion prevents | -| Deep upvalue captures | Pass as parameters | Reduces closure cost | - -## Reference: Native Codegen - -**`--!native` (whole-file) -- use sparingly:** -- Compiles every function in the file to native code, consuming the per-module 1M instruction limit and the per-experience memory budget. -- Only appropriate for files where most/all functions are computational: math utilities, physics solvers, buffer serializers, numerical algorithms. -- Wasteful on typical game scripts where most functions are Roblox API calls, table construction, or string operations -- these don't benefit from native codegen but still eat the budget. - -**`@native` (per-function) -- preferred for most files:** -- Annotate only functions that perform computational work benefiting from JIT: tight loops, `Vector3`/`CFrame` arithmetic, `buffer` ops, `bit32` ops, numerical math. -- Place directly above the function declaration. Inner functions do NOT inherit it. -- Top-level code runs once at `require()` time; `@native` provides no meaningful benefit there. -- This is the correct default strategy for mixed scripts with both hot computational code and API-heavy orchestration. - -**Functions that do NOT benefit from `@native`:** -- Roblox API calls (`Instance:Clone()`, `:FindFirstChild()`, `:GetChildren()`, `:WaitForChild()`, event connections) -- execution time is in C++/engine, not Luau bytecode -- Table construction without computation (allocation-bound; the allocator is C code native codegen can't speed up) -- Heavy Luau library calls (`string.format`, `string.match`, `string.gmatch` -- C implementations that native codegen can't accelerate) -- One-shot initialization code -- Event handler registration and wiring -- `require()` calls and module setup -- Coroutine/task scheduling (`task.spawn`, `task.defer`, `task.wait`) - -**Functions that benefit from `@native`:** -- Tight numerical loops (physics, interpolation, noise generation) -- Mathematical operations on table data (reading values, computing, writing back -- the Roblox docs explicitly cite this) -- `Vector3`/`CFrame` arithmetic (native generates specialized vector code with proper type annotations) -- `buffer` read/write operations (efficient native lowering) -- `bit32` operations (maps to CPU instructions) -- Hot paths called every frame (RunService handlers with computational work, not API orchestration) - -**Hurts native:** `getfenv`/`setfenv`, wrong types to typed functions, non-numeric math args, breakpoints, size limits (64K instructions/block, 32K blocks/function, 1M/module). - -**Budget management:** The 1M instruction limit is per-module; the memory budget for native code is per-experience, shared across ALL native scripts. Use `--record-stats=function` to check each function's native instruction count and `debug.dumpcodesize()` in Studio to see per-experience usage. A few well-chosen `@native` functions outperform blanket `--!native` across many files. - -## Reference: CLI Tools - -### `luau-compile` -- Static bytecode/codegen analysis (primary tool) - -Modes (mutually exclusive): `binary` (raw bytecode), `text` (human-readable opcodes with source annotations), `remarks` (source with inlining/allocation comments -- **most useful**), `codegen` (native assembly, requires `--target`). - -Options: `-O` (0-2, default 1; `-O2` enables inlining), `-g` (debug level 0-2), `--target=` (`x64`, `x64_ms`, `a64`, `a64_nf`; use `x64_ms` on Windows), `--record-stats=` (JSON stats: bytecodeInstructionCount, lowerStats with spills/skipped/blocks/errors), `--bytecode-summary` (opcode distribution, requires `--record-stats=function`), `--stats-file=` (default `stats.json`), `--timetrace` (trace.json), `--vector-lib`/`--vector-ctor`/`--vector-type` (always set for Roblox). - -### `luau-analyze` -- Type checking and linting - -Modes: omitted (typecheck + lint), `--annotate` (source with all inferred types inline -- **critical for finding `any`**). - -Options: `--mode=strict` (force strict even without directive), `--formatter=plain` (machine-parseable), `--formatter=gnu` (grep-friendly), `--timetrace`. - -### `luau` -- Runtime execution, profiling, and coverage - -**Limited for Roblox scripts** (most depend on engine APIs). Only usable for pure-logic modules. For Roblox scripts, use Studio Script Profiler and `debug.dumpcodesize()`. - -Options: `-O`, `-g`, `--codegen` (native execution), `--profile[=N]` (sampling at N Hz, default 10000, outputs `profile.out`), `--coverage` (outputs `coverage.out`), `--timetrace`, `-a` (program args). - -### `luau-ast` -- AST dump - -No flags. Outputs full JSON AST with node types, source locations, variable scopes, type annotations. Useful for programmatic analysis: function nesting depth, function body size (monolith detection), closure captures (upvalue analysis), table construction patterns, loop-invariant expression detection. - -## Reference: VM Architecture - -**Fastcall builtins:** `assert`, `type`, `typeof`, `rawget`/`rawset`/`rawequal`/`rawlen`, `getmetatable`/`setmetatable`, `tonumber`/`tostring`, most `math.*` (not `noise`/`random`/`randomseed`), `bit32.*`, some `string.*`/`table.*`. Partial: `assert` (unused return + truthy), `bit32.extract` (constant field/width), `select(n, ...)` O(1). With `-O2`: constant-arg builtins folded; `math.pi`, `math.huge` folded. - -**Inline caching:** HREF-style for table fields. Compiler predicts hash slot; VM corrects. Best: compile-time field name, no metatables, uniform shapes. - -**Import resolution:** `math.max` resolved at load time. Invalidated by `getfenv`/`setfenv`/`loadstring`. - -**GC:** Incremental mark-sweep with "GC assists" (allocation pays proportional GC). Paged sweeper (16 KB pages). No `__gc` metamethod. - -**Compiler:** Multi-pass. Constant folding across functions/locals. Upvalue optimization. `-O2`: inlining, loop unrolling (constant bounds), aggressive constant folding. Interprocedural limited to single modules. - -**Table length:** `#t` is O(1) cached, worst case O(log N) branch-free binary search. `table.insert`/`table.remove` update the cache. - -**Upvalues:** ~90% immutable. Immutable = no allocation, no closing, faster access. Mutable = extra object. - -**Closures:** Cached when no upvalues, or all upvalues immutable and module-scope. - -## Reference: Documentation to Consult - -Read these docs during execution if needed for specific detail. Two doc trees: -- `.cursor/rules/luau/` -- Official Luau site docs (guides, types, reference, getting-started) -- `.cursor/rules/luau-rfcs/` -- Luau RFCs (language proposals, library additions) - -**Luau site docs (primary):** -- `.cursor/rules/luau/guides/performance.md` -- **The official Luau performance guide.** Covers interpreter, compiler, fastcalls, inline caching, imports, table creation, GC, inlining, loop unrolling, upvalues, closures. -- `.cursor/rules/luau/guides/profile.md` -- Profiling guide (flame graphs, sampling) -- `.cursor/rules/luau/types/` -- Full type system docs (basic-types, tables, generics, refinements, unions-and-intersections, object-oriented-programs, roblox-types, considerations) -- `.cursor/rules/luau/getting-started/lint.md` -- All 28 lint rules -- `.cursor/rules/luau/reference/library.md` -- Complete library reference -- `.cursor/rules/luau/getting-started/compatibility.md` -- Luau vs Lua differences - -**Luau RFCs (specific features):** -- `.cursor/rules/luau-rfcs/function-inlining.md` -- Inlining RFC (no user `@inline`, automatic at `-O2`) -- `.cursor/rules/luau-rfcs/syntax-attribute-functions-native.md` -- `@native` per-function attribute -- `.cursor/rules/luau-rfcs/function-table-create-find.md`, `function-table-clear.md`, `function-table-clone.md`, `function-table-freeze.md` -- Table operations -- `.cursor/rules/luau-rfcs/function-math-lerp.md` -- `math.lerp` -- `.cursor/rules/luau-rfcs/function-bit32-byteswap.md`, `function-bit32-countlz-countrz.md` -- CPU-level bit ops -- `.cursor/rules/luau-rfcs/function-buffer-bits.md`, `type-byte-buffer.md` -- Buffer type and ops -- `.cursor/rules/luau-rfcs/vector-library.md` -- Vector library and fastcalls -- `.cursor/rules/luau-rfcs/function-string-pack-unpack.md` -- Binary string operations -- `.cursor/rules/luau-rfcs/syntax-floor-division-operator.md` -- `//` dedicated opcode -- `.cursor/rules/luau-rfcs/syntax-compound-assignment.md` -- `+=` single LHS evaluation -- `.cursor/rules/luau-rfcs/deprecate-getfenv-setfenv.md` -- Why fenv disables optimizations -- `.cursor/rules/luau-rfcs/deprecate-table-getn-foreach.md` -- Deprecated table functions -- `.cursor/rules/luau-rfcs/generalized-iteration.md` -- Modern iteration patterns -- `.cursor/rules/luau-rfcs/generic-functions.md`, `never-and-unknown-types.md`, `syntax-type-ascription.md` -- Type system RFCs - -**Cursor rules:** -- `.cursor/rules/luau.mdc` -- Luau language rules and optimization tips - -**Roblox docs:** -- `.cursor/rules/roblox/en-us/luau/native-code-gen.md` -- Native codegen (size limits, Vector3 annotation impact) -- `.cursor/rules/roblox/en-us/luau/type-checking.md` -- Type annotation syntax and modes -- `.cursor/rules/roblox/en-us/performance-optimization/improve.md` -- Script computation, memory, physics, rendering -- `.cursor/rules/roblox/en-us/performance-optimization/design.md` -- Event-driven patterns, frame budgets -- `.cursor/rules/roblox/en-us/luau/variables.md` -- Local vs global performance -- `.cursor/rules/roblox/en-us/luau/scope.md` -- Scope performance implications diff --git a/.cursor/commands/shared b/.cursor/commands/shared new file mode 160000 index 00000000..9a8a79fc --- /dev/null +++ b/.cursor/commands/shared @@ -0,0 +1 @@ +Subproject commit 9a8a79fcd010fb2925f252719f75df698ab6f789 diff --git a/.cursor/docs/shared b/.cursor/docs/shared new file mode 160000 index 00000000..187d8917 --- /dev/null +++ b/.cursor/docs/shared @@ -0,0 +1 @@ +Subproject commit 187d891770f3338ab73ed4543df684bd6e8ca261 diff --git a/.cursor/logs/.gitignore b/.cursor/logs/.gitignore deleted file mode 100644 index 314f02b1..00000000 --- a/.cursor/logs/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.txt \ No newline at end of file diff --git a/.cursor/plans/ambiguous_path_handling_f2eaef11.plan.md b/.cursor/plans/ambiguous_path_handling_f2eaef11.plan.md deleted file mode 100644 index 1b0bc3b4..00000000 --- a/.cursor/plans/ambiguous_path_handling_f2eaef11.plan.md +++ /dev/null @@ -1,425 +0,0 @@ ---- -name: Ambiguous Path Handling -overview: "Replace the current duplicate-name blacklist/skip system with a full ambiguous path handling system: a 3-pass matching algorithm (3 implementations: 2 Rust, 1 Lua), filesystem-collision-based dedup (~N suffixes), and filesystem-name-based ref paths. Implementation starts with the Rust syncback matching algorithm for testability, then expands outward." -todos: - - id: phase1a-remove-blacklist-rust - content: Remove duplicate-skip blacklist from Rust side (dir.rs, project.rs, syncback/mod.rs) - status: completed - - id: phase1b-remove-blacklist-plugin - content: Cherry-pick plugin relaxations from rbxm-ambiguous (diff.lua, encodeInstance.lua) - status: completed - - id: phase1c-two-pass-syncback - content: Restructure syncback_dir_no_meta to two-pass child processing (tentative names, then collision grouping) - status: completed - - id: phase1d-dedup-key-semantics - content: Change dedup key in file_names.rs from bare slug to full filesystem name component - status: completed - - id: phase1e-suffix-cleanup - content: Implement suffix cleanup rules (gap-tolerant, base-name promotion, group-to-1) - status: completed - - id: phase2a-matching-syncback - content: Implement 3-pass matching algorithm for syncback (src/syncback/matching.rs) - status: completed - - id: phase2b-integrate-syncback - content: Integrate matching into syncback_dir_no_meta (dir.rs) - status: completed - - id: phase2c-matching-forward - content: Implement 3-pass matching algorithm for forward sync (src/snapshot/matching.rs) - status: completed - - id: phase2d-integrate-forward - content: Integrate matching into compute_children_patches (patch_compute.rs) - status: completed - - id: phase2e-matching-cache - content: Add optional matching cache (parent_ref -> match_assignments) with invalidation - status: pending - - id: phase3a-fs-name-ref-paths - content: Switch ref_target_path() to filesystem-name-based paths in rojo_ref.rs - status: completed - - id: phase3b-tree-resolution - content: Update get_instance_by_path() in tree.rs to resolve filesystem-name segments - status: completed - - id: phase3c-ref-properties - content: Update ref_properties.rs for filesystem-name-based linking - status: completed - - id: phase3d-patch-apply - content: Update patch_apply.rs ref resolution for new path format - status: completed - - id: phase3e-ref-update-infra - content: Extend RefPathIndex and ref update infrastructure for all rename/dedup cases - status: completed - - id: phase4a-change-processor - content: Update change_processor.rs for VFS echo prevention on dedup renames and suffix cleanup - status: completed - - id: phase4b-api-write - content: Update api.rs for two-pass write, dedup in all 4 branches, dual write consistency - status: completed - - id: phase5a-lua-matching - content: Implement 3-pass matching algorithm in Lua (hydrate.lua + matching.lua + XXH32.luau) - status: completed - - id: phase5b-plugin-integration - content: Update ChangeBatcher and confirmation dialog for duplicate-named instances - status: completed - - id: phase6-cherry-picks - content: Cherry-pick roundtrip test improvements and macOS test ignore from rbxm-ambiguous - status: completed - - id: phase7-testing - content: "Implement comprehensive test suite: shared test vectors, all spec scenarios, roundtrip tests" - status: completed -isProject: false ---- - -# Ambiguous Path Handling - -## Architecture - -The feature introduces three interlocking subsystems that replace the current "skip duplicates" approach: - -```mermaid -flowchart TD - subgraph matching [Matching Algorithm] - MA1[Pass 1: Unique Names] - MA2[Pass 2: Ref Discriminators] - MA3[Pass 3: Similarity Scoring] - MA1 --> MA2 --> MA3 - end - - subgraph dedup [Dedup System] - D1[Compute tentative FS name per child] - D2[Group by lowercased FS collision] - D3[Assign ~N suffixes within groups] - end - - subgraph refs [Ref Path System] - R1[Paths use full FS names incl extensions] - R2[RefPathIndex tracks all refs] - R3[Batch update on rename/dedup change] - end - - matching -->|"pairing determines which get new names"| dedup - dedup -->|"final FS names feed into"| refs -``` - - - -**Execution order per sync operation:** Matching runs first (pairs instances), dedup runs second (assigns filesystem names), ref paths are computed last (using final filesystem names). - -**Performance target:** System must handle large games (10K+ instances) with <100ms latency per operation. Architecture must not have O(n^2) bottlenecks on the full tree. The matching algorithm should only run on the affected subtree when possible. Optimization can be deferred but the structure must support it. - ---- - -## Phase 1: Foundation - Remove Blacklist and Restructure Dedup - -### 1a. Remove duplicate-skip blacklist (Rust) - -`**[src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs)`** -- Remove the duplicate child detection and skip logic in `syncback_dir_no_meta()`: - -- Lines 151-181: `child_name_counts` / `duplicate_names` HashSet construction -- Lines 235-239, 321-324: `if duplicate_names.contains(...) { continue; }` guards -- Related stats recording (`record_duplicate_names_batch`) - -`**[src/snapshot_middleware/project.rs](src/snapshot_middleware/project.rs)`** -- Replace `bail!` on duplicate names with dedup suffix handling. Adapt the rbxm-ambiguous branch's case-insensitive detection (skip + warn), but instead of skipping, route through the new dedup system. **Important:** project KEYS are unique by JSON definition and do NOT participate in dedup themselves. Only filesystem children under project nodes need dedup when they collide. Evaluate whether to remove the warn-and-skip guard from the rbxm branch or keep it as a safety net. - -`**[src/syncback/mod.rs](src/syncback/mod.rs)`** -- Remove `has_duplicate_children` detection used for skipping. Keep the infrastructure for detecting duplicates since it feeds into the dedup system. - -### 1b. Remove duplicate-skip blacklist (Plugin) - -Take the rbxm-ambiguous branch changes directly: - -`**[plugin/src/Reconciler/diff.lua](plugin/src/Reconciler/diff.lua)`** -- Remove `findDuplicateNames()`, `ambiguousIds`, `scanForDuplicates()`, all `if ambiguousIds[id] then` guards, and the `skippedDuplicateCount` tracking. Duplicate-named instances now flow through diff normally. - -`**[plugin/src/ChangeBatcher/encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua)`** -- Remove `skippedDuplicateCount`, remove child duplicate skip loop, keep `isPathUnique` as a debug log (not a skip). Return single function instead of wrapper. - -### 1c. Restructure syncback to two-pass child processing - -`**[src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs)`** `syncback_dir_no_meta()` -- Replace the current one-at-a-time `with_joined_path()` loop with: - -**Pass 1 -- Tentative names:** Iterate ALL children, call `get_best_middleware()` for each, compute tentative filesystem name (slug + extension for files, directory name for dirs). Also determine whether each instance would be file or directory (for init-style collision detection). - -**Pass 2 -- Dedup grouping:** Group children by lowercased tentative filesystem name. Within each collision group (size > 1), assign ~N suffixes. The matching algorithm's pairing (Phase 2) determines which instances preserve existing filenames and which get new suffixes. - -### 1d. Change dedup key semantics in file_names.rs - -`**[src/syncback/file_names.rs](src/syncback/file_names.rs)`** -- The current `dedup_key` is a bare slug (without extension). Change it to be the **full filesystem name component** (slug + extension for files, directory name for dirs), lowercased. - -Current dedup key for `Script "Foo"` = `"foo"` (bare slug). -New dedup key for `Script "Foo"` = `"foo.server.luau"` (full filesystem name). - -This means: - -- `Folder "Foo"` (key: `"foo"`) and `Script "Foo"` (key: `"foo.server.luau"`) do NOT collide -- correct. -- `Script "Foo" (server)` and `Script "Foo" (server)` both key: `"foo.server.luau"` -- collision, dedup applied. -- `Folder "Foo"` and init-style `Script "Foo"` both key: `"foo"` (both directories) -- collision, dedup applied. - -Update `deduplicate_name()` to accept the full filesystem name as input and apply the suffix to the stem before the compound extension: `Foo~1.server.luau`, not `Foo.server~1.luau`. - -### 1e. Suffix cleanup rules - -Implement in a shared helper (used by syncback, change_processor, and api.rs): - -- **Gap-tolerant deletion:** Deleting `~1` from `{Foo, Foo~1, Foo~2}` leaves `{Foo, Foo~2}`. No renumbering. -- **Base-name promotion:** Deleting `Foo` (base) from `{Foo, Foo~1, Foo~2}` promotes `Foo~1` to `Foo`. `Foo~2` stays. -- **Group-to-1 cleanup:** Deleting from `{Foo, Foo~1}` leaves one instance -- remove its suffix entirely (rename to clean name). - ---- - -## Phase 2: Matching Algorithm - -### 2a. Rust syncback matching (`src/syncback/matching.rs` -- new file) - -Core 3-pass algorithm operating on `WeakDom` instances (syncback context): - -``` -Input: new_children: Vec (from Roblox file WeakDom) - old_children: Vec (from filesystem WeakDom) - new_dom: &WeakDom, old_dom: &WeakDom - hashes: &HashMap (precomputed by hash_tree) -Output: MatchResult { matched: Vec<(new_ref, old_ref)>, - unmatched_new: Vec, - unmatched_old: Vec } -``` - -**Pass 1 -- Unique names (O(n)):** Build name-count maps for both sides. Any name that appears exactly once on both sides is an instant match. **Within same-Name groups, ClassName is a fast first discriminator:** if two siblings share name "Part" but one is Part and one is MeshPart, and each (Name, ClassName) pair is unique on both sides, match them in Pass 1 without needing Pass 2/3. **Fast path:** if all names are unique (or all resolved by name+class), return immediately (skip P2+P3). - -**Pass 2 -- Ref discriminators:** For remaining unmatched groups (same true Name), use pre-resolved Ref properties to differentiate. If instance A has a Ref pointing to a target already matched in P1, and only one candidate on the other side has the equivalent Ref, that's a match. Also consider incoming refs (other matched instances pointing TO a candidate). **Unmatched ref targets:** if a Ref target is itself in an unmatched ambiguous group (not resolved in Pass 1), treat it as a weaker signal -- compare target names/classes without requiring a confirmed match. Do NOT recursively match the target's group. If insufficient, the instance falls through to Pass 3. - -**Pass 3 -- Similarity scoring:** For still-unmatched groups, narrow by ClassName first, then compute pairwise similarity using precomputed blake3 subtree hashes. Greedy best-match-first assignment: pick highest similarity pair, remove both, repeat. Tiebreaker: DOM child order (index in parent's children list). - -**Ref pre-resolution (prerequisite):** Before any pass, resolve Ref properties on both sides. On the new side (Roblox file), Refs are WeakDom referents -- build a `Ref -> instance_path` map. On the old side (filesystem), Refs may be stored as `Rojo_Ref_`* attributes -- parse and resolve. - -### 2b. Integrate into syncback_dir_no_meta (dir.rs) - -In `syncback_dir_no_meta()`: - -1. Call matching algorithm to pair `new_inst.children()` with old children -2. For matched pairs: preserve existing filesystem assignment (old instance keeps its filename) -3. For unmatched new: generate new filename via dedup system (Phase 1c) -4. For unmatched old: mark for deletion - -### 2c. Forward sync matching (`src/snapshot/matching.rs` -- new file) - -Same 3-pass algorithm but operating on `InstanceSnapshot` vs `RojoTree` instances: - -``` -Input: snapshot_children: Vec - tree_children: Vec (RojoTree instance IDs) - tree: &RojoTree -Output: MatchResult { matched, unmatched_snapshot, unmatched_tree } -``` - -Key differences from syncback version: - -- **True Name resolution from filesystem:** On the filesystem side, resolving the true Instance.Name is non-trivial. Resolution chain: (1) `name` field in `.meta.json5` if present (overrides filename), (2) `name` field in `.model.json5`, (3) filename stem after stripping extensions and script suffixes (if no meta override). The matching algorithm must resolve all true Names before building groups. On the tree/plugin side, `Instance.Name` / `instance.name()` is readily available. -- **Ref pre-resolution fallback order:** Try the old RojoTree FIRST (most refs target existing instances). If the path can't be resolved in the old tree (target is a new instance), fall back to walking the snapshot tree. The snapshot is only a subtree (the re-snapshotted directory), so this fallback only works for refs within the same subtree. Refs to new instances outside the current snapshot remain unresolved and are skipped during matching (treated as nil). -- Snapshot children have `Rojo_Ref_`* as string paths in attributes -- resolve against tree (then snapshot) before matching -- Tree children have Refs as UIDs -- already resolved -- Hash infrastructure: snapshot side doesn't have precomputed hashes yet -- compute structural fingerprint on demand - -### 2d. Integrate into patch_compute.rs - -Replace the greedy name+class matching in `compute_children_patches()` with the forward sync matching algorithm. The current code: - -```6:17:src/snapshot/patch_compute.rs -// Current: greedy first-match by name+class -.find(|(instance_index, instance_child_id)| { - if paired_instances[*instance_index] { return false; } - snapshot_child.name == instance_child.name() - && snapshot_child.class_name == instance_child.class_name() -}) -``` - -Becomes: call to matching algorithm, then iterate matched pairs for recursive `compute_patch_set_internal()`, add unmatched snapshots as `PatchAdd`, add unmatched tree children as `removed_instances`. - -### 2e. Matching cache - -Add an optional cache mapping `parent_ref -> (children_list_hash, match_assignments)` to avoid re-running the full algorithm when children haven't changed. Invalidate per-parent when a child is added, removed, or renamed under that parent. During two-way sync, each `/api/write` mutation invalidates the affected parent's cache. - ---- - -## Phase 3: Ref Path System - -### 3a. Switch to filesystem-name-based paths - -`**[src/rojo_ref.rs](src/rojo_ref.rs)**` -- `ref_target_path()`: - -Current: uses `escape_ref_path_segment(&inst.name)` producing instance-name paths like `"Workspace/A\/B"`. - -New: uses the **full filesystem name** of each instance (slug + extension + dedup suffix for files; directory name + dedup suffix for dirs). Path from DataModel's children downward. - -Examples: - -- `Folder "Foo"` -> segment `"Foo"` -- `ModuleScript "Foo"` -> segment `"Foo.luau"` -- `Script "Foo"` (server) -> segment `"Foo.server.luau"` -- `Script "Foo"` with children (init-style) -> segment `"Foo"` (directory) -- Dedup'd `ModuleScript "Foo"` -> segment `"Foo~1.luau"` - -Remove `escape_ref_path_segment()`, `unescape_ref_path_segment()`, `split_ref_path()`. Path splitting becomes a simple `path.split('/')` since filesystem names can't contain `/` (slugified to `_`). - -### 3b. Filesystem-name resolution in tree.rs - -`**[src/snapshot/tree.rs](src/snapshot/tree.rs)`** -- `get_instance_by_path()`: - -Current: walks tree matching each segment against `child.name` (instance name). - -New: walks tree matching each segment against the **filesystem name** of each child. Derive from: - -1. `instigating_source` filename/dirname (for file-backed instances) -2. Fallback: compute what the filesystem name WOULD be (slugify name + middleware extension) for instances without instigating_source (e.g., inside .rbxm files, newly added) - -### 3c. Update ref_properties.rs - -`**[src/syncback/ref_properties.rs](src/syncback/ref_properties.rs)`:** - -`link_referents()` currently writes path-based (`Rojo_Ref`_*) using instance-name paths. Update to use filesystem-name paths (the dedup'd filenames assigned during syncback). - -`collect_referents()` currently uses `is_path_unique` to decide between path-based and ID-based linking. With the dedup system, ALL paths are unique (filesystem names are unique by definition). Simplify: always use path-based linking for file-backed instances. Fall back to `$id`/`Rojo_Target`_* only for instances without filesystem backing (inside .rbxm files). - -### 3d. Update patch_apply.rs - -`**[src/snapshot/patch_apply.rs](src/snapshot/patch_apply.rs)`:** - -Update the ref resolution in `finalize_patch_application()` to use the new filesystem-name-based `get_instance_by_path()`. - -### 3e. Ref path update infrastructure - -Extend `RefPathIndex` and `update_ref_paths_after_rename()` in [change_processor.rs](src/change_processor.rs) to handle all cases: - -- Instance rename -> slug change -> all refs to it and descendants update -- Dedup reassignment -> suffix change -> all refs update -- Reparenting -> entire ancestor path changes -> all refs update -- Script type transition -> extension change -> all refs through this instance update -- File-to-folder transition -> segment format change -> all refs update -- Batch writes: collect ALL affected ref updates, write each file once - ---- - -## Phase 4: Two-Way Sync Integration - -### 4a. change_processor.rs - -`**[src/change_processor.rs](src/change_processor.rs)`:** - -- **VFS echo prevention for dedup renames:** When suffix cleanup renames files (e.g., `Attachment~1` -> `Attachment`), call `suppress_path()` / `suppress_path_any()` for both old and new paths before the rename. **New instance additions must NOT be suppressed** -- the VFS watcher needs to pick up new files for forward sync. -- **Dedup suffix cleanup on deletion:** When a child deletion triggers suffix cleanup (base-name promotion or group-to-1), perform the rename and ref path updates. -- **Self-initiated rename tagging:** Tag dedup-triggered renames so `handle_vfs_event()` recognizes them as self-initiated and skips re-snapshotting. - -### 4b. api.rs - -`**[src/web/api.rs](src/web/api.rs)`:** - -- **Two-pass /api/write:** First pass: apply ALL mutations (renames, property changes, adds, removes) to the tree. Second pass: recompute all affected ref slug paths based on final tree state. This ensures refs always use newest slugs. -- **4 file format branches in `syncback_updated_properties()`:** Each branch must compute the correct dedup'd filename for the meta/model file. When an instance has a dedup suffix, the meta path includes it: `Foo~1.meta.json5`, `Foo~1/init.meta.json5`, etc. -- **Added instances in dedup groups:** `syncback_added_instance()` must check for filesystem-name collisions with existing siblings and assign appropriate ~N suffix. -- **Dual write path consistency:** File writes and PatchSet sent to ChangeProcessor must use the same dedup'd names. - ---- - -## Phase 5: Plugin Updates - -### 5a. Lua matching algorithm (plugin/src/Reconciler/matching.lua -- new file) - -`**[plugin/src/Reconciler/hydrate.lua](plugin/src/Reconciler/hydrate.lua)`:** - -Replace the current name+class greedy matching with the 3-pass algorithm: - -- **Pass 1:** Unique name matching (same as Rust) -- **Pass 2:** Ref discriminators. Server sends virtual instances with UIDs. Plugin resolves UIDs via instanceMap. If a Ref property on a virtual instance points to UID-7 (already matched in P1), and only one Studio candidate has the equivalent Ref, match. -- **Pass 3:** Structural fingerprinting with XXH32. Fingerprint = hash of (child count + sorted child name+class pairs). Do NOT hash full property values (too expensive). For actual similarity scoring, compare properties directly with early-exit ordering: ClassName -> Tags -> Attributes -> scalar properties -> Source (last, most expensive). - -`**[plugin/src/XXH32.luau](plugin/src/XXH32.luau)`** -- New file containing the XXH32 implementation from the spec (lines 239-350 of the prompt). - -**Caching:** Compute structural fingerprints LAZILY (only for instances entering Pass 3). Cache for duration of the matching call, not across calls. - -### 5b. ChangeBatcher updates - -`**[plugin/src/ChangeBatcher/init.lua](plugin/src/ChangeBatcher/init.lua)`:** Handle duplicate-named instances flowing through the batcher without skipping. - -### 5c. Confirmation dialog - -Dedup suffix renames, ref path updates, and meta file changes triggered by the matching algorithm must appear in the review UI in Always and Initial sync modes. No silent application. - ---- - -## Phase 6: Cherry-Picks from rbxm-ambiguous - -Selectively take these from the `rbxm-ambiguous` branch: - -- **Plugin relaxations** (diff.lua, encodeInstance.lua) -- already described in Phase 1b -- **Roundtrip test improvements** (`[tests/tests/syncback_roundtrip.rs](tests/tests/syncback_roundtrip.rs)`) -- Vec-based `compare_children` (handles duplicates correctly), Tags comparison in `compare_properties` -- **project.rs case-insensitive detection** -- case-insensitive name counting for duplicate detection (adapt for dedup instead of skip) -- **macOS ref_properties test ignore** -- platform-specific test attribute - -**Do NOT take:** `ambiguous_container` metadata, `find_rbxm_container`, `reserialize_rbxm_container`, rbxm fallback block, ambiguous test fixtures that output .rbxm files. - -**Non-requirement: no .rbxm transition logic.** Syncback rewrites the filesystem from scratch (clean) or matches instances to existing files (incremental) -- either way, old .rbxm containers simply don't get recreated. User-intentional .rbxm files placed manually in their project still load fine via `snapshot_rbxm` during forward sync -- that's unchanged. Do not build migration code for converting old .rbxm files. - ---- - -## Phase 7: Testing - -### Shared test vectors - -Create structured test data (JSON or Rust structs) defining: - -- Two lists of instance descriptions (name, class, properties, refs, children) -- Expected match pairing output - -Both Rust implementations and the Lua implementation must produce identical pairings for all vectors. - -### Test scenarios (minimum required from spec) - -**Dedup:** Two identical Folders, Folders with different children, Folders with identical content (tiebreaker test), Folder + Script same name (no dedup), Folder + init-style Script (dedup), natural tilde name ("Foo~1" slugifies differently), third duplicate added, suffix cleanup (group-to-1), gap tolerance, base-name promotion, idempotency, roundtrip. - -**Ref paths:** Basic ref survives syncback, ref to dedup'd instance, ref survives gap-tolerant deletion, ref survives base-name promotion, ref survives group-to-1, ref survives rename, ref survives reparent, deeply nested through dedup layers, cross-file ref update, ref to deleted instance, tilde-named instance ref, two-way sync ref update, concurrent ref+rename, forward sync manual edit, fallback to $id, mass ref stress test (50+ instances). - -**Matching:** ClassName discriminator, Ref discriminator, property similarity, matching stability, preserves existing pairings, fast path verification. - -**Dedup collision:** Folder + ModuleScript (no collision), Folder + Folder (collision), Server + Client script (no collision), Server + Server (collision), ModuleScript + ModuleScript, slug collision ("Foo?" + "Foo*"), case-insensitive collision ("Foo" + "foo"). - -**Cross-system integration:** Full roundtrip with duplicates, incremental syncback after rename, two-way sync add/delete, forward sync edit dedup'd file, slugify+dedup interaction, project file + filesystem duplicates. - -**Sync invariants:** CLI syncback parity, 4 file format branches, compound extension dedup, InstigatingSource after dedup, file-to-folder transition with dedup, script type transition in dedup group, dual write path consistency, review dialogue with dedup, atomicity, determinism, idempotency, pre-seeded dedup. - -### Test infrastructure - -- Syncback test fixtures in `[rojo-test/syncback-tests/](rojo-test/syncback-tests/)` -- Build test fixtures in `[rojo-test/build-tests/](rojo-test/build-tests/)` -- Integration tests in `[tests/tests/](tests/tests/)` -- Generate .rbxm fixtures programmatically (see `tests/generate_ambiguous_fixtures.rs` from rbxm-ambiguous branch) - ---- - -## Key Invariants to Preserve - -1. **Round-trip identity:** syncback -> build -> compare = bit-identical trees -2. **CLI syncback parity:** two-way sync produces byte-identical filesystem output to CLI syncback -3. **Determinism:** same input always produces same filesystem output (sorted child ordering, deterministic suffix assignment) -4. **INSTIGATING SOURCE consistency:** dedup'd paths reflected in InstigatingSource::Path -5. **Compound extensions:** suffix before compound extension (`Foo~1.server.luau`, not `Foo.server~1.luau`) -6. **Meta pairing:** `Foo~1.server.luau` pairs with `Foo~1.meta.json5` (strip script suffix, keep dedup suffix) - ---- - -## Key Files Changed - - -| File | Change | -| --------------------------------------------- | ------------------------------------------------------------ | -| `src/syncback/file_names.rs` | Dedup key = full FS name; suffix on stem before compound ext | -| `src/syncback/dir.rs` (snapshot_middleware) | Two-pass child processing; remove blacklist | -| `src/syncback/matching.rs` (NEW) | 3-pass matching algorithm for syncback | -| `src/snapshot/matching.rs` (NEW) | 3-pass matching algorithm for forward sync | -| `src/snapshot/patch_compute.rs` | Replace greedy matching with algorithm | -| `src/snapshot/patch_apply.rs` | Update ref resolution for FS-name paths | -| `src/snapshot/tree.rs` | `get_instance_by_path()` uses FS names | -| `src/rojo_ref.rs` | FS-name paths; remove escape/split; update `ref_target_path` | -| `src/syncback/ref_properties.rs` | FS-name-based linking; simplify path uniqueness | -| `src/change_processor.rs` | VFS echo for dedup renames; suffix cleanup | -| `src/web/api.rs` | Two-pass write; dedup in all 4 branches | -| `src/snapshot_middleware/project.rs` | Replace bail with dedup; case-insensitive | -| `plugin/src/Reconciler/hydrate.lua` | 3-pass matching algorithm (Lua) | -| `plugin/src/Reconciler/diff.lua` | Remove blacklist | -| `plugin/src/ChangeBatcher/encodeInstance.lua` | Remove blacklist | -| `plugin/src/XXH32.luau` (NEW) | Hash function for Lua-side fingerprinting | - - diff --git a/.cursor/plans/ambiguous_paths_audit_fixes_9d3ed6da.plan.md b/.cursor/plans/ambiguous_paths_audit_fixes_9d3ed6da.plan.md deleted file mode 100644 index a26e32c7..00000000 --- a/.cursor/plans/ambiguous_paths_audit_fixes_9d3ed6da.plan.md +++ /dev/null @@ -1,310 +0,0 @@ ---- -name: Ambiguous paths audit fixes -overview: "Fix 6 issues found during the ambiguous-paths branch audit: make Rust matching recursive, fix ref path format in api.rs added_paths, restructure syncback ref collection for dedup-aware paths, improve dedup cleanup grouping precision, extract shared trueEquals module, and correct a misleading comment." -todos: - - id: fix1-recursive-matching - content: "Fix 1: Make Rust matching implementations recursive (both forward sync and syncback) to match the Lua plugin behavior. Add depth limit and best_so_far pruning." - status: completed - - id: fix2-added-paths - content: "Fix 2: Replace escape_ref_path_segment with slugify_name in api.rs added_paths to fix ref path format mismatch." - status: completed - - id: fix3-dedup-refs - content: "Fix 3: Restructure syncback ref collection to use final dedup'd filesystem names instead of tentative paths. Fix misleading comment." - status: completed - - id: fix4-dedup-cleanup - content: "Fix 4: Change dedup cleanup in change_processor to match by full filesystem name (stem + extension) instead of stem only." - status: completed - - id: fix5-shared-trueequals - content: "Fix 5: Extract trueEquals to a shared Lua module to eliminate duplication between matching.lua and diff.lua." - status: completed - - id: run-tests - content: Write all required tests and run CI to verify everything passes. - status: completed -isProject: false ---- - -# Ambiguous Path Handling Audit Fixes - -> This plan was generated by `/audit` from a Plan-mode session. -> Refer to `.cursor/rules/atlas.mdc` for full project standards. - -## Standards - -These standards govern every fix in this plan. An implementer MUST read `.cursor/rules/atlas.mdc` before starting. - -### Round-Trip Identity (from `atlas.mdc`) - -Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -### CLI Syncback Parity (from `atlas.mdc`) - -Plugin-based sync must produce **exactly the same filesystem output** as `atlas syncback`. Any divergence is a bug until proven otherwise. - -### Code Quality (from `atlas.mdc`) - -DRY code that is easy to reason about and hard to get wrong. The same slugify/dedup/meta-update pattern should not be copy-pasted across files. Small refactors (2-3 call sites) are included as fixes. Major rewrites (10+ call sites) are deferred. - -## Context - -Auditing all changes on `ambiguous-paths` branch (10 commits, 41 files, +4275/-1020 lines) against `origin/master`. The feature replaces the duplicate-skip blacklist with a matching algorithm (3 implementations), filesystem-collision-based dedup, filesystem-name-based ref paths, dedup suffix cleanup, and plugin updates. - -The audit traced round-trip identity through all sync paths and found 3 critical issues, 3 correctness concerns, and 2 code quality items. - ---- - -## Fixes - -Each fix below was approved by the user during the audit quiz. Implement them in order. Each fix includes its test requirements -- a fix is not complete until its tests pass. - -### Fix 1: Make Rust matching implementations recursive - -- **Status:** Approved -- **Finding:** C1/CC3 -- Rust matching is flat (non-recursive) while Lua is recursive, causing pairing divergence -- **Files:** - - [src/snapshot/matching.rs](src/snapshot/matching.rs) -- forward sync matching - - [src/syncback/matching.rs](src/syncback/matching.rs) -- syncback matching -- **Problem:** Both Rust `count_own_diffs` functions only compare top-level properties and add +1 for children count difference. They do NOT recursively score subtrees. The `UNMATCHED_PENALTY` constant (10,000) is defined but never used. For ambiguous groups where instances have identical top-level properties but different children, Rust scores them identically (0 cost), falling back to child order. The Lua implementation correctly recurses into subtrees and applies `UNMATCHED_PENALTY` for unmatched children. -- **Solution:** -**For `src/snapshot/matching.rs` (forward sync):** - 1. Rename `count_own_diffs` to `count_own_diffs_only` (internal helper). - 2. Create new `compute_change_count(snap: &InstanceSnapshot, inst: &InstanceWithMeta, tree: &RojoTree, best_so_far: u32) -> u32`: - - Call `count_own_diffs_only` for the flat property cost. - - If cost >= best_so_far, early return. - - Recursively call `match_forward_internal` on children (a new variant that returns matched pairs + unmatched counts without consuming snapshots -- use `&[InstanceSnapshot]` and `&[Ref]` refs). - - For each matched pair, recursively call `compute_change_count`. If cost >= best_so_far, early return. - - Add `UNMATCHED_PENALTY * unmatched_count` to cost. - 3. In the ambiguous group scoring loop, replace `count_own_diffs(snap, &inst)` with `compute_change_count(snap, &inst, tree, best_so_far)`. - 4. The `match_forward` function needs a variant that doesn't consume snapshots (borrows instead). Create `match_forward_scoring(snap_children: &[InstanceSnapshot], tree_children: &[Ref], tree: &RojoTree) -> ScoringResult` that returns `(matched_count, unmatched_snap_count, unmatched_tree_count, Vec<(usize, usize)>)` -- index pairs for recursive scoring. - 5. **Depth limit:** Add a `depth: u32` parameter to `compute_change_count`. At depth > 3 (or configurable), fall back to flat comparison to prevent O(n^k) explosion on deeply nested identical trees. - **For `src/syncback/matching.rs` (syncback):** - Same transformation: create `compute_change_count` that recursively matches children and scores subtrees. The hash fast-path remains: if new_hash == old_hash, return 0 immediately (skips recursion). When hashes differ, recurse into children. - **Key constraint:** The recursive scoring functions must NOT allocate heavily in the inner loops. Use stack-based recursion with early exit on `best_so_far`. The hash fast-path in syncback makes this efficient -- most subtrees are identical and short-circuit at depth 0. -- **Risk:** Medium. Recursive matching is more expensive than flat matching. The `best_so_far` pruning and depth limit mitigate this. Hash fast-path in syncback means most comparisons never recurse. Forward sync doesn't have hashes but the (Name, ClassName) grouping limits the cross-product size. -- **Verify round-trip:** Create 10 same-named Parts with different subtrees, syncback them, rebuild. The pairings should be stable across syncback + forward sync. -- **Verify syncback parity:** N/A (matching algorithm is internal, output is the same files) -- **Tests required:** - - Rust unit test in `src/snapshot/matching.rs`: 10 Parts named "Line" with different Transparency values, reversed order in tree. Verify each pair has matching Transparency (proves recursive scoring produces correct pairing). - - Rust unit test in `src/syncback/matching.rs`: Same test with WeakDom instances. - - Rust unit test: Identical instances (all properties same, same children) -- verify greedy falls back to child order (stable). - - Rust unit test: Depth limit test -- deeply nested tree (depth > 5) completes in reasonable time. - -### Fix 2: Replace `escape_ref_path_segment` with filesystem-compatible names in `added_paths` - -- **Status:** Approved -- **Finding:** C2 -- `added_paths` mixes filesystem-name parent path with escape-encoded child name -- **Files:** - - [src/web/api.rs](src/web/api.rs) lines 685-686 -- **Problem:** `crate::escape_ref_path_segment(&added.name)` produces escaped instance names (e.g., `"Hey\/Bro"`) but `get_instance_by_path` splits on `/` without unescaping. An instance named `"Hey/Bro"` gets path segment `"Hey\/Bro"` which splits into `["Hey\", "Bro"]`, failing resolution. Should use the same filesystem name format as `ref_target_path_from_tree`. -- **Solution:** Replace lines 685-686 with: - -```rust - // Use slugified name (matching filesystem conventions) instead of - // escape_ref_path_segment (which uses legacy \/ escaping). - let fs_name = if crate::syncback::name_needs_slugify(&added.name) { - crate::syncback::slugify_name(&added.name) - } else { - added.name.clone() - }; - let path = if parent_path.is_empty() { - fs_name - } else { - format!("{}/{}", parent_path, fs_name) - }; - - -``` - - Note: This doesn't include the file extension (e.g., `.server.luau`) because added instances don't have middleware info at this point. The `get_instance_by_path` fallback uses case-insensitive instance name matching, which will handle the resolution. For a more complete fix, compute the tentative extension based on `added.class_name` and `added.children.is_empty()`, similar to `tentative_fs_name` in `ref_properties.rs`. - -- **Risk:** Low. Only affects ref properties referencing just-added instances with `/` or `\` in their names. -- **Verify round-trip:** Add an instance named `"Hey/Bro"` via two-way sync, then verify a ref property pointing to it resolves correctly after a server restart. -- **Verify syncback parity:** N/A (two-way sync only, CLI syncback doesn't use added_paths) -- **Tests required:** - - Rust integration test in `tests/tests/two_way_sync.rs`: Send a `/api/write` with an added instance named `"A/B"` and an update that references it via Ref. Verify the Ref resolves to the correct tree instance after patch application. - -### Fix 3: Restructure syncback ref collection for dedup-aware paths - -- **Status:** Approved -- **Finding:** C3 -- `tentative_fs_path` doesn't include dedup suffixes, producing ambiguous paths for duplicate-named instances -- **Files:** - - [src/syncback/ref_properties.rs](src/syncback/ref_properties.rs) -- `tentative_fs_path`, `collect_referents`, comment - - [src/syncback/mod.rs](src/syncback/mod.rs) -- `syncback_loop` orchestration - - [src/syncback/file_names.rs](src/syncback/file_names.rs) -- `name_for_inst` (produces dedup'd names) - - [src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs) -- `syncback_dir_no_meta` (calls `name_for_inst`) -- **Problem:** `collect_referents()` calls `tentative_fs_path()` which computes paths BEFORE dedup suffix assignment. Two instances with the same name/class get identical paths (e.g., both `"Workspace/Data"`). The `Rojo_Ref`_* attribute stores an ambiguous path that resolves to the first matching child, potentially the wrong one. -The comment at line ~147 says "ALL filesystem paths are unique" which is misleading -- tentative paths aren't unique for duplicate-named instances. -- **Solution:** -**Phase 1: Correct the comment (immediate)** -Replace the misleading comment in `collect_referents` with: - -```rust - // NOTE: tentative_fs_path() does not include dedup suffixes (~N). - // For instances with duplicate names under the same parent, this - // produces ambiguous paths. Resolution via get_instance_by_path() - // returns the first matching child, which may be wrong. - // - // To fully fix this, collect_referents must run AFTER dedup suffix - // assignment, with access to the final filesystem names. See Phase 2. - - -``` - - **Phase 2: Pass dedup assignments to ref collection** - -1. In `syncback_loop()` (`src/syncback/mod.rs`), after the recursive `syncback_dir_no_meta` / middleware dispatch completes (which assigns filenames via `name_for_inst`), build a `HashMap` mapping each instance's Ref to its FINAL dedup'd filesystem path. -2. Pass this map to `collect_referents()` as a new parameter `final_paths: &HashMap`. In `collect_referents`, when building the target path, look up the target Ref in `final_paths` first. If found, use that path. If not found (external ref, pruned instance), fall back to `tentative_fs_path`. -3. The `final_paths` map is built bottom-up during the syncback walk. Each middleware's `syncback()` call returns a `SyncbackReturn` which contains the `fs_snapshot` with file paths. Extract the Ref→path mapping from the `SyncbackSnapshot` path + the child assignments. - **Implementation detail:** The simplest approach is to add a `ref_path_map: &mut HashMap` parameter to `SyncbackSnapshot::with_joined_path` and record the mapping there. Each time a child gets a filesystem name assigned, record `(child_ref, parent_path + "/" + filename)` in the map. - -- **Risk:** Medium. Changes the syncback flow to thread a map through the recursive walk. Must be careful not to break incremental mode. The `final_paths` map is only populated during syncback, so forward sync is unaffected. -- **Verify round-trip:** Create two Folders named "Data" under Workspace, add a Script with PrimaryPart pointing to the second "Data". Syncback, rebuild, verify PrimaryPart points to the correct "Data" (the one with dedup suffix `~1`). -- **Verify syncback parity:** The CLI syncback output must include the correct `Rojo_Ref_`* attribute with the dedup'd path (e.g., `"Workspace/Data~1"`). Two-way sync should produce the same path. -- **Tests required:** - - Rust integration test in `tests/tests/syncback_roundtrip.rs`: Two same-named Folders with a ref property pointing to the second one. Verify the `Rojo_Ref_`* attribute contains the dedup'd path (e.g., `"Workspace/Data~1"`). - - Rust unit test: `collect_referents` with `final_paths` containing dedup'd paths. Verify the output uses dedup'd paths instead of tentative paths. - -### Fix 4: Dedup cleanup should match by full filesystem name, not stem alone - -- **Status:** Approved -- **Finding:** CC1 -- Change processor groups dedup siblings by stem only, ignoring extension -- **Files:** - - [src/change_processor.rs](src/change_processor.rs) lines 1098-1125 -- **Problem:** The dedup cleanup code extracts the stem by splitting on `'.'` and groups siblings by base stem. `Foo.server.luau` (stem `Foo`) and `Foo.luau` (stem `Foo`) are grouped together even though they have different dedup keys (`foo.server.luau` vs `foo.luau`) and are NOT in the same dedup group. This inflates `remaining_stems.len()` and can change the cleanup action. -- **Solution:** When finding siblings in the dedup group, also compare extensions. Extract the extension from the removed instance's filesystem name, and only include siblings whose extension matches. Specifically: - -```rust - // Extract the compound extension (everything after the stem) - let removed_extension = removed_fs_name - .find('.') - .map(|i| &removed_fs_name[i + 1..]); - - for &sibling_ref in parent_inst.children() { - if sibling_ref == removed_id { continue; } - let sibling_fs = tree.filesystem_name_for(sibling_ref); - let sibling_stem = sibling_fs.split('.').next().unwrap_or(&sibling_fs); - let sibling_ext = sibling_fs.find('.').map(|i| &sibling_fs[i + 1..]); - - // Only group siblings with the same extension - if sibling_ext != removed_extension { continue; } - - let sibling_base = match parse_dedup_suffix(sibling_stem) { - Some((b, _)) => b, - None => sibling_stem, - }; - if sibling_base.eq_ignore_ascii_case(&base_stem) { - remaining_stems.push(sibling_stem.to_string()); - } - } - - -``` - -- **Risk:** Very low. Makes grouping more precise, no behavior change for the common case (all siblings in a dedup group have the same extension by definition). -- **Verify round-trip:** Create siblings `Foo.server.luau` (Script) and `Foo.luau` (ModuleScript) and `Foo~1.server.luau` (Script). Delete `Foo.server.luau` via two-way sync. Verify `Foo~1.server.luau` is renamed to `Foo.server.luau` and `Foo.luau` is untouched. -- **Verify syncback parity:** N/A (dedup cleanup is a two-way sync operation) -- **Tests required:** - - Rust unit test in `src/syncback/dedup_suffix.rs`: Verify `compute_cleanup_action` with mixed-extension input (though this tests the helper, the real fix is in change_processor). - - Rust integration test or manual verification: Mixed-extension siblings deletion scenario as described above. - -### Fix 5: Extract `trueEquals` to a shared module - -- **Status:** Approved -- **Finding:** CC2 -- `trueEquals` (and `fuzzyEq`) duplicated between `matching.lua` and `diff.lua` -- **Files:** - - New: [plugin/src/Reconciler/trueEquals.lua](plugin/src/Reconciler/trueEquals.lua) - - [plugin/src/Reconciler/matching.lua](plugin/src/Reconciler/matching.lua) -- remove local copy, require shared - - [plugin/src/Reconciler/diff.lua](plugin/src/Reconciler/diff.lua) -- remove local copy, require shared -- **Problem:** `trueEquals` is copy-pasted between two files. If either is updated without the other, matching and diff will disagree on value equality, causing phantom changes (matching says "equal" but diff says "different"). -- **Solution:** - 1. Create `plugin/src/Reconciler/trueEquals.lua` containing `fuzzyEq` and `trueEquals`. Export `trueEquals` as the module return value. - 2. In `matching.lua`, remove the local `fuzzyEq` and `trueEquals` definitions (lines 27-111). Add `local trueEquals = require(script.Parent.trueEquals)`. - 3. In `diff.lua`, remove the local `fuzzyEq` and `trueEquals` definitions (lines 19-115). Add `local trueEquals = require(script.Parent.trueEquals)`. -- **Risk:** Very low. Pure refactor, no behavior change. -- **Verify round-trip:** Existing tests cover both callers. -- **Verify syncback parity:** N/A (plugin-only change) -- **Tests required:** - - Existing diff.spec.lua and diff.stress.spec.lua tests verify equality behavior. No new tests needed. - ---- - -## Skipped Fixes - -### Skipped: Remove unused `UNMATCHED_PENALTY` from Rust matching files - -- **Finding:** Q1 -- dead constant in both Rust matching files -- **Problem:** `UNMATCHED_PENALTY` defined but never used -- **Reason skipped:** Fix 1 (recursive matching) will start using this constant, making removal unnecessary. - ---- - -## Accepted Limitations - -None -- all limitations flagged were approved for fixing. - ---- - -## Deferred Refactors - -- **Matching cache (Phase 2e from original plan):** Add optional cache mapping `parent_ref -> (children_list_hash, match_assignments)` to avoid re-running the full algorithm when children haven't changed. Not needed for correctness, optimization only. -- **Duplicated name-to-index grouping pattern:** All three matching implementations repeat the same "build HashMap of name to indices" pattern. Could be factored into a shared helper, but the three implementations operate on different types (InstanceSnapshot, WeakDom, Lua tables) making a shared abstraction non-trivial. Flagged for consideration after the matching implementations stabilize. - ---- - -## Test Plan - -Tests are not optional. Every approved fix must have test coverage. A fix is not complete until its tests pass (or intentionally fail, for known limitations). - -### Rust Unit Tests (`#[cfg(test)]` blocks) - -- **10 same-named Parts with different properties, reversed order:** Verify recursive matching pairs correctly by property content, not position. (Fix 1) -- **Identical instances (all same):** Verify stable child-order tiebreaker. (Fix 1) -- **Depth limit test:** Deeply nested tree (depth > 5) completes without hanging. (Fix 1) -- `**collect_referents` with `final_paths`:** Verify dedup'd paths used instead of tentative. (Fix 3) - -### Rust Integration Tests (`tests/tests/`) - -- **Two-way sync with added instance named `"A/B"`:** Verify ref resolution works with slugified names. (Fix 2) -- **Syncback roundtrip with duplicate-named Folders + ref:** Verify `Rojo_Ref`_* contains dedup'd path. (Fix 3) - -### Lua Spec Tests (`.spec.lua` files) - -- Existing diff.spec.lua and diff.stress.spec.lua cover `trueEquals` behavior. (Fix 5) - -### Snapshot Tests (`insta` crate) - -- Existing snapshot tests should be re-verified after recursive matching change. Run `cargo insta review` after Fix 1. (Fix 1) - ---- - -## Test Rules - -The implementer MUST follow these rules when writing tests for this plan: - -### For bugs found and fixed - -Every bug fix MUST have a test that: - -1. Would have **FAILED** before the fix -2. **PASSES** after the fix -3. Prevents the bug from regressing - -### For missing coverage identified - -For each "missing test coverage" gap: - -1. Write the test -2. Verify it passes against the current implementation -3. If it fails, investigate -- it may have found another bug - -### Scope: test every affected layer - -For each finding, determine which test layers are affected and write tests in ALL of them: - -- Does the bug manifest at the plugin level? -> Lua spec test -- Does it manifest at the server level? -> Rust unit test or integration test -- Does it affect the round-trip? -> Integration test with filesystem verification -- Could it regress from a different code path? -> Test that code path too - -## Final Step: Run CI - -After ALL fixes and tests are implemented, run the `/ci` command (see `.cursor/commands/ci.md`) to execute the full CI pipeline. Every fix must pass CI before the plan is considered complete. Do not skip this step. \ No newline at end of file diff --git a/.cursor/plans/atlas_daemon_python_bot_be6b0651.plan.md b/.cursor/plans/atlas_daemon_python_bot_be6b0651.plan.md deleted file mode 100644 index 90252ba0..00000000 --- a/.cursor/plans/atlas_daemon_python_bot_be6b0651.plan.md +++ /dev/null @@ -1,646 +0,0 @@ ---- -name: Atlas Daemon Python Bot -overview: Add --opencloud flag to atlas CLI for API-key-based Roblox access, then build a Python Discord bot daemon that uses atlas commands to periodically syncback games, review diffs with Anthropic Claude, and post Cursor-style issue reports. -todos: - - id: rust-opencloud - content: Add --opencloud global flag to atlas CLI, create src/roblox_api.rs shared auth module, update download_place() in syncback.rs to support API key via OpenCloud Asset Delivery API. - status: completed - - id: rust-clone-opencloud - content: Update clone.rs to pass --opencloud through to syncback and fetch_experience_name(). - status: completed - - id: rust-studio-upload-opencloud - content: Update studio.rs get_universe_id() and upload.rs to accept --opencloud as fallback for API key auth. - status: completed - - id: scaffold - content: Scaffold tools/atlas-daemon/ with pyproject.toml, package structure, and __main__.py CLI entry point. - status: completed - - id: config-db - content: Implement config.py (env loading) and db.py (SQLite schema with allowed_servers table, migrations, CRUD for games/issues/admins/servers). - status: completed - - id: security - content: "Implement security.py: Fernet encryption for API keys, admin permission checks, server whitelist enforcement." - status: completed - - id: atlas-cli - content: "Implement atlas_cli.py: async subprocess wrappers for atlas clone --opencloud, atlas syncback --opencloud --download, git diff, git commit." - status: completed - - id: review-engine - content: "Implement review.py + review_prompt.txt: Anthropic Claude API call with Luau-focused code review prompt, JSON output parsing, diff chunking for large diffs." - status: completed - - id: discord-fmt - content: "Implement discord_fmt.py: format issues as Discord embeds with severity colors, code blocks, buttons, error reporting embeds." - status: completed - - id: bot-commands - content: "Implement bot.py + commands/: discord.py bot with all slash commands, button interaction handlers, and /approve-server admin command." - status: completed - - id: daemon-loop - content: "Implement daemon.py: per-game asyncio task loop (syncback --download --opencloud -> git diff -> review -> post), with first-sync skip, issue dedup, and error reporting." - status: completed - - id: main-entry - content: "Wire everything together in __main__.py: parse args, init DB, start bot + daemon loops concurrently." - status: completed -isProject: false ---- - -# Atlas Daemon - Automated Roblox Code Review Bot - -Two-phase implementation: (1) add `--opencloud` support to the atlas Rust binary, then (2) build the Python Discord bot daemon that uses those commands. - ---- - -## Phase 1: Rust -- Add `--opencloud` to Atlas CLI - -### Inventory of Roblox API Calls - - -| File | Function | URL | Current Auth | Needs `--opencloud` | -| ---------------------------------- | ------------------------- | ---------------------------------------------------- | --------------------- | ---------------------------------------------------------- | -| [syncback.rs](src/cli/syncback.rs) | `download_place()` | `assetdelivery.roblox.com/v1/asset/?id=` | Cookie (required) | YES -- use Asset Delivery API | -| [clone.rs](src/cli/clone.rs) | `fetch_experience_name()` | `apis.roblox.com/universes/v1/places/{}/universe` | Cookie (optional) | YES -- same endpoint, add API key header | -| [clone.rs](src/cli/clone.rs) | `fetch_experience_name()` | `games.roblox.com/v1/games?universeIds=` | Cookie (optional) | BEST-EFFORT -- may not support API key, graceful fallback | -| [upload.rs](src/cli/upload.rs) | `do_upload_legacy()` | `data.roblox.com/Data/Upload.ashx` | Cookie | NO -- legacy path, keep as-is | -| [upload.rs](src/cli/upload.rs) | `do_upload_asset()` | `apis.roblox.com/assets/v1/assets/{}` | API key (`--api_key`) | ALIGN -- fall back to `--opencloud` if `--api_key` not set | -| [upload.rs](src/cli/upload.rs) | `do_upload_place()` | `apis.roblox.com/universes/v1/{}/places/{}/versions` | API key (`--api_key`) | ALIGN -- same fallback | -| [studio.rs](src/cli/studio.rs) | `get_universe_id()` | `apis.roblox.com/universes/v1/places/{}/universe` | Cookie (optional) | YES -- add API key header | - - -### 1. Global `--opencloud` Flag - -Add to `GlobalOptions` in [src/cli/mod.rs](src/cli/mod.rs): - -```rust -#[clap(long, env = "ATLAS_OPENCLOUD_KEY", global(true), hide = true)] -pub opencloud: Option, -``` - -Hidden from help (power-user / daemon feature), also readable via `ATLAS_OPENCLOUD_KEY` env var. - -### 2. Shared Auth Module: `src/roblox_api.rs` - -New module consolidating all Roblox HTTP auth logic: - -```rust -pub enum RobloxAuth { - Cookie(String), - ApiKey(String), -} - -/// Resolve auth: prefer --opencloud API key, fall back to system cookie. -pub fn resolve_auth(opencloud_key: Option<&str>) -> anyhow::Result; - -/// Download a place file. Uses OpenCloud Asset Delivery API with API key, -/// or legacy assetdelivery.roblox.com with cookie. -pub fn download_place(place_id: u64, auth: &RobloxAuth) -> anyhow::Result; - -/// Resolve place_id -> universe_id. Works with both auth methods. -pub fn get_universe_id(place_id: u64, auth: &RobloxAuth) -> anyhow::Result>; - -/// Resolve place_id -> experience name. Best-effort with API key -/// (games.roblox.com may not support it), always works with cookie. -pub fn fetch_experience_name(place_id: u64, auth: &RobloxAuth) -> anyhow::Result>; -``` - -**OpenCloud download path** (when `RobloxAuth::ApiKey`): - -``` -GET https://apis.roblox.com/asset-delivery-api/v1/assetId/{place_id} -Header: x-api-key: -Scope required: legacy-asset:manage -Response: JSON { "location": "" } --> GET -> raw rbxl bytes -``` - -**Cookie download path** (when `RobloxAuth::Cookie`): existing logic from `syncback.rs:download_place()`, moved into this module. - -### 3. Per-Command Changes - -**[syncback.rs](src/cli/syncback.rs)**: Replace inline `download_place()` with call to `roblox_api::download_place()`. Pass `global.opencloud` through. - -**[clone.rs](src/cli/clone.rs)**: Replace inline `fetch_experience_name()` with `roblox_api::fetch_experience_name()`. Pass `global.opencloud` through. Clone constructs a `SyncbackCommand` internally -- the global `--opencloud` flag propagates through to syncback's `download_place()` automatically. Result: `atlas --opencloud KEY clone PLACEID --path DIR` works end-to-end with no cookie needed. - -**[studio.rs](src/cli/studio.rs)**: Replace inline `get_universe_id()` with `roblox_api::get_universe_id()`. Pass `global.opencloud` through. - -**[upload.rs](src/cli/upload.rs)**: If `--api_key` is not set but `--opencloud` is, use `--opencloud` as the API key for Open Cloud upload paths. Legacy upload still requires cookie. - ---- - -## Phase 2: Python Discord Bot Daemon - -### Architecture - -Python project at `tools/atlas-daemon/` that orchestrates the `atlas` binary via subprocess. Now that atlas supports `--opencloud`, the daemon simply passes the user's API key as a CLI flag -- no need for Python to download rbxl files directly. - -```mermaid -flowchart TB - subgraph daemon ["atlas-daemon (Python)"] - Bot["discord.py Bot"] - Scheduler["asyncio Task Scheduler"] - AtlasCLI["atlas CLI (subprocess)"] - GitDiff["git diff (subprocess)"] - Reviewer["Claude Review (anthropic SDK)"] - DB["SQLite (stdlib)"] - end - - Scheduler -->|"every ~5 min per game"| AtlasCLI - AtlasCLI -->|"atlas syncback --opencloud KEY --download PLACEID"| GitDiff - GitDiff -->|"unified diff"| Reviewer - Reviewer -->|"issues JSON"| Bot - Bot -->|"embeds + code blocks"| Discord - Bot -->|"slash commands"| DB - Discord["Discord Channels"] -``` - - - -### Project Structure - -``` -tools/atlas-daemon/ - pyproject.toml - atlas_daemon/ - __init__.py - __main__.py -- CLI entry point (click) - bot.py -- discord.py bot, event handler, slash command tree - commands/ - __init__.py - approve_server.py -- /approve-server [server_id] (global admin only) - revoke_server.py -- /revoke-server (global admin only) - add_game.py -- /add-game [#channel] - remove_game.py -- /remove-game - reset_game.py -- /reset-game - set_api_key.py -- /set-api-key (ephemeral) - status.py -- /status - list_games.py -- /list-games - daemon.py -- Per-game sync loop (asyncio.create_task per game) - review.py -- Anthropic Claude code review + prompt - db.py -- SQLite schema, migrations, CRUD - discord_fmt.py -- Format issues + errors as Discord embeds - security.py -- API key encryption (Fernet), permission checks, server whitelist - config.py -- Env var loading, dataclass config - atlas_cli.py -- Subprocess wrappers for atlas commands - review_prompt.txt -- The code review system prompt -``` - -Note: `download.py` is no longer needed -- atlas handles download natively with `--opencloud`. - -### Dependencies - -```toml -[project] -name = "atlas-daemon" -requires-python = ">=3.11" -dependencies = [ - "discord.py>=2.4", - "anthropic>=0.40", - "cryptography>=43", - "click>=8.1", -] -``` - -`httpx` removed -- no longer downloading in Python. - -### Core Flows - -#### 1. Atlas CLI Wrappers (`atlas_cli.py`) - -```python -async def atlas_clone(place_id: int, path: Path, opencloud_key: str) -> None: - """Initialize a new game project via atlas clone.""" - cmd = [ - config.atlas_binary, "--opencloud", opencloud_key, - "clone", str(place_id), - "--path", str(path), - "--skip-git", - ] - proc = await asyncio.create_subprocess_exec( - *cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE - ) - stdout, stderr = await proc.communicate() - if proc.returncode != 0: - raise RuntimeError(f"atlas clone failed: {stderr.decode()}") - -async def atlas_syncback(working_dir: Path, place_id: int, opencloud_key: str) -> str: - """Download + syncback in one command.""" - cmd = [ - config.atlas_binary, "--opencloud", opencloud_key, - "syncback", - "--download", str(place_id), - "--working-dir", str(working_dir), - "--incremental", - "--list", - ] - proc = await asyncio.create_subprocess_exec( - *cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE - ) - stdout, stderr = await proc.communicate() - if proc.returncode != 0: - raise RuntimeError(f"atlas syncback failed: {stderr.decode()}") - return stdout.decode() -``` - -#### 2. Initial Game Setup (on `/add-game`) - -Uses `atlas clone --opencloud` directly -- it handles everything: fetching the game name, creating the project, downloading the rbxl, and running syncback. - -```python -async def init_game(place_id: int, server_id: str, opencloud_key: str) -> Path: - game_dir = config.data_dir / server_id / str(place_id) - - # atlas clone handles: fetch name, create project, download rbxl, syncback - await run( - config.atlas_binary, "--opencloud", opencloud_key, - "clone", str(place_id), - "--path", str(game_dir), - "--skip-git", # we manage git ourselves - ) - - # Init git and commit baseline (no review on first sync) - await run("git", "init", cwd=game_dir) - await run("git", "add", ".", cwd=game_dir) - await run("git", "commit", "-m", "Initial sync", cwd=game_dir) - - return game_dir -``` - -First sync is committed without review (everything is new, reviewing the entire codebase would be noise). - -#### 3. Periodic Sync Loop (`daemon.py`) - -```python -async def sync_loop(game: Game, bot: discord.Client): - while True: - try: - api_key = decrypt_api_key(game.api_key_encrypted) - - # Download + syncback via atlas CLI - output = await atlas_syncback(game.working_dir, game.place_id, api_key) - - # Check for changes - diff = await git_diff(game.working_dir) - if diff: - # Filter to script changes only, chunk if too large - script_diff = filter_script_changes(diff) - if script_diff: - issues = await review_diff(script_diff, game) - new_issues = dedup_issues(issues, game.id) # skip already-reported - if new_issues: - await post_issues(bot, game, new_issues) - - await git_commit(game.working_dir, f"Sync {datetime.utcnow().isoformat()}") - update_last_sync(game.id) - - except Exception as e: - await report_error_to_discord(bot, game, e) - update_last_error(game.id, str(e)) - - await asyncio.sleep(config.sync_interval) -``` - -#### 4. AI Code Review (`review.py`) - -Modeled after Cursor's BugBot architecture (from their [blog](https://cursor.com/blog/building-bugbot)): - -- BugBot runs **multiple parallel passes** with randomized diff order and uses **majority voting** to surface high-confidence issues -- It feeds prior review comments as context to avoid duplicates -- It uses a validator to filter false positives - -We implement a simplified version of this pipeline. - -**Step 1: Filter the diff to reviewable content** - -Strip non-script changes before sending to Claude. The daemon only reviews Luau code -- binary models, meta files, and project files are noise. - -```python -REVIEWABLE_EXTENSIONS = {".luau", ".lua"} - -def filter_script_changes(raw_diff: str) -> str: - """Parse unified diff, keep only hunks for script files.""" - filtered_hunks = [] - for file_diff in split_diff_by_file(raw_diff): - path = extract_file_path(file_diff) - if any(path.endswith(ext) for ext in REVIEWABLE_EXTENSIONS): - filtered_hunks.append(file_diff) - return "\n".join(filtered_hunks) -``` - -**Step 2: Send to Claude (full diff, no chunking unless truly massive)** - -Claude Sonnet has a 200k token context window. A typical 5-minute diff for a game is well under this. Only chunk if the filtered diff exceeds ~150k tokens (rare -- would require hundreds of scripts changing simultaneously). - -```python -client = anthropic.AsyncAnthropic(api_key=config.anthropic_key) - -async def review_diff(diff: str, game: Game) -> list[Issue]: - script_diff = filter_script_changes(diff) - if not script_diff: - return [] - - # Build dedup context (see section 5) - existing = db.get_unresolved_issues(game.id) - existing_context = format_existing_issues(existing) - - token_estimate = len(script_diff) // 4 - if token_estimate > 150_000: - return await _review_chunked(script_diff, existing_context) - - response = await client.messages.create( - model="claude-sonnet-4-20250514", - max_tokens=4096, - system=load_system_prompt(), - messages=[{"role": "user", "content": f"{existing_context}\n\nReview this diff:\n\n{script_diff}"}], - ) - issues = parse_issues(response.content[0].text) - return final_dedup(issues, game.id) -``` - -**Step 3: For oversized diffs, chunk by file and review in parallel** - -```python -async def _review_chunked(diff: str, existing_context: str) -> list[Issue]: - file_diffs = split_diff_by_file(diff) - tasks = [ - _review_single_file(fd, existing_context) - for fd in file_diffs - ] - results = await asyncio.gather(*tasks) - return [issue for file_issues in results for issue in file_issues] -``` - -**The system prompt** (`review_prompt.txt`) instructs Claude to: - -1. Analyze the unified diff line-by-line, focusing ONLY on added/changed lines (lines starting with `+`) -2. Flag issues in these categories: logic bugs, security vulnerabilities, performance problems, Roblox/Luau anti-patterns, race conditions from yielding -3. Output a JSON array: `[{"file": "path", "line_start": N, "line_end": N, "severity": "Low|Medium|High|Critical", "title": "short title", "explanation": "why this is a problem and what could go wrong", "suggestion": "corrected code snippet"}]` -4. Severity guide: - - **Critical**: Will crash, corrupt data, or create security holes (infinite loop, data loss, remote code execution) - - **High**: Likely to cause incorrect behavior (off-by-one, wrong event connection, race condition) - - **Medium**: Could cause issues under certain conditions (missing nil check, unbounded table growth) - - **Low**: Minor improvement opportunity (deprecated API usage, suboptimal pattern) -5. Luau-specific checks: 1-indexed arrays, `wait()` instead of `task.wait()`, `getfenv`/`setfenv`, 0-based loops, missing `task.cancel()`, unbounded `table.insert` without cleanup, yielding in `RenderStepped`/`Heartbeat`, `Instance.new` with parent as second arg (deprecated) -6. Do NOT flag: style preferences, formatting, naming conventions, missing comments, TODO items -7. If no issues found, return an empty array `[]` -8. Skip any issues already listed in the "existing unresolved issues" context - -#### 5. Issue Deduplication - -Claude will flag the same bug every sync cycle until it's fixed. We solve this at two layers. - -**Layer 1: Prompt context (primary)** - -Feed Claude the list of unresolved issues so it skips them. This mirrors how Cursor's BugBot "reads GitHub PR comments (top-level and inline) to avoid duplicate suggestions and build on prior feedback." - -```python -def format_existing_issues(existing: list[DBIssue]) -> str: - if not existing: - return "" - lines = ["Already-reported unresolved issues (do NOT re-report these):"] - for e in existing: - lines.append(f"- [{e.severity}] {e.file_path}:{e.line_start} -- {e.title}") - return "\n".join(lines) -``` - -This context is prepended to the user message in every review call (see section 4). - -**Layer 2: Hard dedup in Python (safety net)** - -If Claude re-reports despite the context, catch exact matches before posting: - -```python -def final_dedup(new_issues: list[Issue], game_id: int) -> list[Issue]: - existing = db.get_unresolved_issues(game_id) - existing_keys = {(e.file_path, e.title) for e in existing} - return [i for i in new_issues if (i.file, i.title) not in existing_keys] -``` - -**Layer 3: Auto-resolution** - -When a file with unresolved issues is modified in a subsequent diff, auto-resolve those issues: - -```python -def auto_resolve_changed_files(diff: str, game_id: int) -> list[int]: - """Mark issues as auto-resolved if their file was modified.""" - changed_files = extract_changed_file_paths(diff) - resolved_ids = [] - for issue in db.get_unresolved_issues(game_id): - if issue.file_path in changed_files: - db.resolve_issue(issue.id, resolved_by="auto", reason="file modified") - resolved_ids.append(issue.id) - return resolved_ids -``` - -Auto-resolved issues get their Discord embed updated with a "Resolved -- code was modified" footer. This runs *before* the Claude review, so the auto-resolved issues don't appear in the dedup context (they might have been fixed, so Claude should re-check the new version). - -#### 6. Discord Output Format - -Each issue posted as a rich embed with buttons: - -``` -[Critical] Potential infinite loop in PlayerManager.server.luau -Line 47-52 - - for i = 0, #players do -- BUG: 0-indexed loop - local player = players[i] - if player then - processPlayer(player) - end - end - -Explanation: Luau arrays are 1-indexed. This loop starts at 0, -missing the last element. Use `for i = 1, #players do`. - -Suggested fix: - for i = 1, #players do -``` - -- Embeds color-coded: Low=0x2ecc71 (green), Medium=0xf1c40f (yellow), High=0xe67e22 (orange), Critical=0xe74c3c (red) -- Critical issues trigger `@here` mention -- Two buttons per issue: - - "Mark Fixed" -- sets resolved=True in SQLite, updates embed to show who resolved it and when - - "Copy Context" -- sends ephemeral message with full issue in a copyable code block (file path, line numbers, code, explanation, suggestion -- formatted for pasting into Cursor or a ticket) -- Issues grouped per sync cycle: one summary embed header, then individual issue embeds -- Auto-resolved issues get their embed edited with a strikethrough title and "Resolved -- code was modified" footer - -**Summary embed** (posted once per sync cycle with issues): - -``` -Sync Review -- PlaceId 12345678 -3 new issues found | 2 auto-resolved - - 1 Critical | 1 High | 1 Medium | 0 Low - -Reviewed 4 changed scripts (127 lines added, 23 removed) -``` - -**Error reporting** (`discord_fmt.py`): - -Every error type gets its own embed posted to the game's channel. Errors are not silent -- operators need to know immediately. - - -| Error Type | Embed Color | Content | -| ------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------- | -| Download failure (OpenCloud 403/401) | Red | "API key may be invalid or missing `legacy-asset:manage` scope. Use `/set-api-key` to update." | -| Download failure (network) | Red | "Could not reach Roblox API. Will retry next cycle." | -| Syncback crash (atlas exit code != 0) | Red | Full stderr output in a code block, truncated to 1500 chars | -| Claude API error (rate limit, auth) | Orange | "Review skipped this cycle. Changes were still committed." | -| Claude parse error (invalid JSON) | Orange | "Claude returned unparseable response. Raw output logged." | -| Git error | Red | Full error message | - - -```python -async def report_error(bot: discord.Client, game: Game, error: Exception, error_type: str): - channel = bot.get_channel(int(game.channel_id)) - embed = discord.Embed( - title=f"Sync Error -- PlaceId {game.place_id}", - description=truncate(str(error), 1500), - color=0xe74c3c, - ) - embed.add_field(name="Error Type", value=error_type, inline=True) - embed.add_field(name="Last Successful Sync", value=game.last_sync_at or "Never", inline=True) - embed.set_footer(text="Will retry next cycle") - await channel.send(embed=embed) -``` - -**Error throttling**: Don't spam the channel with the same error every 5 minutes. Track the last error message in the `games` table. If the current error is identical to `last_error`, only re-post after 1 hour of continuous failure (12 consecutive cycles). On the first occurrence of a *new* error, always post immediately. - -#### 7. Discord Slash Commands - - -| Command | Args | Permission | Description | -| ----------------- | -------------------------------- | -------------------- | ----------------------------------------------------- | -| `/approve-server` | `server_id` (optional) | Global admin only | Whitelist current server (or remote by ID) | -| `/revoke-server` | `server_id` | Global admin only | Remove server from whitelist, stop all its sync loops | -| `/add-game` | `place_id`, `channel` (optional) | Admin or has API key | Start monitoring a game in this server | -| `/remove-game` | `place_id` | Admin or game owner | Stop monitoring, optionally delete local data | -| `/reset-game` | `place_id` | Admin or game owner | Delete clone, re-sync from scratch | -| `/set-api-key` | `key` | Any permitted user | Set OpenCloud key (ephemeral, encrypted) | -| `/status` | -- | Any permitted user | Show monitored games, last sync, error counts | -| `/list-games` | -- | Any permitted user | List games in this server | - - -#### 8. Security Model - -**Server whitelist (allowed_servers)**: - -Every slash command and every bot action checks the server whitelist first. If the server is not in `allowed_servers`, the bot responds with an ephemeral "This server is not authorized. Ask an admin to run `/approve-server`." and does nothing else. This is the first check in every interaction handler -- no exceptions. - -```python -async def check_server_allowed(interaction: discord.Interaction) -> bool: - if not db.is_server_allowed(str(interaction.guild_id)): - await interaction.response.send_message( - "This server is not authorized. Ask a bot admin to approve it.", - ephemeral=True, - ) - return False - return True -``` - -The `allowed_servers` table is managed exclusively by global admins: - - -| Command | Who can run it | What it does | -| ------------------------------------------------------------ | ----------------- | ------------------------------------------------------------ | -| `/approve-server` (no args, run in target server) | Global admin only | Adds current server to whitelist | -| `/approve-server ` (run from any approved server) | Global admin only | Adds a remote server by ID | -| `/revoke-server ` | Global admin only | Removes server, stops all its sync loops, keeps data on disk | - - -On bot startup, the daemon loads all approved servers and only starts sync loops for games in those servers. - -**Full permission model:** - -- **Global admins** (seeded in DB on first run): Discord user IDs `176643682689089545`, `1010301288946339920` -- **Per-user API keys**: Provided via `/set-api-key` (ephemeral response, never logged, never visible to other users). Encrypted with Fernet (symmetric, derived from `ATLAS_DAEMON_ENCRYPTION_KEY` env var) before SQLite storage. -- **Server isolation**: Games scoped to `/`. Multiple servers can independently monitor the same place with separate working directories and separate API keys. -- **Rate limiting**: Configurable max games per server (default 5, via `ATLAS_DAEMON_MAX_GAMES_PER_SERVER`). -- **Command permissions**: Non-admin users can only manage games they added (`added_by` field). Admins can manage any game in any approved server. - -#### 9. SQLite Schema - -```sql --- Server whitelist. No entry = bot refuses all commands in that server. -CREATE TABLE allowed_servers ( - discord_server_id TEXT PRIMARY KEY, - server_name TEXT, -- cached for /status display - approved_by TEXT NOT NULL, -- discord user ID of admin who approved - approved_at TEXT DEFAULT (datetime('now')) -); - --- Global admin users. Seeded on first run with hardcoded IDs. -CREATE TABLE admins ( - discord_user_id TEXT PRIMARY KEY, - added_at TEXT DEFAULT (datetime('now')) -); - --- Monitored games. FK to allowed_servers ensures orphan cleanup on revoke. -CREATE TABLE games ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - discord_server_id TEXT NOT NULL REFERENCES allowed_servers(discord_server_id) ON DELETE CASCADE, - place_id INTEGER NOT NULL, - channel_id TEXT NOT NULL, - api_key_encrypted BLOB NOT NULL, -- Fernet-encrypted OpenCloud key - added_by TEXT NOT NULL, -- discord user ID - working_dir TEXT NOT NULL, -- absolute path to game's project directory - last_sync_at TEXT, - last_error TEXT, -- last error message (for throttling) - last_error_at TEXT, -- when last_error first occurred - error_count INTEGER DEFAULT 0, -- consecutive error count (for throttling) - created_at TEXT DEFAULT (datetime('now')), - UNIQUE(discord_server_id, place_id) -); - --- Reported issues. Tracks every issue for dedup + mark-as-fixed. -CREATE TABLE issues ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - game_id INTEGER NOT NULL REFERENCES games(id) ON DELETE CASCADE, - discord_message_id TEXT, -- for editing the embed on resolve - file_path TEXT NOT NULL, - line_start INTEGER, - line_end INTEGER, - severity TEXT NOT NULL, -- Low, Medium, High, Critical - title TEXT NOT NULL, - explanation TEXT, - suggestion TEXT, - resolved INTEGER DEFAULT 0, - resolved_by TEXT, -- discord user ID or "auto" - resolved_reason TEXT, -- "manual", "file modified", etc. - resolved_at TEXT, - created_at TEXT DEFAULT (datetime('now')) -); - -CREATE INDEX idx_issues_game_unresolved ON issues(game_id, resolved) WHERE resolved = 0; -CREATE INDEX idx_games_server ON games(discord_server_id); -``` - -#### 10. Configuration - -```env -ATLAS_DAEMON_DISCORD_TOKEN= -ATLAS_DAEMON_ANTHROPIC_KEY= -ATLAS_DAEMON_DATA_DIR=./atlas-daemon-data -ATLAS_DAEMON_ENCRYPTION_KEY= -ATLAS_DAEMON_SYNC_INTERVAL=300 -ATLAS_DAEMON_MAX_GAMES_PER_SERVER=5 -ATLAS_DAEMON_ATLAS_BINARY=atlas -``` - -#### 11. CLI Interface - -```bash -python -m atlas_daemon \ - --discord-token $TOKEN \ - --anthropic-key $KEY \ - --data-dir ./data \ - --sync-interval 300 -``` - -## Audit Gap Resolution - - -| Gap | Fix | -| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| GAP 1: `atlas clone` uses cookie | FIXED: `--opencloud` global flag on atlas CLI. `atlas --opencloud KEY clone PLACEID` works end-to-end with no cookie. Daemon calls `atlas clone` for init, `atlas syncback --download` for periodic syncs. | -| GAP 2: No server whitelist | FIXED: `allowed_servers` table with FK cascade to `games`. `/approve-server` and `/revoke-server` admin commands. Every interaction handler checks whitelist first -- no exceptions. | -| GAP 3: Error reporting not specified | FIXED: Typed error embeds per failure mode (download, syncback, Claude, git) posted to game channel with color coding. Error throttling: same error only re-posted after 1 hour (12 consecutive cycles). Error state tracked via `last_error`, `last_error_at`, `error_count` in `games` table. | -| GAP 4: No diff size handling | FIXED: `filter_script_changes()` strips non-Luau files before review. Full filtered diff sent to Claude (200k context handles normal syncs). Only chunk by file + parallel review for truly massive diffs (>150k estimated tokens). First sync committed without review. | -| GAP 5: No issue deduplication | FIXED: Three-layer approach. (1) Prompt context: unresolved issues fed to Claude so it avoids re-reporting. (2) Hard dedup: exact `(file_path, title)` match in Python as safety net. (3) Auto-resolution: issues in files modified by a subsequent diff auto-resolved before review, Discord embeds updated with "Resolved -- code was modified" footer. | - - diff --git a/.cursor/plans/atlas_fork_isolation_ef1d08fd.plan.md b/.cursor/plans/atlas_fork_isolation_ef1d08fd.plan.md deleted file mode 100644 index e02a3662..00000000 --- a/.cursor/plans/atlas_fork_isolation_ef1d08fd.plan.md +++ /dev/null @@ -1,206 +0,0 @@ ---- -name: Atlas Fork Isolation -overview: Change default port, add a server fork identifier, rename settings prefix, rename plugin rbxm, rename binary to atlas, update VS Code extension binary references, and rename internal Studio markers so Atlas and stock Rojo can coexist without conflicts. -todos: - - id: port - content: Change default port from 34872 to 34873 in serve.rs and Config.lua - status: completed - - id: version - content: Bump version in Cargo.toml and plugin/Version.txt - status: completed - - id: protocol - content: Bump protocol version 5->6 in interface.rs and Config.lua - status: completed - - id: fork-id - content: Add serverFork field to ServerInfoResponse, populate with 'atlas', validate in plugin ApiContext.lua and Types.lua - status: completed - - id: settings - content: Change settings prefix from Rojo_ to Atlas_ in Settings.lua - status: completed - - id: session-markers - content: Rename __Rojo_SessionLock and __Rojo_ConnectionUrl to __Atlas_ in App/init.lua - status: completed - - id: widget-ids - content: Rename Rojo_ prefixed widget IDs to Atlas_ in Confirming.lua and Connected.lua - status: completed - - id: rbxm-managed - content: Rename RojoManagedPlugin.rbxm to AtlasManagedPlugin.rbxm in plugin.rs - status: completed - - id: rbxm-build - content: Rename Rojo.rbxm to Atlas.rbxm in build scripts, install scripts, and release workflow - status: completed - - id: binary-rename - content: "Rename binary: Cargo.toml name rojo->atlas, CARGO_BIN_EXE in tests, clap name, release workflow BIN, install script binary refs" - status: completed - - id: vscode-binary-refs - content: "Change all rojo binary invocations to atlas in vscode-rojo: getRojoInstall, installPlugin, serveProject, buildProject, createProjectFile, openMenu" - status: completed - - id: bugfix-waypoint - content: "Fix broken undo detection: App/init.lua checks '^Rojo: Patch' but ServeSession already records as 'Atlas: Patch'" - status: completed - - id: templates - content: Update project template READMEs and init.rs CLI output to say atlas instead of rojo - status: completed -isProject: false ---- - -# Atlas Fork Isolation from Stock Rojo - -## 1. Default Port: 34872 -> 34873 - -**Server:** - -- `[src/cli/serve.rs](src/cli/serve.rs)` line 15: `DEFAULT_PORT: u16 = 34872` -> `34873` -- Same file line 28-29: update help text from `34872` to `34873` - -**Plugin:** - -- `[plugin/src/Config.lua](plugin/src/Config.lua)` line 32: `defaultPort = "34872"` -> `"34873"` - -## 2. Version Bump + Unique Server Fork Identifier - -**Version bump** (both must match per `build.rs` assertion): - -- `[Cargo.toml](Cargo.toml)` line 3: bump `version` (e.g. `"7.7.0-rc.1"` -> `"7.7.0-rc.2"` or whatever the next version should be) -- `[plugin/Version.txt](plugin/Version.txt)`: match the same value - -**Protocol version bump:** - -- `[src/web/interface.rs](src/web/interface.rs)` line 28: `PROTOCOL_VERSION: u64 = 5` -> `6` -- `[plugin/src/Config.lua](plugin/src/Config.lua)` line 30: `protocolVersion = 5` -> `6` - -**Add `serverFork` field to `ServerInfoResponse**` so the plugin can reject non-Atlas servers even if protocol versions coincidentally match in the future: - -- `[src/web/interface.rs](src/web/interface.rs)`: add `pub server_fork: String` to `ServerInfoResponse` (serializes as `"serverFork"`) -- `[src/web/api.rs](src/web/api.rs)` ~line 272: include `server_fork: "atlas".to_owned()` when constructing the response -- `[plugin/src/Types.lua](plugin/src/Types.lua)` ~line 38: add `serverFork = t.string` to `ApiInfoResponse` -- `[plugin/src/ApiContext.lua](plugin/src/ApiContext.lua)` ~line 27: add a `rejectWrongFork` check that validates `infoResponseBody.serverFork == "atlas"`, rejecting with a clear message if it's a stock Rojo server - -## 3. Plugin Settings Prefix: `Rojo_` -> `Atlas_` - -- `[plugin/src/Settings.lua](plugin/src/Settings.lua)`: change `"Rojo_"` to `"Atlas_"` on lines 41, 45, 70 (3 occurrences, all share the same pattern) - -## 4. Session Lock + Connection Attribute Naming - -These are stored on real instances in Studio and would conflict if both plugins are loaded: - -- `[plugin/src/App/init.lua](plugin/src/App/init.lua)`: rename `"__Rojo_SessionLock"` -> `"__Atlas_SessionLock"` (lines 321, 348, 351, 365) -- Same file: rename `"__Rojo_ConnectionUrl"` -> `"__Atlas_ConnectionUrl"` (lines 534, 547, 557, 561) - -## 5. Ephemeral Widget IDs: `Rojo_` -> `Atlas_` - -These are `CreateDockWidgetPluginGui` IDs that persist across sessions and would clash: - -- `[plugin/src/App/StatusPages/Confirming.lua](plugin/src/App/StatusPages/Confirming.lua)`: 4 IDs (`Rojo_ConfirmingStringDiff`, `Rojo_ConfirmingTableDiff`, `Rojo_AcceptConfirm`, `Rojo_DiffSync`) -- `[plugin/src/App/StatusPages/Connected.lua](plugin/src/App/StatusPages/Connected.lua)`: 3 IDs (`Rojo_ChangesViewer`, `Rojo_ConnectedStringDiff`, `Rojo_ConnectedTableDiff`) - -## 6. Plugin RBXM Naming: `Rojo.rbxm` -> `Atlas.rbxm` - -`**rojo plugin install` command:** - -- `[src/cli/plugin.rs](src/cli/plugin.rs)` line 13: `PLUGIN_FILE_NAME = "RojoManagedPlugin.rbxm"` -> `"AtlasManagedPlugin.rbxm"` - -**Build scripts:** - -- `[scripts/watch-build-plugin.sh](scripts/watch-build-plugin.sh)`: `Rojo.rbxm` -> `Atlas.rbxm`, `rojo build` -> `atlas build` -- `[scripts/watch-build-plugin.ps1](scripts/watch-build-plugin.ps1)`: same -- `[scripts/unit-test-plugin.sh](scripts/unit-test-plugin.sh)`: `rojo build` -> `atlas build` -- `[scripts/unit-test-plugin.ps1](scripts/unit-test-plugin.ps1)`: `rojo build` -> `atlas build` -- `[install.sh](install.sh)`: `Rojo.rbxm` -> `Atlas.rbxm`, `./target/$MODE/rojo` -> `./target/$MODE/atlas`, `pkill -f rojo` -> `pkill -f atlas` -- `[install.ps1](install.ps1)`: `Rojo.rbxm` -> `Atlas.rbxm`, `rojo.exe` -> `atlas.exe`, `rojo.pdb` -> `atlas.pdb`, `C:\Program Files\Rojo` -> `C:\Program Files\Atlas`, `Stop-Process -Name "rojo"` -> `Stop-Process -Name "atlas"` - -**GitHub Actions:** - -- `[.github/workflows/release.yml](.github/workflows/release.yml)`: - - Line 34: `rojo build` -> `atlas build` (but this uses rokit's stock rojo -- see note below) - - Line 88: `BIN: rojo` -> `BIN: atlas` - - Lines 34, 40, 45, 46: `Rojo.rbxm` -> `Atlas.rbxm` - -**Note on CI plugin build:** Release workflow line 34 uses rokit-installed `rojo` to build the plugin rbxm artifact. After binary rename, the locally compiled binary is `atlas`, but rokit installs stock `rojo`. Two options: - -- Option A: Change CI to compile atlas first, then use `atlas build` for the plugin (requires reordering jobs or combining them) -- Option B: Keep using rokit's stock `rojo build` for the plugin artifact (the `build` command is format-compatible) -- **Recommend Option A** for correctness -- the build-plugin step should use the atlas binary from the build step. - -## 7. Binary Rename: `rojo` -> `atlas` - -**Cargo.toml:** - -- `[Cargo.toml](Cargo.toml)` line 2: `name = "rojo"` -> `name = "atlas"` (changes binary output from `rojo`/`rojo.exe` to `atlas`/`atlas.exe`) -- `[lib] name = "librojo"` stays unchanged (line 41) -- this keeps all `use librojo::` imports working without cascading changes to ~20 test/bench files - -**CLI display name:** - -- `[src/cli/mod.rs](src/cli/mod.rs)` line 36: `#[clap(name = "Rojo"...)]` -> `#[clap(name = "Atlas"...)]` - -**Test binary path resolution:** - -- `[tests/rojo_test/io_util.rs](tests/rojo_test/io_util.rs)` line 10: `env!("CARGO_BIN_EXE_rojo")` -> `env!("CARGO_BIN_EXE_atlas")` (Cargo auto-generates this env var from the binary name) - -## 8. VS Code Extension: Binary Invocations `rojo` -> `atlas` - -The extension package is already rebranded (`vscode-atlas`, commands `vscode-atlas.*`, config `atlas.*`). But source files still invoke the `rojo` binary: - -- `[vscode-rojo/src/getRojoInstall.ts](vscode-rojo/src/getRojoInstall.ts)`: - - Line 46: `which("rojo")` -> `which("atlas")` - - Line 56: `exec("rojo --version", ...)` -> `exec("atlas --version", ...)` -- `[vscode-rojo/src/installPlugin.ts](vscode-rojo/src/installPlugin.ts)`: - - Line 13: `exec("rojo plugin install", ...)` -> `exec("atlas plugin install", ...)` -- `[vscode-rojo/src/serveProject.ts](vscode-rojo/src/serveProject.ts)`: - - Line 30: `terminal.sendText('rojo serve ...')` -> `terminal.sendText('atlas serve ...')` -- `[vscode-rojo/src/buildProject.ts](vscode-rojo/src/buildProject.ts)`: - - Line 24: `exec('rojo build ...')` -> `exec('atlas build ...')` -- `[vscode-rojo/src/createProjectFile.ts](vscode-rojo/src/createProjectFile.ts)`: - - Line 8: `exec("rojo init", ...)` -> `exec("atlas init", ...)` -- `[vscode-rojo/src/commands/openMenu.ts](vscode-rojo/src/commands/openMenu.ts)`: - - Line 164: `which("rojo")` -> `which("atlas")` - - Line 571: `terminal.sendText('rojo studio ...')` -> `terminal.sendText('atlas studio ...')` - - Line 602: `terminal.sendText('rojo syncback ...')` -> `terminal.sendText('atlas syncback ...')` - -**Persisted state key:** - -- `[vscode-rojo/src/serveProject.ts](vscode-rojo/src/serveProject.ts)` line 16 and `[vscode-rojo/src/commands/serveRecent.ts](vscode-rojo/src/commands/serveRecent.ts)` line 10: `"rojoLastPath"` -> `"atlasLastPath"` - -**Aftman install references** (in `installRojo.ts` lines 183, 201, 210): These reference `rojo-rbx/rojo` for auto-installing. Left as-is for now since our fork may not be published to aftman yet. Will need updating when distribution is set up. - -## 9. Bugfix: Undo Waypoint Detection - -`ServeSession.lua:529` already records as `"Atlas: Patch ..."` but `App/init.lua:66` still checks for `"^Rojo: Patch"`. This means undo detection is currently broken. - -- `[plugin/src/App/init.lua](plugin/src/App/init.lua)` line 66: `"^Rojo: Patch"` -> `"^Atlas: Patch"` - -## 10. Project Templates and CLI Output: `rojo` -> `atlas` - -**Template READMEs:** - -- `[assets/project-templates/place/README.md](assets/project-templates/place/README.md)`: `Generated by [Rojo](...)` -> `Generated by [Atlas](...)`, `rojo serve` -> `atlas serve`, `rojo syncback` -> `atlas syncback` -- `[assets/project-templates/model/README.md](assets/project-templates/model/README.md)`: same pattern, `rojo build` -> `atlas build` -- `[assets/project-templates/plugin/README.md](assets/project-templates/plugin/README.md)`: same pattern, `rojo build` -> `atlas build` - -**CLI print:** - -- `[src/cli/init.rs](src/cli/init.rs)` line 206: `"Run 'rojo syncback' to sync your place."` -> `"Run 'atlas syncback' to sync your place."` - ---- - -## What We Are NOT Changing (and why) - - -| Item | Reason | -| --------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | -| `plugin.project.json` name `"Rojo"` | Would require updating `FindFirstAncestor("Rojo")` in 50+ Lua files; each plugin loads its own tree, no cross-plugin conflict | -| `[lib] name = "librojo"` | Keeps all `use librojo::` imports working in ~20 test/bench files | -| `/api/rojo` endpoint path | Internal protocol between our server and our plugin; not user-facing | -| `handle_api_rojo` / `get_api_rojo` method names | Internal Rust/test method names; cosmetic | -| `Rojo_Id`, `Rojo_Target_`, `Rojo_Ref_` attribute names | Data format embedded in existing Roblox files; changing breaks backward compatibility | -| `ROJO_DEV_BUILD` instance name | Internal dev flag within plugin tree; no cross-plugin conflict | -| `ROJO_SYNCBACK_DEBUG` env var | Internal debug var; cosmetic | -| `rojo-test/` directory, `mod rojo_test`, `rojo-insta-ext` crate | Internal test infrastructure; not derived from package name, still works | -| `rokit.toml` `rojo = "rojo-rbx/rojo@7.5.1"` | Dev tool dependency for stock rojo; doesn't affect our binary | -| `build/windows/rojo-manifest.rc` and `rojo.manifest` | Windows manifest files; paths are hardcoded in build.rs, not derived from package name | -| `RojoTree`, `RojoRef`, etc. type names | Internal Rust types; cosmetic | -| Comments, doc strings, error messages (~150 occurrences) | Cosmetic only; no functional conflict | -| `plugin/Packages/` vendored dependencies | Third-party code; must not touch | -| `vscode-rojo/src/installRojo.ts` aftman refs | Distribution not set up yet; update later | - - diff --git a/.cursor/plans/audit_ambiguous_path_handling_30e99d9a.plan.md b/.cursor/plans/audit_ambiguous_path_handling_30e99d9a.plan.md deleted file mode 100644 index e6726a3f..00000000 --- a/.cursor/plans/audit_ambiguous_path_handling_30e99d9a.plan.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -name: Audit Ambiguous Path Handling -overview: Production audit of the Ambiguous Path Handling feature (matching algorithm, dedup system, ref path system). Identifies 7 critical/correctness issues, 3 code quality items, and extensive missing test coverage." -todos: - - id: c1-pass3-double-match - content: "Fix: Forward sync pass3 can re-match pass1-matched items (snap_available not consumed)" - status: completed - - id: c2-case-sensitivity - content: "Fix: get_instance_by_path inconsistent case sensitivity between primary and fallback" - status: completed - - id: c3-projectnode-path - content: "Fix: ref_target_path_from_tree uses project filename instead of instance name for ProjectNode" - status: completed - - id: c5-return-value - content: "Verify: encodeInstance return value change doesn't break callers" - status: completed - - id: c6-dead-code - content: "Fix: Remove dead code in ref_properties.rs (compute_refs_with_duplicate_siblings, is_path_unique_with_cache)" - status: completed - - id: c7-ref-path-format - content: "Critical: ref_properties.rs writes instance-name paths but tree.rs expects filesystem-name paths" - status: completed - - id: q2-hashset-perf - content: "Fix: Use HashSet instead of Vec for matched tracking in syncback matching" - status: completed - - id: c8-matching-lua-require-crash - content: "Critical: matching.lua has wrong require path for Log module - crashes on load, breaks hydration entirely" - status: completed - - id: q3-unused-import - content: "Fix: Remove unused Log import in Lua matching module (after fixing c8, Log is still unused)" - status: completed - - id: t1-syncback-integration - content: "Test: Add syncback integration tests for duplicate-named instances" - status: completed - - id: t3-new-fn-tests - content: "Test: Add tests for ref_target_path_from_tree and filesystem_name_for" - status: completed -isProject: false ---- - -# Audit: Ambiguous Path Handling Feature - -> This plan was generated by `/audit` from a Plan-mode session. -> Refer to `.cursor/rules/atlas.mdc` for full project standards. - -## Standards - -### Round-Trip Identity (from `atlas.mdc`) - -Syncback writes a directory tree. Building an rbxl from that tree and forward-syncing it back must produce a **bit-identical instance tree**. Any deviation is a bug. - -### CLI Syncback Parity (from `atlas.mdc`) - -Plugin-based sync must produce **exactly the same filesystem output** as `atlas syncback`. Any divergence is a bug. - -### Code Quality (from `atlas.mdc`) - -DRY code, no duplicated slugify/dedup/meta patterns across files. - -## Context - -Auditing all changes on `ambiguous-paths` branch (4 commits, 24 files, +3560/-825 lines) against `origin/master`. The feature replaces the duplicate-skip blacklist with a 3-pass matching algorithm, filesystem-collision-based dedup, and filesystem-name-based ref paths. - ---- - -## Critical Issues - -### C1. Forward sync matching does not filter already-matched items in Pass 3 - -**File:** [src/snapshot/matching.rs](src/snapshot/matching.rs), `pass3_similarity()` line 199-262 - -**Problem:** `pass3_similarity` builds its own `snap_by_name` / `tree_by_name` maps from ALL items in `snap_available` / `tree_children`, including items already matched in Pass 1 (which are marked only via `snap_matched[si]=true` / `tree_available[ti]=false` in the caller). However, `snap_by_name` iterates `snap_available` checking `if let Some(snap) = snap_opt` -- but snap_available entries are never set to `None` after Pass 1 matching. This means Pass 3 **re-groups items already matched in Pass 1** into its name maps. The `snap_matched` guard inside the pair-building loop catches this for snap items, but the `tree_by_name` check is `if !tree_available[i]` which IS correctly applied. The snap side relies on `snap_matched[si]` which is initialized to `vec![false; ...]` at the top of pass3 -- it does NOT inherit the pass1 match state. - -**Impact:** Pass 3 will attempt to re-match snapshots already matched in Pass 1, potentially creating duplicate matched pairs in the output. The `build_result()` function does `.take()` on snap entries, so the second `.take()` would return `None` and the pair would be silently dropped. This means the unmatched counts would be wrong (items appear in neither matched nor unmatched). - -**Fix:** Either set `snap_available[si] = None` for pass1-matched items before calling pass3, or initialize pass3's `snap_matched` from the caller's `snap_matched` state. The simplest fix: filter `snap_by_name` to only include indices where `snap_available[i].is_some()` AND the index was not already matched. Since we use a separate `snap_matched` bool vec, we can check: the `snap_available` entries for pass1-matched items were never consumed (they're still `Some`). We need to either mark them `None` or pass the matched state. - -### C2. `get_instance_by_path` uses case-insensitive comparison for filesystem names but case-SENSITIVE for fallback - -**File:** [src/snapshot/tree.rs](src/snapshot/tree.rs), `get_instance_by_path()` line ~248 - -**Problem:** The primary lookup uses `fs_name.eq_ignore_ascii_case(segment)` but the fallback name lookup uses `child.name == *segment` (case-sensitive). This inconsistency means: - -- A ref path `"workspace/Part"` would match filesystem name `"Workspace"` (case-insensitive) in the primary check -- But if the instance had no `instigating_source`, the fallback would fail because `"Workspace" != "workspace"` - -More critically, this creates an asymmetry: `ref_target_path_from_tree()` builds paths from filesystem names preserving their original case, but resolution uses case-insensitive matching. This means two distinct instances `"Foo.luau"` and `"foo.luau"` (which should be dedup'd for cross-platform safety) would both match the same path segment. - -**Fix:** Use case-insensitive comparison in BOTH the primary and fallback paths. Or use exact case matching in both (since filesystem names are deterministic and paths should round-trip exactly). - -### C3. `ref_target_path_from_tree` falls back to instance name for ProjectNode instances, creating inconsistent paths - -**File:** [src/rojo_ref.rs](src/rojo_ref.rs), `ref_target_path_from_tree()` line ~157-173 - -**Problem:** When an instance has `InstigatingSource::ProjectNode`, the code falls through to the `else` branch (no instigating_source) and uses `inst.name.clone()`. But `InstigatingSource::ProjectNode` DOES have a path -- `source.path()` returns the project file path, whose `file_name()` would be something like `default.project.json5`. This is wrong -- for project nodes, the segment should be the instance name (not the project filename). - -The current code handles this correctly by accident: the `if let Some(source) = &meta.instigating_source` check matches `ProjectNode` (it has a source), so it uses `source.path().file_name()` which returns the project filename like `"default.project.json5"`. This produces WRONG ref path segments for project-sourced instances -- a service like "Workspace" would get segment `"default.project.json5"` instead of `"Workspace"`. - -**Fix:** Check for `InstigatingSource::ProjectNode` specifically and use the instance name, not the project file path. The `instigating_source.path()` for ProjectNode returns the project file itself, not the instance's filesystem representation. - -### C4. Lua matching `_pass1NameAndClass` has index invalidation bug when removing from arrays - -**File:** [plugin/src/Reconciler/matching.lua](plugin/src/Reconciler/matching.lua), lines 168-190 - -**Problem:** After collecting matched indices, the code sorts them in reverse order and calls `table.remove(remainingVirtual, idx)` / `table.remove(remainingStudio, idx)` for each. However, if Pass 1 matched both a unique-name pair AND a class-narrowed pair from the same name group, the same index could theoretically appear twice in `matchedVirtualIndices`. The deduplication check (`seenV[idx]`) handles this. - -But the more fundamental issue: indices collected during the matching loop refer to positions in `remainingVirtual` at the START of the function. As `table.remove` shifts elements, subsequent indices become invalid. The reverse-order sort mitigates this for sequential removals, but if indices from DIFFERENT name groups interleave (e.g., index 3 from name "A" and index 2 from name "B"), removing index 3 first then index 2 works. However, if the same index appears for both a unique match and a class match (shouldn't happen since unique match `continue`s), the dedup prevents double-removal. - -**Real bug:** The virtual and studio index lists are independent. `matchedVirtualIndices` contains indices into `remainingVirtual`, `matchedStudioIndices` contains indices into `remainingStudio`. Removing from one array doesn't affect the other. But removing from `remainingVirtual` in reverse order IS correct for that array alone. The issue is that indices 1, 3, 5 removed in order 5, 3, 1 correctly removes the right elements. - -Actually, this is correct IF no duplicates. But there's a subtle issue: the class narrowing loop can match items whose indices overlap with the unique-name match. Since the unique-name match does `continue` (skips class narrowing for that name), this shouldn't happen. **Low risk but fragile.** - -### C5. `encodeInstance.lua` return value change breaks callers expecting 2 return values - -**File:** [plugin/src/ChangeBatcher/encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua), bottom - -**Problem:** The old function returned `(result, skippedDuplicateCount)` -- two values. The new code returns just `encodeInstance(instance, parentId, false)` -- one value. Per the Lua silent argument mismatch rule, callers that destructured the second return value now silently get `nil` instead of a count. Need to verify all callers. - -**Verification needed:** Search for all callers of `encodeInstance` / `encodeInstanceWithDuplicateTracking` to confirm none destructure the second return value. - -### C6. Dead code left behind in `ref_properties.rs` - -**File:** [src/syncback/ref_properties.rs](src/syncback/ref_properties.rs), lines 54-131 - -**Problem:** `compute_refs_with_duplicate_siblings()` and `is_path_unique_with_cache()` are now dead code (clippy confirms: "function is never used"). The `collect_referents()` function was simplified to always use path-based linking, but the old helper functions were not removed. This is dead code that will confuse future maintainers. - -### C7. `ref_properties.rs` always uses instance-name paths, not filesystem-name paths - -**File:** [src/syncback/ref_properties.rs](src/syncback/ref_properties.rs), `collect_referents()` line ~170 - -**Problem:** The simplified `collect_referents()` calls `inst_path(dom, *target_ref)` which uses the legacy `ref_target_path()` (instance-name-based with escaping). This means Rojo_Ref_* attributes written during syncback still use the OLD path format (instance names), not the new filesystem-name format. But `get_instance_by_path()` in tree.rs now expects filesystem-name segments. This creates a **format mismatch**: syncback writes instance-name paths, forward sync tries to resolve them as filesystem-name paths. - -The fallback in `get_instance_by_path()` (case-sensitive instance name match) partially mitigates this, but it's fragile and won't work for instances whose name differs from their filesystem name (slugified names, dedup'd names). - -**Impact:** Critical round-trip violation for any instance with a slugified or dedup'd name that is referenced by a Ref property. The ref path written during syncback won't resolve during forward sync. - -**Fix:** `collect_referents()` needs to build filesystem-name paths. This requires access to the filesystem names assigned during syncback (via instigating_source or a Ref-to-filesystem-name map built during the syncback pass). - ---- - -### C8. Lua matching module has wrong `require` path -- crashes on load, breaks hydration - -**File:** [plugin/src/Reconciler/matching.lua](plugin/src/Reconciler/matching.lua), line 16 - -**Problem:** `local Log = require(script.Parent.Parent.Log)` resolves to `plugin/src/Log` which does not exist. Every other file in `plugin/src/Reconciler/` uses `local Packages = script.Parent.Parent.Parent.Packages` followed by `require(Packages.Log)`. Since Luau's `require()` executes immediately at module load time, this incorrect path causes a runtime error when `matching.lua` loads, which prevents the 3-pass matching algorithm from functioning and breaks hydration entirely (`hydrate.lua` line 15 requires `matching`). - -**Impact:** The plugin cannot connect to the server at all. Hydration is the first thing that runs after the initial `/api/read` -- if matching.lua fails to load, the entire sync session crashes. - -**Fix:** Replace line 16 with: - -```lua -local Packages = script.Parent.Parent.Parent.Packages -local Log = require(Packages.Log) -``` - ---- - -## Code Quality Issues - -### Q1. Duplicated name→index grouping pattern across 3 matching modules - -All three matching implementations (syncback, forward sync, Lua plugin) repeat the same pattern: build `HashMap>` for both sides, iterate names, check counts. This is ~40 lines repeated 6+ times across the codebase. Should be factored into a shared helper (or at minimum documented as intentional duplication per the spec requirement of separate implementations). - -### Q2. `matched_new.contains(r)` uses O(n) linear scan in syncback matching - -**File:** [src/syncback/matching.rs](src/syncback/matching.rs), lines 196, 262, 358, 400 - -The `matched_new.contains()` / `matched_old.contains()` checks are O(n) linear scans. For large ambiguous groups (10+ duplicates), this creates O(n^2) behavior within Pass 2 and Pass 3. Should use `HashSet` instead of `Vec` for the matched tracking sets. - -### Q3. Unused `Log` import in Lua matching module - -**File:** [plugin/src/Reconciler/matching.lua](plugin/src/Reconciler/matching.lua), line 16 - -`local Log = require(script.Parent.Parent.Log)` is imported but never used. Will trigger selene lint warning. - ---- - -## Missing Test Coverage - -### T1. No integration tests for duplicate-named instances through syncback - -The feature's core value proposition -- syncing duplicate-named instances -- has zero integration tests. The only tests are unit tests for the matching algorithm and dedup suffix cleanup. Need syncback test fixtures with: - -- Two Folders with same name -- Folder + Script same name (no collision) -- Init-style collision (Folder + Script with children) -- Roundtrip test with duplicates - -### T2. No tests for forward sync with duplicate-named instances - -`compute_children_patches` now uses the matching algorithm, but there are no tests verifying that editing one of two same-named files correctly pairs to the right tree instance. - -### T3. No tests for `ref_target_path_from_tree` or `filesystem_name_for` - -New functions with zero test coverage. Critical for ref path correctness. - -### T4. No tests for dedup key semantics change - -The `deduplicate_name_with_ext` function is tested via updated existing tests, but there are no tests specifically for the Folder+Script no-collision scenario or init-style collision scenario. - -### T5. No Lua spec tests for the matching module - -The Lua matching module has zero tests. The `hydrate.lua` changes are untested. - ---- - -## Deferred Refactors - -- **Syncback ref path format migration**: `collect_referents()` needs to build filesystem-name paths instead of instance-name paths. This requires restructuring the syncback flow to make filesystem name assignments available during ref collection. (Blocked on: syncback flow restructure) -- **Matching cache (Phase 2e)**: Deferred optimization, not needed for correctness. -- **change_processor dedup cleanup integration**: The `dedup_suffix.rs` module provides cleanup rules but they aren't integrated into the change processor's deletion handling yet. - diff --git a/.cursor/plans/audit_ambiguous_paths_d9495fcc.plan.md b/.cursor/plans/audit_ambiguous_paths_d9495fcc.plan.md deleted file mode 100644 index 85196078..00000000 --- a/.cursor/plans/audit_ambiguous_paths_d9495fcc.plan.md +++ /dev/null @@ -1,280 +0,0 @@ ---- -name: Audit Ambiguous Paths -overview: "Audit of the \"Ambiguous Path Handling\" feature: three parallel matching algorithm implementations (2 Rust, 1 Lua), Reconciler integration, and encoding changes." -todos: - - id: fix-stale-comment - content: "RESOLVED: encodeInstance.lua header comment already updated in prior session" - status: pending - - id: align-tags-attrs-scoring - content: "RESOLVED by matching_algorithm_parity plan (Fix 2): Rust countOwnDiffs now has granular Tags/Attributes scoring" - status: pending - - id: ref-identity-rust - content: "RESOLVED by matching_algorithm_parity plan (Fix 1): Rust countOwnDiffs now has Ref-target-aware scoring" - status: pending - - id: double-cost-perf - content: "Fix: eliminate double cost computation in Lua matchChildren totalCost loop by tracking scored costs from ambiguous loop and reusing them" - status: completed - - id: trueequals-types - content: "Fix: add UDim, UDim2, NumberRange, NumberSequence, ColorSequence, Rect fuzzy equality to trueEquals.lua" - status: completed -isProject: false ---- - -# Audit: Ambiguous Path Handling (Reconciler Changes) - -## Scope - -Files audited: - -- [plugin/src/Reconciler/matching.lua](plugin/src/Reconciler/matching.lua) -- Lua matching algorithm (631 lines) -- [plugin/src/Reconciler/matching.spec.lua](plugin/src/Reconciler/matching.spec.lua) -- Lua matching tests -- [plugin/src/Reconciler/hydrate.lua](plugin/src/Reconciler/hydrate.lua) -- Integration with matching -- [plugin/src/Reconciler/reify.lua](plugin/src/Reconciler/reify.lua) -- Nil-instance guards for ambiguous exclusions -- [plugin/src/Reconciler/trueEquals.lua](plugin/src/Reconciler/trueEquals.lua) -- Shared value equality -- [plugin/src/Reconciler/diff.lua](plugin/src/Reconciler/diff.lua) -- Uses shared trueEquals -- [plugin/src/ChangeBatcher/encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua) -- Duplicate detection helpers -- [src/snapshot/matching.rs](src/snapshot/matching.rs) -- Rust forward sync matching -- [src/syncback/matching.rs](src/syncback/matching.rs) -- Rust syncback matching -- [src/variant_eq.rs](src/variant_eq.rs) -- Rust property comparison - ---- - -## Architecture Summary - -```mermaid -flowchart TD - subgraph luaPlugin ["Lua Plugin (Studio)"] - Hydrate["hydrate.lua"] - LuaMatch["matching.lua"] - TrueEquals["trueEquals.lua"] - Hydrate -->|"calls"| LuaMatch - LuaMatch -->|"uses"| TrueEquals - end - - subgraph rustForward ["Rust Forward Sync"] - PatchCompute["patch_compute.rs"] - FwdMatch["snapshot/matching.rs"] - VariantEq["variant_eq.rs"] - PatchCompute -->|"calls"| FwdMatch - FwdMatch -->|"uses"| VariantEq - end - - subgraph rustSyncback ["Rust Syncback"] - SbEntry["syncback entry"] - SbMatch["syncback/matching.rs"] - SbEntry -->|"calls"| SbMatch - SbMatch -->|"uses"| VariantEq - end -``` - - - -All three implementations use the same algorithm: - -1. **Fast path**: Group by `(Name, ClassName)` -- 1:1 groups instant-match -2. **Ambiguous groups**: Pairwise recursive `computeChangeCount` scoring -3. **Greedy assignment**: Sort by cost ascending, pick lowest-cost unmatched pair -4. **Depth limit**: `MAX_SCORING_DEPTH = 3` prevents O(n^k) explosion -5. **Session caching**: `MatchingSession` avoids redundant recursive scoring - ---- - -## Findings - -### FINDING 1: Stale header comment in encodeInstance.lua (Low -- misleading docs) - -The file header at lines 12-16 states: - -```1:17:plugin/src/ChangeBatcher/encodeInstance.lua ---[[ - // ... - DUPLICATE HANDLING: - - Instances with duplicate-named siblings at ANY level of the path are skipped - - This matches the behavior in ref_properties.rs::is_path_unique - - A path is ambiguous if duplicates exist anywhere from the instance to the root - - A warning is logged when duplicates are encountered -]] -``` - -But the actual code at lines 159-168 does **not** skip duplicates -- it logs a debug message and encodes normally: - -```159:168:plugin/src/ChangeBatcher/encodeInstance.lua -encodeInstance = function(instance, parentId, _skipPathCheck) - -- Log duplicate-named siblings as a debug message (server handles them via - -- dedup suffixes) but do NOT skip encoding. - if not _skipPathCheck and not isPathUnique(instance) then - Log.debug( - "Instance '{}' ({}) has duplicate-named siblings in path (server will handle via dedup)", - instance:GetFullName(), - instance.ClassName - ) - end -``` - -The inline comment (line 161) is correct; the file-level docblock is stale from a prior implementation. **Fix: update the header comment.** - ---- - -### FINDING 2: Tags/Attributes granularity divergence across implementations (Medium -- scoring asymmetry) -- RESOLVED - -> **Resolved by [matching_algorithm_parity](matching_algorithm_parity_01524d4c.plan.md) Fix 2** (status: completed). Rust `countOwnDiffs` in both forward sync and syncback now extracts Tags/Attributes and scores them granularly (per-tag, per-attribute), matching the Lua behavior. Parity tests added (Fix 6). - -~~The three `countOwnDiffs` implementations score Tags and Attributes differently.~~ - -Original analysis preserved below for reference: - -The Lua implementation (`matching.lua` lines 282-307) counts each individual tag/attribute diff as +1. The Rust implementations previously counted the entire `Tags`/`Attributes` Variant as a single +1 diff. This meant 3 of 10 tags differing scored +1 in Rust but +3 in Lua, potentially causing different pairings. - ---- - -### FINDING 3: Lua Ref scoring uses identity heuristic not present in Rust (Medium -- divergence) -- RESOLVED - -> **Resolved by [matching_algorithm_parity](matching_algorithm_parity_01524d4c.plan.md) Fix 1** (status: completed). Both Rust `countOwnDiffs` functions now resolve Ref targets to `(Name, ClassName)` and score mismatches at `UNMATCHED_PENALTY`, matching the Lua behavior. Rust unit tests `ref_scoring_forward_sync` and `ref_scoring_syncback` added. - -~~The Rust implementations had no equivalent of Lua's Ref identity heuristic.~~ - -Original analysis preserved below for reference: - -The Lua `countOwnDiffs` scored Ref property mismatches using `RefIdentity` (name + className) at a cost of `UNMATCHED_PENALTY` (10,000). The Rust implementations compared `Variant::Ref` values as opaque IDs (+1 per mismatch), which were always different between contexts, making Refs useless for disambiguation. - ---- - -### FINDING 4: Performance -- double cost computation in Lua matchChildren (Low -- perf only) - -In `matchChildren`, ambiguous group costs are computed inline (lines 534-557) for assignment decisions but never stored in `session.costCache`. Then lines 604-607 recompute total cost by calling `computePairCost` for every matched pair: - -```604:608:plugin/src/Reconciler/matching.lua - local totalCost = 0 - for _, pair in ipairs(matched) do - totalCost += computePairCost(session, pair.virtualId, pair.studioInstance, virtualInstances, math.huge, depth) - end - totalCost += (#unmatchedVirtual + #unmatchedStudio) * UNMATCHED_PENALTY -``` - -This means ambiguous group pairs have their full subtree cost computed **twice**: once during the scoring loop, once during totalCost. For 1:1 fast-path pairs, cost is computed **once** (only in totalCost), which is correct. - -**Impact**: Wasted computation proportional to ambiguous group size squared. Since ambiguous groups are typically small (2-10 instances) and the depth limit caps recursion, this is acceptable. The `computePairCost` call does populate `session.costCache`, so subsequent recursive calls at deeper levels benefit. - -**Fix (deferred)**: Store the computed cost from the ambiguous scoring loop and reuse it in the totalCost sum instead of calling `computePairCost` again. - ---- - -### FINDING 5: `trueEquals` lacks fuzzy equality for compound float types (Low -- edge case) - -`trueEquals.lua` provides fuzzy float comparison for: `number`, `Color3`, `Vector3`, `Vector2`, `CFrame`. It falls through to `return false` for all other types (line 111). - -The Rust `variant_eq.rs` provides fuzzy comparison for additional float-containing types: `UDim`, `UDim2`, `NumberRange`, `NumberSequence`, `ColorSequence`, `Rect`, `PhysicalProperties`, `Ray`, `Region3`, `Float32`, `Float64`, `Font`. - -In Luau, `UDim2 == UDim2` uses `__eq` which may or may not apply float tolerance. If Roblox's `__eq` does exact comparison, two UDim2 values that differ by float precision would fail `==` and then fail `trueEquals` (which returns false for unrecognized types). This would inflate match costs slightly. - -**Impact**: Unlikely to cause wrong pairings since the inflation would be symmetric across all candidates. But it could trigger unnecessary reconciler updates (diff sees a change that isn't really a change). - -**Fix (deferred)**: Add UDim2, NumberRange, NumberSequence, Rect handlers to `trueEquals`. These are uncommon in ambiguous matching scenarios but would improve diff accuracy. - ---- - -### FINDING 6: Reconciler integration is clean (Positive) - -**hydrate.lua** (lines 33-45) correctly filters out missing virtual children before calling `matchChildren`, and passes a shared `MatchingSession` through recursive hydration: - -```32:48:plugin/src/Reconciler/hydrate.lua - -- Filter out virtual children missing from virtualInstances - local validVirtualIds: { string } = {} - for _, childId in ipairs(virtualChildIds) do - if virtualInstances[childId] then - table.insert(validVirtualIds, childId) - else - Log.warn( - "Hydration: virtualInstances missing child ID {} (parent: {} '{}')", - childId, - rootId, - virtualInstance.Name - ) - end - end - - local result = - Matching.matchChildren(session, validVirtualIds, existingChildren, virtualInstances, rootId, rootInstance) -``` - -**reify.lua** (lines 52-57) defensively handles nil virtual instances (excluded from patch): - -```52:57:plugin/src/Reconciler/reify.lua - if virtualInstance == nil then - -- This child was intentionally excluded from the patch (e.g., due to - -- ambiguous paths with duplicate-named siblings). Skip it gracefully. - return - end -``` - -**diff.lua** (line 133) uses the shared `trueEquals` module, ensuring matching and diff agree on equality: - -```133:133:plugin/src/Reconciler/diff.lua - if not trueEquals(existingValue, decodedValue) then -``` - -Session sharing through recursive hydration is correct. The `--!native` and `--!optimize 2` directives on `matching.lua` and `trueEquals.lua` ensure native codegen for hot paths. - ---- - -### FINDING 7: Test coverage is solid but lacks cross-implementation parity tests (Low) -- RESOLVED - -> **Resolved by [matching_algorithm_parity](matching_algorithm_parity_01524d4c.plan.md) Fix 6** (status: completed). Parity tests added: `parity_forward_vs_syncback` (Rust), `round_trip_matching_identity` (Rust integration), `parity_with_rust_fixture` (Lua spec). - -**Lua tests** (`matching.spec.lua`): 15+ test cases covering session caching, totalCost computation, Ref scoring, 2x2 and 3x3 ambiguous groups, recursive matching, edge cases, and now cross-implementation parity fixtures. - -**Rust forward sync tests** (`src/snapshot/matching.rs`): 12+ test cases including property-based matching, depth limit, session cache, default-omission tests, and Ref scoring. - -**Rust syncback tests** (`src/syncback/matching.rs`): 6+ test cases covering basics, class grouping, unmatched, duplicates, stability, session cache, and Ref scoring. - -**Integration test**: `ref_ambiguous_path_no_crash` and `ref_ambiguous_target_no_crash` in `tests/tests/two_way_sync.rs` verify that Ref properties with ambiguous paths don't crash. - ---- - -## Summary Table - - -| # | Finding | Severity | Status | Fix Effort | -| --- | -------------------------------------------- | -------- | -------- | ------------------ | -| 1 | Stale header comment in encodeInstance.lua | Low | RESOLVED | -- (prior session) | -| 2 | Tags/Attributes granularity divergence | Medium | RESOLVED | -- (parity plan) | -| 3 | Lua Ref identity heuristic missing in Rust | Medium | RESOLVED | -- (parity plan) | -| 4 | Double cost computation in Lua matchChildren | Low | **Fix** | Small | -| 5 | trueEquals lacks compound float types | Low | **Fix** | Small | -| 6 | Reconciler integration is clean | Positive | N/A | N/A | -| 7 | No cross-implementation parity tests | Low | RESOLVED | -- (parity plan) | - - -Additionally, the parity plan also resolved a float epsilon divergence (Fix 3: Rust `variant_eq.rs` now uses a 0.0001 epsilon matching Lua's `trueEquals`), and a VCache session-level caching optimization (Fix 5), partially mitigating Finding 4. - -**Overall assessment**: The ambiguous path handling feature is well-implemented and correct. The matching algorithm is sound, the three implementations are now fully aligned (via the parity plan fixes), and the integration points (hydrate, reify, diff) are clean. No round-trip identity violations found. - ---- - -## Actionable Fixes - -### Fix A: Eliminate double cost computation in Lua matchChildren (Finding 4) - -- **File:** `plugin/src/Reconciler/matching.lua` -- **Problem:** In `matchChildren`, the ambiguous scoring loop (lines 528-575) computes full subtree costs for each pair, but these costs are only stored in `scoredPairs` for sorting. Then the totalCost loop (lines 615-618) calls `computePairCost` for **every** matched pair (including ambiguous ones), recomputing the same costs from scratch. The `computePairCost` function does check `session.costCache`, but the ambiguous scoring loop never writes to it, so nothing is cached. -- **Solution:** Track the winning cost for each matched pair during greedy assignment and sum them directly, instead of calling `computePairCost` again. For 1:1 fast-path matches (which have no pre-computed cost), call `computePairCost` only for those. - -Concretely in `matchChildren`: - -1. Add a `matchedCosts: { [number]: number }` table (keyed by match index in `matched` array) -2. In the ambiguous greedy assignment loop (lines 585-595), store the pair's cost from `scoredPairs` alongside each match -3. In the totalCost loop, use the stored cost for ambiguous pairs and only call `computePairCost` for 1:1 fast-path pairs (which don't have a pre-computed cost) - -### Fix B: Add compound float type fuzzy equality to trueEquals (Finding 5) - -- **File:** `plugin/src/Reconciler/trueEquals.lua` -- **Problem:** `trueEquals` handles `number`, `Color3`, `Vector3`, `Vector2`, `CFrame` with fuzzy float comparison, but falls through to `return false` for `UDim`, `UDim2`, `NumberRange`, `NumberSequence`, `ColorSequence`, `Rect`. Since these types contain floats, Luau's `==` operator may fail on precision differences, causing phantom diffs in both matching and diff. -- **Solution:** Add handlers before the final `return false` (line 111): - - `UDim2`: decompose via `.X.Scale`, `.X.Offset`, `.Y.Scale`, `.Y.Offset` -- fuzzyEq on Scale, exact on Offset (integer) - - `UDim`: decompose via `.Scale`, `.Offset` -- fuzzyEq on Scale, exact on Offset - - `NumberRange`: fuzzyEq on `.Min`, `.Max` - - `Rect`: fuzzyEq on `.Min.X`, `.Min.Y`, `.Max.X`, `.Max.Y` - - `NumberSequence`: compare `.Keypoints` length, then per-keypoint fuzzyEq on `.Time`, `.Value`, `.Envelope` - - `ColorSequence`: compare `.Keypoints` length, then per-keypoint fuzzyEq on `.Time` + color3Eq on `.Value` - -These match the Rust `variant_eq.rs` coverage exactly. \ No newline at end of file diff --git a/.cursor/plans/audit_ambiguous_paths_followup_00831072.plan.md b/.cursor/plans/audit_ambiguous_paths_followup_00831072.plan.md deleted file mode 100644 index f83f38e2..00000000 --- a/.cursor/plans/audit_ambiguous_paths_followup_00831072.plan.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -name: audit ambiguous paths followup -overview: Production audit of the ambiguous-paths branch against origin/master. Documents critical round-trip issues, approved fixes, accepted limitations, and required regression tests for implementation in a follow-up Agent-mode session. -todos: - - id: fix-metadata-drift - content: "Fix 1: Update dedup cleanup rename flow to keep tree metadata/path indexes in sync" - status: completed - - id: fix-batch-removal-dedup - content: "Fix 2: Exclude co-removed siblings from dedup cleanup sibling enumeration" - status: completed - - id: fix-added-paths - content: "Fix 3: Extend added_paths in api.rs to include middleware extension and dedup suffix" - status: completed - - id: fix-ref-path-final - content: "Fix 4: Complete Phase 2 of previous audit Fix 3 -- pass final_paths to collect_referents instead of global text rewrite" - status: completed - - id: fix-regression-tests - content: "Fix 5: Add regression tests for Fixes 1-4" - status: completed -isProject: false ---- - -# Ambiguous Paths Audit Fix Plan - -> This plan was generated by `/audit` from a Plan-mode session. -> Refer to `.cursor/rules/atlas.mdc` for full project standards. - -## Standards - -These standards govern every fix in this plan. An implementer MUST read `.cursor/rules/atlas.mdc` before starting. - -### Round-Trip Identity (from `atlas.mdc` §Quality Standard) - -Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a bit-identical instance tree -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -### CLI Syncback Parity (from `atlas.mdc` §Two-Way Sync Strategy) - -Plugin-based sync must produce exactly the same filesystem output that `atlas syncback` would give for the same input. Byte-for-byte identical files, identical directory structures, identical naming. Any divergence is a bug until proven otherwise. - -### Code Quality (from `atlas.mdc` §Code Quality Standard) - -DRY code that is easy to reason about and hard to get wrong. Small helper refactors are in scope; major pipeline redesign is deferred. - -## Context - -Audited branch `ambiguous-paths` against `origin/master` using commit range `origin/master..HEAD`. - -Primary findings: - -- Critical path drift in dedup cleanup rename flow (`[src/change_processor.rs](d:/UserGenerated/rojo/src/change_processor.rs)`). -- Critical batch-removal dedup cleanup counts co-removed siblings as "remaining", defeating group-to-1 cleanup (`[src/change_processor.rs](d:/UserGenerated/rojo/src/change_processor.rs)`). -- Critical same-batch Ref target path synthesis mismatch for added instances (`[src/web/api.rs](d:/UserGenerated/rojo/src/web/api.rs)`). -- Critical ref-path post-processing strategy relies on global text replacement (`[src/syncback/mod.rs](d:/UserGenerated/rojo/src/syncback/mod.rs)`, `[src/syncback/fs_snapshot.rs](d:/UserGenerated/rojo/src/syncback/fs_snapshot.rs)`). -- Known limitation accepted for this release: duplicate-named children under ProjectNode currently skipped in `[src/snapshot_middleware/project.rs](d:/UserGenerated/rojo/src/snapshot_middleware/project.rs)`. -- Known limitation accepted for this release: greedy matcher is not globally optimal (`[src/snapshot/matching.rs](d:/UserGenerated/rojo/src/snapshot/matching.rs)`, `[src/syncback/matching.rs](d:/UserGenerated/rojo/src/syncback/matching.rs)`, `[plugin/src/Reconciler/matching.lua](d:/UserGenerated/rojo/plugin/src/Reconciler/matching.lua)`). - -## Fixes - -Each fix below was approved by the user during the audit quiz. Implement in order. - -### Fix 1: Keep tree metadata consistent after dedup cleanup rename - -- **Status:** Approved -- **Finding:** Step 2d / Step 8 (rename/delete interactions + VFS suppression) -- **Files:** `[src/change_processor.rs](d:/UserGenerated/rojo/src/change_processor.rs)` -- **Problem:** In dedup cleanup (`~1073-1203`), the code renames files (`fs::rename`) and suppresses both old/new paths, but does not update the renamed sibling's `InstigatingSource::Path` or metadata path indexes. Subsequent writes can target stale paths. -- **Solution:** After successful `DedupCleanupAction::RemoveSuffix` / `PromoteLowest`, locate the sibling instance being renamed, update its metadata source path and relevant path indexes in-memory, and keep suppression counters consistent with the updated path. -- **Risk:** Medium; touches tree mutation bookkeeping and rename lifecycle. -- **Verify round-trip:** Create duplicate siblings (`Foo`, `Foo~1`), delete `Foo`, ensure `Foo~1 -> Foo` rename occurs, then issue a property update to the survivor in same session and verify disk write targets new path and survives rebuild. -- **Verify syncback parity:** Compare output of two-way deletion flow to CLI syncback on equivalent tree state; both must produce the same remaining filename/meta layout. -- **Tests required:** - - Rust integration test in `[tests/tests/two_way_sync.rs](d:/UserGenerated/rojo/tests/tests/two_way_sync.rs)` covering delete-triggered dedup cleanup followed by update. - - Optional focused unit test around cleanup metadata path update helper in `[src/change_processor.rs](d:/UserGenerated/rojo/src/change_processor.rs)`. - -### Fix 2: Exclude co-removed siblings from dedup cleanup sibling enumeration - -- **Status:** Approved -- **Files:** `[src/change_processor.rs](d:/UserGenerated/rojo/src/change_processor.rs)` -- **Problem:** In the dedup cleanup loop (lines 1077-1203), the sibling enumeration (line 1120) only skips `sibling_ref == removed_id` -- the single instance being processed in the current iteration. It does NOT skip other instances that are also in `patch_set.removed_instances`. When multiple siblings from the same dedup group are removed in a single patch, the co-removed instances are incorrectly counted as "remaining", inflating the sibling count and defeating cleanup rules. -- **Failure path:** Remove `Foo` (A) and `Foo~1` (B) from a group of 3, leaving `Foo~2` (C) as the sole survivor. api.rs deletes all files first. In the dedup cleanup loop, iteration for A finds B and C as remaining (count=2), so group-to-1 does not fire; instead `PromoteLowest` tries to rename the already-deleted `Foo~1` → `Foo` (fails). Iteration for B finds A and C as remaining (count=2), group-to-1 again does not fire. Result: C keeps its `~2` suffix permanently when it should have been renamed to `Foo`. -- **Solution:** Before the dedup cleanup loop, build a `HashSet` from `patch_set.removed_instances`. In the sibling enumeration (line 1121), change the skip condition from `sibling_ref == removed_id` to `removed_set.contains(&sibling_ref)`: - -```rust -let removed_set: HashSet = patch_set.removed_instances.iter().copied().collect(); - -// ... inside sibling loop: -for &sibling_ref in parent_inst.children() { - if removed_set.contains(&sibling_ref) { - continue; - } - // ... rest of sibling processing -} -``` - -- **Risk:** Low; narrow, mechanical change. The HashSet construction is O(n) and the lookup is O(1). -- **Verify round-trip:** Remove 2 of 3 duplicate siblings via two-way sync. Verify the sole survivor has its dedup suffix removed and survives rebuild with the clean name. -- **Verify syncback parity:** N/A (dedup cleanup is a two-way sync operation only). -- **Tests required:** - - Rust integration test in `[tests/tests/two_way_sync.rs](d:/UserGenerated/rojo/tests/tests/two_way_sync.rs)`: batch-remove 2 of 3 same-named siblings, verify survivor is renamed from `Foo~2` to `Foo`. - - Edge test: batch-remove ALL members of a dedup group (no survivor); verify no spurious rename attempts. - -### Fix 3: Build correct same-batch added Ref paths - -- **Status:** Approved -- **Lineage:** Extends `ambiguous_paths_audit_fixes_9d3ed6da` Fix 2 (completed), which replaced `escape_ref_path_segment` with `slugify_name` in `added_paths` but explicitly acknowledged the missing extension as a limitation. The current code at lines 637-641 of `api.rs` uses `slugify_name`; this fix adds the remaining segments. -- **Finding:** Step 2a / Step 10 (plugin->server wire format and write processing) -- **Files:** `[src/web/api.rs](d:/UserGenerated/rojo/src/web/api.rs)` -- **Problem:** `added_paths` map (`~622-649`) uses only slugified instance name (from the previous fix); it still omits middleware extension and dedup suffix. `syncback_updated_properties` then writes incorrect `Rojo_Ref_`* when target is newly added in same request (`~2694-2706`). -- **Solution:** Extend the existing `added_paths` builder (lines 637-649) to derive the full filesystem name: slugified name + middleware extension based on `added.class_name` and `added.children.is_empty()` + dedup suffix if colliding with siblings. Reuse `tentative_fs_name` logic from `ref_properties.rs` or the shared helper from the Deferred Refactors section. -- **Risk:** Medium; affects same-request Ref persistence edge path. -- **Verify round-trip:** Send `/api/write` with add(target script/model) + update(ref property pointing to target) in one batch; verify persisted path includes correct segment (`.server.luau`, `.model.json5`, or dedup suffix) and resolves after rebuild. -- **Verify syncback parity:** Run equivalent scenario via CLI syncback fixture and compare written `Rojo_Ref_`* attribute string. -- **Tests required:** - - Rust integration test in `[tests/tests/two_way_sync.rs](d:/UserGenerated/rojo/tests/tests/two_way_sync.rs)` for same-batch add+ref on file-backed and directory-backed targets. - - Edge test for dedup suffix target (e.g., `Foo~1`). - -### Fix 4: Complete attribute-scoped final paths (previously incomplete) - -- **Status:** Approved -- **Finding:** Step 2a / Step 9 / Step 11h (round-trip identity, parity, determinism) -- **Lineage:** `ambiguous_paths_audit_fixes_9d3ed6da` Fix 3 defined a two-phase fix. Phase 1 (correct misleading comment) was completed -- visible at lines 194-199 of `ref_properties.rs`. Phase 2 (pass `final_paths` to `collect_referents`) was NOT completed despite the todo being marked "completed". The API was prepared (`final_paths: Option<&HashMap>` parameter exists at line 188 of `ref_properties.rs`) but the call site at line 177 of `mod.rs` still passes `None`. The `ref_path_map` infrastructure was built by `ref_path_and_dedup_integration_81a47dfe` and is populated during the syncback walk (used at lines 614-637 of `mod.rs` for the text replacement). This fix completes that unfinished Phase 2. -- **Files:** `[src/syncback/mod.rs](d:/UserGenerated/rojo/src/syncback/mod.rs)`, `[src/syncback/ref_properties.rs](d:/UserGenerated/rojo/src/syncback/ref_properties.rs)`, `[src/syncback/fs_snapshot.rs](d:/UserGenerated/rojo/src/syncback/fs_snapshot.rs)` -- **Problem:** `collect_referents(&new_tree, &pre_prune_paths, None)` is called at line 177 of `mod.rs` BEFORE the syncback walk that populates `ref_path_map`. The `None` means tentative paths (without dedup suffixes) are written into `Rojo_Ref_`* attributes. Then the post-hoc `fix_ref_paths` (lines 614-637) performs global text replacement across entire meta/model file contents to substitute tentative paths with final dedup'd paths. This is not attribute-scoped and can alter unrelated strings that happen to contain the same substring as a tentative path. -- **Existing infrastructure to build on:** - 1. `collect_referents` already accepts `final_paths: Option<&HashMap>` (line 188 of `ref_properties.rs`). - 2. `ref_path_map` is already populated during the syncback walk with `(Ref, final_path)` entries. - 3. `tentative_fs_path_public` is already used at line 623 of `mod.rs` to compute tentative paths for the substitution diff. -- **Solution:** Move the `collect_referents` call from line 177 (before the syncback walk) to after the walk completes (after line 612). Pass `Some(&ref_path_map.borrow())` instead of `None`. Then remove or guard the `fix_ref_paths` block (lines 614-637) -- it should no longer be needed for any path that has a `final_paths` entry. -- **Ordering constraint:** `collect_referents` is currently called before property filtering (lines 179-198). Moving it after the syncback walk means it runs after filtering. Verify that `collect_referents` does not depend on properties that are removed by filtering (it should not -- it only reads Ref-type properties, which are not in the filtered set unless `ignore_referents` is true, in which case refs are skipped entirely). -- **Risk:** Medium; changes the ordering of the syncback pipeline. The infrastructure is already in place, reducing implementation risk. -- **Verify round-trip:** Scenario with duplicate-named ref target and non-ref string property containing same substring as tentative path; ensure only `Rojo_Ref_`* changes and non-ref string is untouched. -- **Verify syncback parity:** Compare CLI syncback and two-way outputs for refs targeting dedup-suffixed instances; paths must be byte-identical. -- **Tests required:** - - Rust integration test in `[tests/tests/syncback_roundtrip.rs](d:/UserGenerated/rojo/tests/tests/syncback_roundtrip.rs)` validating non-ref string preservation while refs are rewritten correctly. - - Rust integration test in `[tests/tests/two_way_sync.rs](d:/UserGenerated/rojo/tests/tests/two_way_sync.rs)` for dedup-aware ref persistence without text rewrite side effects. - -### Fix 5: Add regression coverage for approved fixes - -- **Status:** Approved -- **Finding:** Step 13 (missing coverage) -- **Files:** `[tests/tests/two_way_sync.rs](d:/UserGenerated/rojo/tests/tests/two_way_sync.rs)`, `[tests/tests/syncback_roundtrip.rs](d:/UserGenerated/rojo/tests/tests/syncback_roundtrip.rs)`, optionally helper fixtures under `[rojo-test/syncback-tests](d:/UserGenerated/rojo/rojo-test/syncback-tests)`. -- **Problem:** Current tests do not fully guard the four approved bug classes. -- **Solution:** Add targeted regression tests tied to Fixes 1-4 and ensure they fail pre-fix and pass post-fix. -- **Risk:** Low. -- **Verify round-trip:** Covered by added integration scenarios. -- **Verify syncback parity:** Add assertions comparing resulting file paths/attribute values against expected CLI-format output. -- **Tests required:** - - All tests listed under Fixes 1-4. - - One deterministic re-run assertion (second run no changes) for affected scenarios. - -## Skipped Fixes - -### Skipped: ProjectNode duplicate-child handling rewrite - -- **Finding:** Step 2d / Step 11k -- **Problem:** Duplicate-named children under ProjectNode are currently skipped with warnings (`[src/snapshot_middleware/project.rs](d:/UserGenerated/rojo/src/snapshot_middleware/project.rs)` around `~587-683`). -- **Reason skipped:** User accepted as release limitation for now. - -### Skipped: Globally optimal matcher replacement - -- **Finding:** Step 11h (determinism/assignment quality) -- **Problem:** Greedy assignment may produce suboptimal pairing in rare ambiguous groups. -- **Reason skipped:** User accepted greedy behavior for this release. - -## Accepted Limitations - -- **Limitation:** ProjectNode duplicate-named children are skipped during syncback. -- **Scenario:** Under project-backed nodes, duplicate names are detected and omitted from child maps; warning logged. -- **User decision:** Accepted for this release. -- **Mitigation:** Keep explicit warning logs; add failing acceptance test (below) to track until fixed. -- **Limitation:** Greedy matching is not globally optimal. -- **Scenario:** Ambiguous duplicate groups can choose a local minimum causing rename churn. -- **User decision:** Accepted for this release. -- **Mitigation:** Add stress/failing test for known counterexample and keep deterministic tie behavior. - -## Deferred Refactors - -- Consolidate filesystem-segment derivation into one shared helper used by `[src/rojo_ref.rs](d:/UserGenerated/rojo/src/rojo_ref.rs)`, `[src/snapshot/tree.rs](d:/UserGenerated/rojo/src/snapshot/tree.rs)`, and `[src/web/api.rs](d:/UserGenerated/rojo/src/web/api.rs)` to eliminate duplicate naming logic. *(Continuing from `ambiguous_paths_audit_fixes_9d3ed6da` Deferred Refactors -- still open.)* -- Revisit optimal assignment algorithm for large ambiguous groups (major rewrite; out of current scope). *(Continuing from `ambiguous_paths_audit_fixes_9d3ed6da` Deferred Refactors -- still open.)* -- Phase 2e matching cache from the original plan (`ambiguous_path_handling_f2eaef11`): add optional cache mapping `parent_ref -> (children_list_hash, match_assignments)` to avoid re-running the full algorithm when children haven't changed. Optimization only, not needed for correctness. *(Never completed or cancelled across any subsequent plan -- explicitly deferred here.)* - -## Test Plan - -### Rust Unit Tests (`#[cfg(test)]`) - -- Dedup cleanup metadata update helper behavior after rename (Fix 1). -- Added-path segment generation helper returns correct extension/suffix across middleware types (Fix 3). - -### Rust Integration Tests (`tests/tests/`) - -- Delete base dedup name then update promoted sibling in same serve session; verify writes hit new path and persist after rebuild (Fix 1). -- Batch-remove 2 of 3 same-named siblings; verify sole survivor is renamed from `Foo~2` to `Foo` (Fix 2). -- Batch-remove all members of a dedup group; verify no spurious rename attempts (Fix 2). -- Same `/api/write` request: add target + set Ref to target, verify persisted path includes expected extension/suffix (Fix 3). -- Ref rewrite safety: non-ref string fields are unchanged while `Rojo_Ref_`* gets final dedup path (Fix 4). - -### Lua Spec Tests (`.spec.lua`) - -- No mandatory Lua-side changes for approved fixes; optional guard test for same-batch add+ref behavior if plugin-side helper touched. - -### Snapshot Tests (`insta`) - -- Add or update syncback snapshot fixture showing final dedup-aware `Rojo_Ref_`* output without incidental string changes (Fix 4). - -### Failing Tests for Known Limitations - -- ProjectNode duplicate-named child round-trip identity test asserting correct behavior (expected to fail until limitation removed). -- Ambiguous-group matching counterexample test asserting globally optimal pairing (expected to fail with greedy algorithm). - -## Test Rules - -### For bugs found and fixed - -- Each approved bug fix must have a regression test that fails pre-fix and passes post-fix. - -### For missing coverage identified - -- Add coverage in affected layer(s); investigate any unexpected failure as a potential additional bug. - -### For known limitations (Accepted Limitations section) - -- Write correctness-asserting tests even if they fail now. -- Leave them failing (do not ignore), to serve as future acceptance criteria. - -### Scope - -- Cover both persistence correctness (filesystem outputs) and in-memory tree consistency where applicable. - -## Final Step: Run CI - -After implementing all approved fixes and tests, run `/ci` and require a clean pass before considering this plan complete. \ No newline at end of file diff --git a/.cursor/plans/audit_ref_path_system_c21fc130.plan.md b/.cursor/plans/audit_ref_path_system_c21fc130.plan.md deleted file mode 100644 index ed4c8235..00000000 --- a/.cursor/plans/audit_ref_path_system_c21fc130.plan.md +++ /dev/null @@ -1,185 +0,0 @@ ---- -name: Audit Ref Path System -overview: Audit the Luau-style ref path system (rojo_ref.rs, tree.rs, patch_apply.rs, change_processor.rs, ref_properties.rs, api.rs, meta.rs) for round-trip correctness, resolution consistency, and edge-case safety. -todos: - - id: roundtrip - content: Verify compute_relative_ref_path <-> resolve_ref_path_to_absolute round-trip for all prefix classes - status: completed - - id: dual-resolution - content: Verify resolve_ref_path (tree.rs) and resolve_ref_path_to_absolute (rojo_ref.rs) produce identical results - status: completed - - id: priority - content: Audit Rojo_Ref_ vs Rojo_Target_ priority handling in patch_apply.rs - status: completed - - id: cleanup - content: Verify attribute cleanup completeness after ref resolution - status: completed - - id: fs-name-consistency - content: Audit filesystem_name_for vs ref_target_path_from_tree consistency - status: completed - - id: index-correctness - content: Audit RefPathIndex operations (populate, find_by_prefix, update_prefix, rename_file) - status: completed - - id: rename-fixup - content: Audit update_ref_paths_after_rename path reconstruction logic - status: completed - - id: placeholder - content: Audit placeholder system in CLI syncback (uniqueness, substitution order, fallback) - status: completed - - id: added-paths - content: Audit added_paths same-batch ref handling in api.rs (extensions, dedup suffixes) - status: completed - - id: test-gaps - content: Identify test coverage gaps and flag missing scenarios - status: completed -isProject: false ---- - -# Audit: Ref Path System (Luau-Style Ref Paths) - -## Scope - -The ref path system converts Roblox `Ref` properties (like `Model.PrimaryPart`) into filesystem-path-based `Rojo_Ref_*` attributes using Luau require-by-string syntax (`@self`, `./`, `../`, `@game/`). This audit covers: - -- Path generation: `[src/rojo_ref.rs](src/rojo_ref.rs)` (`compute_relative_ref_path`, `ref_target_path_from_tree`) -- Path resolution: `[src/rojo_ref.rs](src/rojo_ref.rs)` (`resolve_ref_path_to_absolute`), `[src/snapshot/tree.rs](src/snapshot/tree.rs)` (`resolve_ref_path`, `walk_segments`, `get_instance_by_path`, `filesystem_name_for`) -- Forward sync application: `[src/snapshot/patch_apply.rs](src/snapshot/patch_apply.rs)` (`finalize_patch_application`, `defer_ref_properties`) -- Syncback generation: `[src/syncback/ref_properties.rs](src/syncback/ref_properties.rs)` (`collect_referents`, `tentative_fs_path`) -- Two-way sync: `[src/web/api.rs](src/web/api.rs)` (`syncback_updated_properties`, `added_paths`) -- Rename updates: `[src/change_processor.rs](src/change_processor.rs)` (`update_ref_paths_after_rename`), `[src/syncback/meta.rs](src/syncback/meta.rs)` (`update_ref_paths_in_file`) -- Index: `[src/rojo_ref.rs](src/rojo_ref.rs)` (`RefPathIndex`) - -## Audit Methodology - -Evaluate each area against the **round-trip identity invariant**: syncback writes `Rojo_Ref_`* paths, forward sync resolves them back to the same `Ref` targets. Any code path where a ref target can be lost, silently changed, or fail to resolve is a bug. - -## Audit Areas - -### 1. Round-Trip: `compute_relative_ref_path` <-> `resolve_ref_path_to_absolute` - -**Files:** `src/rojo_ref.rs` lines 205-289 - -Verify the compute/resolve pair is bijective for all prefix classes: - -- `@self` / `@self/...` -- descendant paths -- `./...` -- sibling paths (1 up) -- `../...` chains -- 2+ levels up within same service -- `@game/...` -- cross-service / ancestor refs -- Bare paths (no prefix) -- legacy fallback - -**Specific checks:** - -- `compute_relative_ref_path` uses **case-sensitive** common-prefix detection (line 222: `a == b`), but `resolve_ref_path` / `walk_segments` uses **case-insensitive** matching (line 365: `eq_ignore_ascii_case`). This asymmetry is safe only if path generation always uses canonical filesystem case. Verify this invariant holds across all callers of `ref_target_path_from_tree`. -- When `remaining_parts.is_empty()` (target is ancestor of source), falls through to `@game/` (line 231-233). Verify `resolve_ref_path_to_absolute` handles this correctly. -- Empty `source_abs` or `target_abs` edge cases. - -### 2. Dual Resolution: `resolve_ref_path` (tree.rs) vs `resolve_ref_path_to_absolute` (rojo_ref.rs) - -**Files:** `src/snapshot/tree.rs` lines 300-389, `src/rojo_ref.rs` lines 254-289 - -Two independent implementations resolve relative paths: - -- `resolve_ref_path` (tree.rs) -- walks the live `RojoTree`, used during forward sync -- `resolve_ref_path_to_absolute` (rojo_ref.rs) -- pure string manipulation, used by `RefPathIndex` and `update_ref_paths_in_file` - -Verify they handle **all prefix variants identically**: - -- `../` prefix: tree.rs pops to grandparent THEN walks rest. rojo_ref.rs pops source + parent from parts THEN processes rest. Both handle subsequent `..` in rest via loop. -- Edge case: `../` on a root-level instance (1 segment in `source_abs`). `resolve_ref_path_to_absolute` does `p.pop(); p.pop()?` -- the second pop returns `None`. `resolve_ref_path` checks `grandparent.is_none()`. Both return None. Consistent. -- Empty rest after prefix strip: e.g., `"@self/"` → empty rest. tree.rs: `walk_segments(source, "")` returns `Some(source)`. rojo_ref.rs: no segments to iterate, returns `source_abs`. Consistent (equivalent to `@self`). - -### 3. Priority: `Rojo_Ref_`* vs `Rojo_Target_`* in Forward Sync - -**File:** `src/snapshot/patch_apply.rs` lines 110-205, 321-360 - -In `defer_ref_properties`: both `Rojo_Ref_`* and `Rojo_Target_`* are collected into **separate** maps without deduplication. In `finalize_patch_application`: `attribute_refs_to_rewrite` (Target) runs first (line 131), then `path_refs_to_rewrite` (Ref) runs second (line 144), **overwriting** the Target result. - -**Finding:** Priority is correct (`Rojo_Ref_`* wins) but implemented via **execution order**, not explicit logic. If the blocks are reordered, priority silently flips. Consider whether this warrants a code comment or explicit dedup in `defer_ref_properties`. - -### 4. Attribute Cleanup Completeness - -**File:** `src/snapshot/patch_apply.rs` lines 171-202 - -After resolution, `instances_needing_attr_cleanup` triggers removal of all `Rojo_Id`, `Rojo_Target_`*, and `Rojo_Ref_`* attributes. Verify: - -- Both `defer_ref_properties` code paths (Rojo_Target_ and Rojo_Ref_) add to `instances_needing_attr_cleanup`. -- Rojo_Id is also added (line 357). -- Cleanup iterates ALL attributes and removes matches by prefix -- catches attributes even if they weren't in the rewrite maps (e.g., orphaned attributes). -- Check: does an update patch also trigger defer_ref_properties? Yes (line 310). - -### 5. `filesystem_name_for` Consistency - -**File:** `src/snapshot/tree.rs` lines 394-418 - -This function is the **ground truth** for path segment names during forward sync. Verify: - -- `InstigatingSource::Path` -- returns filename from disk. Correct: includes extension, dedup suffix, slugified name. -- `InstigatingSource::ProjectNode` -- returns instance name. Correct: project nodes are services or named containers, not files. -- No `instigating_source` -- falls back to instance name. This happens for newly-added instances (two-way sync). Verify this fallback doesn't break ref path resolution for refs pointing at just-added instances. -- `ref_target_path_from_tree` (rojo_ref.rs lines 140-191) independently reimplements the same logic. Check for consistency: both use `meta.instigating_source`, both have the same ProjectNode vs Path branching. - -### 6. `RefPathIndex` Correctness - -**File:** `src/rojo_ref.rs` lines 339-511 - -- `populate_from_dir` (line 400): scans filesystem directly (bypassing VFS), reads JSON5 files, resolves relative paths to absolute. The `source_abs` comes from `tree.get_ids_at_path`. **Edge case:** orphaned meta file (no tree entry) gets `source_abs = ""`, which corrupts relative path resolution (e.g., `"./Sibling"` resolves to `"Sibling"` instead of `"Service/Parent/Sibling"`). Low severity since orphaned meta files shouldn't exist during normal serve sessions. -- `find_by_prefix` (line 464): checks exact match OR prefix-with-slash. Correct. No false positives from segment-prefix overlap (e.g., `"Workspace/Foo"` won't match `"Workspace/FooBar"`). -- `update_prefix` (line 491): merges file sets when new key already exists. Correct for convergent renames. -- `rename_file` (line 481): updates filesystem paths in all entries. O(n) scan -- acceptable since called rarely. - -### 7. `update_ref_paths_after_rename` Path Fixup - -**File:** `src/change_processor.rs` lines 429-540 - -When the indexed file path no longer exists (directory was renamed), this code tries to reconstruct the new path by replacing the old directory segment with the new one in the PathBuf components (lines 462-497). - -**Checks:** - -- Only replaces the **first** occurrence. If the old segment appears in multiple path components (e.g., `src/Foo/Foo/file.meta.json5`), only the first gets replaced. This is correct for single-level renames but could fail for deeply nested same-named directories. **Low severity** since dedup suffixes prevent truly identical sibling names. -- Handles both plain name and slugified name variants (lines 448-484). -- After updating files, updates the index with both `update_prefix` and `rename_file` (lines 532-540). The zip iteration assumes `original_paths` and `files_to_check` have the same length and order -- they do since `files_to_check` is a 1:1 map of the originals. - -### 8. Placeholder System (CLI Syncback) - -**Files:** `src/syncback/ref_properties.rs`, `src/syncback/mod.rs`, `src/syncback/fs_snapshot.rs` - -Placeholders (`__ROJO_REF__TO_`__) are written during the syncback walk before dedup suffixes are known, then substituted with final relative paths. - -**Checks:** - -- Placeholder uniqueness: encodes both source and target Refs. Unique per (source, target) pair. -- Substitution in `fix_ref_paths`: verify it handles placeholders appearing in both meta and model files. -- Length-descending sort prevents partial prefix matches (e.g., `__ROJO_REF_A_TO_B`__ won't partially match `__ROJO_REF_A_TO_BC_`_ if the longer one is processed first). -- Fallback: if final path not in `ref_path_map`, falls back to `tentative_fs_path_public()`. Verify this fallback produces a valid path. - -### 9. Two-Way Sync: `added_paths` for Same-Batch Refs - -**File:** `src/web/api.rs` - -When the plugin adds instances and sets Ref properties targeting them in the same `/api/write` request, `added_paths` pre-computes filesystem paths. Verify: - -- `added_instance_fs_segment` mirrors `tentative_fs_name` logic from ref_properties.rs. -- Paths include correct extensions (`.server.luau`, `.luau`, `.model.json5`, no extension for folders). -- Dedup suffixes are NOT included in `added_paths` (the instance hasn't been written yet), which could cause the ref path to mismatch if the actual write adds a dedup suffix. - -### 10. Test Coverage Assessment - -**Files:** `src/rojo_ref.rs` (tests), `tests/tests/two_way_sync.rs`, `tests/tests/syncback.rs` - -Existing tests cover: basic ref write, nil ref, target change, rename update, same-batch add, dedup cleanup, RefPathIndex population, relative path round-trips (100+ cases). - -**Gaps to check:** - -- Multi-level ancestor renames (rename grandparent, verify ref 3 levels down updates) -- Cross-nested-project refs -- Refs where source and target are in the same dedup group -- `../` chains exceeding 2 levels -- Unicode instance names in ref paths - -## Severity Scale - -- **Critical** -- Round-trip identity violated; ref targets silently lost or changed -- **High** -- Refs fail to resolve in specific but reproducible scenarios -- **Medium** -- Code fragility or missing error handling that could cause future regressions -- **Low** -- Minor edge cases, code quality, or documentation gaps - diff --git a/.cursor/plans/audit_ref_two-way_sync_9e8ce7a8.plan.md b/.cursor/plans/audit_ref_two-way_sync_9e8ce7a8.plan.md deleted file mode 100644 index 4e6aef92..00000000 --- a/.cursor/plans/audit_ref_two-way_sync_9e8ce7a8.plan.md +++ /dev/null @@ -1,420 +0,0 @@ ---- -name: Audit Ref Two-Way Sync -overview: "Production-grade audit of the two-way sync Ref property feature. The invariant: for every Ref property change (set, change target, set to nil), the filesystem must represent the Ref as a Rojo_Ref_* path-based attribute such that building an rbxl from the filesystem and forward-syncing it back produces a bit-identical Ref target. Every audit item is evaluated against this round-trip fidelity standard." -todos: - - id: round-trip-identity - content: "Verify round-trip identity for all Ref lifecycle paths: set, nil, change target, ObjectValue.Value, script ref, stale path after rename" - status: completed - - id: plugin-encoding - content: "Audit plugin-side encoding: propertyFilter, encodePatchUpdate, createPatchSet, encodeInstance, ChangeBatcher for Ref correctness" - status: completed - - id: server-resolution - content: "Audit server-side path resolution: syncback_updated_properties, filter_properties_for_meta, merge_or_build_meta, handle_api_write nil Ref conversion" - status: completed - - id: forward-sync - content: "Audit forward-sync: compute_ref_properties, patch_apply defer/finalize, decodeValue.lua for Rojo_Ref_* attribute resolution" - status: completed - - id: existing-ref-systems - content: "Audit interaction with legacy Rojo_Target_*/Rojo_Id system: coexistence, priority, DRY concerns" - status: completed - - id: meta-lifecycle - content: "Audit meta file lifecycle with Refs: creation, merge, update, deletion, orphaned attributes" - status: completed - - id: path-correctness - content: "Audit path computation: full_path_of/get_instance_by_path inverse consistency, instance names containing /, deep nesting, root target" - status: completed - - id: encode-instance-leak - content: "Audit encodeInstance.lua Ref leak: Ref no longer in UNENCODABLE_DATA_TYPES means Refs reach encodeProperty and fail via pcall instead of explicit filter" - status: completed - - id: vfs-echo - content: Verify suppress_path() is called on all meta/model file writes with Rojo_Ref_* attributes (all 4 format branches) - status: completed - - id: syncback-parity - content: "Verify two-way sync Ref output matches CLI syncback output: same attribute format, same path format, same nil handling, shared helpers" - status: completed - - id: msgpack-wire - content: "Verify Variant::Ref msgpack round-trip: plugin { Ref = hexid } deserializes to correct Ref, Ref::none() round-trips as Ref(None)" - status: completed - - id: edge-cases - content: "Audit edge cases: ProjectNode targets, nested projects, concurrent changes, non-existent property names, multiple instances" - status: completed - - id: known-limitations - content: "Verify known limitations are documented and handled gracefully: ambiguous paths, stale paths, no immediate ID for new instances" - status: completed - - id: prove-stale-path - content: "Write ignored regression tests proving stale-path-after-rename bug: set Ref, rename target, assert stored path updated (should fail)" - status: completed - - id: prove-untracked-ref - content: "Write ignored regression tests proving untracked-instance-ref-dropped bug: add instance + set Ref to it in same batch, assert Ref persisted (should fail)" - status: completed - - id: prove-missing-instancemap - content: "Write ignored Lua spec test proving ServeSession.lua:738 missing instanceMap arg: call encodePatchUpdate without 4th arg, assert Ref encoded (should fail)" - status: completed - - id: test-coverage - content: Review test coverage against audit areas, flag gaps with specific test descriptions - status: completed - - id: write-report - content: "Produce final audit report: critical issues, correctness concerns, missing coverage, known limitations, code quality items" - status: completed -isProject: false ---- - -# Audit: Two-Way Sync Ref Properties -- Round-Trip Fidelity - -## Quality Standard - -> **Round-trip identity**: Two-way sync writes a `Rojo_Ref_`* attribute to a meta/model file. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical Ref target** -- same property name, same target instance. Any deviation is a bug. - -Every audit item below must be evaluated against this standard. If there is ANY code path where a Ref property can be lost, point to the wrong target, or silently become nil through a two-way-sync + rebuild cycle, flag it as **critical**. - -## Code Quality Standard - -Watch for duplicated logic between [ref_properties.rs](src/syncback/ref_properties.rs) (CLI syncback bulk mode) and [api.rs](src/web/api.rs) (two-way sync per-instance mode). Both compute paths and format `Rojo_Ref_`* attributes. The shared helpers in [rojo_ref.rs](src/rojo_ref.rs) should be the single source of truth. - ---- - -## 1. Round-Trip Identity Verification - -Trace the **complete lifecycle** of a Ref property through every path. - -### 1a. Set PrimaryPart Round-Trip - -Concrete example: `Model.PrimaryPart = Part1` (Part1 is at `Workspace/TestModel/Part1`). - -- **Plugin encodes**: reads `instance.PrimaryPart` -> Instance -> `instanceMap.fromInstances[Part1]` -> server Ref ID -> `{ Ref = "hexid" }` -- **Server receives**: `Variant::Ref(part1_ref)` in `changed_properties` -- **Server writes**: `syncback_updated_properties` extracts Ref, computes path via `full_path_of`, writes `Rojo_Ref_PrimaryPart = "Workspace/TestModel/Part1"` to `init.meta.json5` -- **Server applies**: PatchSet includes `PrimaryPart = Variant::Ref(part1_ref)` to in-memory tree -- **Forward sync reads**: `compute_ref_properties` finds `Rojo_Ref_PrimaryPart` attribute, calls `get_instance_by_path("Workspace/TestModel/Part1")`, resolves to `Variant::Ref` -- **Verify**: Is the resolved Ref the same target instance? Does `full_path_of` produce a path that `get_instance_by_path` can resolve back? Any off-by-one in root handling? - -### 1b. Nil PrimaryPart Round-Trip - -`Model.PrimaryPart = nil`: - -- **Plugin encodes**: reads nil -> `{ Ref = "000...0" }` -- **Server receives**: `Variant::Ref(Ref::none())` -- **handle_api_write converts**: nil Ref -> `None` (property removal) in PatchSet -- **Server writes**: `remove_attributes` includes `"Rojo_Ref_PrimaryPart"` -- **Server applies**: property removed from in-memory tree -- **Forward sync reads**: no `Rojo_Ref_PrimaryPart` attribute -> no PrimaryPart property -- **Verify**: Is the nil Ref -> `None` conversion in `handle_api_write` correct? Does `merge_or_build_meta` actually remove the attribute? Does `remove_attributes` run BEFORE `new_attributes` merge (ordering matters if both lists have the same key)? - -### 1c. Change Target Round-Trip - -`Model.PrimaryPart = Part1` then `Model.PrimaryPart = Part2`: - -- First write: `Rojo_Ref_PrimaryPart = "Workspace/TestModel/Part1"` -- Second write: `merge_or_build_meta` overwrites attribute to `"Workspace/TestModel/Part2"` -- **Verify**: Does the merge correctly overwrite? Or does the old value persist alongside the new? Is the attribute key case-sensitive? - -### 1d. ObjectValue.Value Round-Trip - -`ObjectValue.Value = SomePart` where ObjectValue is defined in `.model.json5`: - -- **Server writes**: attribute goes into the `.model.json5` file directly (is_model_file = true) -- **Verify**: Does `merge_or_build_meta` correctly add `Rojo_Ref_Value` to a model file's attributes? Does the snapshot middleware read attributes from `.model.json5` the same way as from `.meta.json5`? - -### 1e. Ref on Script Round-Trip - -Script has a custom Ref property set via two-way sync: - -- **Server writes**: adjacent `ScriptName.meta.json5` gets the `Rojo_Ref_*` attribute -- **Verify**: Is the meta file path computed correctly (strip `.server`/`.client` suffix from stem)? Does the adjacent meta correctly pair with the script file on read? - -### 1f. Stale Path After Rename - -Set `Model.PrimaryPart = Part1`, then rename Model from `TestModel` to `RenamedModel`: - -- Meta file written with `Rojo_Ref_PrimaryPart = "Workspace/TestModel/Part1"` -- ChangeProcessor renames directory to `RenamedModel` -- Path in attribute is now stale -- **Verify**: What happens on rebuild? `get_instance_by_path("Workspace/TestModel/Part1")` returns None because `TestModel` no longer exists. PrimaryPart silently becomes nil. Is this documented as a known limitation? Is a warning logged? - ---- - -## 2. Plugin-Side Encoding Completeness - -Every code path in the plugin that encodes property changes must correctly handle Ref properties. - -- [propertyFilter.lua](plugin/src/ChangeBatcher/propertyFilter.lua): `Ref` removed from `UNENCODABLE_DATA_TYPES`? Only `UniqueId` remains? -- [encodePatchUpdate.lua](plugin/src/ChangeBatcher/encodePatchUpdate.lua): - - `descriptor.dataType == "Ref"` branch handles nil, valid, and unresolvable cases? - - `descriptor:read(instance)` correctly reads Ref properties on all instance types (Model.PrimaryPart, ObjectValue.Value, Weld.Part0)? - - Does the `instanceMap.fromInstances[readResult]` lookup use the Instance as key (not a string)? - - When `instanceMap` is nil (should never happen but defensively), does the code log and skip without crashing? -- [createPatchSet.lua](plugin/src/ChangeBatcher/createPatchSet.lua): `instanceMap` passed to `encodePatchUpdate` in both normal and `syncSourceOnly` paths? -- [encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua): Still filters out Ref properties during instance addition encoding? (Refs on newly added instances are NOT encoded -- they'd have no target ID yet) -- **Edge cases**: - - Instance's `Changed` event fires for Ref property but the target was just destroyed -> `readResult` is nil -> correctly encoded as null ref? - - ValueBase instances (ObjectValue) -> `GetPropertyChangedSignal("Value")` fires, `descriptor:read` returns the Instance reference? - ---- - -## 3. Server-Side Path Resolution Completeness - -Every code path in [api.rs](src/web/api.rs) that handles Ref properties must correctly compute paths. - -- `syncback_updated_properties`: - - Ref extraction happens BEFORE `filter_properties_for_meta`? - - `crate::ref_attribute_name(key)` produces correct attribute name? - - `crate::ref_target_path(tree.inner(), *target_ref)` produces correct path? - - `tree.get_instance(*target_ref).is_some()` correctly checks target existence? - - Nil Ref -> `remove_attributes` list, not `ref_attributes` map? - - Target not in tree -> warning logged, not in either list? - - Ref entries removed from `props` before `filter_properties_for_meta`? (verify Refs don't fall through to `variant_to_json` which returns None) -- `filter_properties_for_meta`: - - `Variant::Ref` is no longer skipped? Only `Variant::UniqueId` is skipped? - - If a `Variant::Ref` somehow reaches `variant_to_json`, it returns `None` (safe fallback)? -- `merge_or_build_meta`: - - `remove_attributes` processed BEFORE `new_attributes` merge? (important: if the same key is in both, the add should win) - - Removal works on existing files (parses JSON5, modifies object, writes back)? - - Removal is no-op on non-existent files? - - Removal is no-op when the attribute doesn't exist in the file? -- `handle_api_write`: - - Nil Refs (`Ref::none()`) converted to `None` (property removal) in the PatchSet? (the fix we applied) - - Conversion happens for ALL updated instances, not just some? - - Non-nil Refs pass through unchanged? - ---- - -## 4. Forward-Sync Resolution Completeness - -The forward-sync direction (filesystem -> server -> plugin) must correctly resolve `Rojo_Ref_*` attributes. - -- [patch_compute.rs](src/snapshot/patch_compute.rs) `compute_ref_properties`: - - Correctly strips `Rojo_Ref`_ prefix to get property name? - - Handles both `Variant::String` and `Variant::BinaryString` attribute values? - - Logs warning for non-string attribute types? - - `tree.get_instance_by_path(path)` returns `None` for invalid paths without crashing? - - `None` return for unresolvable paths -- does this cause property removal on the tree instance? (could silently clear a Ref that was set during the session but hasn't been written to disk yet) -- [patch_apply.rs](src/snapshot/patch_apply.rs): - - `defer_ref_properties` correctly collects `Rojo_Ref_*` attributes for later resolution? - - `finalize_patch_application` resolves path refs via `get_instance_by_path`? - - Resolved refs are set as `Variant::Ref` on the instance? - - `Rojo_Ref_*` attributes are cleaned from the Attributes property after resolution? (they should NOT appear as instance attributes in Studio) -- [decodeValue.lua](plugin/src/Reconciler/decodeValue.lua): - - `Ref` type correctly handled: resolves via `instanceMap.fromIds[value]`? - - Null ref (`"000...0"`) returns nil? - - Unknown ID returns error? - ---- - -## 5. Interaction with Existing Ref Systems - -The new `Rojo_Ref_*` system coexists with the legacy `Rojo_Target_*` + `Rojo_Id` system. - -- [ref_properties.rs](src/syncback/ref_properties.rs): CLI syncback still uses both path-based (`Rojo_Ref_*`) and ID-based (`Rojo_Target_*` + `Rojo_Id`) systems? - - The shared `ref_attribute_name` helper is used for path-based refs? - - The `Rojo_Target_*` formatting still uses inline `format!` (not shared)? - - Is this inconsistency a DRY concern? -- `link_referents`: Old attributes (`Rojo_Ref_*` and `Rojo_Target_*`) are filtered out before re-inserting? No duplicate attributes? -- `compute_ref_properties` in patch_compute.rs: handles BOTH `Rojo_Ref_*` and `Rojo_Target_*`? Both resolve correctly? Priority if both exist for the same property? -- Two-way sync: `filter_properties_for_meta` no longer skips `Variant::Ref` -- does this mean `Variant::Ref` values could reach `variant_to_json` if a Ref property change comes from a path OTHER than `syncback_updated_properties`? Are there other callers? - ---- - -## 6. Meta File Lifecycle with Refs - -Ref attributes add a new dimension to meta file management. - -- **Creation**: When the first Ref is set on an instance with no meta file -> meta file created with just `attributes: { Rojo_Ref_PropertyName: "path" }`? Does `build_meta_object` handle this (called when file doesn't exist)? -- **Merge**: When Ref attribute is added to an existing meta file with `className`, `properties`, other `attributes` -> existing content preserved? `Rojo_Ref_`* merged into attributes alongside user attributes? -- **Update**: When Ref target changes -> attribute value overwritten? Old value not left alongside new? -- **Deletion**: When Ref set to nil -> attribute removed from file? If no other content remains in `attributes`, is the empty `attributes: {}` section left or cleaned up? If meta file has no remaining content at all (no className, no properties, no attributes), should the file be deleted? -- **Orphaned Rojo_Ref_***: If an instance is deleted, its meta file is deleted too (existing behavior). No orphaned `Rojo_Ref_`* attributes should remain. Verify this path. - ---- - -## 7. Path Computation Correctness - -The path computation is the heart of the system. Any bug here silently corrupts Ref targets. - -- `ref_target_path` calls `dom.full_path_of(target_ref, "/")`: - - Root instance -> empty string ""? Does `get_instance_by_path("")` correctly resolve to root? - - Single depth -> `"Workspace"`? Resolves back? - - Deep nesting -> `"Workspace/Model/SubFolder/Part"`? Resolves back? - - Instance name contains `/` -> path becomes ambiguous! `full_path_of` uses `/` as separator but instance names can contain `/` (slugified in filesystem but NOT in the tree). **This could be a critical issue.** A Part named `"A/B"` at `Workspace` would produce path `"Workspace/A/B"` which resolves to `Workspace > A > B` (3 levels) instead of `Workspace > "A/B"` (2 levels). - - Instance name contains special chars -> path may not match filesystem slug. But paths are computed from tree names, not filesystem names, so this should be OK for resolution within the same session. Cross-session, paths are stored on disk and resolved from the tree -- tree names should be consistent. - ---- - -## 7b. Known Potential Issue: Missing instanceMap in ServeSession Pull Path - -**File:** [ServeSession.lua](plugin/src/ServeSession.lua) line 738 - -`encodePatchUpdate` was updated to accept an `instanceMap` parameter (4th arg) for Ref encoding. `createPatchSet.lua` passes it correctly. However, the call in `ServeSession.lua` line 738 was NOT updated: - -```lua -local update = encodePatchUpdate(instance, change.id, propertiesToSync) -``` - -This is the "pull" path in `__confirmAndApplyInitialPatch` -- when users select "pull" in the initial patch confirmation dialog to sync Studio property changes back to Atlas. The missing 4th argument means `instanceMap` is `nil` inside `encodePatchUpdate`, causing all Ref property changes (PrimaryPart, ObjectValue.Value, constraint refs, etc.) to be silently dropped with a warning instead of encoded. This is a round-trip identity violation for the initial sync pull path. - -**Expected fix:** Pass `self.__instanceMap` as the 4th argument: - -```lua -local update = encodePatchUpdate(instance, change.id, propertiesToSync, self.__instanceMap) -``` - -**Audit should verify:** Are there any OTHER callers of `encodePatchUpdate` beyond `createPatchSet.lua` and `ServeSession.lua:738` that are also missing the `instanceMap` argument? - ---- - -## 7c. encodeInstance.lua Ref Leak - -**File:** [encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua) - -`encodeInstance.lua` imports `UNENCODABLE_DATA_TYPES` from `propertyFilter.lua` and uses it to filter properties before calling `encodeProperty`. We removed `Ref = true` from that filter. Now Ref properties on newly added instances pass through to `encodeProperty`, which calls `RbxDom.EncodedValue.encode(readResult, dataType)`. For Ref properties, `readResult` is a Roblox Instance, and `RbxDom.EncodedValue.encode` likely throws (Instance is not an encodable value). The `pcall` wrapper catches the error and the property is silently dropped. - -**The behavior is correct** (you can't encode a Ref without the InstanceMap during instance addition), **but the code path is fragile**. It relies on `pcall` catching an error thrown by `RbxDom.EncodedValue.encode` rather than an explicit check. If `RbxDom.EncodedValue.encode` is updated to handle Refs in the future, the behavior would change silently. - -**Audit should verify:** Does `encodeInstance.lua` need its own Ref-specific filter (like `encodePatchUpdate.lua` has), or is the pcall fallback acceptable? - ---- - -## 7d. VFS Echo Prevention for Ref Meta Writes - -**File:** [api.rs](src/web/api.rs) `syncback_updated_properties()` - -The suppression system uses per-path counters: `suppress_path()` increments a create/write counter, `suppress_path_remove()` increments a remove counter. The change processor checks and decrements these when VFS events arrive. - -**Modern pattern:** - -- **Updates to existing files** (meta writes, model updates, source writes): MUST suppress to prevent feedback loops -- **New instance additions** (`syncback_added_instance`): do NOT suppress -- the VFS watcher must pick up new files to add them to the tree -- **Folder creation**: suppression varies by context (conversion vs. new creation) - -**Verify for Ref changes specifically:** All four file format branches in `syncback_updated_properties` call `suppress_path()` before `fs::write()`: - -1. Directory init.meta.json5 (line ~2630) -2. Adjacent script .meta.json5 (line ~2663) -3. Inline .model.json5 (line ~2690) -4. Adjacent non-script .meta.json5 (line ~2713) - -These are all updates to existing instances (not additions), so suppression is correct. Verify no branch was missed and that the `suppress_path` calls use the correct path (the path being written, not the instance path). - ---- - -## 7e. CLI Syncback Parity - -**From atlas.mdc:** "Plugin-based sync must produce exactly the same filesystem output that atlas syncback would give for the same input. Byte-for-byte identical files." - -Verify that the two-way sync Ref output matches CLI syncback (`ref_properties.rs`) output for equivalent scenarios: - -- Same `Rojo_Ref_`* attribute name format -- Same path format (slash-separated, root excluded) -- Same JSON5 attribute placement (in `attributes` section, not `properties`) -- Same handling of nil Refs (attribute absent, not present with empty value) -- Both use the shared `ref_attribute_name()` helper from [rojo_ref.rs](src/rojo_ref.rs) - -Any divergence between the two paths is a bug per atlas.mdc. - ---- - -## 7f. Msgpack Wire Format for Refs - -The plugin sends `{ Ref = "hexid" }` via msgpack to the server. The server deserializes this as `Variant::Ref(Ref)`. - -**Verify:** Does the msgpack deserialization in `handle_api_write` correctly round-trip `Variant::Ref` values? Check that `Ref::from_str` parses the hex string from the plugin and produces the correct `NonZeroU128`. Check that `Ref::none()` (hex `"000...0"`) deserializes as `Ref(None)`. - ---- - -## 8. Edge Cases and Error Handling - -- **Ref to ProjectNode instance**: Can a Ref property target an instance defined in a project file? Path resolution should work since ProjectNode instances ARE in the tree. But if the target is removed from the project file, the path becomes invalid. -- **Ref to instance in nested project**: Path computed by `full_path_of` spans the entire tree. But nested projects have their own sync boundaries. Is the path still valid after a project reload? -- **Concurrent Ref changes**: Two Ref properties changed in the same batch -> both written to meta file? Does `merge_or_build_meta` handle multiple attribute additions in one call? -- **Ref property that doesn't exist in reflection**: If the plugin sends a Ref for a property name that doesn't exist in rbx_reflection -> attribute is written but never resolved on forward-sync? -- **Multiple instances with same Ref property change**: Different instances, each with PrimaryPart changes -> each gets their own meta file written correctly? - ---- - -## 9. Known Limitations (Document, Don't Fix) - -These were explicitly accepted in the implementation plan. Confirm they are documented, log appropriate warnings, and do NOT produce silent data corruption. - -- **Ambiguous paths**: Duplicate-named siblings make paths non-unique. Path-based refs may resolve to wrong sibling. No crash, but round-trip violation. -- **Stale paths after rename**: Stored path becomes invalid when target is renamed/moved. -- **No immediate ID for new instances**: Pulled instances don't get IDs until VFS watcher processes files. Ref properties targeting new instances are dropped with warning. - ---- - -## 10. Prove Known Limitations (Regression Tests Left Failing) - -Write tests that **assert the correct round-trip behavior** for the known limitations. These tests SHOULD FAIL against the current implementation, proving the bugs are real. **Leave them failing -- do NOT mark them `#[ignore]` or `SKIP` or try to fix the implementation to make them pass.** They document real violations of the round-trip invariant and will serve as acceptance criteria when fixes are implemented later. - -If a test unexpectedly PASSES, analyze why. If the behavior is genuinely correct, leave the test -- it's free coverage. - -### 10a. Stale Path After Target Rename (Rust integration) - -In `tests/tests/two_way_sync.rs`: - -1. Set `Model.PrimaryPart = Part1` via `/api/write` -2. Wait for `Rojo_Ref_PrimaryPart = "Workspace/TestModel/Part1"` in meta file -3. Rename `Part1` to `RenamedPart` via `/api/write` (changed_name) -4. Wait for rename to process -5. Read meta file -- assert `Rojo_Ref_PrimaryPart` is now `"Workspace/TestModel/RenamedPart"` -6. EXPECTED: FAIL (stored path is stale) - -Add variations: - -- Rename the MODEL (parent) instead of the target Part -- Rename an ancestor higher in the tree - -### 10b. Ref to Instance Added in Same Request (Rust integration) - -In `tests/tests/two_way_sync.rs`: - -1. Add a new Part via `/api/write` (added instances) with a temp GUID key -2. In the SAME write request, set `Model.PrimaryPart = newPartRef` (using the temp GUID) -3. Assert that `Rojo_Ref_PrimaryPart` appears in the meta file with the correct path to the new Part -4. EXPECTED: FAIL (target not in tree when `syncback_updated_properties` runs) - -### 10c. Ref to Untracked Instance Dropped (Lua spec) - -In `plugin/src/ChangeBatcher/encodePatchUpdate.spec.lua`: - -1. Create a Model and a Part in Studio -2. Set `Model.PrimaryPart = Part` -3. Insert Model into InstanceMap but NOT Part -4. Call `encodePatchUpdate` with `PrimaryPart` change and the instanceMap -5. Assert that PrimaryPart IS encoded (with Part's server ID) -6. EXPECTED: FAIL (Part not in InstanceMap, property dropped with warning) - -### 10d. ServeSession Pull Path Missing instanceMap (Lua spec) - -In `plugin/src/ChangeBatcher/encodePatchUpdate.spec.lua`: - -1. Create a Model with PrimaryPart set to a tracked Part (both in InstanceMap) -2. Call `encodePatchUpdate(model, "MODEL_ID", { PrimaryPart = true })` -- WITHOUT the 4th instanceMap arg -3. Assert that PrimaryPart IS encoded as `{ Ref = serverId }` -4. EXPECTED: FAIL (instanceMap is nil, triggers warning path, property dropped) - ---- - -## 11. Test Coverage Review - -Evaluate existing tests against the audit areas above. For each gap, flag as missing coverage with specific test description. - -- **Round-trip tests**: Do integration tests verify that setting a Ref via `/api/write`, then building from filesystem, produces the same Ref? -- **Nil Ref cleanup**: Is the nil Ref -> attribute removal -> property removal chain tested end-to-end? -- **Forward-sync resolution**: Are there serve tests that verify `Rojo_Ref_`* attributes resolve to `Variant::Ref` in the tree? -- **Path edge cases**: Instance names with `/` in them? Deep nesting? Root-level Ref targets? -- **Concurrent changes**: Multiple Ref changes in one batch? -- **Error paths**: Ref to non-existent instance? Ref on ProjectNode instance? -- **CLI syncback parity**: Does the test suite verify that two-way sync and CLI syncback produce identical `Rojo_Ref_`* output for the same input? - ---- - -## 12. Deliverables - -Produce a structured report with: - -- **Critical issues** -- bugs that would cause incorrect Ref targets, lost Refs, or silent data corruption on round-trip -- **Correctness concerns** -- logic that might not manifest immediately but could cause problems (e.g., the `/` in instance names issue in section 7) -- **Missing test coverage** -- specific test cases needed, prioritized by risk -- **Known limitations** -- confirmed as documented and handled gracefully (warning logged, no crash, no silent corruption beyond the documented scope) -- **Code quality items** -- DRY violations, dead code, stale comments -- For each issue: file path, line numbers, description, and suggested fix - diff --git a/.cursor/plans/audit_slugify_branch_e913b7dc.plan.md b/.cursor/plans/audit_slugify_branch_e913b7dc.plan.md deleted file mode 100644 index 8a4c8fb1..00000000 --- a/.cursor/plans/audit_slugify_branch_e913b7dc.plan.md +++ /dev/null @@ -1,298 +0,0 @@ ---- -name: Audit slugify branch -overview: "Production-grade audit of the `slugify` branch. The invariant: filesystem must be a perfect 1:1 representation of the Studio place such that syncback → rebuild from filesystem produces a byte-identical place file. Every audit item is evaluated against this round-trip fidelity standard." -todos: - - id: round-trip-invariant - content: "Verify the core invariant: for every instance in a place, syncback writes files that forward-sync rebuilds into a bit-identical instance tree (name, class, properties, hierarchy)" - status: completed - - id: forward-sync - content: "Audit forward sync: all middleware correctly resolves instance names from meta name field or filename stem, no lingering decode_path_name" - status: completed - - id: reverse-sync - content: "Audit reverse sync: slugify + dedup + meta emission correct in file_names.rs, snapshot.rs, dir.rs, project.rs" - status: completed - - id: two-way-sync - content: "Audit two-way sync: change_processor.rs renames and api.rs adds/removes handle slugify, dedup, meta lifecycle, event suppression" - status: completed - - id: dedup-consistency - content: "Verify dedup_key consistency: case sensitivity, cross-format collisions, old-inst vs new-inst paths, all insertion sites" - status: completed - - id: property-preservation - content: Verify no property data is lost or mangled through name changes -- Name property, metadata fields, ref properties, attributes all survive round-trips - status: completed - - id: config-cleanup - content: Grep for any lingering path_encoding, encode/decode references, %ENCODED% patterns, removed config fields - status: completed - - id: test-coverage - content: Catalog existing tests vs missing tests -- especially round-trip tests that assert filesystem→rebuild identity - status: completed - - id: json-model-name - content: "Audit json_model name field: read path, write path, legacy compat, json_model_legacy_name snapshot change correctness" - status: completed - - id: meta-lifecycle - content: "Audit meta file lifecycle: creation, update, deletion, merge with existing fields, orphaned meta handling" - status: completed - - id: legacy-cleanup - content: "Verify legacy %ENCODING% system is fully purged: no references in code/tests/fixtures, old config fields parse without crashing" - status: completed - - id: write-report - content: "Produce final report: critical issues, correctness concerns, missing test coverage, cleanup items with file paths and suggested fixes" - status: completed -isProject: false ---- - -# Audit: slugify Branch -- Production-Grade Round-Trip Fidelity - -## Quality Standard - -This is a **production-grade synchronization system**. The filesystem must represent a **1:1 copy** of the Studio place. The core invariant: - -> **Round-trip identity**: Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -Every audit item below must be evaluated against this standard. A "works most of the time" finding is not acceptable. If there is ANY code path where an instance name, property, or hierarchy relationship can be lost, mangled, or silently altered through a syncback→rebuild cycle, flag it as **critical**. - -## Code Quality Standard - -We are building a **maintainable** codebase. During the audit, watch for duplicated logic -- the same slugify/dedup/meta-update pattern copy-pasted across `change_processor.rs`, `api.rs`, `dir.rs`, `project.rs`, etc. If you find duplicated code that could be consolidated into a shared helper: - -- **Small refactor** (extracting a helper function, consolidating 2-3 call sites): flag it AND fix it as part of this audit. -- **Major system rewrite** (restructuring data flow, changing function signatures across 10+ call sites, redesigning the snapshot pipeline): flag it clearly in a **"Deferred Refactors"** section at the bottom of the report. We will evaluate whether it's worth doing after the audit is complete. - -The goal is clean, DRY code that is easy to reason about and hard to get wrong. If the same "compute meta path, check if name needs slugify, upsert/remove name field" sequence appears in 3+ places, that's a refactor candidate. - -## Context - -This audit covers two plans that drove the branch: - -- [nuke_path_encoding_migration](.cursor/plans/nuke_path_encoding_migration_7dfffc4d.plan.md) -- removed `src/path_encoding.rs`, replaced all encode/decode callsites with `slugify_name()` + `deduplicate_name()` + metadata `name` field -- [fix_stem-level_dedup](.cursor/plans/fix_stem-level_dedup_8fa9a015.plan.md) -- fixed dedup key propagation so `taken_names` contains bare slugs (not filenames with extensions) - -Run `git diff main...HEAD` for the full diff. Read both plan files in full. Then audit every area below, citing file paths, line numbers, and code snippets. Flag anything missing, incorrect, inconsistent, or undertested. - ---- - -## 1. Round-Trip Identity Verification - -This is the single most important audit area. Trace the **complete lifecycle** of an instance with a name containing forbidden chars through every path: - -### 1a. Syncback → Forward Sync Round-Trip - -Pick a concrete example: instance named `"Key:Script"` (ServerScript class). - -- **Syncback writes**: `Key_Script.server.luau` + `Key_Script.meta.json5` with `{"name": "Key:Script"}` -- **Forward sync reads**: `Key_Script.server.luau` → detects adjacent `Key_Script.meta.json5` → reads `name` field → sets `specified_name` on metadata → final instance name becomes `"Key:Script"` -- **Verify**: Trace this exact path through the code. Is there ANY point where the name could become `"Key_Script"` instead of `"Key:Script"`? Any middleware that reads the filename stem and ignores the meta name? - -### 1b. Two-Way Sync → Forward Sync Round-Trip - -Instance added in Studio with name `"What?Module"` during a live `rojo serve` session: - -- **API handler writes**: `What_Module.luau` + `What_Module.meta.json5` with `{"name": "What?Module"}` -- **Change processor** picks up the new files → snapshots them → applies to DOM -- **Verify**: Does the DOM instance end up with name `"What?Module"` or `"What_Module"`? If the change processor snapshots the new file before the meta file is written, what happens? - -### 1c. Rename Round-Trip - -Instance renamed in Studio from `"Clean"` to `"Has/Slash"`: - -- Old file `Clean.server.luau` is removed -- New file `Has_Slash.server.luau` + `Has_Slash.meta.json5` with `{"name": "Has/Slash"}` is created -- **Verify**: Is there a window where the old file is deleted but the new file hasn't been written yet? Could the file watcher fire in between and produce an incorrect intermediate state? - -### 1d. Collision Round-Trip - -Two sibling instances: `"A/B"` (ModuleScript) and `"A_B"` (ModuleScript). Both slugify to `A_B`. - -- **Syncback**: First gets `A_B.luau`, second gets `A_B~1.luau` (with meta `{"name": "A_B"}` since slug+dedup differs from real name) -- **Forward sync rebuild**: `A_B.luau` → name `"A/B"` (from meta), `A_B~1.luau` → name `"A_B"` (from meta) -- **Verify**: Is the ordering deterministic? If processed in reverse order next time, do names get swapped? Is there a stable sort or tie-breaking rule? - -### 1e. Directory Instance Round-Trip - -Folder named `"My:Folder"`: - -- **Syncback**: Directory `My_Folder/` + `My_Folder/init.meta.json5` with `{"name": "My:Folder"}` -- **Forward sync**: Reads directory → finds `init.meta.json5` → applies name override → instance named `"My:Folder"` -- **Verify**: Does `DirectoryMetadata.apply_name()` actually work? Is `init.meta.json5` read before or after the directory name is set? - -### 1f. Model JSON Round-Trip - -Configuration instance named `"What?Model"`: - -- **Syncback**: `What_Model.model.json5` with `{"name": "What?Model", "className": "Configuration"}` -- **Forward sync**: Reads `.model.json5` → parses `name` field → uses it as instance name -- **Verify**: Trace through [json_model.rs](src/snapshot_middleware/json_model.rs). Does the `name` field actually override? Is there a priority conflict with `properties.Name`? - ---- - -## 2. Forward Sync Completeness (filesystem → Roblox) - -Every middleware that reads files and produces `InstanceSnapshot` must correctly resolve the instance name. - -- [src/snapshot_middleware/mod.rs](src/snapshot_middleware/mod.rs): Is `decode_path_name` fully removed? Does every middleware path derive the instance name from the metadata `name` field (when present) or the filename stem (when absent)? -- [src/snapshot_middleware/meta_file.rs](src/snapshot_middleware/meta_file.rs): Do `AdjacentMetadata` and `DirectoryMetadata` both have `name: Option`? Do `apply_all` / `apply_name` correctly set `specified_name` on `InstanceMetadata`? Is `is_empty()` updated for `name`? -- [src/snapshot_middleware/json_model.rs](src/snapshot_middleware/json_model.rs): Does `name` from `.model.json5` actually override the filename-derived name? Trace parse → `InstanceSnapshot` construction → final instance name. Any path where `name` is silently ignored? -- [src/snapshot_middleware/lua.rs](src/snapshot_middleware/lua.rs), [txt.rs](src/snapshot_middleware/txt.rs), [csv.rs](src/snapshot_middleware/csv.rs): Correct instance names? Any lingering `encode_path_name`/`decode_path_name` references? -- **Edge cases**: - - `Foo~1.server.luau` with NO meta file -- must produce instance name `Foo~1` (backward compat, tilde is NOT a dedup marker during reads) - - `Foo~1.server.luau` WITH meta `"name": "Foo/Bar"` -- meta name must win - - `init.meta.json5` with `"name": "SomeOverride"` inside directory `MyFolder` -- must name the directory instance `SomeOverride` - ---- - -## 3. Reverse Sync Completeness (Roblox → filesystem / syncback) - -Every path that writes instances to the filesystem must use slugify + dedup + metadata correctly, and the written files must round-trip back to identical instances. - -- [src/syncback/file_names.rs](src/syncback/file_names.rs): Audit `slugify_name()` for all 9 forbidden chars (`< > : " / \ | ? *`), Windows reserved names (CON, PRN, NUL, COM1-9, LPT1-9), trailing dots/spaces, empty strings, all-forbidden-chars strings. Does `deduplicate_name()` handle `~1` already taken (skip to `~2`)? Does `name_for_inst()` correctly return `(filename, needs_meta, dedup_key)` for both old-inst and new-inst paths? -- [src/syncback/snapshot.rs](src/syncback/snapshot.rs): Do `with_joined_path` and `with_base_path` propagate `dedup_key`? Are callers in dir.rs/project.rs using `dedup_key` (not `filename`) when inserting into `taken_names`? -- [src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs): Is `taken_names` seeded correctly (tree children, not disk)? Is `dedup_key.to_lowercase()` inserted after each child? Any ordering issue where a child is processed before its collision partner is in the set? -- [src/snapshot_middleware/project.rs](src/snapshot_middleware/project.rs): Same checks. Verify `or_insert_with` closure seeds from tree children. -- **Meta file emission**: When `needs_meta` is true, is `name` actually written to `.meta.json5` or `.model.json5`? Trace from `name_for_inst` returning `needs_meta=true` → meta file on disk. Is there ANY code path where `needs_meta` is true but no meta file gets written? This would silently lose the real instance name on rebuild. -- **Determinism**: Given the same instance tree, does syncback ALWAYS produce the same filesystem output? Is child ordering stable? Is dedup suffix assignment deterministic? Non-determinism means different builds from the same source, which violates the invariant. -- **Edge cases**: - - Instance name `Hey_Bro` (no forbidden chars, slug equals another instance's slug) -- no meta if first claim, `~1` + meta if second - - Instance name exactly a Windows reserved name (e.g. `CON`) -- what does `slugify_name` produce? Can the result be read back? - ---- - -## 4. Two-Way Sync Completeness (live serve sessions) - -Highest-risk area. Every change made in Studio must produce filesystem state that, if the serve session were killed and the place rebuilt from scratch, would produce an identical tree. - -- [src/change_processor.rs](src/change_processor.rs) -- instance **renamed** in Studio: - - Slugifies new name? - - Dedups against sibling files in same directory? - - Creates/updates/removes meta `name` field as needed? - - Renaming FROM slugified TO clean: removes stale `name` from meta? (check `remove_meta_name_field`) - - Renaming FROM clean TO slugified: creates meta with `name`? (check `upsert_meta_name_field`) - - Suppresses filesystem events correctly to avoid feedback loops? - - **After the rename completes, if you killed the server and ran `rojo build`, would the instance have the correct name?** -- [src/web/api.rs](src/web/api.rs) -- instance **added**: - - `syncback_added_instance` uses slugify + dedup correctly? - - `taken_names` seeded from tree siblings (not disk)? - - Writes meta file when slug differs from real name? - - Meta file path matches script file path (e.g. `Foo_Bar.server.luau` pairs with `Foo_Bar.meta.json5`, not some other path)? - - **After the add completes, does `rojo build` include this instance with the correct name, class, and source?** -- [src/web/api.rs](src/web/api.rs) -- instance **removed**: - - Cleans up both script file AND associated meta file? - - Handles missing meta file gracefully (instance had clean name)? - - **After the remove, does `rojo build` correctly omit this instance?** -- **Atomicity**: When a rename involves deleting old files and creating new files, is there a window where the filesystem is in an inconsistent state that the file watcher could pick up? Could this cause a "ghost" instance or a lost instance in the DOM? -- **Race conditions**: When multiple renames happen in quick succession, is `taken_names` rebuilt each time or cached? Could stale data cause incorrect dedup? - ---- - -## 5. Dedup Key Consistency - -The dedup system must be watertight. Any inconsistency means two instances can silently overwrite each other's files. - -- `name_for_inst` old-inst path: derives `dedup_key` by stripping middleware extension from existing filename? What if Dir middleware (no extension)? What if extension doesn't match `extension_for_middleware` (manually renamed file)? -- `name_for_inst` new-inst path: `dedup_key` is always the slug BEFORE extension is appended? -- **Case sensitivity**: Is `.to_lowercase()` applied consistently at ALL insertion sites in dir.rs, project.rs, api.rs, change_processor.rs? A single site that forgets lowercase would cause silent overwrites on case-insensitive filesystems (Windows/macOS). -- **Cross-format collision**: Instance `Helper` as ModuleScript (`Helper.luau`) and instance `Helper` as Folder (`Helper/`) -- both dedup keys should be `helper` (lowercase). Do they collide correctly, producing `Helper/` and `Helper~1.luau` (or vice versa)? -- **Stable ordering**: When two instances collide, which one gets the base name and which gets `~1`? Is this deterministic across runs? If not, consecutive syncbacks could swap filenames, causing unnecessary git churn. - ---- - -## 6. Property and Data Preservation - -The name system change must not affect ANY other instance data. - -- **Name property vs instance name**: Roblox instances have both `Instance.Name` (the tree name) and a `Name` string property. Are these conflated anywhere? Does the new `name` field in meta/model files interact with the `Name` property in `properties`? -- **Ref properties**: Do ref properties (ObjectValue.Value, etc.) still resolve correctly after the naming change? Refs use instance IDs, not names, but verify no code path accidentally uses filenames for ref resolution. -- **Attributes**: Are instance attributes preserved through syncback? The naming change shouldn't affect them, but verify no metadata merge operation accidentally clobbers attributes stored in meta files. -- **Source scripts**: Does script source content survive the rename cycle? When a file is renamed (old deleted, new created), is the content preserved byte-for-byte? - ---- - -## 7. Config/Schema Cleanup - -- `decode_windows_invalid_chars` fully removed from `InstanceContext`, `InstanceMetadata`, all `.snap` files, `serve_session.rs`? -- `encode_windows_invalid_chars` fully removed from `SyncbackRules`, project schema, JSON schema? -- Grep for ANY lingering references to: `path_encoding`, `encode_path_name`, `decode_path_name`, `%SLASH%`, `%COLON%`, `%QUESTION%`, `%DOT%`, `%STAR%`, `%PIPE%`, `%QUOTE%`, `%LESSTHAN%`, `%GREATERTHAN%` -- Do old project files with these removed fields parse without crashing? (serde should ignore unknown fields, but verify) - ---- - -## 8. Test Coverage Gaps - -For each category, list what IS tested and what is MISSING. **Prioritize round-trip tests** -- these are the ultimate proof of correctness. - -- **Round-trip tests**: Is there a test that does syncback → rebuild → compare instance trees? This is the gold standard. If it doesn't exist, flag as critical missing coverage. -- **Unit tests** ([src/syncback/file_names.rs](src/syncback/file_names.rs)): `slugify_name` edge cases, `deduplicate_name` edge cases, `name_for_inst` all paths, `dedup_key` correctness -- **Build integration** ([tests/tests/build.rs](tests/tests/build.rs)): `.model.json5` with `name` field? `init.meta.json5` with `name`? `~N` suffixed files read back correctly? -- **Syncback integration** ([tests/tests/syncback.rs](tests/tests/syncback.rs)): Forbidden-char instances produce slugified filenames + meta? Collision test (two instances whose slugs match)? -- **Two-way sync** ([tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs)): All 28 old encoded-pattern references updated? Rename test (clean → slugified, slugified → clean)? Add test (new instance with forbidden chars)? Collision test during live sync? -- **Snapshot tests**: Any pending `cargo insta review` changes? All `.snap` files reflect new system? -- **Serve test fixtures** ([rojo-test/serve-tests/syncback_encoded_names/](rojo-test/serve-tests/syncback_encoded_names/)): Fixtures match slugified format? Meta files with `name` fields present? -- **Negative test**: File `Foo~1.luau` WITHOUT meta produces instance name `Foo~1` (tilde NOT parsed as dedup marker during forward sync)? -- **Idempotency test**: Run syncback twice on the same tree -- does the second run produce zero file changes? If not, something is unstable. -- **Large tree stress test**: 100+ instances with various collision patterns -- does dedup produce correct, deterministic results? - ---- - -## 9. JSON Model `name` Field - -- **Read path** ([json_model.rs](src/snapshot_middleware/json_model.rs)): `.model.json5` with `"name": "Real Name"` uses `Real Name`? `specified_name` set on metadata? -- **Write path** (syncback): `name` field emitted when slug differs? Omitted when slug matches? -- **Legacy compat**: Old `.model.json` with `"Name": "Something"` in `properties` still works? Any conflict between new top-level `name` and old `properties.Name`? What wins if both are present? -- `**json_model_legacy_name` build test**: Snapshot changed from `Expected Name` to `Overridden Name`. Is this correct? What was the test fixture's intent? Read the fixture files to understand the expected behavior. - ---- - -## 10. Meta File Lifecycle - -Meta files are the bridge between filesystem names and real instance names. Any bug here silently corrupts names. - -- **Creation**: Only when `needs_meta` is true? If meta already exists with other fields (e.g. `ignoreUnknownInstances`), is the `name` field MERGED in (not replacing the whole file)? Verify `upsert_meta_name_field` in change_processor.rs does a proper merge. -- **Update**: When instance renamed and slug changes, is meta updated? When slug stays same but real name changes (e.g. `A/B` → `A:B`, both slugify to `A_B`) -- the meta `name` field must change from `"A/B"` to `"A:B"`. Is this handled? -- **Deletion**: Renaming from slugified to clean removes `name` from meta? If meta has no other fields after removal, is the file itself deleted? Verify `remove_meta_name_field` handles both cases. -- **Orphaned meta files**: Script deleted but meta remains -- does forward sync handle this gracefully (ignore the orphan) or does it create a phantom instance? -- **Model JSON meta vs adjacent meta**: For `.model.json5` files, the `name` is stored IN the model file (not in a separate `.meta.json5`). Is this consistent? Could there be a case where both a `.model.json5` `name` field and a `.meta.json5` `name` field exist for the same instance? What wins? - ---- - -## 11. Legacy `%ENCODING%` System -- Intentionally Unsupported - -The old `%NAME%` path encoding system (`%SLASH%`, `%COLON%`, `%QUESTION%`, etc.) is **intentionally removed with no backward compatibility**. This is a full refactor, not an incremental change. The old system was inferior -- it produced ugly filenames, required special decoding on read, and was fragile. The new slugify + metadata `name` approach is strictly better. - -**Do NOT flag the removal of `%ENCODING%` support as a regression.** It is by design. However, DO verify: - -- `src/path_encoding.rs` is fully deleted and no references remain anywhere in the codebase -- No `%SLASH%`, `%COLON%`, `%QUESTION%`, `%DOT%`, `%STAR%`, `%PIPE%`, `%QUOTE%`, `%LESSTHAN%`, `%GREATERTHAN%` patterns exist in source code, test fixtures, or snapshots -- Projects with the old `encodeWindowsInvalidChars`/`decodeWindowsInvalidChars` fields in `.project.json` parse without crashing (serde should ignore unknown fields -- verify this) -- The `syncback_encoded_names` test fixture has been fully migrated from `%ENCODED%` filenames to slugified filenames + meta files, with no old-format files remaining - ---- - -## 12. Known Issues (Already Identified) - -These have already been found. Include them in the report as confirmed, and check whether the suggested fixes are correct and complete. - -### 12a. CRITICAL: Meta `name` field update skipped when slug doesn't change - -**Files**: [src/change_processor.rs:834-879](src/change_processor.rs), [src/change_processor.rs:734-789](src/change_processor.rs) - -The meta file `name` field update logic (`upsert_meta_name_field` / `remove_meta_name_field`) is nested inside the `if new_path != *path` condition. When renaming an instance where both old and new names slugify to the same filename (e.g. `"Foo/Bar"` to `"Foo|Bar"` -- both become `"Foo_Bar"`), the path doesn't change, so the entire block is skipped -- including the meta file updates. - -**Impact**: The instance rename is silently lost. The meta file retains the old `name` value, so subsequent forward syncs restore the old name instead of the new one. This is a direct round-trip fidelity violation. - -**Affected paths**: Both regular file renames (line ~835) and init file/directory renames (line ~735). - -**Suggested fix**: Move the meta `name` field update logic OUTSIDE the `if new_path != *path` block. The meta name must be updated whenever the instance name changes, regardless of whether the filesystem path changes. The condition for updating the meta file is `old_name != new_name`, not `old_path != new_path`. - ---- - -## 13. Deliverables - -Produce a structured report with: - -- **Critical issues** -- bugs that would cause data loss, incorrect instance names, file overwrites, or round-trip identity failures -- **Correctness concerns** -- logic that looks wrong or has edge cases that might not manifest immediately but could cause silent data corruption -- **Missing test coverage** -- specific test cases that should exist but don't, prioritized by risk (round-trip tests > unit tests) -- **Determinism concerns** -- any non-deterministic behavior that could cause different builds from the same source -- **Cleanup items** -- leftover references, dead code, stale comments -- **Deferred refactors** -- major structural improvements that would reduce duplication or improve maintainability but are too large to do inline. Describe the problem, the affected files, and the rough scope. These will be evaluated separately after the audit. -- For each issue: file path, line numbers, description, and suggested fix - diff --git a/.cursor/plans/audit_slugify_pass_3_b11f65a1.plan.md b/.cursor/plans/audit_slugify_pass_3_b11f65a1.plan.md deleted file mode 100644 index 417549d5..00000000 --- a/.cursor/plans/audit_slugify_pass_3_b11f65a1.plan.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -name: Audit slugify pass 3 -overview: Holistic audit of the entire `slugify` branch diff against master (110 files, +6315/-1188 lines, 21 commits). Found 1 critical bug, 2 correctness issues, and 8 test gaps. All prior plan fixes verified in code. Legacy cleanup confirmed complete. -todos: - - id: c1-model-rename - content: "CRITICAL: Fix model JSON rename in change_processor.rs -- add .model to suffix list, update name inside model file instead of adjacent meta" - status: completed - - id: cc1-model-update-name - content: Fix syncback_update_existing_instance (api.rs:1093) dropping name field when rewriting .model.json5 files, and write_init_meta_json (api.rs:1075) dropping name field for directories - status: completed - - id: cc2-dir-removal-meta - content: Fix remove_instance_at_path directory case to clean up grandparent-level DirName.meta.json5 - status: completed - - id: test-roundtrip-slugified - content: "Add roundtrip test: instances with forbidden chars through syncback -> rebuild -> compare" - status: completed - - id: test-model-rename - content: "Add two-way sync test: rename a .model.json5 instance, verify compound extension preserved and name updated" - status: completed - - id: test-idempotency - content: "Add syncback idempotency integration test: syncback twice = zero changes" - status: completed - - id: test-3-collision - content: Add 3+ instance collision test (X/Y, X:Y, X|Y all slug to X_Y) - status: completed - - id: test-reserved-names - content: Add Windows reserved name integration test (CON, PRN round-trip) - status: completed - - id: test-dir-rename - content: "Add two-way sync test: directory/init-file rename with forbidden chars" - status: completed - - id: test-case-collision - content: Add case-insensitive collision integration test (Foo vs foo) - status: completed - - id: test-meta-empty-deletion - content: Strengthen rename_slugified_to_clean test to verify meta file is deleted (not just name removed) when it becomes empty - status: completed -isProject: false ---- - -# Audit: slugify Branch -- Pass 3 (Holistic) - -## Scope - -Full diff against `master`: 110 files, +6,315 / -1,188 lines across 21 commits. Every changed file reviewed. All 4 prior plan files cross-referenced against codebase. - -## Quality Standard - -> **Round-trip identity**: Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree**. Any deviation is a bug. - ---- - -## Prior Plan Verification - -All claims from prior plans verified in code -- no discrepancies: - -- **fix_audit_findings**: C1 (meta gating), C2 (removal meta path), C3 (deny_unknown_fields), CC1 (determinism), CC2 (init removal), DR1 (shared meta helper), DR2 (meta path helper) -- all confirmed in code. -- **fix_audit_pass_2**: CC2 refactor (`remove_instance_at_path`), preseed fix, rename dedup, dir sort, csv instigating_source, over-suppression, comment fix -- all confirmed. -- **fix_stem-level_dedup**: `return-dedup-key`, `fix-dir`, `fix-project`, `fix-api` -- all confirmed. Note: `fix-tests` is still marked `in_progress` in the plan but tests do exist; the plan status is stale. - ---- - -## Areas Confirmed CLEAN - -Thoroughly re-audited via the full diff and found correct: - -- **Forward sync** (all middleware): `decode_path_name` fully removed. All middleware correctly resolves names from metadata `name` field or filename stem. `specified_name` set on `InstanceMetadata` in every middleware. `is_empty()` updated for `name`. `instigating_source` preserved in `csv.rs`. -- **Reverse sync / syncback**: `slugify_name()`, `deduplicate_name()`, `name_for_inst()` all correct. Pre-seeding uses `relevant_paths` + `strip_middleware_extension()`. Child ordering sorted alphabetically in both `dir.rs` and `project.rs`. `dedup_key.to_lowercase()` applied at ALL insertion sites. -- **Two-way sync adds**: `syncback_added_instance` groups adds by parent, seeds `sibling_slugs` from tree children via `instigating_source` paths, uses `strip_middleware_extension`. Meta files written when slug differs. Meta path matches script file path via `adjacent_meta_path()`. -- **Two-way sync removals**: `remove_instance_at_path` handles directories, init files (parent dir removal + grandparent meta), and regular files (adjacent meta). Old dead `syncback_removed_instance` deleted. -- **Meta lifecycle**: C1 fix in place -- meta updates OUTSIDE `if new_path != *path` for both init and regular paths. Shared module (`syncback::meta`) used by `change_processor.rs`. `suppress_path_remove` exists. `RemoveNameOutcome` handled correctly with `(1, 0)` counts for `FileDeleted`. -- **Legacy cleanup**: Zero references to old encoding system in source, tests, plugin, schema, or snapshots. `src/path_encoding.rs` deleted. `pub mod path_encoding` removed from `lib.rs`. `decode_windows_invalid_chars` removed from `InstanceContext` and `serve_session.rs`. -- **Dedup key consistency**: All insertion sites use `.to_lowercase()`. Cross-format collision handled. -- **SyncbackRules**: No `deny_unknown_fields`. -- **JSON schema**: `encodeWindowsInvalidChars` removed from `vscode-rojo/schemas/`. -- **Snapshot files**: All `.snap` files updated. No stale `decode_windows_invalid_chars` or `%ENCODED%` patterns. -- `**json_model_legacy_name` snapshot change**: Instance name changed from `Expected Name` to `Overridden Name` -- correct, this is the intended behavior change (the `Name`/`name` field is now respected instead of ignored). -- **Test fixture migration**: All `%ENCODED%` filenames in `syncback_encoded_names/` correctly replaced with slugified names + meta files. -- **Existing test updates**: All ~12 two-way sync tests with encoded patterns correctly updated to slugified equivalents. - ---- - -## CRITICAL: Model JSON rename loses `.model` compound extension - -**File**: [src/change_processor.rs](src/change_processor.rs) lines 786-868 - -The rename handler's suffix list: - -```786:789:src/change_processor.rs -let known_suffixes = [ - ".server", ".client", ".plugin", ".local", - ".legacy", -]; -``` - -Does NOT include `.model`. For `What_Model.model.json5` renamed to `Why?Model`: - -- `stem` = `"What_Model.model"`, `extension` = `"json5"`, `script_suffix` = `""` (no match) -- `old_base` = `"What_Model.model"` (includes `.model`) -- New filename = `"Why_Model.json5"` -- `.model` LOST - -**Impact**: File type changes from `.model.json5` (JSON instance) to `.json5` (data module). Instance class, properties, hierarchy silently lost. The meta update then writes to `Why_Model.meta.json5` (wrong location for model files). Direct round-trip violation. - -**Fix**: Add `.model` to the suffix list. Then detect `.model.json5`/`.model.json` files and update the `name` field INSIDE the model file (like `syncback::meta::upsert_meta_name` but targeting the JSON root's `name` key) instead of writing adjacent `.meta.json5`. - ---- - -## CORRECTNESS: `syncback_update_existing_instance` drops `name` field - -**File**: [src/web/api.rs](src/web/api.rs) lines 1091-1098 - -When updating an existing `.model.json5` via two-way sync (plugin sends updated properties), the code rewrites the entire model file: - -```1093:1093:src/web/api.rs -let content = self.serialize_instance_to_model_json(added, None)?; -``` - -`None` for `instance_name` means the `name` field is NOT written. If the model file previously had `"name": "Hey/Bro"`, the name is silently lost on rewrite. Same issue exists at line 1075 for directory updates via `write_init_meta_json(existing_path, added, None)`. - -**Fix**: Compute `meta_name_field` by comparing the slug of the existing filesystem name against `added.name`. If they differ, pass `Some(&added.name)`. This matches the logic in `syncback_instance_to_path_with_stats`. - ---- - -## CORRECTNESS: `remove_instance_at_path` directory case skips grandparent meta - -**File**: [src/web/api.rs](src/web/api.rs) lines 1389-1396 - -When `path.is_dir()` (plain Folder), `remove_dir_all` is called but no adjacent `DirName.meta.json5` at the parent level is cleaned up. The init-file case (lines 1423-1438) correctly handles this. - -**Severity**: LOW. Grandparent-level `DirName.meta.json5` only exists from manual creation or the change_processor rename path (which renames it). Standard syncback uses `init.meta.json5` inside the directory. - -**Fix**: After `remove_dir_all`, add grandparent meta cleanup matching the init-file path. - ---- - -## TEST COVERAGE GAPS - -Prioritized by risk: - -1. **Roundtrip test with slugified names** -- `syncback_roundtrip.rs` exists but no fixtures exercise slugified names. None of `meta_name_override`, `model_json_name_override`, `dedup_suffix_with_meta` are in the roundtrip test list. -2. **Model file rename two-way sync** -- No test for renaming a `.model.json5` instance. Would catch the critical bug above. -3. **Syncback idempotency integration** -- Run syncback twice, assert zero changes on second run. Unit tests exist but no full-pipeline test. -4. **3+ instance collision** -- Only 2-instance collision tested (`add_two_colliding_instances_deduplicates`). Need `X/Y`, `X:Y`, `X|Y` -> `X_Y`, `X_Y~1`, `X_Y~2`. -5. **Windows reserved name integration** -- Unit tests for `CON`/`PRN` slugification exist. No build or syncback integration test. -6. **Directory rename with forbidden chars** -- Two-way sync tests cover file renames but not init-file/directory renames. -7. **Case-insensitive collision** -- Code handles it (`.to_lowercase()` everywhere). No integration test. -8. **Meta file empty deletion** -- `rename_slugified_to_clean` test checks meta doesn't have `name` field but doesn't verify the meta file itself is deleted when it becomes empty (the `RemoveNameOutcome::FileDeleted` path). - ---- - -## Summary - - -| Category | Count | Details | -| ------------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| Critical bugs | 1 | Model JSON rename loses `.model` extension | -| Correctness | 2 | `syncback_update_existing_instance` drops `name` field; directory removal skips grandparent meta | -| Missing tests | 8 | Roundtrip, model rename, idempotency, 3+ collision, reserved names, dir rename, case collision, meta empty deletion | -| Prior plans | OK | All claims verified in code, no discrepancies | -| Clean areas | 10 | Forward sync, reverse sync, two-way adds/removals, meta lifecycle, legacy cleanup, dedup consistency, schema, snapshots, test fixtures, test updates | - - diff --git a/.cursor/plans/bump_sync_logging_to_info_3e39ff81.plan.md b/.cursor/plans/bump_sync_logging_to_info_3e39ff81.plan.md deleted file mode 100644 index 8810a814..00000000 --- a/.cursor/plans/bump_sync_logging_to_info_3e39ff81.plan.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -name: Bump sync logging to info -overview: Promote all sync-related change logging in the Rojo Studio plugin from Debug/Trace to Info level, so that every change received, confirmed, sent, and applied is visible in the Studio output console at the default log level. -todos: - - id: log-padding - content: Remove 15-space padding from log tags in plugin/log/init.lua (TRACE_TAG, INFO_TAG, DEBUG_TAG) - status: completed - - id: serve-session - content: Bump Debug/Trace to Info in ServeSession.lua (received, confirmed, applied summaries + per-item decisions). Add combined patch summary after WebSocket message combining. - status: completed - - id: change-batcher - content: Bump batch summary in ChangeBatcher/init.lua line 115 from Debug to Info - status: completed - - id: api-context - content: Bump sending-to-server logs in ApiContext.lua from Debug/Trace to Info (summary + per-item operations) - status: completed - - id: apply-patch - content: Bump patch application logs in Reconciler/applyPatch.lua from Debug to Info (summary + per-update details) - status: completed -isProject: false ---- - -# Bump Sync Change Logging to Info - -## Current State - -The plugin's `Log` module (at `plugin/log/init.lua`) supports levels: Error(0), Warning(1), Info(2), Debug(3), Trace(4). Default log level is `"Info"`, meaning Debug and Trace messages are hidden unless the user manually changes the setting. - -Most sync-flow messages are currently at Debug or Trace, so users can't see what changes are being received/sent/confirmed without digging into settings. - -## Files to Change - -### 0. [plugin/log/init.lua](plugin/log/init.lua) -- Fix excessive log padding - -The log tags have 15 hardcoded spaces prepended for alignment with Studio's timestamp column, but it creates absurdly wide output -- especially for multi-line messages where `addTags` replaces every `\n` with `\n` + the full padded tag. - -```lua --- Current (lines 15-16) -- repeats tag on every line of multi-line messages: -local function addTags(tag, message) - return tag .. message:gsub("\n", "\n" .. tag) -end - --- Fix: just prepend the tag once -local function addTags(tag, message) - return tag .. message -end -``` - -```lua --- Current (lines 19-21) -- 15 spaces of padding before each tag: -local TRACE_TAG = (" "):rep(15) .. "[Rojo-Trace] " -local INFO_TAG = (" "):rep(15) .. "[Rojo-Info] " -local DEBUG_TAG = (" "):rep(15) .. "[Rojo-Debug] " - --- Fix: remove the padding -local TRACE_TAG = "[Rojo-Trace] " -local INFO_TAG = "[Rojo-Info] " -local DEBUG_TAG = "[Rojo-Debug] " -``` - -Note: `WARN_TAG` on line 22 already has no padding (it goes through `warn()` which has its own formatting). - -### 1. [plugin/src/ServeSession.lua](plugin/src/ServeSession.lua) -- Received / Confirmed / Applied - -**Received from server (WebSocket):** - -- Line 222: `Log.debug` -> `Log.info` -- "Received {} messages from Rojo server" -- After line 228 (after combining messages into `combinedPatch`): add an `Log.info` summary of what's IN the combined patch (removals, additions, updates counts), similar to how `applyPatch.lua` does it. Currently the contents are only visible at Trace via the raw packet dump. - -**Confirmation selections:** - -- Line 699: `Log.debug` -> `Log.info` -- "User selections: {} push, {} pull, {} ignored" -- Line 713: `Log.trace` -> `Log.info` -- "[Push] Update: {}" -- Line 726: `Log.trace` -> `Log.info` -- "[Pull] Update: {}" -- Line 757: `Log.trace` -> `Log.info` -- "[Push] Delete: {}" -- Line 792: `Log.trace` -> `Log.info` -- "[Push] Add: {}.{}" -- Lines 772, 797, 828 are already Info -- no change needed - -**Applied to Studio (summary):** - -- Line 813: `Log.debug` -> `Log.info` -- "Applying to Studio: {} additions, {} removals, {} updates" -- Line 583: `Log.debug` -> `Log.info` -- unapplied patch summary (important for diagnosing sync issues) - -### 2. [plugin/src/ChangeBatcher/init.lua](plugin/src/ChangeBatcher/init.lua) -- Outgoing batched changes - -- Line 115: `Log.debug` -> `Log.info` -- "Two-way sync: {} updates, {} additions, {} removals" -- Lines 70, 73 stay at Trace -- these fire per-property-per-frame and would flood the console if promoted - -### 3. [plugin/src/ApiContext.lua](plugin/src/ApiContext.lua) -- Sent to server - -- Line 202: `Log.debug` -> `Log.info` -- "Sending to server: {} removals, {} additions, {} updates" -- Line 212: `Log.trace` -> `Log.info` -- "[Syncback] Remove ID: {}" -- Line 218: `Log.trace` -> `Log.info` -- "[Syncback] Add {} ({})" -- Line 228: `Log.trace` -> `Log.info` -- "[Syncback] Update ID {} ({} properties)" - -### 4. [plugin/src/Reconciler/applyPatch.lua](plugin/src/Reconciler/applyPatch.lua) -- Applied to Studio (per-item) - -- Line 36: `Log.debug` -> `Log.info` -- "Applying patch to Studio: {} removals, {} additions, {} updates" -- Line 141: `Log.debug` -> `Log.info` -- "[Studio] Update: {} - {}" -- Lines 56, 106 are already Info -- no change needed - -## What stays at Debug/Trace (intentionally) - -- ChangeBatcher per-property detection (lines 70, 73) -- fires every frame, too noisy -- Raw WebSocket packet dump (ApiContext line 299) -- huge payloads, not useful for comparison -- Precommit/postcommit hook registration (ServeSession lines 182, 189, 203, 210) -- lifecycle plumbing, not sync data -- Internal fallback/replace logic (ServeSession lines 561, 566) -- internal recovery mechanism - -## Summary of Sync Flow Visibility After Changes - -``` -Server → Plugin: "Received N messages" + combined patch summary (counts) -Confirmation: "User selections: X push, Y pull, Z ignored" + per-item decisions -Apply to Studio: "Applying patch: N removals, M additions, K updates" + per-item details -Studio → Server: "Two-way sync: X updates, Y additions, Z removals" (batch summary) -Send to Server: "Sending to server: N removals, M additions, K updates" + per-item details -``` - -All of these will now appear in the Studio output console at the default Info log level. \ No newline at end of file diff --git a/.cursor/plans/cargo_dependency_upgrades_9b14d945.plan.md b/.cursor/plans/cargo_dependency_upgrades_9b14d945.plan.md deleted file mode 100644 index 311d9265..00000000 --- a/.cursor/plans/cargo_dependency_upgrades_9b14d945.plan.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -name: Cargo Dependency Upgrades -overview: Upgrade all 11 incompatible cargo dependencies across the rojo workspace and the rbx-dom submodule, organized into tiers by risk and complexity. -todos: - - id: tier1-rand - content: Upgrade rand 0.8 -> 0.9 in rbx_types (thread_rng -> rng rename) - status: completed - - id: tier1-bitflags - content: Upgrade bitflags 1.x -> 2.x in rbx_types (faces.rs, axes.rs macro syntax) - status: completed - - id: tier2-winreg - content: Upgrade winreg 0.10 -> 0.55 in rojo (auth_cookie.rs, winapi -> windows-sys) - status: completed - - id: tier2-serde-yaml - content: Upgrade serde_yaml 0.8 -> 0.9 in rojo, rojo-insta-ext, rbx_util, rbx_reflector. Run cargo insta review for snapshot diffs. - status: completed - - id: tier3-criterion - content: Upgrade criterion 0.3/0.5 -> 0.8 in rojo and rbx_binary benchmarks - status: completed - - id: tier3-xml-rs - content: Upgrade xml-rs 0.8 -> 1.0 in rbx_xml (deserializer_core.rs, serializer_core.rs) - status: completed - - id: tier3-reqwest - content: Upgrade reqwest 0.11 -> 0.13 in rojo and rbx_reflector (blocking feature still supported) - status: completed - - id: tier4-bincode - content: Upgrade bincode 1.x -> 3.0 in rojo and rbx_types (build.rs embedding, runtime deserialize, config::legacy for compat) - status: completed - - id: tier4-hyper - content: Upgrade hyper 0.14 -> 1.x + hyper-tungstenite 0.11 -> 0.19. Add hyper-util, http-body-util. Rewrite server setup and body handling. - status: completed - - id: final-verify - content: Run cargo test, cargo clippy, cargo fmt --check across entire workspace to verify - status: completed -isProject: false ---- - -# Cargo Incompatible Dependency Upgrade Plan - -## Inventory - -11 packages across 8 `Cargo.toml` files need incompatible (semver-breaking) upgrades: - - -| Package | From | To | Location(s) | Risk | -| ----------------- | ------- | ------ | --------------------------------------------- | ----------- | -| rand | 0.8.5 | 0.9.2 | rbx_types | Low | -| bitflags | 1.3.2 | 2.10.0 | rbx_types | Low | -| winreg | 0.10.1 | 0.55.0 | rojo (Windows) | Low | -| serde_yaml | 0.8.26 | 0.9.34 | rojo, rojo-insta-ext, rbx_util, rbx_reflector | Low | -| criterion | 0.3/0.5 | 0.8.2 | rojo, rbx_binary | Medium | -| xml-rs | 0.8.28 | 1.0.0 | rbx_xml | Medium | -| reqwest | 0.11.27 | 0.13.2 | rojo, rbx_reflector | Medium | -| bincode | 1.3.3 | 3.0.0 | rojo, rbx_types | Medium-High | -| hyper | 0.14.32 | 1.8.1 | rojo | High | -| hyper-tungstenite | 0.11.1 | 0.19.0 | rojo | High | - - -**Note:** 6 of these packages live in the `rbx-dom/` submodule (separate git repo). Those changes must be committed to the submodule first, then the submodule pointer updated in rojo. - ---- - -## Tier 1 -- Low Risk (rbx-dom submodule) - -### 1a. rand 0.8 to 0.9 - -- **File:** [rbx-dom/rbx_types/Cargo.toml](rbx-dom/rbx_types/Cargo.toml) -- **Code change:** [rbx-dom/rbx_types/src/unique_id.rs](rbx-dom/rbx_types/src/unique_id.rs) -- 1 file, ~2 lines -- `thread_rng()` renamed to `rng()` in rand 0.9. `gen_range(0..i64::MAX)` syntax remains valid. - -### 1b. bitflags 1.x to 2.x - -- **File:** [rbx-dom/rbx_types/Cargo.toml](rbx-dom/rbx_types/Cargo.toml) -- **Code changes:** [rbx-dom/rbx_types/src/faces.rs](rbx-dom/rbx_types/src/faces.rs) and [rbx-dom/rbx_types/src/axes.rs](rbx-dom/rbx_types/src/axes.rs) -- 2 files -- bitflags 2.x keeps the `bitflags!` macro but struct visibility syntax changes slightly. Manual serde impls and `.bits()` / `.from_bits()` remain but some trait impls (like `Hash`) are now auto-derived. - ---- - -## Tier 2 -- Low Risk (rojo main + crates) - -### 2a. winreg 0.10 to 0.55 - -- **File:** [Cargo.toml](Cargo.toml) (Windows target dep) -- **Code change:** [src/auth_cookie.rs](src/auth_cookie.rs) -- 1 file, ~6 lines -- Core API (`RegKey::predef`, `open_subkey`, `get_value`) is preserved. Main change is the backend switched from `winapi` to `windows-sys`. - -### 2b. serde_yaml 0.8 to 0.9 - -- **Files:** - - [Cargo.toml](Cargo.toml) (dev-deps) - - [crates/rojo-insta-ext/Cargo.toml](crates/rojo-insta-ext/Cargo.toml) - - [rbx-dom/rbx_util/Cargo.toml](rbx-dom/rbx_util/Cargo.toml) - - [rbx-dom/rbx_reflector/Cargo.toml](rbx-dom/rbx_reflector/Cargo.toml) -- **Code changes:** [crates/rojo-insta-ext/src/redaction_map.rs](crates/rojo-insta-ext/src/redaction_map.rs), [rbx-dom/rbx_util/src/view_binary.rs](rbx-dom/rbx_util/src/view_binary.rs), [rbx-dom/rbx_reflector/src/patches.rs](rbx-dom/rbx_reflector/src/patches.rs) -- 3 files -- serde_yaml 0.9 renames `Value::Mapping` internals and changes error types. The basic `from_str`, `to_writer`, `to_value` APIs are largely the same. May also affect insta snapshot test output formatting. - ---- - -## Tier 3 -- Medium Risk - -### 3a. criterion 0.3/0.5 to 0.8 - -- **Files:** - - [Cargo.toml](Cargo.toml) (dev-deps: `0.3.6`) - - [rbx-dom/rbx_binary/Cargo.toml](rbx-dom/rbx_binary/Cargo.toml) (dev-deps: `0.5.1`) -- **Code changes:** [benches/build.rs](benches/build.rs), [rbx-dom/rbx_binary/benches/suite/main.rs](rbx-dom/rbx_binary/benches/suite/main.rs), [rbx-dom/rbx_binary/benches/suite/util.rs](rbx-dom/rbx_binary/benches/suite/util.rs) -- 3 files -- criterion 0.8 removed `criterion_group!` / `criterion_main!` macros in favor of a new runner. Benchmark functions remain similar but setup code will change. - -### 3b. xml-rs 0.8 to 1.0 - -- **File:** [rbx-dom/rbx_xml/Cargo.toml](rbx-dom/rbx_xml/Cargo.toml) -- **Code changes:** [rbx-dom/rbx_xml/src/deserializer_core.rs](rbx-dom/rbx_xml/src/deserializer_core.rs), [rbx-dom/rbx_xml/src/serializer_core.rs](rbx-dom/rbx_xml/src/serializer_core.rs), and [rbx-dom/rbx_xml/src/types/physical_properties.rs](rbx-dom/rbx_xml/src/types/physical_properties.rs) -- 3 files, ~300 lines -- xml-rs 1.0 rebrands to the `xml` crate. The event-based reader/writer API has the same structure but types/namespaces changed. `ParserConfig`, `EventReader`, `EmitterConfig`, `EventWriter` all have equivalents but may be renamed or restructured. - -### 3c. reqwest 0.11 to 0.13 - -- **Files:** [Cargo.toml](Cargo.toml), [rbx-dom/rbx_reflector/Cargo.toml](rbx-dom/rbx_reflector/Cargo.toml) -- **Code changes:** [src/cli/studio.rs](src/cli/studio.rs), [src/cli/syncback.rs](src/cli/syncback.rs), [src/cli/upload.rs](src/cli/upload.rs) -- 3 files -- reqwest 0.13 **still supports `blocking**`. Main breaking changes: internal HTTP client changes, some header/feature reorganization. The `reqwest::blocking::Client` API is preserved. - ---- - -## Tier 4 -- High Risk - -### 4a. bincode 1.x to 3.0 - -- **Files:** [Cargo.toml](Cargo.toml) (deps + build-deps), [rbx-dom/rbx_types/Cargo.toml](rbx-dom/rbx_types/Cargo.toml) (dev-deps) -- **Code changes:** - - [build.rs](build.rs) -- `bincode::serialize_into` calls - - [src/cli/plugin.rs](src/cli/plugin.rs) -- `bincode::deserialize` call - - [src/cli/init.rs](src/cli/init.rs) -- `bincode::deserialize` call - - ~16 test usages across `rbx-dom/rbx_types/src/` (serialization roundtrips) -- bincode 3.0 completely rewrites the API. Serde support is opt-in via the `serde` feature. `serialize`/`deserialize` become `bincode::serde::encode_to_vec` / `bincode::serde::decode_from_slice` with an explicit `Configuration`. For backward compatibility with existing bincode 1.x-encoded data (embedded plugin/template snapshots), use `config::legacy()`. -- **Critical concern:** The build.rs embeds snapshots at compile time that are deserialized at runtime. The format must remain compatible across the upgrade, or the embedded blobs must be regenerated. - -### 4b. hyper 0.14 to 1.x + hyper-tungstenite 0.11 to 0.19 - -- **Files:** [Cargo.toml](Cargo.toml) -- **New dependency needed:** `hyper-util` (provides the server and service utilities removed from hyper core) -- **Code changes:** - - [src/web/mod.rs](src/web/mod.rs) -- Server setup (~25 lines). `hyper::Server::bind` replaced by `hyper_util::server::conn::auto::Builder` + a TCP accept loop. - - [src/web/api.rs](src/web/api.rs) -- Request/response handling (~50 lines). `hyper::Body` becomes a trait; use `http_body_util::Full` or `BoxBody`. - - [src/web/ui.rs](src/web/ui.rs) -- Same Body/Response changes (~20 lines). - - [src/web/util.rs](src/web/util.rs) -- Response builder helpers (~30 lines). `Body::from()` becomes `Full::new(Bytes::from(...))`. - - [tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs) -- Test WebSocket client (~15 lines). -- **New dependencies:** `hyper-util`, `http-body-util`, `bytes` (if not already present) -- This is the most architecturally impactful change. The server accept loop, body type system, and service pattern all change fundamentally. - ---- - -## Execution Strategy - -Work in this order so each tier builds on stable ground: - -1. **Tier 1** (rbx-dom: rand, bitflags) -- Isolated to rbx_types, no downstream API changes -2. **Tier 2** (winreg, serde_yaml) -- Simple API surface, low blast radius -3. **Tier 3** (criterion, xml-rs, reqwest) -- More code changes but well-scoped -4. **Tier 4** (bincode, hyper stack) -- Architectural changes, do last - -After each tier: run `cargo test` and `cargo clippy` to verify. For rbx-dom changes, commit to the submodule first, then update the submodule pointer in the main repo. - -**serde_yaml snapshot tests:** The 0.8 to 0.9 upgrade may change YAML serialization output slightly (e.g., tag formatting). Run `cargo insta review` after upgrading to accept snapshot diffs. \ No newline at end of file diff --git a/.cursor/plans/changebatcher_encoding_audit_bade61c8.plan.md b/.cursor/plans/changebatcher_encoding_audit_bade61c8.plan.md deleted file mode 100644 index 3194ecbd..00000000 --- a/.cursor/plans/changebatcher_encoding_audit_bade61c8.plan.md +++ /dev/null @@ -1,211 +0,0 @@ ---- -name: ChangeBatcher Encoding Audit -overview: Audit of the ChangeBatcher encoding refactors covering encodeService.lua (new), encodeInstance.lua (modified), and related test changes across 4 files (132 insertions, 63 deletions). -todos: - - id: fix-header-comment - content: "Fix stale header comment in encodeInstance.lua (Finding 1): update DUPLICATE HANDLING section to say duplicates are encoded and delegated to server" - status: completed - - id: extract-shared-filter - content: Extract shared property encoding filter from encodeService.lua and encodeInstance.lua into a common helper to eliminate duplication (Finding 2) - status: completed - - id: add-encodeService-tests - content: Create encodeService.spec.lua with tests for property encoding, Ref carrier logic, Attributes/Tags, EXCLUDE_PROPERTIES, and empty services (Finding 3) - status: completed - - id: document-clocktime-exclude - content: Add comment to EXCLUDE_PROPERTIES in encodeService.lua explaining why Lighting.ClockTime is excluded (Finding 4) - status: completed - - id: fix-servicechunk-doc - content: Fix misleading doc comment on ServiceChunk in src/web/interface.rs to correctly describe refs as 1-based carrier indices (Finding 5) - status: completed -isProject: false ---- - -# ChangeBatcher Encoding Refactors -- Audit Report - -## Scope - -4 files changed: +132 / -63 across 13 commits. - - -| File | Change Type | Lines | -| -------------------------------- | --------------- | -------------------------------- | -| `encodeService.lua` | New (108 lines) | +108 | -| `encodeInstance.lua` | Modified | +24 / -53 | -| `encodeInstance.spec.lua` | Modified | +3 / -4 | -| `encodeInstance.stress.spec.lua` | Modified | -6 (removed skippedCount checks) | - - ---- - -## Architecture Summary - -```mermaid -flowchart TD - subgraph TwoWaySync [Two-Way Sync Path] - InstanceMap["InstanceMap signals"] --> ChangeBatcher - ChangeBatcher --> createPatchSet - createPatchSet --> encodePatchUpdate - encodePatchUpdate --> encodeProperty - end - - subgraph LiveSyncback [Live Syncback Path] - performSyncback["App:performSyncback()"] --> encodeService - encodeService --> encodeProperty - performSyncback --> encodeInstance - encodeInstance --> encodeProperty - end - - encodeProperty --> RbxDom - encodeService --> propertyFilter - encodeInstance --> propertyFilter - encodePatchUpdate --> propertyFilter -``` - - - -`encodeService` is new and serves the live syncback feature. `encodeInstance` was refactored to delegate duplicate handling to the server. - ---- - -## Finding 1: Stale Header Comment (Bug) - -**Severity: Moderate** | **File:** `[encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua)` lines 1-17 - -The module header comment claims: - -``` -DUPLICATE HANDLING: -- Instances with duplicate-named siblings at ANY level of the path are skipped -``` - -But the code was changed to do the opposite -- duplicates are now **encoded** (not skipped), with a debug log, and the server handles dedup. The header directly contradicts the code behavior. - -**Fix:** Update the header to reflect the new behavior. - ---- - -## Finding 2: Duplicated Encoding Filter Logic (Code Quality) - -**Severity: Moderate (small refactor candidate)** | **Files:** `[encodeService.lua](plugin/src/ChangeBatcher/encodeService.lua)`, `[encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua)` - -The property encoding filter is copy-pasted across both files with only minor differences: - - -| Logic | `encodeService.lua` | `encodeInstance.lua` | -| --------------------------------------------- | ------------------- | -------------------- | -| SKIP_PROPERTIES (Parent, Name, Archivable) | Lines 7-11 | Lines 34-38 | -| Skip Attributes/Tags (handled separately) | Line 33 | Lines 217-219 | -| Scriptability check (ReadWrite, Read, Custom) | Lines 37-39 | Lines 224-226 | -| DoesNotSerialize check | Line 40 | Line 227 | -| UNENCODABLE_DATA_TYPES filter | Line 45 | Line 233 | -| Attributes encoding (pcall + descriptor) | Lines 70-81 | Lines 121-138 | -| Tags encoding (pcall + descriptor) | Lines 83-94 | Lines 141-157 | - - -If either filter is updated (e.g., adding a new skip property, changing the scriptability check), the other must be updated identically or a divergence bug is introduced. - -**Fix:** Extract a shared `iterEncodableProperties(className, callback)` helper that handles the filter logic once. Both `encodeService` and `encodeInstance` would call it. The Attributes/Tags encoding blocks could also be extracted to a shared `encodeAttributesAndTags(instance, properties)` function (the `encodeAttributes`/`encodeTags` functions in `encodeInstance.lua` already do this but aren't exported). - ---- - -## Finding 3: No Tests for `encodeService.lua` (Test Gap) - -**Severity: Moderate** | **File:** `encodeService.lua` (new, 108 lines, no spec file) - -Every other encoding module has a `.spec.lua` test: - -- `encodeInstance.spec.lua` (exists) -- `encodeInstance.stress.spec.lua` (exists) -- `encodePatchUpdate.spec.lua` (exists) -- `encodeProperty.spec.lua` (exists) -- `**encodeService.spec.lua` -- MISSING** - -`encodeService` handles Ref property encoding via ObjectValue carriers (a tricky serialization path), service-level property filtering, and the carrier index calculation. These all warrant test coverage. - -**Fix:** Add `encodeService.spec.lua` covering: - -- Basic property encoding for a service (e.g., Lighting) -- Ref property carrier creation and index correctness -- Attributes/Tags encoding on services -- EXCLUDE_PROPERTIES filtering (Lighting.ClockTime) -- Empty service (no properties, no children) - ---- - -## Finding 4: `EXCLUDE_PROPERTIES` Undocumented (Documentation) - -**Severity: Low** | **File:** `[encodeService.lua](plugin/src/ChangeBatcher/encodeService.lua)` lines 13-15 - -```lua -local EXCLUDE_PROPERTIES = { - Lighting = { ClockTime = true }, -} -``` - -`ClockTime` (Float32) and `TimeOfDay` (String) are linked properties on Lighting -- they represent the same value in different formats, and both have `Serialization: "Serializes"`. Excluding `ClockTime` avoids sending a redundant/conflicting representation alongside `TimeOfDay`. This is a reasonable design choice, but there is no comment explaining the reasoning. If someone sees `TimeOfDay` behaving oddly, they won't know `ClockTime` was intentionally excluded or why. - -**Fix:** Add a comment explaining the linked-property reason. - ---- - -## Finding 5: Misleading `ServiceChunk` Doc Comment (Documentation) - -**Severity: Low** | **File:** `[src/web/interface.rs](src/web/interface.rs)` lines 30-42 - -The doc comment on `ServiceChunk` states: - -> `refs` maps property names to 1-based indices into this combined range (0 = nil). Indices <= child_count point directly to a child instance. Indices > child_count point to an ObjectValue carrier. - -But the server code in `[serve.rs](src/cli/serve.rs)` lines 198-204 treats `refs` values as **1-based indices into the carrier slice only** (not the combined range): - -```rust -let carriers = &service_range[carrier_start..carrier_end]; -for (prop_name, &idx) in &chunk.refs { - if idx == 0 || (idx as usize) > carriers.len() { continue; } - ref_entries.push((prop_name.clone(), carriers[idx as usize - 1])); -} -``` - -And the plugin sets `refs[propertyName] = #refTargets` (1-based into refTargets only). The "indices into combined range" and "indices <= child_count point to a child" parts of the comment are incorrect -- carriers never point to children. - -**Fix:** Update the doc comment to say `refs` maps property names to 1-based indices into the carrier slice. - ---- - -## Positive Changes (No Action Needed) - -### P1: Module-Level Mutable State Removed (encodeInstance.lua) - -The old code had `local skippedDuplicateCount = 0` at module scope, mutated across calls and reset inside a wrapper function. This was a shared mutable state pattern that risked stale counts if the wrapper wasn't used. The new code removes this entirely -- clean improvement. - -### P2: Duplicate Handling Delegated to Server - -Previously, `encodeInstance` skipped any instance whose path contained duplicate-named siblings, silently losing data. Now all instances are encoded and sent to the server, which handles filesystem name collisions via the dedup suffix system (`~2`, `~3`, etc.). This is the correct design -- the server has the filesystem context needed to resolve collisions, while the plugin should send complete data. - -### P3: `Custom` Scriptability Added - -The filter now includes `propertyMeta.scriptability == "Custom"` alongside `ReadWrite` and `Read`. The reflection database has 9 `Custom` scriptability properties. After accounting for those handled separately (Attributes, Tags, Source, Contents), this adds coverage for `Scale` (NumberValue), `WorldPivotData` (Model), `PropertiesSerialize` (StyleSheet), and `MaterialColors` (Workspace) -- all of which serialize and were previously silently dropped. - -### P4: Simplified Wrapper Function - -The `encodeInstanceWithDuplicateTracking` wrapper was replaced with a simple `return function(instance, parentId)` that calls `encodeInstance(instance, parentId, false)`. Tests updated to match (no more second `skippedCount` return value). - -### P5: Tests Updated Correctly - -Both `encodeInstance.spec.lua` and `encodeInstance.stress.spec.lua` are updated to assert that duplicates ARE included (e.g., `expect(#encoded.children).to.equal(3)` instead of `1`). All `skippedCount` assertions removed. - ---- - -## Summary - - -| # | Finding | Severity | Type | -| --- | ------------------------------------------ | -------- | --------------------- | -| 1 | Stale header comment in encodeInstance.lua | Moderate | Bug (misleading docs) | -| 2 | Duplicated encoding filter logic | Moderate | Code quality | -| 3 | No tests for encodeService.lua | Moderate | Test gap | -| 4 | EXCLUDE_PROPERTIES undocumented | Low | Documentation | -| 5 | Misleading ServiceChunk doc comment | Low | Documentation | - - -No critical or round-trip-identity issues found. The encoding logic is correct, the server-side consumption matches, and the refactors improve the codebase. The main action items are updating stale comments, adding a test file, and extracting the duplicated filter logic. \ No newline at end of file diff --git a/.cursor/plans/compact_json5_arrays_36a8cfab.plan.md b/.cursor/plans/compact_json5_arrays_36a8cfab.plan.md deleted file mode 100644 index d2ae36ba..00000000 --- a/.cursor/plans/compact_json5_arrays_36a8cfab.plan.md +++ /dev/null @@ -1,328 +0,0 @@ ---- -name: Compact JSON5 arrays -overview: Arrays with <12 non-compound elements render on one line. Recursive -- inner arrays compact independently. -todos: - - id: modify-array-arm - content: "Modify the Array arm of write_to() in src/json.rs: inline if <12 elements and no element is Array/Object" - status: completed - - id: snapshot-tests - content: Run cargo test, then cargo insta review to update affected snapshots - status: completed -isProject: false ---- - -# Compact JSON5 Array Formatting - -## Rule - -An array renders inline if: - -1. Fewer than 12 direct elements -2. No direct element is an `Array` or `Object` - -Format: `[ elem, elem, elem ]` (spaces inside brackets). Recursive -- each nested array independently decides. - -## Change - -One file: [src/json.rs](src/json.rs), the Array arm of `Json5Value::write_to()` (lines 154-169). ~10 lines added. - ---- - -## Expected Output Examples - -### Color3 (3 floats) - -Before: - -```json5 -Color3: [ - 0.41568630933761597, - 0, - 1 -] -``` - -After: - -```json5 -Color3: [ 0.41568630933761597, 0, 1 ] -``` - -### NumberRange (2 floats) - -Before: - -```json5 -Lifetime: { - NumberRange: [ - 0.25, - 0.6000000238418579 - ] -} -``` - -After: - -```json5 -Lifetime: { - NumberRange: [ 0.25, 0.6000000238418579 ] -} -``` - -### Tags (string array) - -Before: - -```json5 -Tags: [ - "SoundGroupEffects" -] -``` - -After: - -```json5 -Tags: [ "SoundGroupEffects" ] -``` - -Multiple tags: - -```json5 -Tags: [ "_VFX", "Collectible", "PowerUp" ] -``` - -### CFrame (object with position + orientation) - -Before: - -```json5 -CFrame: { - position: [ - -0.09659165, - 1.517803, - -0.83597946 - ], - orientation: [ - [ - 0.10630996, - -0.0024746126, - -0.9943304 - ], - [ - 0.021991052, - 0.999758, - -0.0021534874 - ], - [ - 0.9941102, - -0.021623673, - 0.1063388 - ] - ] -} -``` - -After: - -```json5 -CFrame: { - position: [ -0.09659165, 1.517803, -0.83597946 ], - orientation: [ - [ 0.10630996, -0.0024746126, -0.9943304 ], - [ 0.021991052, 0.999758, -0.0021534874 ], - [ 0.9941102, -0.021623673, 0.1063388 ] - ] -} -``` - -- `position` (3 numbers) -> inline -- `orientation` (3 arrays) -> multi-line because elements are arrays -- Each inner orientation row (3 numbers) -> inline - -### UDim2 (2 arrays of 2 numbers) - -Before: - -```json5 -Size: [ - [ - 1, - 0 - ], - [ - 0, - 100 - ] -] -``` - -After: - -```json5 -Size: [ - [ 1, 0 ], - [ 0, 100 ] -] -``` - -Outer has array elements -> multi-line. Inner arrays (2 numbers each) -> inline. - -### Rect (2 Vector2s) - -Before: - -```json5 -ImageRectOffset: [ - [ - 100, - 100 - ], - [ - 200, - 200 - ] -] -``` - -After: - -```json5 -ImageRectOffset: [ - [ 100, 100 ], - [ 200, 200 ] -] -``` - -### ColorSequence keypoints (array of objects -- NO CHANGE) - -Before and after (objects always expand): - -```json5 -Color: { - ColorSequence: { - keypoints: [ - { - color: [ 0.364705890417099, 0.11372549086809158, 1 ], - time: 0 - }, - { - color: [ 0.364705890417099, 0.11372549086809158, 1 ], - time: 1 - } - ] - } -} -``` - -- `keypoints` array has objects -> stays multi-line -- `color` arrays inside each keypoint (3 numbers) -> inline - -### NumberSequence with 20 keypoints (array of objects -- NO CHANGE) - -Stays fully expanded. Both because elements are objects AND count >= 12. - -### Full file: Texture.model.json5 - -Before: - -```json5 -{ - className: "Texture", - properties: { - Color3: [ - 0.41568630933761597, - 0, - 1 - ], - Face: "Top", - StudsPerTileU: 200, - StudsPerTileV: 200, - TextureContent: "rbxassetid://10025668350", - Transparency: 0.6000000238418579 - } -} -``` - -After: - -```json5 -{ - className: "Texture", - properties: { - Color3: [ 0.41568630933761597, 0, 1 ], - Face: "Top", - StudsPerTileU: 200, - StudsPerTileV: 200, - TextureContent: "rbxassetid://10025668350", - Transparency: 0.6000000238418579 - } -} -``` - -### Full file: Water.model.json5 - -Before: - -```json5 -{ - attributes: { - Rojo_Ref_SoundGroup: "ServerStorage/__server_muted.model.json5" - }, - className: "Sound", - properties: { - AudioContent: "rbxassetid://9120549564", - Looped: true, - Playing: true, - SourceAssetId: 9120549564, - Tags: [ - "SoundGroupEffects" - ], - Volume: 3 - } -} -``` - -After: - -```json5 -{ - attributes: { - Rojo_Ref_SoundGroup: "ServerStorage/__server_muted.model.json5" - }, - className: "Sound", - properties: { - AudioContent: "rbxassetid://9120549564", - Looped: true, - Playing: true, - SourceAssetId: 9120549564, - Tags: [ "SoundGroupEffects" ], - Volume: 3 - } -} -``` - -### Edge: empty array (NO CHANGE) - -```json5 -Tags: [] -``` - -### Edge: 12+ primitive elements (stays multi-line) - -```json5 -SomeList: [ - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10, - 11, - 12 -] -``` - diff --git a/.cursor/plans/comprehensive_plugin_tests_bdd5b47c.plan.md b/.cursor/plans/comprehensive_plugin_tests_bdd5b47c.plan.md deleted file mode 100644 index dde3f32e..00000000 --- a/.cursor/plans/comprehensive_plugin_tests_bdd5b47c.plan.md +++ /dev/null @@ -1,525 +0,0 @@ ---- -name: Comprehensive Plugin Tests -overview: Create comprehensive Lua plugin stress tests (.spec.lua files) covering edge cases, large-scale scenarios, and abuse testing for scripts-only mode, everything mode, and concurrent multi-developer workflows. -todos: - - id: test-utils - content: Create test utility modules (MockApiContext, LargeTreeGenerator, PatchGenerator) - status: completed - - id: diff-stress - content: Create diff.stress.spec.lua with 25+ tests for large trees, duplicates, equality edge cases - status: completed - - id: apply-stress - content: Create applyPatch.stress.spec.lua with 20+ tests for partial failures, refs, className changes - status: completed - - id: reify-stress - content: Create reify.stress.spec.lua with 15+ tests for deep/wide trees, property edge cases - status: completed - - id: property-read - content: Create getProperty.spec.lua with 15+ tests for all error paths and property types - status: completed - - id: property-write - content: Create setProperty.spec.lua with 15+ tests for error paths and type coercion - status: completed - - id: decode-values - content: Create decodeValue.spec.lua with 15+ tests for refs, types, and failure scenarios - status: completed - - id: encode-stress - content: Create encodeInstance.stress.spec.lua with 25+ tests for hierarchies and all instance types - status: completed - - id: encode-property - content: Create encodeProperty.spec.lua with 20+ tests for all property types - status: completed - - id: patchset-stress - content: Create PatchSet.stress.spec.lua with 15+ tests for merge operations and scale - status: completed - - id: instancemap-stress - content: Create InstanceMap.stress.spec.lua with 10+ tests for scale and concurrency - status: completed - - id: integration-sync - content: Create syncflow.spec.lua with 15+ tests for E2E sync flow and error recovery - status: completed - - id: integration-twoway - content: Create twoWaySync.spec.lua with 15+ tests for bidirectional sync and conflicts - status: completed - - id: scripts-only-mode - content: Create scriptsOnly.spec.lua with tests for scripts-only mode edge cases - status: pending - - id: everything-mode - content: Create everythingMode.spec.lua with tests for everything mode and all instance types - status: pending - - id: mode-transitions - content: Create modeTransitions.spec.lua with tests for switching between sync modes - status: pending - - id: multi-developer - content: Create multiDeveloper.spec.lua simulating concurrent changes from multiple sources - status: pending - - id: race-conditions - content: Create raceConditions.spec.lua detecting race conditions during sync - status: pending - - id: chaos-tests - content: Create stressPatterns.spec.lua with 20+ chaos engineering tests - status: completed - - id: wire-tests - content: Update runTests.lua to include all new test modules - status: completed -isProject: false ---- - -# Comprehensive Lua Plugin Stress Tests - -## Vision and Philosophy - -**Goal**: Make the plugin/API interface bulletproof for complex games. The plugin must handle abuse from real-world scenarios - huge games, many developers, concurrent Rojo setups, and chaotic Studio environments. - -**Testing Philosophy**: - -- Tests exist to EXPOSE potential issues, not just pass -- A failing test requires INVESTIGATION - it could mean: - - The code has a bug (fix the code) - - The test is invalid or has wrong assumptions (fix the test) - - The test is testing something that's not actually a requirement (remove/adjust the test) -- Don't automatically assume failing test = broken code, but also don't dismiss failures -- When a test fails, determine the root cause before deciding on the fix -- Tests should be grounded in real requirements and real-world scenarios - -**Code Quality Awareness**: - -- The plugin code has been iterated by AI agents and may have accumulated "fix on fix" complexity -- If a subsystem needs repeated patches, step back and consider a ground-up redesign -- Example: if diff equality checks keep needing fixes, redesign the comparison logic -- Use good judgment - don't rewrite everything, but don't just pile on fixes either - -**Why Abuse Testing Matters**: - -- The plugin/API interface is a mega weak layer -- It constantly crashes, nukes files, syncs incorrectly, misses files, or syncs wrong files -- Real games have thousands of instances, concurrent developers, and unpredictable Studio behavior -- Scripts-only mode AND everything-mode must both be bulletproof - ---- - -## Motivation - -The Rojo plugin/API interface is a critical weak layer that must handle: - -- Scripts-only mode and everything-mode -- Large games with many developers (potentially 10+ developers with their own Rojo setups) -- Concurrent Rojo setups on the same game -- Edge cases causing crashes, file nuking, incorrect syncing -- Rapid changes during active development -- Recovery from partial failures and network issues - -## Known Bug Patterns to Catch - -These are the types of bugs that stress tests should expose: - -**Duplicate/Ambiguous Path Handling**: - -- Instances with duplicate-named siblings cause ambiguous paths -- Nested duplicates at any level of the hierarchy -- Path uniqueness checks must walk entire ancestor chain -- Tests should verify duplicate detection at every level - -**Property Equality Edge Cases**: - -- Floating-point comparison (epsilon = 0.0001) -- Color3 RGB integer comparison vs float comparison -- CFrame/Vector3/Vector2 precision -- NaN handling (NaN != NaN) -- EnumItem vs number comparisons - -**Patch Application Failures**: - -- Partial application (some properties succeed, others fail) -- Ref properties to non-existent instances -- ClassName changes with child migration failures -- Instance creation failures (invalid ClassName) -- Permission errors on protected properties - -**Concurrency Issues**: - -- Changes during confirmation dialogue -- Rapid bidirectional changes -- Instance destruction during patch application -- WebSocket messages during patch processing - -**Memory and Scale**: - -- Large instance trees (1000+ instances) -- Deep hierarchies (50+ levels) -- Wide hierarchies (100+ siblings) -- Large patches (500+ changes) - ---- - -## Test Files to Create - -### 1. Reconciler Stress Tests - -`**plugin/src/Reconciler/diff.stress.spec.lua**` - Diff algorithm edge cases and stress testing - -```lua --- Key test scenarios: --- Large tree diffing (1000+ instances) --- Duplicate name detection at multiple levels --- Ambiguous path handling (nested duplicates) --- Floating-point property precision (epsilon edge cases) --- Color3/CFrame/Vector equality edge cases --- ignoreUnknownInstances with mixed trees --- Scripts-only mode deletion rules --- Property decode failures during diff --- Concurrent structure changes during diff --- NaN handling in property comparisons -``` - -`**plugin/src/Reconciler/applyPatch.stress.spec.lua**` - Patch application edge cases - -```lua --- Key test scenarios: --- Large batch removals (500+ instances) --- Large batch additions (500+ instances) --- Mixed add/remove/update in single patch --- Partial application failures (some succeed, some fail) --- Complex className changes (multi-level deep) --- Ref property chains (A->B->C->D) --- Circular ref detection --- Concurrent patch application --- Race conditions with instance destruction --- ClassName change with failing child migration -``` - -`**plugin/src/Reconciler/reify.stress.spec.lua**` - Instance creation stress tests - -```lua --- Key test scenarios: --- Deep hierarchy creation (50+ levels) --- Wide hierarchy creation (100+ siblings) --- Mixed success/failure in sibling creation --- Property type coercion edge cases --- Large property sets (50+ properties per instance) --- Nested ref chains during creation --- Instance creation during active ChangeHistoryService --- Memory pressure scenarios -``` - -### 2. Property Handling Tests - -`**plugin/src/Reconciler/getProperty.spec.lua**` - Property reading edge cases - -```lua --- Key test scenarios: --- All error paths (UnknownProperty, UnreadableProperty, LackingPropertyPermissions) --- Canonical property name resolution --- Serialization-only property aliases --- Permission error detection for protected properties --- Various property types (all Roblox types) --- Computed vs stored properties --- Properties that changed scriptability between engine versions -``` - -`**plugin/src/Reconciler/setProperty.spec.lua**` - Property writing edge cases - -```lua --- Key test scenarios: --- All error paths (UnwritableProperty, LackingPropertyPermissions) --- Type coercion scenarios (number -> int, etc.) --- Unknown property handling (should not error) --- Write-only vs ReadWrite properties --- Properties with validation (e.g., Size on Terrain) --- Rapid sequential writes to same property -``` - -`**plugin/src/Reconciler/decodeValue.spec.lua**` - Value decoding stress tests - -```lua --- Key test scenarios: --- All ref scenarios (null, valid, invalid, circular) --- All RbxDom encoded value types --- Decode failure scenarios --- Malformed encoded values --- Edge case values (huge numbers, empty strings, etc.) --- Nested encoded structures -``` - -### 3. Instance Encoding Stress Tests - -`**plugin/src/ChangeBatcher/encodeInstance.stress.spec.lua**` - Encoding for syncback - -```lua --- Key test scenarios: --- Deep hierarchies (100 levels) --- Wide hierarchies (1000 siblings) --- Duplicate name handling at every level --- All supported instance types encoding --- Complex attribute encoding (all types) --- Tag encoding edge cases --- Instances with 100+ properties --- Script encoding with special characters in Source --- Concurrent encoding of changing instances --- Path uniqueness checking at scale --- Memory usage with huge instances -``` - -`**plugin/src/ChangeBatcher/encodeProperty.spec.lua**` - Property encoding tests - -```lua --- Key test scenarios: --- All property types (String, Bool, Int32, Int64, Float32, Float64, etc.) --- Vector2, Vector3, Color3 encoding --- UDim, UDim2 encoding --- Enum encoding --- Attributes with all value types --- BinaryString encoding --- CFrame encoding precision --- Large string properties (100KB+) --- Unicode handling -``` - -### 4. PatchSet and InstanceMap Stress Tests - -`**plugin/src/PatchSet.stress.spec.lua**` - PatchSet operations at scale - -```lua --- Key test scenarios: --- Merging large patches (1000+ changes each) --- Conflict resolution in merge (same ID, different changes) --- Rapid merge operations --- Deep equality checking on complex patches --- countChanges/countInstances at scale --- Serialization/deserialization of large patches -``` - -`**plugin/src/InstanceMap.stress.spec.lua**` - InstanceMap at scale - -```lua --- Key test scenarios: --- Large maps (10000+ instances) --- Rapid insert/remove cycles --- Concurrent change callbacks --- Memory cleanup verification --- Pause/unpause with many instances --- ID collision handling -``` - -### 5. Integration and End-to-End Tests - -`**plugin/src/integration/syncflow.spec.lua**` - Full sync flow testing - -```lua --- Key test scenarios: --- diff -> applyPatch -> verify cycle --- Multiple consecutive patches --- Interleaved local and remote changes --- Error recovery after failed patch --- State consistency after partial failure --- scripts-only mode full flow --- everything mode full flow -``` - -`**plugin/src/integration/twoWaySync.spec.lua**` - Two-way sync scenarios - -```lua --- Key test scenarios: --- Rapid bidirectional changes --- Conflict resolution (both sides change same instance) --- Pull flow for all instance types --- Push flow for all property types --- Mixed push/pull in single confirm --- Concurrent Studio changes during confirm --- ChangeBatcher pause/resume during confirm -``` - -### 6. Scripts-Only vs Everything Mode Tests - -`**plugin/src/modes/scriptsOnly.spec.lua**` - Scripts-only mode specific tests - -```lua --- Key test scenarios: --- Only scripts are synced (ModuleScript, Script, LocalScript) --- Non-script instances are preserved in Studio (not deleted) --- Script children of non-script parents sync correctly --- RunContext property handling for Script class --- Source property encoding/decoding --- ignoreUnknownInstances behavior with non-scripts --- Nested scripts under non-script containers --- Script deletion rules (scripts can always be deleted) --- Format transitions (standalone <-> directory) for scripts only -``` - -`**plugin/src/modes/everythingMode.spec.lua**` - Everything mode specific tests - -```lua --- Key test scenarios: --- All instance types sync correctly --- Folder creation and deletion --- Part, Model, and other non-script instances --- Instance properties beyond Source (Anchored, Size, Color, etc.) --- Attributes on all instance types --- Tags on all instance types --- .model.json generation for complex instances --- Directory structure for instances with children --- Meta file generation (init.meta.json5) --- Mixed hierarchies (scripts and non-scripts) -``` - -`**plugin/src/modes/modeTransitions.spec.lua**` - Switching between modes - -```lua --- Key test scenarios: --- Switch from scripts-only to everything mode --- Switch from everything mode to scripts-only --- Files created in everything mode preserved when switching to scripts-only --- Orphan non-script files in scripts-only mode --- State consistency after mode switch -``` - -### 7. Multi-Developer and Concurrent Scenarios - -`**plugin/src/concurrent/multiDeveloper.spec.lua**` - Simulating multiple developers - -```lua --- Key test scenarios: --- Rapid changes from "multiple sources" (simulated) --- Conflicting changes to same instance --- Interleaved add/remove operations --- Property changes while confirmation dialogue is open --- Patches arriving during patch application --- WebSocket message queue overflow scenarios --- State recovery after connection drop --- Merge conflicts in PatchSet -``` - -`**plugin/src/concurrent/raceConditions.spec.lua**` - Race condition detection - -```lua --- Key test scenarios: --- Instance destroyed during property read --- Instance reparented during diff --- InstanceMap modified during iteration --- ChangeBatcher cycle during pause/resume --- Confirmation callback during state transition --- Multiple simultaneous patch applications --- ID collision during rapid add/remove -``` - -### 8. Edge Case and Chaos Tests - -`**plugin/src/chaos/stressPatterns.spec.lua**` - Chaos engineering patterns - -```lua --- Key test scenarios: --- Random operations at high frequency --- Alternating add/remove of same instances --- Rapid className changes --- Property flapping (rapid value changes) --- Instance reparenting stress --- Deep tree mutation during reconciliation --- Memory pressure scenarios --- Simulated network delays (via timing) -``` - -## Test Utilities to Create - -`**plugin/src/testUtils/MockApiContext.lua**` - -```lua --- Mock API context for testing ServeSession without real server --- Supports: --- - Configurable responses --- - Error injection --- - Delay simulation --- - Request logging -``` - -`**plugin/src/testUtils/LargeTreeGenerator.lua**` - -```lua --- Generates large instance hierarchies for stress testing --- Supports: --- - Configurable depth and width --- - Mixed instance types --- - Property population --- - Duplicate name generation (for edge case testing) -``` - -`**plugin/src/testUtils/PatchGenerator.lua**` - -```lua --- Generates patches for stress testing --- Supports: --- - Random valid patches --- - Edge case patches (all adds, all removes, etc.) --- - Large batch patches --- - Invalid/malformed patches for error testing -``` - -## Key Files to Modify - -- `[plugin/src/runTests.lua](plugin/src/runTests.lua)` - Add new test modules -- `[plugin/src/Reconciler/init.spec.lua](plugin/src/init.spec.lua)` - Import stress tests - -## Test Categories Summary - - -| Category | File | Test Count (Est.) | Purpose | -| ------------------ | ------------------------------ | ----------------- | --------------------------------------- | -| Diff Stress | diff.stress.spec.lua | 25+ | Large trees, duplicates, equality | -| Apply Stress | applyPatch.stress.spec.lua | 20+ | Partial failures, refs, className | -| Reify Stress | reify.stress.spec.lua | 15+ | Deep/wide trees, properties | -| Property Read | getProperty.spec.lua | 15+ | All error paths, types | -| Property Write | setProperty.spec.lua | 15+ | All error paths, coercion | -| Decode Values | decodeValue.spec.lua | 15+ | Refs, types, failures | -| Encode Instance | encodeInstance.stress.spec.lua | 25+ | Hierarchies, duplicates, types | -| Encode Property | encodeProperty.spec.lua | 20+ | All property types | -| PatchSet Stress | PatchSet.stress.spec.lua | 15+ | Merge, scale, conflict | -| InstanceMap Stress | InstanceMap.stress.spec.lua | 10+ | Scale, concurrency | -| Sync Flow | syncflow.spec.lua | 15+ | E2E, modes, recovery | -| Two-Way Sync | twoWaySync.spec.lua | 15+ | Bidirectional, conflicts | -| Scripts-Only Mode | scriptsOnly.spec.lua | 15+ | Script-specific sync, ignoreUnknown | -| Everything Mode | everythingMode.spec.lua | 20+ | All instance types, properties | -| Mode Transitions | modeTransitions.spec.lua | 10+ | Switching modes, orphan handling | -| Multi-Developer | multiDeveloper.spec.lua | 15+ | Concurrent changes, conflicts | -| Race Conditions | raceConditions.spec.lua | 15+ | Instance destruction during ops | -| Chaos Tests | stressPatterns.spec.lua | 20+ | Random ops, flapping, chaos engineering | - - -**Estimated Total: 300+ new tests** - -## Success Criteria - -**Primary Goal: Build Confidence Through Stress Testing** - -1. Failing tests require investigation - could be code bug OR invalid test -2. Each failing test should be analyzed: is this a real bug, or is the test wrong? -3. Don't skip tests without understanding why they fail -4. Tests that pass immediately are fine - they confirm expected behavior - -**Quality Gates**: - -1. All valid tests pass in CI -2. Tests catch regressions in the critical paths identified -3. Edge cases like duplicate names, ambiguous paths are thoroughly covered -4. Both scripts-only and everything modes have dedicated test coverage -5. Large-scale scenarios (1000+ instances) run without timeouts -6. Memory usage is reasonable during stress tests -7. No "fix on fix" pattern - if code keeps needing patches, consider redesign - -**Failure Triage**: - -When a stress test fails, investigate: - -- The symptom (what failed) -- Is this a real bug, or is the test invalid? -- If bug: does it need a patch or a redesign? -- If invalid test: fix the test or remove it -- Document the decision and reasoning - -## Anti-Patterns to Avoid - -- Skipping tests without understanding why they fail -- Adding workarounds instead of fixing root causes -- Reducing test scope arbitrarily to make tests pass -- Ignoring intermittent failures without investigation -- Assuming all failing tests mean broken code (tests can be wrong too) -- Writing tests that don't reflect real requirements or real-world usage - diff --git a/.cursor/plans/connected_mode_test_expansion_5b0c39a3.plan.md b/.cursor/plans/connected_mode_test_expansion_5b0c39a3.plan.md deleted file mode 100644 index fd517b0c..00000000 --- a/.cursor/plans/connected_mode_test_expansion_5b0c39a3.plan.md +++ /dev/null @@ -1,489 +0,0 @@ ---- -name: Connected Mode Test Expansion -overview: Expand the serve test suite to cover multi-step connected mode scenarios -- format transitions, init file operations, directory conversions, slugify/dedup forward-sync, meta name field lifecycle, and sequential change sequences -- with full WebSocket patch verification AND round-trip identity verification. 53 tests total across 8 phases. -todos: - - id: fixtures - content: "Create 4 new test fixtures in rojo-test/serve-tests/: connected_scripts, connected_init, connected_models, connected_slugify" - status: completed - - id: harness - content: "Add harness helpers to tests/rojo_test/serve_util.rs: get_message_cursor for chaining multi-step tests, fresh_rebuild_read for round-trip verification" - status: completed - - id: phase1-format-transitions - content: "Implement Phase 1: Format transition tests (standalone<->directory, init type changes) with round-trip verification -- 8 tests" - status: completed - - id: phase2-multi-step - content: "Implement Phase 2: Multi-step connected sequence tests (create/edit/rename/delete lifecycle) with round-trip verification -- 5 tests" - status: completed - - id: phase3-init - content: "Implement Phase 3: Init file operation tests during connected mode with round-trip verification -- 4 tests" - status: completed - - id: phase4-meta - content: "Implement Phase 4: Property/meta file change tests -- 4 tests" - status: completed - - id: phase5-models - content: "Implement Phase 5: Model JSON file change tests -- 5 tests" - status: completed - - id: phase6-cursor - content: "Implement Phase 6: Cursor tracking and reconnection tests -- 3 tests" - status: completed - - id: phase7-mixed - content: "Implement Phase 7: Mixed API + filesystem verification tests -- 2 tests" - status: completed - - id: phase8-slugify-fixture - content: Create connected_slugify fixture with slugified files, dedup ~1 files, clean files, and directory-format slugified instances - status: completed - - id: phase8-slugify-forward - content: "Implement Phase 8a: Slugify forward-sync tests -- editing/creating/deleting slugified files and verifying patches show real names from meta -- 6 tests" - status: completed - - id: phase8-dedup-forward - content: "Implement Phase 8b: Dedup (~N suffix) forward-sync tests -- collision handling, ~1 with and without meta, add/remove colliding files -- 5 tests" - status: completed - - id: phase8-slugdir - content: "Implement Phase 8c: Slugified directory format tests -- init type changes, child adds inside slugified dirs -- 3 tests" - status: completed - - id: phase8-meta-name-lifecycle - content: "Implement Phase 8d: Meta name field lifecycle tests -- create/update/delete meta name, model.json5 name field -- 5 tests" - status: completed - - id: phase8-slug-multistep - content: "Implement Phase 8e: Multi-step slugify scenarios with round-trip verification -- slug rename chains, collision evolution -- 3 tests" - status: completed - - id: run-and-review - content: Run cargo test, cargo insta review, accept snapshots, verify clean pass - status: completed -isProject: false ---- - -# Connected Mode Test Expansion - -## Quality Standard - -This test expansion is held to the same standard as the [slugify branch audit](audit_slugify_branch_e913b7dc.plan.md): - -> **Round-trip identity**: Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -Every test in this plan must verify not just "did the WebSocket patch look right" but also "if I killed the server and rebuilt from the filesystem right now, would I get the same tree?" This is verified by starting a fresh `rojo serve` on the same project directory after changes and comparing the resulting tree. - ---- - -## Problem - -The current test suite has a major asymmetry: - -- `**two_way_sync.rs**` (plugin -> filesystem via API): 119 tests, covering stress, format transitions, encoded names, concurrent ops, failure recovery -- `**serve.rs**` (filesystem -> plugin via WebSocket patches): 22 tests, each making only ONE change. No multi-step sequences, no format transitions, no directory conversions, no round-trip verification - -Connected mode means the plugin is connected and receiving patches over time as the filesystem evolves. The `serve.rs` tests only verify a single atomic change, never simulating a session where the tree evolves through multiple states. They also never verify the round-trip invariant -- that the filesystem state after changes would produce an identical tree if rebuilt from scratch. - ---- - -## Architecture of a Connected Mode Test - -Each test follows this pattern in [tests/tests/serve.rs](tests/tests/serve.rs): - -```rust -run_serve_test("fixture_name", |session, mut redactions| { - // 1. Snapshot initial state - let info = session.get_api_rojo().unwrap(); - let root_id = info.root_instance_id; - let read = session.get_api_read(root_id).unwrap(); - assert_yaml_snapshot!("test_initial", read.intern_and_redact(&mut redactions, root_id)); - - // 2. Change 1 -> verify patch + state - let packet = session.recv_socket_packet(SocketPacketType::Messages, 0, || { - fs::write(&path, "new content").unwrap(); - }).unwrap(); - assert_yaml_snapshot!("test_patch1", packet.intern_and_redact(&mut redactions, ())); - let read = session.get_api_read(root_id).unwrap(); - assert_yaml_snapshot!("test_state1", read.intern_and_redact(&mut redactions, root_id)); - - // 3. Change 2 -> verify patch + state (using cursor from patch 1) - let cursor = get_message_cursor(&packet); - let packet = session.recv_socket_packet(SocketPacketType::Messages, cursor, || { - fs::rename(&old, &new).unwrap(); - }).unwrap(); - assert_yaml_snapshot!("test_patch2", packet.intern_and_redact(&mut redactions, ())); - - // 4. Round-trip verification: fresh rebuild must match live tree - let final_read = session.get_api_read(root_id).unwrap(); - let fresh_read = fresh_rebuild_read(session.path()); - assert_trees_match(&final_read, &fresh_read); -}); -``` - -The critical addition over existing serve.rs tests: - -- **Multi-step sequences** with cursor chaining -- **Round-trip verification** at the end -- a fresh `rojo serve` on the same filesystem must produce the same instance tree - -Key files involved: - -- [tests/tests/serve.rs](tests/tests/serve.rs) -- where new tests go -- [tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs) -- test harness -- [rojo-test/serve-tests/](rojo-test/serve-tests/) -- test fixtures -- [rojo-test/serve-test-snapshots/](rojo-test/serve-test-snapshots/) -- insta snapshots - ---- - -## Harness Changes - -### `get_message_cursor` -- cursor extraction for chaining - -[tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs) needs a helper to extract `messageCursor` from a `SocketPacket` for chaining multi-step tests: - -```rust -/// Extract the message cursor from a SocketPacket for use in subsequent subscriptions. -pub fn get_message_cursor(packet: &SocketPacket) -> u32 { - match &packet.body { - SocketPacketBody::Messages(msg) => msg.message_cursor, - _ => panic!("Expected Messages packet"), - } -} -``` - -### `fresh_rebuild_read` -- round-trip identity verification - -This is the core addition for enforcing the round-trip standard. After all changes, start a **fresh** `rojo serve` on the same project directory and read the full tree. If the live DOM and the fresh rebuild disagree, the filesystem state is inconsistent. - -```rust -/// Start a fresh rojo serve on the given project path, read the full tree, -/// and return a normalized representation for comparison. -/// -/// This verifies the round-trip invariant: the filesystem state written by -/// the live session, when read from scratch, must produce the same tree. -pub fn fresh_rebuild_read(project_path: &Path) -> NormalizedTree { - // Find the project file in the directory - let project_file = find_project_file(project_path); - - let port = get_port_number(); - let port_string = port.to_string(); - let working_dir = get_working_dir_path(); - - let mut process = Command::new(ROJO_PATH) - .args(["serve", project_file.to_str().unwrap(), "--port", &port_string]) - .current_dir(working_dir) - .stderr(Stdio::piped()) - .spawn() - .expect("Couldn't start fresh Rojo for round-trip check"); - - let kill_guard = KillOnDrop(process); - - // Wait for fresh server to come online (same backoff as TestServeSession) - let info = wait_for_server(port); - let read = get_read(port, info.root_instance_id); - - // Normalize: strip Refs (non-deterministic), sort children, extract - // (name, class, properties, hierarchy) tuples for structural comparison - normalize_tree(&read) -} -``` - -### `NormalizedTree` -- structural comparison ignoring Refs - -Since two separate `rojo serve` sessions produce different `Ref` values, we need structural comparison. A `NormalizedTree` is a recursive structure of `(name, class_name, sorted_properties, sorted_children)` that can be compared with `==` or snapshotted. - -```rust -#[derive(Debug, PartialEq, Eq, serde::Serialize)] -pub struct NormalizedInstance { - pub name: String, - pub class_name: String, - pub properties: BTreeMap, // property name -> debug representation - pub children: Vec, // sorted by (name, class_name) -} -``` - -### `assert_round_trip` -- convenience assertion - -```rust -/// Assert that the live session tree matches a fresh rebuild from the filesystem. -pub fn assert_round_trip(session: &TestServeSession, root_id: Ref) { - let live_read = session.get_api_read(root_id).unwrap(); - let live_tree = normalize_read_response(&live_read, root_id); - - let fresh_tree = fresh_rebuild_read(session.path()); - - assert_eq!( - live_tree, fresh_tree, - "Round-trip identity violation: live tree and fresh rebuild differ. \ - The filesystem state does not faithfully represent the instance tree." - ); -} -``` - ---- - -## New Test Fixtures - -### `rojo-test/serve-tests/connected_scripts/` - -Fixture with both standalone and directory format scripts, covering all three script types: - -``` -connected_scripts/ - default.project.json5 # name: "connected_scripts", tree: { ReplicatedStorage: { $path: "src" } } - src/ - standalone.luau # ModuleScript (standalone format) - server.server.luau # Script (standalone format) - local.client.luau # LocalScript (standalone format) - DirModule/ - init.luau # ModuleScript (directory format) - ChildA.luau # child ModuleScript - ChildB.luau # child ModuleScript - DirScript/ - init.server.luau # Script (directory format) - Handler.luau # child ModuleScript - DirLocal/ - init.local.luau # LocalScript (directory format) - Helper.luau # child ModuleScript -``` - -### `rojo-test/serve-tests/connected_init/` - -Focused init file fixture for init-specific tests: - -``` -connected_init/ - default.project.json5 # name: "connected_init", tree: { ReplicatedStorage: { $path: "src" } } - src/ - init.luau # Root is a ModuleScript - Child.luau # A child module -``` - -### `rojo-test/serve-tests/connected_models/` - -Model file fixture: - -``` -connected_models/ - default.project.json5 # name: "connected_models", tree: { ReplicatedStorage: { $path: "src" } } - src/ - SimpleModel.model.json5 # { "className": "Configuration", "properties": { "Name": "SimpleModel" } } - DirModel/ - init.meta.json5 # { "className": "Folder" } - Child.luau # child ModuleScript -``` - ---- - -## New Tests -- Organized by Category - -### Phase 1: Format Transitions (filesystem-driven, patch + round-trip verified) - -Highest priority. Tests what the plugin receives when files transform between standalone and directory formats, AND verifies the filesystem is consistent after each transformation. - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | -| 1 | `standalone_to_directory_add_child` | Create `ChildNew.luau` next to `standalone.luau`. The snapshot system should convert `standalone.luau` -> `standalone/init.luau` + `standalone/ChildNew.luau`. Verify the patch shows the correct tree transformation. | Yes | -| 2 | `directory_to_standalone_remove_children` | Remove `ChildA.luau` and `ChildB.luau` from `DirModule/`. With no children left, verify whether `DirModule/init.luau` collapses to `DirModule.luau`. Verify patch. | Yes | -| 3 | `standalone_to_directory_and_back` | Multi-step: (a) add child next to standalone script (standalone->dir), (b) remove child (dir->standalone). Two patches verified, plus round-trip after each step. | Yes | -| 4 | `init_type_change_module_to_server` | Rename `DirModule/init.luau` -> `DirModule/init.server.luau`. Verify patch contains ClassName change from ModuleScript to Script. | Yes | -| 5 | `init_type_change_server_to_local` | Rename `DirScript/init.server.luau` -> `DirScript/init.local.luau`. Verify ClassName change from Script to LocalScript. | Yes | -| 6 | `init_type_change_cycle` | Multi-step: `init.luau` -> `init.server.luau` -> `init.local.luau` -> `init.luau`. Three patches, three state snapshots, round-trip at each step. | Yes | -| 7 | `init_delete_children_survive` | Delete `DirModule/init.luau` while `ChildA.luau` and `ChildB.luau` remain. Verify children survive and parent becomes Folder (or whatever the correct behavior is). | Yes | -| 8 | `init_create_in_existing_folder` | Given a folder with only children (no init file), create `init.luau`. Verify the Folder instance becomes a ModuleScript. | Yes | - - -**Important for tests 1-2**: The snapshot middleware may or may not automatically convert between standalone and directory format when children are added/removed via the filesystem. If it doesn't (i.e., the conversion only happens through the API/change processor), the test should document that and verify the actual behavior. - -### Phase 2: Multi-Step Connected Sequences - -Core connected mode pattern: the tree evolves through multiple states. Each intermediate state is verified. - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | -| 9 | `create_edit_rename_delete_sequence` | Create `src/NewScript.luau` -> edit its contents -> rename to `Renamed.luau` -> delete it. Four patches, four state snapshots. Verify each patch contains exactly the expected delta. | Yes (at end) | -| 10 | `directory_lifecycle` | Create `src/NewDir/` -> add `init.luau` + `Child.luau` -> edit `init.luau` -> remove `Child.luau` -> remove directory. Full directory lifecycle with 5 patches. | Yes (at end) | -| 11 | `multi_file_sequential_edits` | Edit `standalone.luau`, then `server.server.luau`, then `local.client.luau`. Verify each patch only contains the changed file (no cross-contamination). | No | -| 12 | `add_multiple_files_sequentially` | Add 3 new `.luau` files one at a time. Verify each patch adds exactly one instance with correct name and class. | Yes (at end) | -| 13 | `remove_multiple_files_sequentially` | Remove 3 files one at a time. Verify each patch removes exactly one instance. | No | - - -### Phase 3: Init File Operations (connected mode) - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | -| 14 | `edit_init_then_edit_child` | Edit `DirModule/init.luau`, then edit `DirModule/ChildA.luau`. Two separate patches, each containing only the changed instance's Source property. | No | -| 15 | `replace_init_file_type` | Delete `DirModule/init.luau`, then create `DirModule/init.server.luau`. Verify the ClassName changes from ModuleScript to Script, children preserved. | Yes | -| 16 | `add_init_to_plain_folder` | Start with a directory containing only children (create by removing init from fixture). Add `init.luau`. Verify Folder -> ModuleScript. | Yes | -| 17 | `delete_init_from_directory` | Delete init file from directory with children. Verify parent becomes Folder, children survive. | Yes | - - -### Phase 4: Property/Meta Changes (connected mode) - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------- | ---------- | -| 18 | `adjacent_meta_creation` | Create `standalone.meta.json5` with `{ "properties": { "Disabled": true } }` next to `standalone.luau`. Verify property appears in patch. | Yes | -| 19 | `adjacent_meta_edit` | Edit existing `.meta.json5` to change a property value. Verify update patch. | No | -| 20 | `adjacent_meta_delete` | Delete `.meta.json5`. Verify properties revert to defaults. | Yes | -| 21 | `init_meta_creation` | Create `DirModule/init.meta.json5` with properties. Verify directory instance gains properties. | Yes | - - -### Phase 5: Model File Changes (connected mode) - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ---------------------------- | ------------------------------------------------------------------------------------------ | ---------- | -| 22 | `model_json_edit_properties` | Edit `SimpleModel.model.json5` to change/add properties. Verify property changes in patch. | Yes | -| 23 | `model_json_add_children` | Edit model JSON to add child instances. Verify additions in patch. | Yes | -| 24 | `model_json_remove_children` | Edit model JSON to remove child instances. Verify removals in patch. | No | -| 25 | `model_json_create` | Create new `NewModel.model.json5`. Verify instance addition patch. | Yes | -| 26 | `model_json_delete` | Delete `SimpleModel.model.json5`. Verify instance removal patch. | No | - - -### Phase 6: Cursor Tracking and Reconnection - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | ---------- | -| 27 | `cursor_advances_correctly` | Make 3 filesystem changes. After each, verify the cursor returned in the WebSocket packet increments monotonically. | No | -| 28 | `reconnect_with_old_cursor` | Make 2 changes with cursor advancement. Reconnect with cursor 0. Verify ALL patches are received in the catch-up response. | No | -| 29 | `reconnect_with_partial_cursor` | Make 3 changes. Reconnect with cursor from after change 1. Verify only patches 2+3 are received. | No | - - -### Phase 7: Mixed API + Filesystem Verification - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- | -| 30 | `api_write_then_filesystem_change` | POST `/api/write` to update Source, then edit a different file on disk. Verify only the filesystem change produces a WebSocket patch (echo suppression working). | Yes | -| 31 | `filesystem_change_then_api_write` | Edit file on disk, receive patch. Then POST `/api/write` on a different instance. Verify the API write produces the correct filesystem change and does NOT echo back as a duplicate patch. | Yes | - - -### Phase 8: Slugify / Dedup / Meta Name (connected mode, round-trip critical) - -This is the most critical phase for round-trip identity. The slugify system replaces forbidden filesystem chars with `_`, deduplicates collisions with `~1`/`~2` suffixes, and stores the real instance name in `.meta.json5` / `.model.json5` `name` fields. If ANY part of this chain is broken in the forward-sync direction (filesystem -> plugin patches), instance names are silently corrupted. - -The existing `two_way_sync.rs` has 17+ tests for slugify/dedup via the API write path (plugin -> filesystem). **None** of those verify the forward-sync direction: what WebSocket patch does the plugin receive when slugified files are changed on the filesystem? This phase fills that gap completely. - -#### New Fixture: `rojo-test/serve-tests/connected_slugify/` - -Richer than `syncback_encoded_names` -- includes dedup collisions and directory-format slugified instances: - -``` -connected_slugify/ - default.project.json5 # name: "connected_slugify", tree: { ReplicatedStorage: { $path: "src" } } - src/ - # Clean-named files (no meta needed) - Normal.luau # ModuleScript "Normal" - CleanScript.server.luau # Script "CleanScript" - - # Slugified files (meta has real name) - What_Module.luau # ModuleScript, meta: "What?Module" - What_Module.meta.json5 # { "name": "What?Module" } - Key_Script.server.luau # Script, meta: "Key:Script" - Key_Script.meta.json5 # { "name": "Key:Script" } - - # Dedup collision: two instances whose slugs both = "Hey_Bro" - Hey_Bro.luau # ModuleScript "Hey_Bro" (natural name, no meta) - Hey_Bro~1.luau # ModuleScript, meta: "Hey/Bro" - Hey_Bro~1.meta.json5 # { "name": "Hey/Bro" } - - # Model JSON with name field - What_Model.model.json5 # { "name": "What?Model", "className": "Configuration" } - - # Slugified directory format - Slug_Dir/ # Directory, meta: "Slug:Dir" - init.luau # ModuleScript init - init.meta.json5 # { "name": "Slug:Dir" } - DirChild.luau # child ModuleScript -``` - -#### Phase 8a: Slugify Forward-Sync (filesystem -> plugin patches) - -Tests that editing/creating/deleting slugified files produces patches with correct **real** instance names (from meta), not filesystem names (slugs). - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | -| 32 | `edit_slugified_script_source` | Edit `What_Module.luau` content. Verify WebSocket patch contains `changedProperties.Source` for instance named `What?Module` (NOT `What_Module`). The meta `name` field must be respected during forward-sync. | Yes | -| 33 | `edit_slugified_server_script_source` | Edit `Key_Script.server.luau` content. Verify patch contains Source change for instance named `Key:Script`. Same principle, different script type. | No | -| 34 | `create_new_slugified_file_with_meta` | Create `New_Slug.luau` + `New_Slug.meta.json5` with `{"name": "New/Slug"}`. Verify the patch adds an instance named `New/Slug` (not `New_Slug`). | Yes | -| 35 | `delete_slugified_file_and_meta` | Delete both `What_Module.luau` and `What_Module.meta.json5`. Verify the patch removes exactly one instance (the one named `What?Module`). | No | -| 36 | `edit_only_meta_name_field` | Edit `What_Module.meta.json5` to change `{"name": "What?Module"}` -> `{"name": "What*Module"}`. Verify the patch contains a name change (or re-snapshot). The slug stays the same but the real name changes. This is the "Foo/Bar -> Foo | Bar, both slugify to Foo_Bar" case from the audit. | -| 37 | `delete_meta_name_reverts_to_stem` | Delete `What_Module.meta.json5` (but leave `What_Module.luau`). Verify the patch shows the instance name changing from `What?Module` to `What_Module` (the filename stem becomes the name when no meta exists). | Yes | - - -#### Phase 8b: Dedup (~N Suffix) Forward-Sync - -Tests that `~N` suffixed files are handled correctly: the suffix is just part of the filename stem, the real name comes from meta. Without meta, the full stem (including `~N`) IS the instance name. - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | -| 38 | `edit_dedup_file_with_meta` | Edit `Hey_Bro~1.luau` content. Verify patch shows Source change for instance named `Hey/Bro` (from meta), not `Hey_Bro~1`. | Yes | -| 39 | `dedup_file_without_meta_uses_stem` | Create `Foo~1.luau` with NO meta file. Verify the instance name in the patch is literally `Foo~1` -- the tilde is NOT parsed as a dedup marker during forward-sync. This is the backward compatibility guarantee. | Yes | -| 40 | `add_second_colliding_file` | Start with `Hey_Bro.luau` (name: `Hey_Bro`). Create `Hey_Bro~1.luau` + `Hey_Bro~1.meta.json5` with `{"name": "Hey:Bro"}`. Verify the patch adds a NEW instance named `Hey:Bro` as a sibling, without disturbing `Hey_Bro`. | Yes | -| 41 | `remove_one_of_two_colliding_files` | Delete `Hey_Bro~1.luau` + `Hey_Bro~1.meta.json5`. Verify the patch removes exactly the instance named `Hey/Bro`, leaving `Hey_Bro` untouched. | Yes | -| 42 | `add_third_collision` | With `Hey_Bro.luau` and `Hey_Bro~1.luau` already present, create `Hey_Bro~2.luau` + `Hey_Bro~2.meta.json5` with `{"name": "Hey*Bro"}`. Verify patch adds instance named `Hey*Bro`. All three coexist. | Yes | - - -#### Phase 8c: Slugified Directory Format - -Tests that directory-format instances with slugified names work correctly during connected mode. The real name is in `init.meta.json5`. - - -| # | Test Name | What It Tests | Round-Trip | -| --- | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | -| 43 | `edit_init_in_slugified_directory` | Edit `Slug_Dir/init.luau` content. Verify patch shows Source change for instance named `Slug:Dir` (from `init.meta.json5`), not `Slug_Dir`. | Yes | -| 44 | `init_type_change_in_slugified_directory` | Rename `Slug_Dir/init.luau` -> `Slug_Dir/init.server.luau`. Verify ClassName changes from ModuleScript to Script. Instance name must remain `Slug:Dir` (from meta). | Yes | -| 45 | `add_child_to_slugified_directory` | Create `Slug_Dir/NewChild.luau`. Verify patch adds a new ModuleScript child under the instance named `Slug:Dir`. | Yes | - - -#### Phase 8d: Meta Name Field Lifecycle (connected mode) - -Tests the full lifecycle of the meta `name` field -- the bridge between filesystem names and real instance names. Any bug here silently corrupts names. - - -| # | Test Name | What It Tests | Round-Trip | -| --- | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- | -| 46 | `add_meta_name_to_clean_file` | `Normal.luau` has no meta (name = `Normal`). Create `Normal.meta.json5` with `{"name": "Nor/mal"}`. Verify the patch shows the instance name changing from `Normal` to `Nor/mal`. | Yes | -| 47 | `update_meta_name_field` | `What_Module.meta.json5` has `{"name": "What?Module"}`. Change to `{"name": "What:Module"}`. Verify the patch shows name change. The slug (`What_Module`) doesn't change, only the real name does. | Yes | -| 48 | `meta_name_with_other_properties` | Create meta file with BOTH `name` AND `$properties`: `{"name": "Real/Name", "$properties": {"Disabled": true}}`. Verify both the name override AND the property appear in the patch. | Yes | -| 49 | `model_json_name_field_edit` | Edit `What_Model.model.json5` to change `"name": "What?Model"` -> `"name": "What:Model"`. Verify name change in patch. The `name` field in `.model.json5` serves the same purpose as in `.meta.json5`. | Yes | -| 50 | `model_json_remove_name_field` | Edit `What_Model.model.json5` to remove the `"name"` field entirely. Verify instance name reverts from `What?Model` to `What_Model` (derived from filename stem). | Yes | - - -#### Phase 8e: Multi-Step Slugify Scenarios (round-trip proofs) - -Multi-step sequences that exercise the slugify system through state transitions, with round-trip verification at each step. These are the highest-value tests for catching subtle bugs. - - -| # | Test Name | What It Tests | Round-Trip | -| --- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | -| 51 | `slugify_rename_chain` | Multi-step: (1) Edit `What_Module.luau` content, (2) Update meta name `What?Module` -> `What*Module`, (3) Delete meta (name reverts to `What_Module`), (4) Re-create meta with `{"name": "What/Module"}`. Four patches, four state snapshots. Round-trip verified at each step. | Yes (each step) | -| 52 | `collision_evolution` | Multi-step: (1) Add `Hey_Bro~2.luau` + meta `{"name": "Hey*Bro"}` (third collision), (2) Delete `Hey_Bro~1.luau` + meta (remove `Hey/Bro`), (3) Add `Hey_Bro~1.luau` + meta with different name `{"name": "Hey | Bro"}`(reuse the`~1` slot). Three patches. Verify correct instances exist at each step. | -| 53 | `clean_to_slug_to_clean_via_filesystem` | Multi-step: (1) `Normal.luau` exists (clean name). Add `Normal.meta.json5` with `{"name": "Nor:mal"}` -- name changes to `Nor:mal`. (2) Delete the meta -- name reverts to `Normal`. (3) Rename `Normal.luau` -> `Has_Slash.luau` + create `Has_Slash.meta.json5` with `{"name": "Has/Slash"}` -- completely different slug+name. Round-trip verified at each step. | Yes (each step) | - - ---- - -## Execution Order - -1. **Fixtures**: Create 4 new fixture directories: `connected_scripts`, `connected_init`, `connected_models`, `connected_slugify` -2. **Harness**: Add `get_message_cursor`, `NormalizedTree`/`NormalizedInstance`, `fresh_rebuild_read`, `assert_round_trip` to [tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs) -3. **Phase 1** (format transitions): Highest value, most likely to catch bugs in the snapshot pipeline -4. **Phase 2** (multi-step sequences): Core connected mode pattern, validates cursor chaining -5. **Phase 3** (init file ops): Critical for directory handling correctness -6. **Phases 4-7**: Property/meta, model JSON, cursor tracking, mixed API+filesystem -7. **Phase 8a-e** (slugify/dedup): 22 tests covering the entire forward-sync direction of the name system, with round-trip proofs -8. **Run**: `cargo test`, then `cargo insta review` to accept snapshots -9. **Verify**: All tests pass on a clean run, no snapshot drift - ---- - -## Notes on Test Design - -### Filesystem events are OS-dependent - -Some operations (like rename) may fire different events on macOS (kqueue/FSEvents) vs Windows (ReadDirectoryChangesW) vs Linux (inotify). Tests that depend on exact patch structure may need `#[cfg_attr(target_os = "macos", ignore)]` annotations if event ordering differs. The existing `ref_properties_remove` test already does this. - -### The snapshot system may not auto-convert formats - -When adding a child file next to a standalone script via the filesystem, the snapshot system may NOT automatically convert to directory format (that conversion might only happen through the change processor during API writes). Tests should verify and document the actual behavior rather than assuming conversion happens. - -### Echo suppression is critical for mixed tests - -Phase 7 tests depend on echo suppression working correctly. The API write path suppresses VFS events for paths it wrote, preventing feedback loops. If echo suppression is broken, these tests will see duplicate patches. \ No newline at end of file diff --git a/.cursor/plans/consolidate_filesystem_name_for_f2bdef69.plan.md b/.cursor/plans/consolidate_filesystem_name_for_f2bdef69.plan.md deleted file mode 100644 index 47e61382..00000000 --- a/.cursor/plans/consolidate_filesystem_name_for_f2bdef69.plan.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -name: Consolidate filesystem_name_for -overview: Eliminate the duplicated InstigatingSource branching logic by having `ref_target_path_from_tree` call `tree.filesystem_name_for()` instead of reimplementing the same logic inline. -todos: - - id: consolidate - content: Replace inline InstigatingSource branching in ref_target_path_from_tree with tree.filesystem_name_for() call - status: completed - - id: verify - content: Run cargo test and cargo clippy to confirm no regressions - status: completed -isProject: false ---- - -# Consolidate `filesystem_name_for` Duplication - -## Problem - -`ref_target_path_from_tree` (`[src/rojo_ref.rs](src/rojo_ref.rs)` lines 140-191) reimplements the same `InstigatingSource` branching logic that `filesystem_name_for` (`[src/snapshot/tree.rs](src/snapshot/tree.rs)` lines 394-418) already provides. The [ref path audit](c:/Users/Joe/.cursor/plans/audit_ref_path_system_c21fc130.plan.md) confirmed these produce identical results for all branches. - -## Approach - -`ref_target_path_from_tree` already receives `&RojoTree` and `filesystem_name_for` is already `pub` on `RojoTree`. The fix is to replace the inline branching with a call to the existing method. No new functions, no signature changes, no new files. - -## Change - -**Single file: `[src/rojo_ref.rs](src/rojo_ref.rs)`** -- Replace the 25-line `let fs_name = if let Some(meta) ...` block (lines 158-183) inside `ref_target_path_from_tree` with a single call to `tree.filesystem_name_for(current)`: - -Before (lines 140-191): - -```rust -pub fn ref_target_path_from_tree(tree: &crate::snapshot::RojoTree, target_ref: Ref) -> String { - let dom = tree.inner(); - let root_ref = dom.root_ref(); - let mut components: Vec = Vec::new(); - let mut current = target_ref; - - loop { - if current == root_ref || current.is_none() { break; } - let inst = match dom.get_by_ref(current) { - Some(i) => i, - None => break, - }; - - // 25 lines of InstigatingSource branching (duplicated from tree.rs) - let fs_name = if let Some(meta) = tree.get_metadata(current) { - // ... Path branch ... - // ... ProjectNode branch ... - // ... no source fallback ... - } else { - inst.name.clone() - }; - - components.push(fs_name); - current = inst.parent(); - } - components.reverse(); - components.join("/") -} -``` - -After: - -```rust -pub fn ref_target_path_from_tree(tree: &crate::snapshot::RojoTree, target_ref: Ref) -> String { - let dom = tree.inner(); - let root_ref = dom.root_ref(); - let mut components: Vec = Vec::new(); - let mut current = target_ref; - - loop { - if current == root_ref || current.is_none() { break; } - let inst = match dom.get_by_ref(current) { - Some(i) => i, - None => break, - }; - components.push(tree.filesystem_name_for(current)); - current = inst.parent(); - } - components.reverse(); - components.join("/") -} -``` - -## Scope - -- **1 file** changed -- **~25 lines** removed (duplicated branching logic) -- **1 line** added (call to existing method) -- **0 call sites** affected (function signature unchanged) -- **0 test changes** needed (behavior is identical per the audit) - -## Verification - -- `cargo test` -- all existing ref path tests (100+ unit, 30+ integration) exercise this function -- `cargo clippy` -- no new warnings expected - diff --git a/.cursor/plans/dedup_suffix_start_at_2_89e66bf2.plan.md b/.cursor/plans/dedup_suffix_start_at_2_89e66bf2.plan.md deleted file mode 100644 index 002d8b29..00000000 --- a/.cursor/plans/dedup_suffix_start_at_2_89e66bf2.plan.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -name: Dedup suffix start at 2 -overview: Change the dedup suffix numbering to start at `~2` instead of `~1`, so the sequence is `Something.luau`, `Something~2.luau`, `Something~3.luau` -- consistent with Windows duplicate naming conventions. -todos: - - id: core-loops - content: Change `for i in 1..` to `for i in 2..` in both `deduplicate_name_with_ext` and `deduplicate_name` in `src/syncback/file_names.rs` - status: completed - - id: unit-tests - content: Update unit test expectations in `file_names.rs` for generated suffix assertions (~1 -> ~2, ~2 -> ~3) - status: completed - - id: integration-tests - content: Update integration test assertions in `two_way_sync.rs` and `connected_mode.rs` - status: completed - - id: fixtures-rename - content: "Rename test fixture files: connected_slugify, ref_ambiguous_path, UFOWave_matching expected outputs" - status: completed - - id: snapshot-tests - content: Run cargo test + cargo insta review to update snapshot expectations - status: completed - - id: docs-update - content: Update atlas-dedup.mdc examples to reflect ~2 starting suffix - status: completed -isProject: false ---- - -# Dedup Suffix: Start at ~2 - -## Core Change - -The only production logic change is in `[src/syncback/file_names.rs](src/syncback/file_names.rs)` -- two `for` loops that generate dedup suffixes: - -`**deduplicate_name_with_ext` (line ~297):** - -```rust -// Before: -for i in 1.. { -// After: -for i in 2.. { -``` - -`**deduplicate_name` (line ~315):** - -```rust -// Before: -for i in 1.. { -// After: -for i in 2.. { -``` - -These are the only two places where dedup suffix numbers are generated. All other code (`parse_dedup_suffix`, `compute_cleanup_action`, `build_dedup_name`, cleanup logic in `change_processor.rs`, `api.rs`) operates on whatever numbers exist on disk and needs no changes. - -## Backward Compatibility - -- `**parse_dedup_suffix**` in `[src/syncback/dedup_suffix.rs](src/syncback/dedup_suffix.rs)` (line ~~53): keep `if n > 0` unchanged. Old filesystems may have `~~1` files; forward sync must still read them correctly. -- `**build_dedup_name**`: takes an explicit number, no change needed. -- **Cleanup rules**: operate on parsed suffix numbers dynamically, work with any starting value. - -## Test Updates - -### Unit Tests - -- `[src/syncback/file_names.rs](src/syncback/file_names.rs)` test module (~~line 389+): update assertions that expect generated `~~1`to`~~2`,`~~ 2`to`~3`, etc. Key tests:` dedup_single_collision`,` dedup_multiple_collisions`,` dedup_skips_taken_suffix`,` dedup_gap_in_suffixes`. -- `[src/syncback/dedup_suffix.rs](src/syncback/dedup_suffix.rs)` test module: `parse_suffix_basic` still tests `~1` parsing (backward compat) -- no change. `build_name_file` references `~1` as explicit input to `build_dedup_name` -- no change (function takes arbitrary numbers). Cleanup tests (`cleanup_group_to_one`, `cleanup_base_deleted_promote_lowest`, etc.) use `~1`/`~2` as existing filesystem state -- no change needed since they test cleanup of pre-existing suffixes. - -### Integration Tests - -- `[tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs)`: update all generation assertions: `X_Y~1` to `X_Y~2`, `X_Y~2` to `X_Y~3`. Affected tests: `add_two_colliding_instances_deduplicates`, `add_three_colliding_instances_deduplicates`, `delete_deduped_instance_group_to_1_cleanup`, `delete_base_deduped_instance_promotes_lowest`, `delete_middle_deduped_instance_tolerates_gap`, `add_same_named_folders_deduplicates`, `ref_through_deduped_instance`, `ref_path_updated_after_dedup_cleanup`. -- `[tests/tests/connected_mode.rs](tests/tests/connected_mode.rs)`: update tests that interact with generated dedup files. `add_third_collision` expects `Hey_Bro~2` -- should become `Hey_Bro~3`. Tests that read existing fixture files (`edit_dedup_file_with_meta`, `remove_one_of_two_colliding_files`) need fixture updates (see below). - -### Test Fixtures (rename files) - -- `rojo-test/serve-tests/connected_slugify/src/Hey_Bro~1.luau` -> `Hey_Bro~2.luau` -- `rojo-test/serve-tests/connected_slugify/src/Hey_Bro~1.meta.json5` -> `Hey_Bro~2.meta.json5` -- `rojo-test/serve-tests/ref_ambiguous_path/src/Workspace/DupParent/Child~1.model.json5` -> `Child~2.model.json5` (and update any ref paths inside) -- `rojo-test/syncback-tests/UFOWave_matching/expected/TsunamiWave/`: rename all `~N` files to `~(N+1)` (e.g., `Texture~1` -> `Texture~2`, ..., `Texture~11` -> `Texture~12`) - -**Keep unchanged (backward compat reading):** - -- `rojo-test/build-tests/dedup_suffix_with_meta/src/Foo~1.`* -- tests that forward sync reads old `~1` files correctly -- `rojo-test/build-tests/tilde_no_meta/src/Foo~1.luau` -- tests literal tilde name (no meta) - -### Snapshot Tests - -- Run `cargo test` then `cargo insta review` to accept updated snapshot expectations. The `.snap` files in `rojo-test/build-test-snapshots/` and `rojo-test/serve-test-snapshots/` will auto-update. - -## Documentation Update - -- `[.cursor/rules/atlas-dedup.mdc](.cursor/rules/atlas-dedup.mdc)`: update examples that reference `~1` as generated output (e.g., `"Foo~1.server.luau"` -> `"Foo~2.server.luau"` where it represents generated names; keep `~1` where it represents parseable/legacy names). - diff --git a/.cursor/plans/destructive_syncback_mode_acb8cb54.plan.md b/.cursor/plans/destructive_syncback_mode_acb8cb54.plan.md deleted file mode 100644 index d61074a4..00000000 --- a/.cursor/plans/destructive_syncback_mode_acb8cb54.plan.md +++ /dev/null @@ -1,250 +0,0 @@ ---- -name: Destructive Syncback Mode -overview: Add a `--clean` flag to syncback that ignores existing file structure and middleware, treating all instances as new to ensure consistent 1:1 output regardless of existing filesystem state. -todos: [] -isProject: false ---- - -# Destructive Syncback Mode (Clean by Default) - -## Root Cause Analysis - -Your inconsistency stems from three preservation mechanisms in syncback: - -### 1. File Name Preservation (`[src/syncback/file_names.rs](src/syncback/file_names.rs)` lines 19-34) - -When an old instance exists, the **existing filename is always preserved**, even if the instance was renamed: - -```rust -if let Some(old_inst) = old_inst { - if let Some(source) = old_inst.metadata().relevant_paths.first() { - source.file_name() // Returns OLD filename, ignores new instance name - } -} -``` - -### 2. Middleware Preservation (`[src/syncback/mod.rs](src/syncback/mod.rs)` lines 353-357) - -When an old instance exists, its middleware format is preserved: - -```rust -} else if let Some(old_middleware) = old_middleware { - // Use old middleware, even if a clean sync would choose differently - middleware = old_middleware; -} -``` - -This means a `Part.rbxm` stays as `.rbxm` instead of potentially becoming a `Part/` directory with children. - -### 3. Name-Based Child Matching (`[src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs)` lines 196-216) - -Children are matched by name between old and new DOMs. If a child exists in both, it inherits the old structure: - -```rust -if let Some(old_child) = old_child_map.remove(new_child.name.as_str()) { - // Existing child - pass old reference, preserving its structure - children.push(snapshot.with_joined_path(*new_child_ref, Some(old_child.id()))?); -} else { - // New child - gets fresh structure - children.push(snapshot.with_joined_path(*new_child_ref, None)?); -} -``` - -## Solution: Clean Mode by Default with `--incremental` Flag - -Make clean (destructive) mode the default behavior, with an `--incremental` flag to opt into the legacy structure-preserving behavior. - -### Ensuring No Residue Files - -The key challenge: if we set `old = None`, the `removed_children` logic won't work (nothing to compare against). We need a two-phase approach: - -1. **Phase 1**: Collect ALL existing paths from the old tree before syncback -2. **Phase 2**: After computing new paths, remove any old paths that aren't in the new set - -This guarantees no orphaned files remain. - -### Changes Required - -#### 1. Add CLI Flag (`[src/cli/syncback.rs](src/cli/syncback.rs)`) - -Add `--incremental` flag (clean mode is now default): - -```rust -/// If provided, syncback will preserve existing file structure and middleware -/// formats when possible. Without this flag, syncback creates a fresh project -/// layout that exactly matches the input file. -#[clap(long, short = 'n')] -pub incremental: bool, -``` - -#### 2. Pass Flag to `syncback_loop` (`[src/cli/syncback.rs](src/cli/syncback.rs)`) - -```rust -let snapshot = syncback_loop( - session_old.vfs(), - &mut dom_old, - dom_new, - session_old.root_project(), - self.incremental, // false = clean mode (default) -)?; -``` - -#### 3. Modify `syncback_loop` Signature (`[src/syncback/mod.rs](src/syncback/mod.rs)`) - -```rust -pub fn syncback_loop( - vfs: &Vfs, - old_tree: &mut RojoTree, - mut new_tree: WeakDom, - project: &Project, - incremental: bool, // false = clean mode (default) -) -> anyhow::Result -``` - -#### 4. Collect Existing Paths Before Syncback (`[src/syncback/mod.rs](src/syncback/mod.rs)`) - -Before the main loop, collect all existing filesystem paths (respecting ignore patterns): - -```rust -// Collect all existing paths from old tree for cleanup in clean mode -let existing_paths: HashSet = if !incremental { - let mut paths = HashSet::new(); - for ref_id in descendants(old_tree.inner(), old_tree.get_root_id()) { - if let Some(inst) = old_tree.get_instance(ref_id) { - for path in inst.metadata().relevant_paths.iter() { - // Skip paths matching ignore patterns - if is_valid_path(&ignore_patterns, project_path, path) { - paths.insert(path.clone()); - } - } - } - } - paths -} else { - HashSet::new() -}; -``` - -#### 5. Set `old = None` in Clean Mode (`[src/syncback/mod.rs](src/syncback/mod.rs)`) - -```rust -let mut snapshots = vec![SyncbackSnapshot { - data: syncback_data, - old: if incremental { Some(old_tree.get_root_id()) } else { None }, - new: new_tree.root_ref(), - path: project.file_location.clone(), - middleware: Some(Middleware::Project), -}]; -``` - -#### 6. Remove Orphaned Files After Syncback (`[src/syncback/mod.rs](src/syncback/mod.rs)`) - -After the main loop, remove any existing paths that weren't written to: - -```rust -// In clean mode, remove any existing paths that weren't overwritten -if !incremental { - let added_paths: HashSet<&Path> = fs_snapshot.added_paths().iter().map(|p| p.as_path()).collect(); - - for old_path in &existing_paths { - // Skip if this path (or a parent) is being written to - if added_paths.contains(old_path.as_path()) { - continue; - } - // Skip if a parent directory is being added (the new structure will replace it) - if added_paths.iter().any(|p| old_path.starts_with(p)) { - continue; - } - - if old_path.is_dir() { - fs_snapshot.remove_dir(old_path); - } else { - fs_snapshot.remove_file(old_path); - } - } -} -``` - -#### 7. Skip Hash Comparison in Clean Mode (`[src/syncback/mod.rs](src/syncback/mod.rs)`) - -The hash-based skipping should be disabled in clean mode since we want to rewrite everything: - -```rust -// Skip hash comparison in clean mode - we want to rewrite everything -if incremental { - 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"), - } - } -} -``` - -### Data Flow Diagram - -```mermaid -flowchart TD - subgraph cleanMode [Default: Clean Mode] - A1[rojo syncback -i game.rbxl] --> B1[Collect existing paths] - B1 --> C1[Set old = None for all snapshots] - C1 --> D1[Generate fresh filenames] - C1 --> E1[Choose best middleware] - C1 --> F1[All children treated as new] - D1 --> G1[Compute new paths] - E1 --> G1 - F1 --> G1 - G1 --> H1[Remove orphaned files] - H1 --> I1[Consistent 1:1 Structure] - end - - subgraph incrementalMode [With --incremental Flag] - A2[rojo syncback -i game.rbxl --incremental] --> B2{Old Instance Exists?} - B2 -->|Yes| C2[Preserve Filename] - B2 -->|Yes| D2[Preserve Middleware] - B2 -->|Yes| E2[Match Children by Name] - C2 --> F2[Legacy Behavior] - D2 --> F2 - E2 --> F2 - end -``` - - - -### Usage - -```bash -# Default: Clean mode (creates fresh, consistent layout) -rojo syncback -i game.rbxl - -# Preview what clean mode would do -rojo syncback -i game.rbxl --list --dry-run - -# Legacy behavior (preserves existing structure) -rojo syncback -i game.rbxl --incremental -rojo syncback -i game.rbxl -n - -# Combine flags -rojo syncback -i game.rbxl --incremental --list -``` - -### Project-Level Configuration (Optional Enhancement) - -If you want to make incremental mode the default for a specific project without passing the flag, we could also add: - -```json5 -{ - "syncbackRules": { - "incremental": true // Opt into legacy behavior per-project - } -} -``` - -This would be read in `syncback_loop` and combined with the CLI flag (CLI takes precedence). \ No newline at end of file diff --git a/.cursor/plans/extension-free_ref_paths_b9a68637.plan.md b/.cursor/plans/extension-free_ref_paths_b9a68637.plan.md deleted file mode 100644 index 5fbce765..00000000 --- a/.cursor/plans/extension-free_ref_paths_b9a68637.plan.md +++ /dev/null @@ -1,284 +0,0 @@ ---- -name: extension-free ref paths -overview: Remove file extensions from ref path segments and enforce dedup suffixes for ALL instances sharing an Instance.Name, regardless of middleware/file type. Ref paths change from `Workspace/Foo.server.luau` to `Workspace/Foo`, and siblings like `LocalScript.local.luau` + `LocalScript.client.luau` now become `LocalScript.local.luau` + `LocalScript~2.client.luau`. -todos: - - id: strip-ext - content: Add `strip_known_extensions()` utility to `file_names.rs` with unit tests - status: pending - - id: dedup-bare-slug - content: Change `deduplicate_name_with_ext()` and `name_for_inst()` to use bare slug for collision detection; update dedup_key semantics - status: pending - - id: taken-names-sites - content: Update ALL taken_names seeding sites (dir.rs, project.rs, api.rs) to use bare slugs via strip_known_extensions - status: pending - - id: ref-segment - content: Add `ref_segment_for()` to tree.rs; update `walk_segments()` and `get_instance_by_path()` to match bare stems - status: pending - - id: ref-construction - content: Update `ref_target_path_from_tree()`, `tentative_fs_name()`, `added_instance_fs_segment()`, `record_ref_path()` to use bare stems - status: pending - - id: cleanup-grouping - content: Update change_processor.rs cleanup to group by bare stem (remove extension filter), refactor compute_cleanup_action for mixed-extension groups - status: pending - - id: unit-tests-dedup - content: Update all file_names.rs unit tests for new bare-slug taken_names semantics; add same-name-different-type tests - status: pending - - id: unit-tests-ref - content: Update rojo_ref.rs unit tests for extension-free ref path format - status: pending - - id: forward-sync-constraint - content: "Add forward sync handling for bare-stem uniqueness constraint: walk_segments backward compat fallback for old-format refs, and warning/auto-dedup for legacy same-bare-stem files" - status: pending - - id: integration-tests - content: Add build test fixture for same-name-different-type dedup; add connected_mode cleanup test; update snapshot expectations with `cargo insta review` - status: pending -isProject: false ---- - -# Extension-Free Ref Paths - -## Core Semantic Change - -**Old behavior:** Dedup key = full filesystem name (slug + extension). `Foo.server.luau` and `Foo.luau` do NOT collide. Ref paths include extensions: `Workspace/Foo.server.luau`. - -**New behavior:** Dedup key = bare slug only (no extension). ALL instances with the same slug collide and get `~2`, `~3`, etc. Ref paths use bare stems: `Workspace/Foo`, `Workspace/Foo~2`. - -`~1` is never produced (already the case, maintained). - -## Hard Constraint: Bare Stem Uniqueness - -**Files in the same directory can NEVER share a primary name (bare stem), even if they have different types/extensions.** This is the foundational invariant of this change. Previously, `Foo.server.luau` and `Foo.luau` could coexist because their full filenames differed. Now they CANNOT -- one must get a dedup suffix (`Foo~2`). - -This constraint must be enforced at multiple levels: - -1. **Writeout (syncback/two-way sync):** The dedup system uses bare slugs in `taken_names`, so same-named instances of different types always get `~2`, `~3`, etc. This is the primary enforcement mechanism. -2. **Forward sync (reading files):** When reading a directory, if two files share a bare stem (legacy state from before this change), forward sync needs to handle it. The `walk_segments` resolver must support a **backward compatibility fallback** that matches old-format refs (with extensions) so existing projects don't break. Additionally, we should log a warning when same-bare-stem siblings are detected, guiding users to re-run syncback to fix the state. -3. **Ref path resolution backward compat:** `walk_segments()` should have a 3-tier fallback: - - **Primary:** Match against `ref_segment_for()` (bare stem) -- new format - - **Fallback 1:** Match against `filesystem_name_for()` (full filename) -- old format backward compat - - **Fallback 2:** Match against instance name -- existing fallback - -This ensures old ref paths like `./Foo.server.luau` still resolve correctly until the project is re-synced. - -## Phase 1: Core Dedup Change - -### 1a. Add `strip_known_extensions()` to [file_names.rs](src/syncback/file_names.rs) - -New utility function that strips known middleware extensions from a filename to recover the bare stem (slug + dedup suffix). Must check compound extensions before simple ones: - -```rust -pub fn strip_known_extensions(filename: &str) -> &str { - const COMPOUND: &[&str] = &[ - ".server.luau", ".client.luau", ".plugin.luau", ".local.luau", ".legacy.luau", - ".server.lua", ".client.lua", ".plugin.lua", - ".model.json5", ".model.json", - ".project.json5", ".project.json", - ".meta.json5", ".meta.json", - ]; - const SIMPLE: &[&str] = &[ - ".luau", ".lua", ".json5", ".json", ".csv", ".txt", - ".rbxm", ".rbxmx", ".toml", ".yml", ".yaml", - ]; - for ext in COMPOUND { if let Some(s) = filename.strip_suffix(ext) { return s; } } - for ext in SIMPLE { if let Some(s) = filename.strip_suffix(ext) { return s; } } - filename -} -``` - -### 1b. Modify `deduplicate_name_with_ext()` in [file_names.rs](src/syncback/file_names.rs) - -Change collision check from full filesystem name to bare slug: - -```rust -// OLD: checks "foo.server.luau" against taken_names -// NEW: checks "foo" (bare slug) against taken_names -if !taken_names.contains(&base.to_lowercase()) { ... } -``` - -`taken_names` now stores bare slugs (lowercased, no extensions). - -### 1c. Modify `name_for_inst()` in [file_names.rs](src/syncback/file_names.rs) - -- **New instance branch:** `dedup_key` = bare slug (with dedup suffix if applied), NOT full filesystem name. -- **Old instance branch:** `dedup_key` = `strip_known_extensions(filename)` (bare stem from existing file). -- Doc comments updated to reflect new semantics. - -### 1d. Update all `taken_names` seeding sites - -These files seed `taken_names` from existing filesystem entries and must switch to bare slugs: - -- [dir.rs](src/snapshot_middleware/dir.rs) lines 224-242: `taken_names.insert(filename.to_lowercase())` must become `taken_names.insert(strip_known_extensions(filename).to_lowercase())` -- [project.rs](src/snapshot_middleware/project.rs) lines 736-744: same change -- [api.rs](src/web/api.rs): any taken_names seeding from tree siblings - -## Phase 2: Ref Path Segment Change - -### 2a. Add `ref_segment_for()` to [tree.rs](src/snapshot/tree.rs) - -New method on `RojoTree` that returns the bare stem for use in ref paths. Keep `filesystem_name_for()` unchanged for any non-ref-path callers (verify first). - -```rust -pub fn ref_segment_for(&self, id: Ref) -> String { - if let Some(meta) = self.metadata_map.get(&id) { - if let Some(source) = &meta.instigating_source { - match source { - InstigatingSource::Path(_) => { - if let Some(name) = source.path().file_name().and_then(|f| f.to_str()) { - return strip_known_extensions(name).to_string(); - } - } - InstigatingSource::ProjectNode { .. } => { - if let Some(inst) = self.inner.get_by_ref(id) { - return inst.name.clone(); - } - } - } - } - } - self.inner.get_by_ref(id).map(|i| i.name.clone()).unwrap_or_default() -} -``` - -For `Foo~2.server.luau` this returns `Foo~2`. For `Foo/` (dir) this returns `Foo`. For project nodes, returns instance name. - -### 2b. Update `walk_segments()` and `get_instance_by_path()` in [tree.rs](src/snapshot/tree.rs) - -Replace `filesystem_name_for()` with `ref_segment_for()` in the segment matching loop. The fallback to instance name matching remains. - -### 2c. Update `ref_target_path_from_tree()` in [rojo_ref.rs](src/rojo_ref.rs) - -Use `tree.ref_segment_for()` instead of `tree.filesystem_name_for()` when building path segments. - -### 2d. Update `tentative_fs_name()` in [ref_properties.rs](src/syncback/ref_properties.rs) - -Return just the bare slug (slugified instance name, no extension). This produces tentative ref-path segments like `Foo` instead of `Foo.server.luau`. - -### 2e. Update `added_instance_fs_segment()` in [api.rs](src/web/api.rs) - -Return bare slug (slugified instance name, no extension) for same-batch ref target paths. - -### 2f. Update `record_ref_path()` in [snapshot.rs](src/syncback/snapshot.rs) - -Currently passes the full filename (e.g., `"Foo~2.server.luau"`) as the child segment. Must pass the bare stem instead (e.g., `"Foo~2"`). The `name` variable from `name_for_inst()` is the full filename, so we need to derive the bare stem -- use `strip_known_extensions(&name)`. - -## Phase 2.5: Forward Sync Constraint Enforcement - -### 2.5a. Update `walk_segments()` with 3-tier fallback in [tree.rs](src/snapshot/tree.rs) - -The current 2-tier fallback (filesystem_name_for -> instance name) becomes 3-tier: - -```rust -// Tier 1: match ref segment (bare stem) -- new format -for &child_ref in children { - let ref_seg = self.ref_segment_for(child_ref); - if ref_seg.eq_ignore_ascii_case(segment) { ... break; } -} -// Tier 2: match full filesystem name -- backward compat for old refs -if !found { - for &child_ref in children { - let fs_name = self.filesystem_name_for(child_ref); - if fs_name.eq_ignore_ascii_case(segment) { ... break; } - } -} -// Tier 3: match instance name -- existing fallback -if !found { - for &child_ref in children { - if child.name.eq_ignore_ascii_case(segment) { ... break; } - } -} -``` - -Same structure for `get_instance_by_path()`. - -### 2.5b. Add bare-stem collision warning in forward sync - -In [dir.rs](src/snapshot_middleware/dir.rs) `snapshot_dir_no_meta()`, after collecting all child snapshots, check for bare-stem collisions among siblings. If found, log a warning like: - -``` -Warning: Files "Foo.server.luau" and "Foo.luau" share bare stem "Foo" -- -this is ambiguous for ref paths. Run syncback to fix. -``` - -This is a non-fatal warning. The forward sync still works (instances get their correct names/classes), but ref resolution may be ambiguous until syncback adds dedup suffixes. - -## Phase 3: Dedup Cleanup Update - -### 3a. Update cleanup grouping in [change_processor.rs](src/change_processor.rs) (lines 1090-1156) - -Currently groups siblings by matching extension (`sibling_ext != removed_extension`). Remove this extension filter -- all siblings with the same bare stem should be in the same dedup group regardless of extension. - -- `removed_stem` derivation: use `strip_known_extensions(removed_fs_name)` instead of splitting on first `.` -- `sibling_stem` derivation: use `strip_known_extensions(sibling_fs)` instead of splitting on first `.` -- Remove the `sibling_ext != removed_extension` guard entirely -- `compute_cleanup_action()` `extension` parameter: still needed for building filesystem paths. Pass `None` for the extension since cleanup now operates on bare stems. The renamed file keeps its original extension -- we just need to rename `Foo~2.server.luau` to `Foo.server.luau`. The extension is derived from the actual file's path, not from the dedup group. - -Wait -- `compute_cleanup_action()` builds rename paths using `build_dedup_name(base_stem, suffix, extension)`. It needs the extension to know the full filename. Since siblings now have DIFFERENT extensions within the same group, the survivor's extension must be read from its actual filesystem name. This requires a small refactor of `compute_cleanup_action()` or the caller: instead of passing a single `extension`, the cleanup should track each remaining sibling's full filename so renames produce correct paths. - -**Approach:** In the caller loop in `change_processor.rs`, track `remaining_entries: Vec<(stem, full_fs_name)>` instead of just `remaining_stems: Vec`. The cleanup action can then derive the correct filesystem path from the survivor's actual full name. - -### 3b. Update `compute_cleanup_action()` in [dedup_suffix.rs](src/syncback/dedup_suffix.rs) - -Modify to accept `remaining_entries` with both stem and full filename info, so it can build correct rename paths for mixed-extension groups. - -## Phase 4: Tests - -### 4a. Update unit tests in [file_names.rs](src/syncback/file_names.rs) - -**All tests using full filesystem names in `taken_names`** must switch to bare slugs: - -- `nfi_dedup_collision`: `"foo.luau"` -> `"foo"` -- `nfi_slug_collision_file_middleware`: `"hey_bro.luau"` -> `"hey_bro"` -- `disk_seed_file_middleware_*`: entries like `"mymodule.luau"` -> `"mymodule"` -- `nightmare_mixed_middleware_*`: These tests will fundamentally change. `Folder "Shared"` and `ModuleScript "Shared"` now DO collide (same bare slug "shared") where they previously didn't. - -**New tests to add:** - -- `same_name_different_type_dedup`: Two instances "Foo" (ModuleScript + ServerScript) get dedup: `Foo.luau`, `Foo~2.server.luau` -- `same_name_dir_and_file_dedup`: Folder "Foo" and Script "Foo" get dedup: `Foo/`, `Foo~2.server.luau` -- `three_way_mixed_type_dedup`: Three instances "X" (ModuleScript, ServerScript, Folder) all dedup -- `dedup_key_is_bare_slug`: Verify dedup_key returned by `name_for_inst()` is the bare slug - -### 4b. Add `strip_known_extensions` unit tests in [file_names.rs](src/syncback/file_names.rs) - -Test all compound and simple extension stripping, including edge cases (dots in instance names, no extension, etc.). - -### 4c. Update ref path unit tests in [rojo_ref.rs](src/rojo_ref.rs) - -Update expected ref path formats: `"Workspace/Foo.luau"` -> `"Workspace/Foo"`, etc. - -### 4d. Add build test fixture - -New test in [build-tests/](rojo-test/build-tests/) for same-name-different-type instances. Verify the build output snapshot shows correct dedup suffixes. - -### 4e. Add connected_mode test - -Test dedup cleanup when a mixed-type group member is deleted. Verify the survivor's suffix is cleaned correctly even though siblings have different extensions. - -### 4f. Update ALL existing snapshot test expectations - -Run `cargo test` and `cargo insta review` to update snapshot files affected by the new ref path format and dedup behavior. - -## Key Files Summary - - -| File | Change Type | -| ------------------------------------------------------------------------ | ------------------------------------------------------------------------- | -| [src/syncback/file_names.rs](src/syncback/file_names.rs) | Add `strip_known_extensions`, modify dedup logic, update tests | -| [src/snapshot/tree.rs](src/snapshot/tree.rs) | Add `ref_segment_for`, update `walk_segments`, `get_instance_by_path` | -| [src/rojo_ref.rs](src/rojo_ref.rs) | Update `ref_target_path_from_tree`, update tests | -| [src/syncback/ref_properties.rs](src/syncback/ref_properties.rs) | Update `tentative_fs_name` to return bare slug | -| [src/web/api.rs](src/web/api.rs) | Update `added_instance_fs_segment`, taken_names seeding | -| [src/change_processor.rs](src/change_processor.rs) | Remove extension-based grouping, update ref paths | -| [src/syncback/dedup_suffix.rs](src/syncback/dedup_suffix.rs) | Update `compute_cleanup_action` for mixed-extension groups | -| [src/syncback/snapshot.rs](src/syncback/snapshot.rs) | Update `record_ref_path` to use bare stems | -| [src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs) | Update taken_names seeding to bare slugs; add bare-stem collision warning | -| [src/snapshot_middleware/project.rs](src/snapshot_middleware/project.rs) | Update taken_names seeding to bare slugs | - - -## Risk Areas - -1. `**compute_cleanup_action` refactor** -- The most complex change. Currently assumes all group members share an extension. Must now handle mixed extensions and still produce correct filesystem rename paths. -2. **Custom sync rules** -- `strip_known_extensions()` only handles built-in extensions. Custom `syncRules` patterns won't be stripped. Acceptable for initial implementation; the ref segment will include the custom extension, and resolution will match correctly since both sides use the same derivation. -3. **Snapshot test churn** -- Many snapshot tests will have new expected output. Use `cargo insta review` to batch-accept. -4. **Legacy project migration** -- Projects with same-bare-stem files (e.g., `Foo.server.luau` + `Foo.luau` in same dir) are now in an invalid state. The 3-tier `walk_segments` fallback ensures old ref paths still resolve, but the ambiguity warning encourages users to re-run syncback. The first syncback after this change will automatically fix the filesystem by applying dedup suffixes. - diff --git a/.cursor/plans/fix_audit_findings_ca70f773.plan.md b/.cursor/plans/fix_audit_findings_ca70f773.plan.md deleted file mode 100644 index 72bca6c1..00000000 --- a/.cursor/plans/fix_audit_findings_ca70f773.plan.md +++ /dev/null @@ -1,266 +0,0 @@ ---- -name: Fix audit findings -overview: Fix all 3 critical bugs, 2 correctness issues, 2 refactors, 1 cleanup item, and add 7 missing tests identified by the slugify branch audit. -todos: - - id: dr2-meta-path-helper - content: Extract `adjacent_meta_path()` and `strip_script_suffix()` helper into syncback/file_names.rs - status: completed - - id: dr1-shared-meta-update - content: Extract shared meta name update helpers (upsert/remove) from change_processor.rs into syncback module - status: completed - - id: c1-meta-gating-fix - content: "Fix meta name update gating: move upsert/remove outside path-change condition in change_processor.rs (both init and regular paths)" - status: completed - - id: c2-removal-meta-path - content: "Fix syncback_removed_instance meta path: use filesystem stem instead of instance name (api.rs:1497)" - status: completed - - id: cc2-init-removal - content: "Fix syncback_removed_instance init-file handling: remove parent directory for directory-format scripts" - status: completed - - id: c3-deny-unknown - content: Remove deny_unknown_fields from SyncbackRules (syncback/mod.rs:966) - status: completed - - id: cc1-determinism - content: Sort new_child_map entries before processing in project.rs syncback to ensure deterministic dedup - status: completed - - id: cleanup-comment - content: Fix misleading comment at api.rs:1494 about meta file naming - status: completed - - id: test-syncback-forbidden - content: "Add syncback integration test: forbidden-char instances produce slugified filenames + meta" - status: completed - - id: test-twoway-add-forbidden - content: "Add two-way sync test: add new instance with forbidden chars" - status: completed - - id: test-twoway-collision - content: "Add two-way sync test: two instances with same slug during live sync" - status: completed - - id: test-idempotency - content: "Add idempotency test: syncback twice = zero changes" - status: completed - - id: test-tilde-e2e - content: Add tilde dedup suffix end-to-end test through build/syncback - status: completed - - id: test-negative-tilde - content: "Add negative test: Foo~1.luau without meta = instance name Foo~1" - status: completed - - id: test-stress - content: "Add large tree stress test: 100+ instances with collision patterns" - status: completed -isProject: false ---- - -# Fix All Audit Findings - -## Standards (from audit) - -- **Round-trip identity**: Syncback writes must rebuild to bit-identical instance trees. Any deviation is a bug. -- **Code quality**: DRY -- no duplicated slugify/dedup/meta patterns. Shared helpers over copy-paste. -- **Legacy %ENCODING%**: Intentionally unsupported. No backward compat for old `%NAME%` patterns. - ---- - -## C1. Meta `name` update skipped when slug doesn't change - -**Files**: [src/change_processor.rs](src/change_processor.rs) lines 735-789 (init) and 835-879 (regular) - -The meta update calls (`upsert_meta_name_field` / `remove_meta_name_field`) are nested inside `if new_dir_path != dir_path` (line 735) and `if new_path != *path` (line 835). When renaming between names that slugify identically (e.g. `"Foo/Bar"` -> `"Foo|Bar"`, both `Foo_Bar`), the path doesn't change so meta is never updated. - -**Fix**: After each path-change block, add a separate `if` that checks the name itself. For **both** the init-file path and regular-file path: - -```rust -// AFTER the path-change block (regardless of whether path changed): -// Always update meta name field when the instance name changed -let current_meta = /* compute meta path using current (possibly unchanged) path */; -if slugified_new_name != *new_name { - self.upsert_meta_name_field(¤t_meta, new_name); -} else { - self.remove_meta_name_field(¤t_meta); -} -``` - -This means if the path DID change, the meta was already renamed to the new location (inside the path-change block), and now we update its `name` field. If the path did NOT change, we update the existing meta in-place. - ---- - -## C2. `syncback_removed_instance` uses raw instance name for meta path - -**File**: [src/web/api.rs](src/web/api.rs) line 1497 - -```rust -let meta_path = parent_dir.join(format!("{}.meta.json5", instance_name)); -``` - -`instance_name` is the Roblox name (e.g. `"Key:Script"`) -- contains forbidden chars, doesn't match the actual slugified meta file. - -**Fix**: Derive the meta stem from the script file's filename. Strip the middleware extension suffix to get the base name (same slug used when the file was created): - -```rust -// Derive meta filename from the script's filesystem name, not the instance name -if let Some(file_name) = instance_path.file_name().and_then(|f| f.to_str()) { - let stem = instance_path.file_stem().and_then(|s| s.to_str()).unwrap_or(""); - // Strip known script suffixes (.server, .client, .plugin, .local, .legacy) - let base = strip_script_suffix(stem); - let meta_path = parent_dir.join(format!("{}.meta.json5", base)); - // ... remove if exists -} -``` - -This naturally ties into DR2 (shared helper). - ---- - -## C3. `deny_unknown_fields` breaks old project files - -**Files**: [src/syncback/mod.rs](src/syncback/mod.rs) line 966 - -`SyncbackRules` uses `#[serde(deny_unknown_fields)]`. On master it had `encode_windows_invalid_chars`. Users upgrading with that field in their project file get a hard parse error. - -**Fix**: Remove `deny_unknown_fields` from `SyncbackRules`. This is the simplest approach -- unknown fields are silently ignored, which is the standard serde behavior and the most user-friendly for forward compatibility. - -Leave `Project` struct's `deny_unknown_fields` as-is since the removed fields (`decodeWindowsInvalidChars`) were on `InstanceContext` / `SyncbackRules`, not on `Project` directly. - ---- - -## CC1. Non-deterministic child ordering in project.rs - -**File**: [src/snapshot_middleware/project.rs](src/snapshot_middleware/project.rs) -- `new_child_map` is a `HashMap` iterated via `.drain()` - -When two siblings collide on the same slug, which gets the base name vs `~1` depends on HashMap iteration order -- non-deterministic. - -**Fix**: Collect `new_child_map` entries into a `Vec`, sort by name (alphabetical), then process in sorted order. This matches `dir.rs` behavior where DOM order provides stability: - -```rust -let mut remaining_children: Vec<_> = new_child_map.drain().collect(); -remaining_children.sort_by(|(name_a, _), (name_b, _)| name_a.cmp(name_b)); -for (name, new_child) in remaining_children { ... } -``` - ---- - -## CC2. `syncback_removed_instance` doesn't clean up init-file directories - -**File**: [src/web/api.rs](src/web/api.rs) lines 1487-1513 - -For directory-format scripts (`src/MyModule/init.luau`), only the init file is deleted. The directory and `init.meta.json5` remain. - -**Fix**: Detect init files and remove the parent directory entirely (since the directory IS the instance): - -```rust -if instance_path.is_file() { - let file_name = instance_path.file_name().and_then(|f| f.to_str()).unwrap_or(""); - let is_init_file = file_name.starts_with("init."); - - if is_init_file { - // The parent directory represents the instance -- remove it all - let dir_path = instance_path.parent().unwrap(); - self.suppress_path_remove(dir_path); - fs::remove_dir_all(dir_path)?; - // Also check for adjacent dir-level meta in grandparent - // e.g., grandparent/MyModule.meta.json5 - // ... (use shared meta_path helper from DR2) - } else { - // Regular file: remove file + adjacent meta - // ... (existing logic, fixed with DR2 helper for meta path) - } -} -``` - ---- - -## DR1. Extract shared meta name update helper - -**Files**: [src/change_processor.rs](src/change_processor.rs), [src/web/api.rs](src/web/api.rs) - -The pattern "check if name needs slugify, decide upsert vs remove name field, compute meta path" appears in 3+ places. Extract to a shared module. - -**Location**: New helper functions in `src/syncback/file_names.rs` (or a new `src/syncback/meta.rs`): - -- `pub fn should_write_meta_name(instance_name: &str, filesystem_name: &str) -> bool` -- returns true when the filesystem name differs from the instance name -- Move `upsert_meta_name_field` and `remove_meta_name_field` out of `change_processor.rs` into the shared module so `api.rs` can use them too - ---- - -## DR2. Extract shared `meta_path_for_script()` helper - -**Files**: [src/web/api.rs](src/web/api.rs), [src/change_processor.rs](src/change_processor.rs) - -Both need "given a script file path, what's the adjacent meta path?" Currently computed differently in each. - -**Location**: `src/syncback/file_names.rs`: - -```rust -/// Given a script file path like `parent/Foo_Bar.server.luau`, -/// returns the adjacent meta path `parent/Foo_Bar.meta.json5`. -pub fn adjacent_meta_path(script_path: &Path) -> PathBuf { - let stem = script_path.file_stem().and_then(|s| s.to_str()).unwrap_or(""); - let base = strip_script_suffix(stem); - script_path.with_file_name(format!("{}.meta.json5", base)) -} -``` - -Both `change_processor.rs` and `api.rs` use this instead of inline computation. - ---- - -## Cleanup: Fix misleading comment - -**File**: [src/web/api.rs](src/web/api.rs) line 1494 - -Comment says "The meta file is named after the instance name, not the file name" -- this is wrong. Fix to: "The meta file is named after the script file's base stem (the slugified name), not the raw instance name." - ---- - -## Tests (7 new test scenarios) - -All in [tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs) and [tests/tests/syncback.rs](tests/tests/syncback.rs) / [src/syncback/file_names.rs](src/syncback/file_names.rs): - -1. **Syncback integration: forbidden chars** -- Create fixture with instances named `"Hey/Bro"`, `"Key:Script"`. Assert slugified filenames + meta `name` fields. -2. **Two-way sync: add with forbidden chars** -- Add new sibling `"A/B"` during serve. Assert `A_B.luau` + `A_B.meta.json5` with `{"name": "A/B"}`. -3. **Two-way sync: collision** -- Add `"A/B"` and `"A:B"` (both slug to `A_B`). Assert one gets `A_B`, other gets `A_B~1`, both with correct meta `name`. -4. **Idempotency** -- Run syncback twice on same tree. Assert zero file changes on second run. -5. **Tilde dedup suffix end-to-end** -- Syncback with collision producing `~1`. Rebuild and verify correct names. -6. **Negative: `Foo~1.luau` without meta** -- Build fixture with `Foo~1.luau` (no meta). Assert instance name is `Foo~1`, not `Foo`. -7. **Large tree stress** -- 100+ instances with collision patterns. Assert deterministic, correct output. - ---- - -## Implementation Notes - -### Files created - - -| File | Purpose | -| -------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `src/syncback/meta.rs` | Shared `upsert_meta_name()` and `remove_meta_name()` -- pure JSON operations without filesystem event suppression. Returns `RemoveNameOutcome` enum so callers handle suppression themselves. | -| `rojo-test/build-tests/tilde_no_meta/` | Build fixture: `Foo~1.luau` with no meta file. Verifies forward sync produces instance name `Foo~1`. | - - -### Files modified - - -| File | What changed | -| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `src/syncback/file_names.rs` | Added `KNOWN_SCRIPT_SUFFIXES`, `strip_script_suffix()`, `adjacent_meta_path()`. Added 19 new unit tests (suffix stripping, meta path derivation, tilde collision, stress, idempotency). | -| `src/syncback/mod.rs` | Added `pub mod meta;`. Exported `adjacent_meta_path`. Removed `deny_unknown_fields` from `SyncbackRules`. | -| `src/change_processor.rs` | Rewrote `upsert_meta_name_field` / `remove_meta_name_field` to delegate to shared `syncback::meta` module. **C1 fix**: moved meta name update logic OUTSIDE `if new_path != *path` for both init-file and regular-file rename paths. Introduced `effective_dir_path` / `effective_meta_base` tracking variables. | -| `src/web/api.rs` | **C2 fix**: `syncback_removed_instance` now uses `adjacent_meta_path()` instead of `instance_name` for meta cleanup. **CC2 fix**: init files trigger `remove_dir_all` on the parent directory + grandparent dir-level meta cleanup. Removed unused `instance_name` variable. Fixed misleading comment. | -| `src/snapshot_middleware/project.rs` | **CC1 fix**: collected `new_child_map.drain()` into sorted `Vec` before processing, ensuring deterministic dedup ordering. | -| `tests/tests/build.rs` | Added `tilde_no_meta` to `gen_build_tests!` macro. | -| `tests/tests/two_way_sync.rs` | Added 2 integration tests: `add_instance_with_forbidden_chars_creates_slug_and_meta`, `add_two_colliding_instances_deduplicates`. | - - -### Test results - -- **646 unit tests pass** (15 new in `file_names.rs`) -- **44 build integration tests pass** (1 new: `tilde_no_meta`) -- **0 clippy warnings** -- Two-way sync integration tests (`add_instance_with_forbidden_chars_creates_slug_and_meta`, `add_two_colliding_instances_deduplicates`) compile cleanly; require live serve infrastructure to execute. - -### Key design decisions - -1. `**meta.rs` returns outcomes, doesn't suppress** -- The shared `upsert_meta_name` / `remove_meta_name` functions are pure I/O (read JSON, modify, write/delete). Filesystem event suppression stays in the caller (`change_processor.rs`) because it depends on the `JobThreadContext` API. This keeps the shared module framework-agnostic. -2. `**effective_dir_path` / `effective_meta_base` pattern** -- For the C1 fix, rather than duplicating the meta update logic in both branches of the path-change condition, we track which path ended up being used (original or renamed) and run the meta update once afterward. This avoids the "nested inside conditional" bug class entirely. -3. `**adjacent_meta_path` derives from filesystem name** -- The helper strips the file extension and script suffix from the actual filesystem path, never from the instance name. This ensures the meta path always matches the script file regardless of slugification. -4. **Alphabetical sort for project.rs determinism** -- Chose alphabetical sort over referent-ID sort because it's human-predictable and matches what a developer would expect when looking at the filesystem. - diff --git a/.cursor/plans/fix_audit_pass_2_c72b80c5.plan.md b/.cursor/plans/fix_audit_pass_2_c72b80c5.plan.md deleted file mode 100644 index 49acf5ad..00000000 --- a/.cursor/plans/fix_audit_pass_2_c72b80c5.plan.md +++ /dev/null @@ -1,334 +0,0 @@ ---- -name: Fix audit pass 2 -overview: Fix 1 critical bug, 4 correctness issues, 3 cleanup items, and add 9 missing tests identified by the slugify branch audit pass 2. -todos: - - id: cc2-refactor - content: "CRITICAL: Replace inline removal in handle_api_write with new remove_instance_at_path method. Delete dead syncback_removed_instance." - status: completed - - id: preseed-fix - content: Fix pre-seeding in dir.rs and project.rs to derive dedup keys from inst.metadata().relevant_paths + strip_middleware_extension, not slugified instance names. - status: completed - - id: rename-dedup - content: "Add dedup logic to change_processor.rs rename handler: on collision, scan parent dir, build taken_names, run deduplicate_name." - status: completed - - id: dir-sort - content: Add alphabetical sort to dir.rs child iteration to match project.rs for deterministic dedup ordering. - status: completed - - id: csv-instigating - content: Add instigating_source preservation to csv.rs snapshot_csv_init, matching lua.rs pattern. - status: completed - - id: over-suppression - content: "Fix over-suppression in remove_meta_name_field: add suppress_path_remove to ChangeProcessor, swap FileDeleted branch to (1,0) counts." - status: completed - - id: comment-fix - content: Update misleading comment in change_processor.rs:608-609 to reference remove_instance_at_path. - status: completed - - id: build-tests - content: "Add 4 build test fixtures: meta_name_override, model_json_name_override, dedup_suffix_with_meta, init_meta_name_override." - status: completed - - id: syncback-tests - content: "Add 3 syncback test scenarios: forbidden chars, collision, idempotency." - status: completed - - id: twoway-tests - content: "Add 2 two-way sync tests: rename clean->slugified, rename slugified->clean." - status: completed -isProject: false ---- - -# Fix Audit Pass 2 Findings - -## Standards (from audit plan) - -> **Round-trip identity**: Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -> **Code quality**: DRY -- no duplicated slugify/dedup/meta patterns. Shared helpers over copy-paste. If the same "compute meta path, check if name needs slugify, upsert/remove name field" sequence appears in 3+ places, that's a refactor candidate. - -> **Legacy %ENCODING%**: Intentionally unsupported. No backward compat for old `%NAME%` patterns. - -> **When working on two-way sync:** Plugin-based sync must produce **exactly the same filesystem output** that `rojo syncback` would give for the same input. Byte-for-byte identical files, identical directory structures, identical naming. Any divergence is a bug until proven otherwise. - ---- - -## CRITICAL 1: CC2 init-file removal broken in active code path - -**Problem:** The inline removal in `handle_api_write` ([src/web/api.rs](src/web/api.rs) lines 363-451) uses `p.is_dir()` to decide how to delete. For init-file scripts (e.g. `src/MyModule/init.luau`), `instigating_source` is the init file path so `p.is_dir()` = false. Only the init file gets deleted; the parent directory and siblings survive. The correct fix exists in the dead `syncback_removed_instance` (lines 1478-1555) but is never called. - -**Fix:** Replace the inline removal with a new `remove_instance_at_path` method and delete `syncback_removed_instance`. - -- Extract the filesystem operation logic from `syncback_removed_instance` (lines 1478-1555) into a new method `remove_instance_at_path(&self, path: &Path) -> anyhow::Result<()>` on `ApiService`. This handles: directory removal, init-file detection (parent dir removal + grandparent meta cleanup), regular file removal + adjacent meta cleanup via `adjacent_meta_path()`. -- Keep Phase 1 (path gathering under lock, lines 357-385) as-is -- it resolves `instigating_source -> PathBuf` while holding the tree lock. -- Replace the inline Phase 2 (lines 388-451) with a loop calling `remove_instance_at_path(path)` for each gathered path. -- Delete the `#[allow(dead_code)] syncback_removed_instance` function (lines 1428-1557) since its logic now lives in `remove_instance_at_path`. -- Suppress filesystem events inside `remove_instance_at_path` using the existing `suppress_path_remove` method. - ---- - -## FIX 2: Pre-seeding uses slugified names instead of filesystem dedup keys - -**Problem:** In [src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs) lines 196-204 and [src/snapshot_middleware/project.rs](src/snapshot_middleware/project.rs) lines 670-678, pre-seeding inserts `slugify_name(inst.name()).to_lowercase()`. But if an old instance already has a tilde-suffixed file (e.g. `A_B~1.luau` from prior dedup), only `"a_b"` is seeded, not `"a_b~1"`. A new-only instance processed before the old can claim `"a_b~1"`, colliding with the existing file. - -**Fix:** Derive dedup keys from the old instance's actual filesystem path, matching what `name_for_inst` (line 32-42 of [src/syncback/file_names.rs](src/syncback/file_names.rs)) does for old instances. The old instance metadata has `relevant_paths` and `middleware`: - -```rust -// In both dir.rs and project.rs pre-seeding loops: -for inst in old_child_map.values() { - if let Some(path) = inst.metadata().relevant_paths.first() { - if let Some(filename) = path.file_name().and_then(|f| f.to_str()) { - let middleware = inst.metadata().middleware.unwrap_or(Middleware::Dir); - let dedup_key = strip_middleware_extension(filename, middleware).to_lowercase(); - taken_names.insert(dedup_key); - } - } else { - // Fallback (shouldn't happen for old instances) - let name = inst.name(); - let slug = if name_needs_slugify(name) { - slugify_name(name).to_lowercase() - } else { - name.to_lowercase() - }; - taken_names.insert(slug); - } -} -``` - -This uses `inst.metadata().relevant_paths.first()` (actual filesystem path) + `inst.metadata().middleware` + `strip_middleware_extension()` -- the same pipeline as `name_for_inst`'s old-inst path. Both `dir.rs` and `project.rs` need the same fix. - ---- - -## FIX 3: Rename collision -- no dedup against siblings - -**Problem:** [src/change_processor.rs](src/change_processor.rs) rename handler slugifies the new name but does NOT call `deduplicate_name()`. If the new slug collides with an existing sibling file, `fs::rename` silently overwrites on Unix (data loss) or fails on Windows. - -**Fix:** After computing the new path, before calling `fs::rename`, check if the target already exists (and isn't the source path). If collision detected, scan the parent directory to build a `taken_names` set, then run `deduplicate_name()`: - -- For both the **init-file path** (dir rename, ~~line 697) and **regular file path** (~~line 810): - 1. Compute `new_path` from `slugified_new_name` - 2. If `new_path != old_path && new_path.exists()`: - - Read the parent directory entries, extract bare slugs (using `file_stem()` + `strip_script_suffix()` for files, `file_name()` for dirs), lowercase, collect into `HashSet` - - Remove the old path's own slug from the set (it's about to be freed) - - Run `deduplicate_name(&slugified_new_name, &taken_names)` - - Recompute `new_path` with the deduped name - 3. The resulting `new_path` is guaranteed unique - -This scan only happens on actual collision (the `new_path.exists()` guard), so the common case has zero overhead. - ---- - -## FIX 4: `dir.rs` child ordering not sorted - -**Problem:** [src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs) processes children in Roblox DOM order (`new_inst.children()`). Unlike `project.rs` which sorts alphabetically (CC1 fix at line 685-686), `dir.rs` doesn't sort. Dedup suffix assignment (`~1` vs base) can differ across serializations. - -**Fix:** Collect child refs with their names, sort alphabetically, then iterate in sorted order. Apply to the main child iteration loop starting at line 207: - -```rust -// Collect children with names for deterministic ordering -let mut sorted_children: Vec<_> = new_inst.children().iter() - .map(|r| (*r, snapshot.get_new_instance(*r).unwrap().name.clone())) - .collect(); -sorted_children.sort_by(|(_, a), (_, b)| a.cmp(b)); - -for (new_child_ref, _) in &sorted_children { - let new_child = snapshot.get_new_instance(*new_child_ref).unwrap(); - // ... existing loop body ... -} -``` - -Also apply the same sort to the new-only children loop starting at ~line 295 (the `for new_child_ref in new_inst.children()` after the matched-children loop). - ---- - -## FIX 5: `csv.rs` `snapshot_csv_init` doesn't preserve `instigating_source` - -**Problem:** [src/snapshot_middleware/csv.rs](src/snapshot_middleware/csv.rs) line 81 does `init_snapshot.metadata = dir_snapshot.metadata;` without preserving the CSV file's `instigating_source`. Two-way sync writes target the directory instead of the file. Compare with `lua.rs` lines 114-123 which correctly saves and restores. - -**Fix:** Add the same preservation pattern from `lua.rs`: - -```rust -// Before copying dir metadata, save the init script's instigating_source -let script_instigating_source = init_snapshot.metadata.instigating_source.take(); - -init_snapshot.children = dir_snapshot.children; -init_snapshot.metadata = dir_snapshot.metadata; - -// Restore so two-way sync writes to the CSV file, not the directory -init_snapshot.metadata.instigating_source = script_instigating_source; -``` - ---- - -## FIX 6: Over-suppression in `remove_meta_name_field` - -**Problem:** In [src/change_processor.rs](src/change_processor.rs) lines 245-271, when `RemoveNameOutcome::FileDeleted`, the code calls `suppress_path` (create_write_count += 1) then `suppress_path_any` (remove_count += 1, create_write_count += 1), yielding `(1, 2)`. The correct counts should be `(1, 0)` -- one Remove event, zero Write events. - -**Fix:** - -1. Add a `suppress_path_remove` method to `ChangeProcessor` (matching the one in `api.rs:253-257`): `entry.0 += 1` (only remove_count). -2. Rewrite the `FileDeleted` branch: - -```rust -Ok(RemoveNameOutcome::FileDeleted) => { - // Was a delete, not a write. Swap: undo Write, add Remove. - self.unsuppress_path(meta_path); // undo (0, 1) -> (0, 0) - self.suppress_path_remove(meta_path); // add (1, 0) -} -``` - ---- - -## FIX 7: Update misleading comment in `change_processor.rs` - -**Problem:** [src/change_processor.rs](src/change_processor.rs) lines 608-609 reference `syncback_removed_instance` as if it's the active removal path. After the CC2 refactor, it will reference the now-deleted function. - -**Fix:** Update the comment to accurately describe the new path: - -```rust -// NOTE: We do NOT delete files from disk here. The API handler -// (handle_api_write → remove_instance_at_path) already deleted -// the files before sending this PatchSet. ... -``` - ---- - -## Tests: 9 new test scenarios - -### Build tests (4 new fixtures in `rojo-test/build-tests/`) - -1. `**meta_name_override**` -- `Hey_Bro.luau` + `Hey_Bro.meta.json5` with `{"name": "Hey/Bro"}`. Assert instance name = `"Hey/Bro"`, not `"Hey_Bro"`. -2. `**model_json_name_override**` -- `Hey_Bro.model.json5` with `{"name": "Hey/Bro", "className": "Configuration"}`. Assert instance name = `"Hey/Bro"`. -3. `**dedup_suffix_with_meta**` -- `Foo.luau` + `Foo~1.luau` + `Foo~1.meta.json5` with `{"name": "Foo"}`. Assert two instances: one named from each file's meta. -4. `**init_meta_name_override**` -- `MyFolder/init.luau` + `MyFolder/init.meta.json5` with `{"name": "Real:Name"}`. Assert directory instance name = `"Real:Name"`. - -Each needs a `default.project.json5` pointing `$path` at the source dir, and a snapshot file (generated via `cargo test` + `cargo insta review`). - -### Syncback tests (3 new scenarios) - -1. **Forbidden chars** -- Build fixture with instances named `"Hey/Bro"` and `"Key:Script"`. Run syncback. Assert slugified filenames + `.meta.json5` with correct `name` fields. -2. **Collision** -- Two sibling instances `"A/B"` and `"A:B"` (both slug to `A_B`). Assert one gets `A_B.luau`, other gets `A_B~1.luau`, both with correct meta. -3. **Idempotency** -- Run syncback twice on same tree. Assert zero file changes on second run. - -### Two-way sync tests (2 new scenarios in `tests/tests/two_way_sync.rs`) - -1. **Rename clean to slugified** -- Rename `Normal` to `Hey/Bro`. Assert file becomes `Hey_Bro.luau` + `Hey_Bro.meta.json5` with `{"name": "Hey/Bro"}`. -2. **Rename slugified to clean** -- Rename `What?Module` to `CleanName`. Assert file becomes `CleanName.luau`, meta `name` field removed (or meta file deleted if no other fields). - ---- - -## Implementation Notes - -### Files modified - - -| File | What changed | -| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `src/web/api.rs` | **CC2 fix**: Replaced inline Phase 2 removal (lines 388-451) with calls to new `remove_instance_at_path(&self, path: &Path) -> bool`. Simplified Phase 1 to gather `Vec<(Ref, Option)>` (no `is_dir` needed). Deleted dead `syncback_removed_instance` function. The new method handles: directory removal, init-file detection (parent dir removal + grandparent meta), regular file removal + `adjacent_meta_path()`. | -| `src/snapshot_middleware/dir.rs` | **Pre-seeding fix**: Changed to derive dedup keys from `inst.metadata().relevant_paths.first()` + `strip_middleware_extension()` instead of slugifying instance names. Added `strip_middleware_extension` and `Middleware` to imports. **Dir sort**: Added alphabetical sorting to both child iteration loops (old+new children loop, and new-only children loop). | -| `src/snapshot_middleware/project.rs` | **Pre-seeding fix**: Same filesystem-based dedup key derivation as dir.rs. Added `strip_middleware_extension` to imports. | -| `src/change_processor.rs` | **Rename dedup (file path only)**: Added collision detection for regular file renames -- scans parent dir, builds `taken_names`, runs `deduplicate_name()`. Uses `deduped_new_name` for meta file naming. **Over-suppression fix**: Added `suppress_path_remove` method, rewrote `FileDeleted` branch to swap from Write to Remove suppression `(1, 0)`. **Comment fix**: Updated line 621 to reference `remove_instance_at_path`. Added `deduplicate_name`, `strip_script_suffix` to imports. | -| `src/snapshot_middleware/csv.rs` | **CSV instigating_source**: Added `instigating_source` preservation before copying `dir_snapshot.metadata`, matching `lua.rs` pattern. | -| `src/syncback/mod.rs` | Added `strip_script_suffix` to the re-exports from `file_names`. | - - -### Files created - - -| File | Purpose | -| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------ | -| `rojo-test/build-tests/meta_name_override/` | Build fixture: `.meta.json5` `name` field overrides instance name to `Hey/Bro`. | -| `rojo-test/build-tests/model_json_name_override/` | Build fixture: `.model.json5` `name` field overrides instance name to `Hey/Bro`. | -| `rojo-test/build-tests/dedup_suffix_with_meta/` | Build fixture: `Foo.luau` + `Foo~1.luau` each with meta name overrides (`A/B` and `A_B`). | -| `rojo-test/build-tests/init_meta_name_override/` | Build fixture: `init.meta.json5` inside folder overrides directory instance name to `Real:Name`. | -| `rojo-test/build-test-snapshots/` (4 new .snap files) | Accepted insta snapshots for the 4 build tests above. | - - -### Snapshots updated - - -| Snapshot | Change | Reason | -| -------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | -| `csv_init.snap` | `instigating_source: Path: /root` → `Path: /root/init.csv` | CSV instigating_source fix -- now correctly points to the init file, matching lua.rs behavior. | -| `csv_init_with_meta.snap` | Same `instigating_source` change. | Same fix. | -| 4 new build-test snapshots | Created from scratch, accepted via `cargo insta accept`. | New build test fixtures. | - - -### Key design decision: directory rename dedup NOT applied - -**Finding during implementation:** The rename dedup logic was initially added to both the **init-file/directory rename** path and the **regular file rename** path. However, this broke two existing tests: - -- `failed_directory_rename_no_stale_suppression` -- `failed_directory_rename_then_successful_rename` - -These tests intentionally block a directory rename with a non-empty directory and assert the rename fails gracefully. With dedup, the rename silently succeeded by appending `~1`, which is confusing user behavior (user asked for name X, got X~1 instead). - -**Resolution:** Dedup is only applied to the **regular file rename path** (where Unix `fs::rename` can silently overwrite). Directory renames are left without dedup because: - -1. `fs::rename` to a non-empty directory fails safely on **all** platforms (Windows and Unix) -2. `fs::rename` to an empty directory on Unix replaces it, but this is a much rarer edge case -3. Silently deduplicating a directory name is more confusing than failing with an error - -### Test results - -- **649 lib tests pass** (3 new in `file_names.rs`: forbidden chars, collision, idempotency) -- **312 integration tests pass** (4 new build tests, 2 new two-way sync tests) -- **0 failures, 0 clippy warnings** - -### Audit pass 2 findings -- verification status - - -| Original finding | Status | Notes | -| ----------------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------- | -| C1 (meta gating) | Verified FIXED in pass 1 | `effective_dir_path`/`effective_meta_base` pattern confirmed correct | -| C2 (removal meta path) | Verified FIXED in pass 1 | Inline code uses `path.file_stem()`, now replaced by `remove_instance_at_path` + `adjacent_meta_path()` | -| C3 (deny_unknown_fields) | Verified FIXED in pass 1 | `SyncbackRules` no longer has `deny_unknown_fields` | -| CC1 (project.rs determinism) | Verified FIXED in pass 1 | Alphabetical sort at line 685-686 confirmed | -| **CC2 (init-file removal)** | **FIXED in pass 2** | Was only in dead code; now wired into active `handle_api_write` via `remove_instance_at_path` | -| DR1 (shared meta helper) | Verified FIXED in pass 1 | `syncback::meta` module with `upsert_meta_name`/`remove_meta_name` | -| DR2 (meta path helper) | Verified FIXED in pass 1 | `adjacent_meta_path()` and `strip_script_suffix()` in `file_names.rs` | -| **Pre-seeding bug** | **FIXED in pass 2** | Both `dir.rs` and `project.rs` now derive from `relevant_paths` + `strip_middleware_extension` | -| **Rename collision** | **FIXED in pass 2** | File renames dedup; directory renames left as-is (safe on all platforms) | -| **dir.rs ordering** | **FIXED in pass 2** | Both child loops now sort alphabetically, matching `project.rs` | -| **csv.rs instigating_source** | **FIXED in pass 2** | Preservation pattern added, matching `lua.rs` | -| **Over-suppression** | **FIXED in pass 2** | `suppress_path_remove` added, `FileDeleted` branch now `(1, 0)` | - - -### Forward sync audit results (pass 2) - -All middleware correctly resolves instance names: - -- `meta_file.rs`: Both `AdjacentMetadata` and `DirectoryMetadata` have `name: Option`, `apply_name` sets `specified_name`. `is_empty()` includes `name`. -- `lua.rs`, `txt.rs`, `csv.rs`: All use filename stem + meta override. No lingering `encode_path_name`/`decode_path_name`. -- `json_model.rs`: Top-level `name` (with `alias = "Name"` for legacy) correctly overrides filename. `specified_name` set on metadata. -- `mod.rs`: `decode_path_name` fully removed. - -### Dedup key consistency (pass 2) - -All 6 insertion sites use `.to_lowercase()` consistently: - -1. `file_names.rs` `deduplicate_name()` -- internal comparison -2. `dir.rs` -- 3 insertion points + pre-seed -3. `project.rs` -- insertion + pre-seed -4. `api.rs` -- seed from tree siblings + insert after add + `process_children_incremental` - -Cross-format collision (file vs directory with same slug) handled correctly. - -### Property/data preservation (pass 2) - -- `Name` property vs instance name: Separate fields, no cross-contamination. -- Ref properties: Resolved via DOM tree paths, not filenames. -- Attributes: `upsert_meta_name` merges (only touches `"name"` key), no clobber risk. -- Script source through renames: `fs::rename` preserves content. - -### Legacy cleanup (pass 2) - -- `path_encoding.rs`: Deleted, zero references. -- `%ENCODED%` patterns: Zero in source/tests/snaps (only in `.cursor/plans/` docs). -- `deny_unknown_fields`: Removed from `SyncbackRules`. -- Old project files: Parse without crashing (serde ignores unknown fields on `SyncbackRules`). - -### Meta file lifecycle (pass 2) - -- Creation: Gated by `needs_meta`. Merge-based (only touches `"name"` key). -- Update: C1 fix ensures meta updates even when slug doesn't change. -- Deletion: `remove_meta_name` deletes empty file, rewrites when other fields remain. -- Orphaned meta: Not loaded as instance (excluded from sync rules), benign on disk. -- Model JSON vs adjacent meta: No conflict -- `JsonModel` doesn't read adjacent meta. - diff --git a/.cursor/plans/fix_infinity_comparison_71fd9057.plan.md b/.cursor/plans/fix_infinity_comparison_71fd9057.plan.md deleted file mode 100644 index 5d8ea86c..00000000 --- a/.cursor/plans/fix_infinity_comparison_71fd9057.plan.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -name: Fix infinity comparison -overview: Make `fuzzyEq` self-contained for all IEEE 754 special values (infinity and NaN), eliminating phantom diffs on properties like `UISizeConstraint.MaxSize` and fixing NaN component comparison in compound types. -todos: - - id: fix-lua-fuzzyeq - content: Add exact-equality and NaN checks to `fuzzyEq` in trueEquals.lua - status: completed - - id: add-tests - content: Add infinity and NaN test cases to trueEquals.spec.lua - status: completed -isProject: false ---- - -# Fix Infinity and NaN Comparison in fuzzyEq - -## Root Cause - -Two bugs in `fuzzyEq`: - -**1. Infinity:** `fuzzyEq(inf, inf)` returns `false` because `inf - inf = NaN`, and `NaN < x` is always `false`. Affects `UISizeConstraint.MaxSize` which defaults to `Vector2(inf, inf)`. - -**2. NaN in compound types:** NaN equality is handled in the `trueEquals` number branch (line 93), but `fuzzyEq` is called directly from `vector2Eq`, `vector3Eq`, `cframeEq`, etc. A Vector2/Vector3/CFrame with a NaN component silently returns `false` instead of `true` because `fuzzyEq` doesn't check for NaN. - -## Fix - -Make `fuzzyEq` self-contained by adding exact-equality and NaN checks at the top: - -```lua -local function fuzzyEq(a: number, b: number): boolean - if a == b then - return true - end - if a ~= a then - return b ~= b - end - local diff = math.abs(a - b) - local maxVal = math.max(math.abs(a), math.abs(b), 1) - return diff < EPSILON or diff < maxVal * EPSILON -end -``` - -Behavior: - -- `inf == inf` -> `true` (caught by `a == b`) -- `-inf == -inf` -> `true` (caught by `a == b`) -- `inf == -inf` -> `false` (falls through, `inf - (-inf) = inf`, fails comparison) -- `NaN == NaN` -> `true` (`a == b` is false for NaN, then `a ~= a` catches it) -- `NaN == 5` -> `false` (`a ~= a` is true but `b ~= b` is false) - -Remove the now-redundant NaN check in `trueEquals` line 93 (the number branch `if a ~= a then return b ~= b end`) since `fuzzyEq` handles it directly. - -## Files - -### 1. [plugin/src/Reconciler/trueEquals.lua](plugin/src/Reconciler/trueEquals.lua) (line 15) - -Replace `fuzzyEq` with the version above. - -### 2. [plugin/src/Reconciler/trueEquals.spec.lua](plugin/src/Reconciler/trueEquals.spec.lua) - -Add test cases for: - -- `trueEquals(math.huge, math.huge)` -> true -- `trueEquals(-math.huge, -math.huge)` -> true -- `trueEquals(math.huge, -math.huge)` -> false -- `trueEquals(Vector2.new(math.huge, math.huge), Vector2.new(math.huge, math.huge))` -> true -- `trueEquals(Vector3.new(0/0, 1, 2), Vector3.new(0/0, 1, 2))` -> true (NaN component) -- `trueEquals(Vector2.new(0/0, 0/0), Vector2.new(0/0, 0/0))` -> true (NaN components) - diff --git a/.cursor/plans/fix_live_syncback_service_properties_d7c2c927.plan.md b/.cursor/plans/fix_live_syncback_service_properties_d7c2c927.plan.md deleted file mode 100644 index 43dce05b..00000000 --- a/.cursor/plans/fix_live_syncback_service_properties_d7c2c927.plan.md +++ /dev/null @@ -1,235 +0,0 @@ ---- -name: Fix Live Syncback Service Properties -overview: Fix live syncback to preserve service-level properties and respect syncCurrentCamera by encoding service properties/attributes/tags/refs alongside the existing rbxm children data. -todos: - - id: plugin-encode-service - content: Create encodeService helper in plugin that returns className, data, properties, attributes, tags, refs - status: completed - - id: plugin-use-helper - content: Update performSyncback to use encodeService, remove children-only guard - status: completed - - id: server-service-chunk - content: Extend ServiceChunk struct with properties, attributes, tags, refs fields - status: completed - - id: server-apply-props - content: Update build_dom_from_chunks to apply service properties/attributes/tags and resolve refs - status: completed - - id: test-helper - content: Update make_service_chunk helpers and make_rbxl_from_chunks - status: completed - - id: fixture-update - content: Update live_syncback fixture project with service $path entries - status: completed - - id: roundtrip-update - content: Update roundtrip test to include service properties - status: completed - - id: new-tests - content: Add parity tests for service properties, childless services, and Camera removal - status: completed -isProject: false ---- - -# Fix Live Syncback Service Properties - -## Root Cause - -1. **Service properties lost** -- Plugin serializes `service:GetChildren()` only. Service-level properties never sent. -2. **Childless services skipped** -- `#service:GetChildren() > 0` guard skips services like VoiceChatService. -3. **Camera not removed** -- `syncback_loop` reads `Workspace.CurrentCamera` to find/remove Camera, but Workspace has no properties in the DOM. - -## Constraint - -`SerializationService:SerializeInstancesAsync` throws if services are in the top-level list. Children-only rbxm stays; service metadata must be encoded separately. - -## Changes - -### 1. Plugin -- New `encodeService` helper - -Create `[plugin/src/ChangeBatcher/encodeService.lua](plugin/src/ChangeBatcher/encodeService.lua)`. Returns a full `ServiceChunk` table: - -```lua --- Returns: --- { --- className = "Lighting", --- data = buffer, -- rbxm of children (empty buffer if no children) --- properties = {}, -- non-Ref encoded properties (via RbxDom) --- attributes = {}, -- encoded attributes map --- tags = {}, -- tags array --- refs = {}, -- Ref properties: { PropName = { name, className } } --- } -``` - -Implementation reuses existing `encodeProperty`, `RbxDom.findClassDescriptor`, `RbxDom.findCanonicalPropertyDescriptor`, and the `UNENCODABLE_DATA_TYPES` filter from `[plugin/src/ChangeBatcher/propertyFilter.lua](plugin/src/ChangeBatcher/propertyFilter.lua)`. - -**Property encoding** -- same loop as `[encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua)` lines 200-249 but without script-specific skips: - -```lua -for propertyName, propertyMeta in classDescriptor.properties do - -- skip Parent, Name, Archivable, Attributes, Tags - if isReadable and doesSerialize then - if descriptor.dataType == "Ref" then - -- Read ref target; if it's a direct child, record name+className - local ok, target = descriptor:read(service) - if ok and target and target.Parent == service then - refs[propertyName] = { name = target.Name, className = target.ClassName } - end - elseif not UNENCODABLE_DATA_TYPES[descriptor.dataType] then - local ok, encoded = encodeProperty(service, propertyName, descriptor) - if ok and encoded ~= nil then - properties[propertyName] = encoded - end - end - end -end -``` - -**Attributes** -- encoded via the Attributes property descriptor (same as `encodeAttributes` in `encodeInstance.lua` lines 121-137), but returned as a separate field. - -**Tags** -- read via `service:GetTags()`, returned as a plain array. - -**Refs** -- Ref properties where the target is a direct child of the service. Encoded as `{ name = target.Name, className = target.ClassName }` so the server can resolve them by finding the matching child after cloning from rbxm. - -**Children rbxm** -- `SerializationService:SerializeInstancesAsync(service:GetChildren())` if children exist, otherwise empty buffer. - -### 2. Plugin -- Update `performSyncback` in `[plugin/src/App/init.lua](plugin/src/App/init.lua)` (lines 641-651) - -```lua -local encodeService = require(Plugin.ChangeBatcher.encodeService) - -local services = {} -for _, className in SYNCBACK_SERVICES do - local ok, service = pcall(game.FindService, game, className) - if ok and service then - table.insert(services, encodeService(service)) - end -end -``` - -No children guard. Every found service is encoded. - -### 3. Server -- Extend `ServiceChunk` in `[src/web/interface.rs](src/web/interface.rs)` (lines 30-37) - -```rust -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct ServiceChunk { - pub class_name: String, - #[serde(with = "serde_bytes")] - pub data: Vec, - #[serde(default)] - pub properties: HashMap, - #[serde(default)] - pub attributes: HashMap, - #[serde(default)] - pub tags: Vec, - #[serde(default)] - pub refs: HashMap, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -pub struct ServiceRef { - pub name: String, - pub class_name: String, -} -``` - -All new fields use `#[serde(default)]` for backwards compatibility. - -### 4. Server -- Update `build_dom_from_chunks` in `[src/cli/serve.rs](src/cli/serve.rs)` (lines 140-179) - -After creating the service instance, apply properties/attributes/tags: - -```rust -for chunk in &payload.services { - let mut builder = InstanceBuilder::new(&chunk.class_name); - - // Apply encoded properties - for (key, value) in &chunk.properties { - builder = builder.with_property(key.as_str(), value.clone()); - } - - // Apply attributes - if !chunk.attributes.is_empty() { - let attrs = rbx_dom_weak::types::Attributes::new(); - // ... convert HashMap to Attributes ... - builder = builder.with_property("Attributes", Variant::Attributes(attrs)); - } - - // Apply tags - if !chunk.tags.is_empty() { - builder = builder.with_property("Tags", Variant::Tags(chunk.tags.clone().into())); - } - - let service_ref = dom.insert(root_ref, builder); - created_services.insert(chunk.class_name.clone()); - - // Clone children from rbxm - if !chunk.data.is_empty() { - let chunk_dom = rbx_binary::from_reader(Cursor::new(&chunk.data))?; - for &child_ref in chunk_dom.root().children() { - deep_clone_into(&chunk_dom, &mut dom, child_ref, service_ref, &mut global_ref_map); - } - } - - // Resolve Ref properties by finding matching children - if !chunk.refs.is_empty() { - let children: Vec = dom.get_by_ref(service_ref).unwrap().children().to_vec(); - for (prop_name, target) in &chunk.refs { - let found = children.iter().find(|&&child_ref| { - let child = dom.get_by_ref(child_ref).unwrap(); - child.name.as_str() == target.name && child.class.as_str() == target.class_name - }); - if let Some(&child_ref) = found { - let service = dom.get_by_ref_mut(service_ref).unwrap(); - service.properties.insert(prop_name.as_str().into(), Variant::Ref(child_ref)); - } - } - } -} -``` - -This handles `Workspace.CurrentCamera` naturally -- the Camera is cloned from the rbxm, then the Ref is resolved by matching `name="Camera", className="Camera"` among children. `syncback_loop` can then find it and destroy it when `syncCurrentCamera: false`. - -### 5. Test helpers -- `[tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs)` - -Update `make_service_chunk` to accept optional properties/attributes/tags/refs. Add companion: - -```rust -pub fn make_service_chunk_full( - class_name: &str, - properties: Vec<(&str, Variant)>, - attributes: Vec<(&str, Variant)>, - tags: Vec, - refs: Vec<(&str, &str, &str)>, // (prop_name, target_name, target_class) - children: Vec, -) -> ServiceChunk -``` - -Update `make_rbxl_from_chunks` to apply properties/attributes/tags/refs to the service in the DOM (mirrors server logic). - -Update `roundtrip_build_syncback_rebuild` to extract service properties from the built rbxl and populate `ServiceChunk` fields. - -### 6. Fixture -- `[rojo-test/serve-tests/live_syncback/default.project.json5](rojo-test/serve-tests/live_syncback/default.project.json5)` - -Add service entries with `$path` for Lighting, SoundService, StarterPlayer, TextChatService, VoiceChatService. Create empty `src/` subdirectories. - -### 7. New tests -- `[tests/tests/live_syncback.rs](tests/tests/live_syncback.rs)` - -**Service property parity tests** (use `assert_live_matches_cli`): - -- `**parity_lighting_properties`** -- Lighting with `Ambient`, `ClockTime`, `Brightness` + child -- `**parity_soundservice_properties`** -- SoundService with `AmbientReverb`, `DistanceFactor` -- `**parity_starterplayer_properties`** -- StarterPlayer with `CameraMaxZoomDistance` -- `**parity_textchatservice_properties**` -- TextChatService with `ChatVersion` -- `**parity_childless_service_with_properties**` -- Service with properties but zero children -- `**parity_service_properties_with_children**` -- Service with both properties AND children -- `**parity_multiple_services_with_properties**` -- Multiple services in one request - -**Camera removal test:** - -- `**parity_camera_not_synced`** -- Workspace with Camera child + `CurrentCamera` ref. Verify Camera does NOT appear on disk (default `syncCurrentCamera: false`). - -**Round-trip test:** - -- `**roundtrip_service_properties`** -- Build -> live syncback -> rebuild. Compare service properties survive the cycle. - diff --git a/.cursor/plans/fix_ref_audit_issues_746c0c25.plan.md b/.cursor/plans/fix_ref_audit_issues_746c0c25.plan.md deleted file mode 100644 index 55ae9aaf..00000000 --- a/.cursor/plans/fix_ref_audit_issues_746c0c25.plan.md +++ /dev/null @@ -1,380 +0,0 @@ ---- -name: Fix Ref Audit Issues -overview: "Fix all 4 critical issues and 2 correctness concerns from the Ref two-way sync audit: ServeSession missing instanceMap, stale paths after rename, instance names with / in paths, compute_ref_properties priority conflict, encodeInstance Ref leak, and filter_properties_for_meta implicit Ref handling." -todos: - - id: fix-serve-session - content: Fix ServeSession.lua:738 -- add self.__instanceMap as 4th arg to encodePatchUpdate, grep for other missing callers - status: completed - - id: fix-priority - content: Fix compute_ref_properties priority -- swap processing order so Rojo_Ref_* is processed after Rojo_Target_* (path-based wins) - status: completed - - id: fix-encode-instance - content: Fix encodeInstance.lua Ref leak -- add explicit Ref skip before encodeProperty call - status: completed - - id: fix-filter-explicit - content: Fix filter_properties_for_meta -- add explicit Variant::Ref skip alongside UniqueId - status: completed - - id: fix-slash-escape - content: Add escape/unescape helpers for / in instance names, update ref_target_path, get_instance_by_path, inst_path - status: completed - - id: fix-stale-paths - content: Add update_ref_paths_after_rename to ChangeProcessor -- scan tree for stale Rojo_Ref_* paths and update them after rename - status: completed - - id: fix-stale-meta - content: Add update_ref_paths_in_meta helper to rewrite Rojo_Ref_* attributes in meta/model files on disk - status: completed - - id: dry-target-helper - content: "DRY: Extract Rojo_Target_* attribute name formatting into shared helper in rojo_ref.rs (matches ref_attribute_name pattern)" - status: completed - - id: dry-binarystring - content: "DRY: Extract BinaryString -> UTF-8 attribute value parsing into shared helper, used by compute_ref_properties and defer_ref_properties" - status: completed - - id: test-parity - content: "Test: Add CLI syncback parity test -- verify two-way sync and CLI syncback produce identical Rojo_Ref_* output for same input" - status: cancelled - - id: test-concurrent - content: "Test: Add concurrent Ref changes test -- multiple Ref properties changed in same batch on same instance" - status: cancelled - - id: test-edge-cases - content: "Test: Add edge case tests -- Ref to ProjectNode instance, Ref to nested project instance, Ref property name not in reflection" - status: cancelled - - id: fix-ambiguous-warning - content: Add ambiguous path warning in syncback_updated_properties when target path has duplicate-named siblings at any ancestor level - status: completed - - id: verify-regression - content: Run regression tests and verify expected pass/fail outcomes match predictions - status: completed -isProject: false ---- - -# Fix All Ref Audit Issues - -## Issue 1: ServeSession.lua:738 Missing instanceMap (CRITICAL) - -**One-line fix.** [ServeSession.lua](plugin/src/ServeSession.lua) line 738: - -```lua --- Before: -local update = encodePatchUpdate(instance, change.id, propertiesToSync) --- After: -local update = encodePatchUpdate(instance, change.id, propertiesToSync, self.__instanceMap) -``` - -Also grep for any OTHER callers of `encodePatchUpdate` that may be missing the 4th arg. - ---- - -## Issue 2: Stale Rojo_Ref_* Paths After Rename (CRITICAL) - -When an instance is renamed, all `Rojo_Ref_`* attributes across the tree that reference the old path must be updated to the new path. - -### Design - -When `handle_tree_event` processes a rename: - -1. Compute the **old path** and **new path** of the renamed instance (using `full_path_of` before and after rename) -2. Scan ALL descendants of the tree root for `Rojo_Ref_`* attributes -3. For each attribute whose path **starts with** the old path (prefix match handles children too), replace the old prefix with the new prefix -4. Update the in-memory tree's Attributes property -5. Write the updated meta/model file to disk (with `suppress_path`) - -### Implementation - -**File:** [change_processor.rs](src/change_processor.rs) - -Add a new method `update_ref_paths_after_rename(&self, tree, old_path, new_path)` that: - -- Iterates `tree.descendants(root_id)` -- For each instance, checks `properties.get("Attributes")` for `Variant::Attributes` -- For each attribute starting with `REF_PATH_ATTRIBUTE_PREFIX`, checks if the path value starts with `old_path` -- If match: replaces the prefix with `new_path` -- Updates the instance's Attributes property in the tree -- Finds the instance's meta/model file via `InstigatingSource::Path` and rewrites the `Rojo_Ref_`* attribute on disk - -Call this method from the rename handler, AFTER the filesystem rename is complete and the tree path has been updated. Both the directory-format rename path (line ~885) and the regular file rename path (line ~973) need it. - -**Important:** The old path must be computed BEFORE the rename happens. Capture it early: - -```rust -let old_path = tree.inner().full_path_of(instance_id, "/"); -// ... do the rename ... -let new_path = tree.inner().full_path_of(instance_id, "/"); -update_ref_paths_after_rename(&tree, &old_path, &new_path); -``` - -The prefix match handles all descendants: if `"Workspace/TestModel"` is renamed to `"Workspace/RenamedModel"`, then `"Workspace/TestModel/Part1"` becomes `"Workspace/RenamedModel/Part1"`. - -### Meta file rewriting - -Use the existing pattern from `upsert_meta_name_field`: - -1. Read the JSON5 file -2. Parse as `serde_json::Value` -3. Navigate to `attributes` object -4. Update matching `Rojo_Ref_*` values -5. Write back with `suppress_path` - -Extract a helper in [syncback/meta.rs](src/syncback/meta.rs) (or [rojo_ref.rs](src/rojo_ref.rs)): - -```rust -pub fn update_ref_paths_in_meta( - meta_path: &Path, - old_prefix: &str, - new_prefix: &str, -) -> anyhow::Result // returns true if any attribute was updated -``` - ---- - -## Issue 3: Instance Names Containing "/" Corrupt Ref Paths (CRITICAL) - -`full_path_of` joins names with "/" separator. `get_instance_by_path` splits on "/". If an instance name contains "/", the path becomes ambiguous. - -### Design - -Escape "/" in instance names when building paths. Unescape after splitting when resolving paths. Use `\/` as the escape sequence (backslash-slash). - -### Implementation - -**File:** [rojo_ref.rs](src/rojo_ref.rs) - -Add escape/unescape helpers: - -```rust -/// Escape "/" in an instance name for use in ref paths. -/// Uses "\/" as escape sequence. -pub fn escape_ref_path_segment(name: &str) -> Cow<'_, str> { - if name.contains('/') { - Cow::Owned(name.replace('/', "\\/")) - } else { - Cow::Borrowed(name) - } -} - -/// Unescape "\/" back to "/" in a path segment. -pub fn unescape_ref_path_segment(segment: &str) -> Cow<'_, str> { - if segment.contains("\\/") { - Cow::Owned(segment.replace("\\/", "/")) - } else { - Cow::Borrowed(segment) - } -} -``` - -**File:** [rojo_ref.rs](src/rojo_ref.rs) -- Update `ref_target_path`: - -Instead of calling `dom.full_path_of(target_ref, "/")`, build the path manually with escaping: - -```rust -pub fn ref_target_path(dom: &WeakDom, target_ref: Ref) -> String { - let root_ref = dom.root_ref(); - let mut components: Vec = dom - .ancestors_of(target_ref) - .filter(|inst| inst.referent() != root_ref) - .map(|inst| escape_ref_path_segment(&inst.name).into_owned()) - .collect(); - components.reverse(); - components.join("/") -} -``` - -**File:** [tree.rs](src/snapshot/tree.rs) -- Update `get_instance_by_path`: - -Split on unescaped "/" only, then unescape each segment: - -```rust -pub fn get_instance_by_path(&self, path: &str) -> Option { - if path.is_empty() { - return Some(self.get_root_id()); - } - // Split on "/" but not "\/" - let segments = split_ref_path(path); - // ... walk tree using unescaped segment names ... -} -``` - -Add a path splitting function to `rojo_ref.rs` that splits on unescaped "/" only: - -```rust -pub fn split_ref_path(path: &str) -> Vec { - // Split on "/" that is NOT preceded by "\" - // Then unescape each segment -} -``` - -**Also update:** `inst_path` in [syncback/snapshot.rs](src/syncback/snapshot.rs) to use the escaped path builder for CLI syncback consistency. - ---- - -## Issue 4: compute_ref_properties Priority Conflict (CRITICAL) - -If both `Rojo_Ref_PrimaryPart` and `Rojo_Target_PrimaryPart` exist, `Rojo_Target_`* silently overwrites `Rojo_Ref_*` because it's processed second. - -### Fix - -**File:** [patch_compute.rs](src/snapshot/patch_compute.rs) `compute_ref_properties` - -Swap the processing order: process `Rojo_Target_`* FIRST, then `Rojo_Ref_*`. Since `map.insert` overwrites, the last insert wins. Processing `Rojo_Ref_*` second means the path-based system has priority (which is correct since it's the preferred system). - -```rust -for (attr_name, attr_value) in attributes.iter() { - // Process legacy Rojo_Target_* FIRST (lower priority) - if let Some(prop_name) = attr_name.strip_prefix(REF_POINTER_ATTRIBUTE_PREFIX) { - // ... resolve via ID ... - map.insert(ustr(prop_name), ...); - continue; - } - - // Process Rojo_Ref_* SECOND (higher priority, overwrites if both exist) - if let Some(prop_name) = attr_name.strip_prefix(REF_PATH_ATTRIBUTE_PREFIX) { - // ... resolve via path ... - map.insert(ustr(prop_name), ...); - continue; - } -} -``` - ---- - -## Issue 5: encodeInstance.lua Ref Leak (Correctness) - -**File:** [encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua) - -Ref properties pass through `UNENCODABLE_DATA_TYPES` check and reach `encodeProperty` where they fail via pcall. Add an explicit skip: - -```lua --- After the UNENCODABLE_DATA_TYPES check, before encodeProperty: -if descriptor.dataType == "Ref" then - -- Ref properties cannot be encoded during instance addition because - -- the target instance has no server ID yet. They are handled separately - -- by encodePatchUpdate.lua during property update encoding. - continue -end -``` - ---- - -## Issue 6: filter_properties_for_meta Implicit Ref Handling (Correctness) - -**File:** [api.rs](src/web/api.rs) `filter_properties_for_meta` - -Add explicit skip with comment for Variant::Ref alongside the UniqueId skip: - -```rust -// Skip UniqueId and Ref - they don't serialize to JSON. -// Ref properties are handled upstream in syncback_updated_properties() -// where they are converted to Rojo_Ref_* path-based attributes. -if matches!(value, Variant::UniqueId(_) | Variant::Ref(_)) { - continue; -} -``` - ---- - -## Issue 6b: Ambiguous Path Warning in Two-Way Sync - -**File:** [api.rs](src/web/api.rs) `syncback_updated_properties()` - -When computing a Ref target path, the two-way sync path does NOT check whether the path is ambiguous (duplicate-named siblings at any ancestor level). CLI syncback has `compute_refs_with_duplicate_siblings` for this. The two-way sync should at minimum log a warning. - -After computing the path via `ref_target_path`, check for path ambiguity: - -```rust -let path = crate::ref_target_path(tree.inner(), *target_ref); - -// Warn if the path is ambiguous (duplicate-named siblings) -if !is_ref_path_unique(tree, *target_ref) { - log::warn!( - "Ref property '{}' for instance {:?} has an ambiguous path '{}' \ - (duplicate-named siblings exist). The ref may resolve to the wrong \ - target on rebuild.", - key, update.id, path - ); -} -``` - -Add a helper `is_ref_path_unique(tree, target_ref)` that walks ancestors checking for duplicate-named siblings -- reuse the logic from `is_path_unique_with_cache` in [ref_properties.rs](src/syncback/ref_properties.rs) adapted for `RojoTree` instead of `WeakDom`. - ---- - -## Issue 7: DRY -- Rojo_Target_* Attribute Name Formatting - -**File:** [ref_properties.rs](src/syncback/ref_properties.rs) line 251 - -The ID-based `Rojo_Target_`* system uses inline `format!("{REF_POINTER_ATTRIBUTE_PREFIX}{}", link.name)` while the path-based system uses the shared `ref_attribute_name()` helper. Add a matching helper: - -```rust -// In rojo_ref.rs: -pub fn ref_target_attribute_name(prop_name: &str) -> String { - format!("{REF_POINTER_ATTRIBUTE_PREFIX}{prop_name}") -} -``` - -Update `ref_properties.rs` line 251 to use it. - ---- - -## Issue 8: DRY -- BinaryString to UTF-8 Attribute Value Parsing - -**Files:** [patch_compute.rs](src/snapshot/patch_compute.rs) and [patch_apply.rs](src/snapshot/patch_apply.rs) - -Both `compute_ref_properties` and `defer_ref_properties` have identical logic for parsing attribute values that may be `Variant::String` or `Variant::BinaryString`: - -```rust -let path = match attr_value { - Variant::String(str) => str.as_str(), - Variant::BinaryString(bytes) => { - if let Ok(str) = std::str::from_utf8(bytes.as_ref()) { - str - } else { - log::warn!("..."); - continue; - } - } - _ => { - log::warn!("..."); - continue; - } -}; -``` - -Extract to a shared helper in [rojo_ref.rs](src/rojo_ref.rs): - -```rust -/// Extract a string value from a Variant that may be String or BinaryString. -/// Returns None with a warning for non-string types or invalid UTF-8. -pub fn variant_as_str<'a>(value: &'a Variant, attr_name: &str) -> Option<&'a str> { - match value { - Variant::String(s) => Some(s.as_str()), - Variant::BinaryString(bytes) => std::str::from_utf8(bytes.as_ref()).ok().or_else(|| { - log::warn!("Attribute {attr_name} contains invalid UTF-8"); - None - }), - _ => { - log::warn!("Attribute {attr_name} is {:?}, expected String", value.ty()); - None - } - } -} -``` - ---- - -## Regression Tests - -The audit already added 5 regression tests (section 10a-10d). After implementing these fixes: - -- `ref_stale_path_after_target_rename` should PASS -- `ref_stale_path_after_parent_rename` should PASS -- `ref_to_instance_added_in_same_request` should still FAIL (separate issue: WeakDom custom IDs) -- Lua spec tests 10c (untracked ref) should still FAIL (by design: untracked instances can't be encoded) -- Lua spec test 10d (missing instanceMap) should still FAIL (test deliberately omits instanceMap arg; fix 1 fixes ServeSession.lua:738 which is a different call site) - -### New tests needed: - -- Instance name with "/" in Ref path: set PrimaryPart to an instance named "A/B", verify path is escaped and resolves back -- Priority conflict: file with both Rojo_Ref_* and Rojo_Target_* for same property, verify Rojo_Ref_* wins -- CLI syncback parity: build an rbxl with Ref properties, run both CLI syncback and two-way sync, compare output files -- Concurrent Ref changes: set Part0 and Part1 on a WeldConstraint in the same batch, verify both Rojo_Ref_* attributes appear -- Edge cases: Ref targeting a ProjectNode instance, Ref targeting an instance in a nested project, Ref with a property name not in rbx_reflection - diff --git a/.cursor/plans/fix_ref_audit_round_2_07d615d1.plan.md b/.cursor/plans/fix_ref_audit_round_2_07d615d1.plan.md deleted file mode 100644 index c3e4f01e..00000000 --- a/.cursor/plans/fix_ref_audit_round_2_07d615d1.plan.md +++ /dev/null @@ -1,304 +0,0 @@ ---- -name: Fix Ref Audit Round 2 -overview: "Fix 4 issues found in the second audit of two-way sync Ref properties: stale test comment, slugified name mismatch during renames, immediate ID assignment for same-request additions, and performance optimization for Rojo_Ref_* path updates after renames." -todos: - - id: fix-test-comment - content: "Fix 1: Update stale test comment on ref_to_instance_added_in_same_request" - status: completed - - id: fix-slugified-rename - content: "Fix 2: Add slugified name fallback in update_ref_paths_after_rename" - status: completed - - id: fix-immediate-id - content: "Fix 3: Implement immediate ID assignment -- include added instances in PatchSet with plugin GUID as snapshot_id" - status: completed - - id: fix-ref-path-index - content: "Fix 4: Implement RefPathIndex for O(1) rename path lookups, add to JobThreadContext + ApiService" - status: completed - - id: tests-all - content: Write all required integration and unit tests for Fixes 1-4 - status: completed - - id: run-ci - content: Run /ci to verify all tests pass - status: completed -isProject: false ---- - -# Fix Ref Two-Way Sync Audit Round 2 - -> This plan was generated by `/audit` from a Plan-mode session. -> Refer to `.cursor/rules/atlas.mdc` for full project standards. - -## Standards - -These standards govern every fix in this plan. An implementer MUST read `.cursor/rules/atlas.mdc` before starting. - -### Round-Trip Identity (from `atlas.mdc` Quality Standard) - -Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -### CLI Syncback Parity (from `atlas.mdc` Two-Way Sync Strategy) - -Plugin-based sync must produce **exactly the same filesystem output** that `atlas syncback` would give for the same input. Byte-for-byte identical files, identical directory structures, identical naming. Any divergence is a bug until proven otherwise. - -### Code Quality (from `atlas.mdc` Code Quality Standard) - -DRY code that is easy to reason about and hard to get wrong. Small refactors (2-3 call sites) are included as fixes. Major rewrites (10+ call sites) are deferred. - -## Context - -Second audit of the two-way sync Ref property feature (branch `refs` vs `origin/master`). The first audit and fix plan addressed critical issues (ServeSession missing instanceMap, stale paths, slash escaping, priority conflict, encodeInstance leak, filter_properties_for_meta). This audit found 4 additional issues. - -## Fixes - -### Fix 1: Stale Test Comment on `ref_to_instance_added_in_same_request` - -- **Status:** Approved -- **Finding:** Step 2b: Nil/Removal Round-Trip -- **Files:** `tests/tests/two_way_sync.rs` -- **Problem:** The test `ref_to_instance_added_in_same_request` (around line ~6780) has comments saying "EXPECTED: FAIL" and explaining that the new Part is not in the tree. However, the `added_paths` mechanism in `syncback_updated_properties` (`src/web/api.rs` lines 596-620) was specifically added to handle this case. It pre-computes paths for instances from `request.added`, so the `Rojo_Ref_PrimaryPart` attribute IS written correctly to the meta file. The test should PASS. -- **Solution:** Update the test doc-comment to explain that `added_paths` handles same-request additions. Remove the "EXPECTED: FAIL" marker and "This SHOULD FAIL" assertion comment. The actual assertion (`assert_meta_has_ref_attr`) should remain as-is since it asserts correct behavior. -- **Risk:** None -- documentation-only change. -- **Verify round-trip:** Run `cargo test ref_to_instance_added_in_same_request` -- it should pass. -- **Verify syncback parity:** N/A -- **Tests required:** - - No new tests. The existing test IS the coverage. - ---- - -### Fix 2: Slugified Name Mismatch in `update_ref_paths_after_rename` - -- **Status:** Approved -- **Finding:** Step 2d: Rename/Move Interactions -- **Files:** `src/change_processor.rs` -- **Problem:** `update_ref_paths_after_rename` (lines 434-458) replaces path components in InstigatingSource paths by comparing the UNESCAPED tree instance name (`old_segment`) to filesystem path components. But the filesystem uses SLUGIFIED names when the instance name has forbidden characters. Example: instance "Test:Model" has filesystem directory "Test_Model". After rename, `old_segment = "Test:Model"` but filesystem component is `"Test_Model"` -- they don't match, so meta files inside the renamed directory aren't found, and Rojo_Ref_* attributes aren't updated. -- **Solution:** When the direct name comparison fails, fall back to comparing against the slugified name. Import `name_needs_slugify` and `slugify_name` from `crate::syncback`. After the `if s == old_segment` check at line 441, add: - -```rust -if s == old_segment { - // ... existing match logic ... -} else if name_needs_slugify(old_segment) { - let slugified_old = slugify_name(old_segment); - if s == slugified_old.as_str() { - let new_fs_name = if name_needs_slugify(new_segment) { - slugify_name(new_segment) - } else { - new_segment.to_string() - }; - *comp = std::path::Component::Normal( - std::ffi::OsStr::new(&new_fs_name), - ); - replaced = true; - break; - } -} -``` - -Note: The `slugify_name` return value needs to outlive the component assignment. Store it in a local variable before the loop, or use a `Cow` pattern. The implementer should verify the lifetime works (may need to collect into a PathBuf outside the loop). - -- **Risk:** Low. Only affects the edge case of slugified names + rename. The slugify/compare is stateless and deterministic. -- **Verify round-trip:** Create an instance named "Test:Model" with a child Part, set PrimaryPart to the Part, then rename "Test:Model" to "New:Model". Verify the meta file's Rojo_Ref_PrimaryPart is updated from "Workspace/Test:Model/Part1" to "Workspace/New:Model/Part1". -- **Verify syncback parity:** N/A -- this is change_processor.rs only. -- **Tests required:** - - Integration test in `tests/tests/two_way_sync.rs`: Create an instance with forbidden characters, set a Ref, rename it, verify meta file updated. - ---- - -### Fix 3: Immediate ID Assignment for Same-Request Additions - -- **Status:** Approved -- **Finding:** Step 14: Known Limitation Challenge (transient dangling Ref) -- **Files:** `src/web/api.rs` -- **Problem:** When `/api/write` both adds a new instance AND sets a Ref targeting it, the filesystem is correct (via `added_paths`), but the in-memory tree gets a dangling Ref. The plugin receives an unresolvable Ref ID ("Unknown ID" error in `decodeValue.lua`), causing a brief nil period (~200-500ms) until VFS watcher correction. -- **Solution:** Include added instances in the PatchSet's `added_instances` using the plugin's GUID as `snapshot_id`. The existing `snapshot_id_to_instance_id` mapping in `apply_patch_set` handles GUID -> tree ID rewriting for Ref properties in `updated_instances`. No VFS suppression needed -- the VFS watcher will match the tree child by name+className via `compute_children_patches` and generate an UPDATE (not duplicate ADD) that fills in InstigatingSource and metadata. - -**Implementation steps:** - -1. **Build InstanceSnapshots from AddedInstance data** -- After the `syncback_added_instance` loop (around line 590), convert each `AddedInstance` to an `InstanceSnapshot`: - -```rust -fn added_instance_to_snapshot( - guid: Ref, - added: &AddedInstance, -) -> InstanceSnapshot { - let properties: UstrMap = added - .properties - .iter() - .map(|(k, v)| (ustr(k), v.clone())) - .collect(); - - InstanceSnapshot { - snapshot_id: guid, - name: Cow::Owned(added.name.clone()), - class_name: ustr(&added.class_name), - properties, - children: added - .children - .iter() - .map(|child| added_instance_to_snapshot(Ref::new(), child)) - .collect(), - metadata: Default::default(), // VFS will fill in InstigatingSource - } -} -``` - -1. **Include in PatchSet** -- Replace `added_instances: Vec::new()` (currently around line 700 in the PatchSet construction) with: - -```rust -added_instances: request - .added - .iter() - .filter_map(|(guid, added)| { - let parent_ref = added.parent?; - Some(PatchAdd { - parent_id: parent_ref, - instance: added_instance_to_snapshot(*guid, added), - }) - }) - .collect(), -``` - -1. **No VFS suppression for additions** -- Keep existing behavior (additions are NOT suppressed). The VFS watcher will fire, `compute_children_patches` will match the existing tree child by name+className, and generate a metadata UPDATE (setting InstigatingSource::Path) rather than a duplicate ADD. -2. **Transient metadata gap** -- Between PatchSet application and VFS correction (~200ms), the tree instance has no InstigatingSource. Rename, property write, and deletion operations that check InstigatingSource would fail during this window. This is acceptable because the user cannot make additional changes in Studio during this brief period. - -- **Risk:** Moderate. Changes how added instances enter the tree (now via PatchSet instead of only via VFS). Edge cases: - - VFS watcher fires BEFORE PatchSet is processed: ChangeProcessor processes PatchSet and VFS patches sequentially on the same thread. If VFS fires first, the PatchSet would find the instance already in the tree and the `snapshot_id_to_instance_id` map would still work (matching by tree ID). - - Actually, the ChangeProcessor processes patches in order. The PatchSet from `handle_api_write` is sent to the `tree_mutation_sender` channel. VFS-triggered patches are also sent to this channel. The ChangeProcessor processes them in order. Since `handle_api_write` sends the PatchSet BEFORE returning (and the VFS watcher fires after the file write), the PatchSet should be processed first. But verify by checking the channel order. - - Plugin reconciler receives the ADD and creates a new Studio instance. But the Studio instance already exists (it was "pulled" from Studio). This is a PRE-EXISTING issue with the pull flow and is not made worse by this change. -- **Verify round-trip:** Run `ref_to_instance_added_in_same_request` test -- it should pass AND the in-memory tree should have the correct Ref (not dangling). -- **Verify syncback parity:** N/A -- this is api.rs PatchSet construction only. -- **Tests required:** - - Update `ref_to_instance_added_in_same_request` test to also verify the Ref resolves correctly in the tree (read the instance back via `/api/read` after a short delay). - - Integration test: Add two instances in the same request with Ref properties referencing each other. Verify both Refs resolve correctly. - ---- - -### Fix 4: Pre-computed Index for Rename Path Updates - -- **Status:** Approved -- **Finding:** Step 11f: Atomicity and File Watcher Races (performance aspect) -- **Files:** `src/change_processor.rs`, `src/web/api.rs` (or new module) -- **Problem:** `update_ref_paths_after_rename` iterates ALL tree descendants (O(tree_size)) for each rename. For large trees with many renames in a batch, this is O(N * tree_size). -- **Solution:** Maintain a `HashMap>` mapping Rojo_Ref_* path prefixes to meta/model files that contain them. Update the index when: - - `syncback_updated_properties` writes a Rojo_Ref_* attribute to a meta/model file (add to index) - - `merge_or_build_meta` removes a Rojo_Ref_* attribute (remove from index if no refs remain) - - `update_ref_paths_in_file` updates a path (update index keys) - - VFS watcher processes a meta/model file with Rojo_Ref_* attributes (add to index) - -On rename, look up `old_path` prefix in the index to find affected files directly. - -**Data structure:** - -```rust -/// Index of meta/model files that contain Rojo_Ref_* attributes. -/// Maps the Rojo_Ref_* attribute VALUE (the path string) to the set of -/// filesystem paths where that attribute appears. -struct RefPathIndex { - /// path_value -> set of meta/model files containing a Rojo_Ref_* - /// attribute with that path value. - paths_to_files: HashMap>, -} - -impl RefPathIndex { - fn add(&mut self, ref_path: &str, meta_file: &Path) { ... } - fn remove(&mut self, ref_path: &str, meta_file: &Path) { ... } - /// Find all files with Rojo_Ref_* paths that start with `prefix`. - fn find_by_prefix(&self, prefix: &str) -> Vec { ... } -} -``` - -**Storage location:** Add as a field on `JobThreadContext` (change_processor) behind `Arc>` (shared with api.rs via the same pattern as `suppressed_paths`). Also accessible from `ApiService`. - -**Index maintenance points:** - -- `syncback_updated_properties` in api.rs: after writing Rojo_Ref_* to a meta file, call `index.add(path_value, meta_path)` -- `merge_or_build_meta` in api.rs: after removing attributes, call `index.remove(old_path_value, meta_path)` -- `update_ref_paths_in_file` in meta.rs: after updating, call `index.remove(old) + index.add(new)` -- Initial population: when the server starts and loads the tree, scan meta files for existing Rojo_Ref_* attributes (or lazily populate on first rename) - -**Rename handler update:** Replace the `tree.descendants(root_id)` scan with: - -```rust -let affected_files = self.ref_path_index.lock().unwrap().find_by_prefix(old_path); -for file_path in affected_files { - // ... existing suppress + update_ref_paths_in_file logic ... -} -``` - -- **Risk:** Moderate. Index must stay synchronized with actual file contents. If the index gets out of sync (missed add/remove), renames would silently skip affected files. Mitigations: (1) the index is a performance optimization -- if a file is missed, the Ref becomes stale (same as the current behavior without the index for very large trees), (2) add debug logging when index is accessed to help diagnose sync issues. -- **Verify round-trip:** All existing rename tests should pass with the index. -- **Verify syncback parity:** N/A -- **Tests required:** - - Unit test for `RefPathIndex`: add, remove, find_by_prefix with various path patterns. - - Integration test: set multiple Refs across different instances, rename one target, verify ALL affected meta files are updated (proves index maintenance works). - ---- - -## Skipped Fixes - -None. All findings were approved. - -## Accepted Limitations - -- **Ambiguous paths (duplicate-named siblings):** Properly warned via `is_ref_path_unique`. Ref is written but may resolve to wrong sibling on rebuild. Accepted in the first audit. -- **Plugin reconciler duplicate on pull:** When the PatchSet includes added instances (Fix 3), the plugin reconciler creates new Studio instances. The original Studio instances (from the "pull" action) still exist. This is a pre-existing issue with the pull flow, not introduced by this feature. Deferred. - -## Deferred Refactors - -- **Lazy index population:** The `RefPathIndex` (Fix 4) could be populated lazily on first rename rather than scanning all files at server startup. This reduces startup time for large projects. Evaluate after Fix 4 is implemented. - -## Test Plan - -Tests are not optional. Every approved fix must have test coverage. A fix is not complete until its tests pass. - -### Rust Unit Tests - -- `RefPathIndex::add`, `remove`, `find_by_prefix` basic operations (Fix 4) -- `RefPathIndex::find_by_prefix` with escaped paths (Fix 4) -- `RefPathIndex::remove` when path not in index (no-op) (Fix 4) - -### Rust Integration Tests (`tests/tests/two_way_sync.rs`) - -- Update `ref_to_instance_added_in_same_request` comment + verify tree state via `/api/read` (Fix 1 + Fix 3) -- Add two instances with cross-referencing Refs in same request (Fix 3) -- Rename instance with slugified name, verify Rojo_Ref_* paths updated (Fix 2) -- Set multiple Refs across different instances, rename target, verify all meta files updated (Fix 4) - -### Lua Spec Tests - -None required for these fixes (plugin-side code is unchanged). - -### Snapshot Tests - -None required for these fixes. - -## Test Rules - -The implementer MUST follow these rules when writing tests for this plan: - -### For bugs found and fixed - -Every bug fix MUST have a test that: - -1. Would have **FAILED** before the fix -2. **PASSES** after the fix -3. Prevents the bug from regressing - -### For missing coverage identified - -For each "missing test coverage" gap: - -1. Write the test -2. Verify it passes against the current implementation -3. If it fails, investigate -- it may have found another bug - -### Scope: test every affected layer - -For each finding, determine which test layers are affected and write tests in ALL of them: - -- Does the bug manifest at the server level? -> Rust unit test or integration test -- Does it affect the round-trip? -> Integration test with `/api/write` + filesystem verification -- Could it regress from a different code path? -> Test that code path too - -## Final Step: Run CI - -After ALL fixes and tests are implemented, run the `/ci` command (see `.cursor/commands/ci.md`) to execute the full CI pipeline. Every fix must pass CI before the plan is considered complete. Do not skip this step. \ No newline at end of file diff --git a/.cursor/plans/fix_ref_audit_round_3_f8ae0e39.plan.md b/.cursor/plans/fix_ref_audit_round_3_f8ae0e39.plan.md deleted file mode 100644 index 004e8677..00000000 --- a/.cursor/plans/fix_ref_audit_round_3_f8ae0e39.plan.md +++ /dev/null @@ -1,335 +0,0 @@ ---- -name: Fix Ref Audit Round 3 -overview: "Fix 3 correctness bugs and 3 code quality issues from the third audit of two-way sync Ref properties: empty RefPathIndex on startup, overbroad remove_file in index, wrong filesystem name in path remapping, stale test comments, dead parameter, misleading variable name." -todos: - - id: fix-startup-index - content: "Fix 1: Populate RefPathIndex on server startup by scanning meta/model files for Rojo_Ref_* attributes" - status: completed - - id: fix-precise-removal - content: "Fix 2: Replace overbroad remove_file with re-index-after-write approach; add remove_all_for_file method" - status: completed - - id: fix-slugified-remap - content: "Fix 3: Use slugified_new() instead of new_segment in primary match case of path remapping" - status: completed - - id: fix-stale-comments - content: "Fix 4: Update EXPECTED: FAIL comments on ref_stale_path_after_target_rename and ref_stale_path_after_parent_rename" - status: completed - - id: fix-dead-param - content: "Fix 5: Remove unused _tree parameter from update_ref_paths_after_rename" - status: completed - - id: fix-variable-name - content: "Fix 6: Remove redundant removed_ref_values variable (subsumed by Fix 2)" - status: completed - - id: tests-all - content: Write all required integration and unit tests for Fixes 1-3 - status: completed - - id: run-ci - content: Run /ci to verify all tests pass - status: completed -isProject: false ---- - -# Fix Ref Two-Way Sync Audit Round 3 - -> This plan was generated by `/audit` from a Plan-mode session. -> Refer to `.cursor/rules/atlas.mdc` for full project standards. - -## Standards - -These standards govern every fix in this plan. An implementer MUST read `.cursor/rules/atlas.mdc` before starting. - -### Round-Trip Identity (from `atlas.mdc` Quality Standard) - -Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -### CLI Syncback Parity (from `atlas.mdc` Two-Way Sync Strategy) - -Plugin-based sync must produce **exactly the same filesystem output** that `atlas syncback` would give for the same input. Byte-for-byte identical files, identical directory structures, identical naming. Any divergence is a bug until proven otherwise. - -### Code Quality (from `atlas.mdc` Code Quality Standard) - -DRY code that is easy to reason about and hard to get wrong. Small refactors (2-3 call sites) are included as fixes. Major rewrites (10+ call sites) are deferred. - -## Context - -Third audit of the two-way sync Ref property feature (branch `refs` vs `origin/master`). Previous audits found and fixed: ServeSession missing instanceMap, stale paths after rename, slash escaping, priority conflict, encodeInstance leak, filter_properties_for_meta, slugified name fallback, immediate ID assignment, and RefPathIndex implementation. This audit found 3 correctness bugs and 3 code quality issues in the current implementation. - -## Fixes - -### Fix 1: Populate RefPathIndex on Server Startup - -- **Status:** Approved -- **Finding:** Step 2d: Rename/Move Interactions -- RefPathIndex starts empty, pre-existing Rojo_Ref_* attributes are never indexed. -- **Files:** `src/change_processor.rs` -- **Problem:** `RefPathIndex` is initialized empty (`RefPathIndex::new()`) in `src/serve_session.rs:160`. It's only populated when `syncback_updated_properties` in `api.rs` writes new Rojo_Ref_* attributes. Pre-existing attributes in meta/model files (from CLI syncback, manual edits, or previous sessions) are never indexed. If a rename happens before any two-way sync writes, the index finds nothing, and stale ref paths in existing meta files are not updated. -- **Solution:** After the initial tree is built and the ChangeProcessor starts, scan all tree instances that have `InstigatingSource::Path` pointing to a `.meta.json5` or `.model.json5` file. For each such file, read it and look for `Rojo_Ref_*` attributes. Add entries to the RefPathIndex. -Implementation: Add a method `populate_initial_index` to `JobThreadContext` (or a standalone function). Call it at the beginning of `main_task()` in the ChangeProcessor, before the main loop. The function should: - 1. Lock the tree - 2. Iterate all instances via `tree.descendants(root_id)` - 3. For each instance with `InstigatingSource::Path(path)`, check if the path ends in `.meta.json5`, `.model.json5`, `.meta.json`, or `.model.json` (or if it's a directory, check for `init.meta.json5` inside it) - 4. Read the file, parse JSON5, look for `attributes` object entries starting with `Rojo_Ref_` - 5. For each matching attribute, call `index.add(path_value, meta_file_path)` - Alternatively (simpler and more robust): Walk the `InstanceContext` or the VFS to find all `*.meta.json5` and `*.model.json5` files under the project root. For each, parse and scan for `Rojo_Ref_*` attributes. This avoids depending on tree metadata. - The simpler approach (file-system scan) is recommended because: - - It catches ALL meta files, not just those with InstigatingSource - - It handles nested projects correctly - - It's a one-time cost at startup - ```rust - fn populate_initial_ref_path_index(&self) { - let project_root = &self.project_root; - // Walk all .meta.json5 and .model.json5 files under project root - for entry in walkdir::WalkDir::new(project_root) - .into_iter() - .filter_map(|e| e.ok()) - .filter(|e| { - let name = e.file_name().to_string_lossy(); - name.ends_with(".meta.json5") || name.ends_with(".model.json5") - || name.ends_with(".meta.json") || name.ends_with(".model.json") - }) - { - let path = entry.path(); - if let Ok(bytes) = std::fs::read(path) { - if let Ok(val) = crate::json::from_slice::(&bytes) { - if let Some(attrs) = val.get("attributes").and_then(|a| a.as_object()) { - let mut index = self.ref_path_index.lock().unwrap(); - for (key, value) in attrs { - if key.starts_with(crate::REF_PATH_ATTRIBUTE_PREFIX) { - if let Some(path_str) = value.as_str() { - index.add(path_str, path); - } - } - } - } - } - } - } - } - ``` - **Dependency check:** `walkdir` is already a dependency of the project (used by memofs). If not directly available, use `std::fs::read_dir` recursively or `glob`. -- **Risk:** Low. Additive change that runs once at startup. Does not modify existing behavior. May add a few ms to startup time for large projects. -- **Verify round-trip:** Start server with a pre-existing meta file containing `Rojo_Ref_PrimaryPart = "Workspace/Model/Part1"`. Rename `Part1` to `NewPart` via Studio. Verify meta file updates to `"Workspace/Model/NewPart"`. -- **Verify syncback parity:** N/A -- this is index population only. -- **Tests required:** - - Integration test: Create a fixture with pre-existing Rojo_Ref_* in a meta file. Start server. Rename target. Verify meta file path updated. - ---- - -### Fix 2: Precise RefPathIndex Removal for Partial Attribute Deletion - -- **Status:** Approved -- **Finding:** Step 7: Audit Meta File Lifecycle -- `remove_file()` deletes all index entries for a file instead of just the removed attribute. -- **Files:** `src/web/api.rs` (lines 2887-2903) -- **Problem:** When removing one Rojo_Ref_* attribute from a file that has multiple, `index.remove_file(&written_meta_path, attr_name)` removes the meta file from ALL index entries. Remaining Rojo_Ref_* attributes lose their index entries, so future renames won't find them. -- **Solution:** Replace the current removal-then-add approach with a complete re-index of the written file. After `merge_or_build_meta` writes the file, re-read it and re-index ALL remaining Rojo_Ref_* attributes. This is simpler and more correct than trying to track individual removals. -Replace the current index maintenance block (lines 2887-2904 in `api.rs`) with: - ```rust - // Re-index the written meta file: remove all old entries for this file, - // then add entries for all remaining Rojo_Ref_* attributes. - { - let mut index = self.ref_path_index.lock().unwrap(); - - // Remove ALL old entries for this file (clean slate) - index.remove_all_for_file(&written_meta_path); - - // Re-scan the file for remaining Rojo_Ref_* attributes - if let Ok(bytes) = std::fs::read(&written_meta_path) { - if let Ok(val) = crate::json::from_slice::(&bytes) { - if let Some(attrs) = val.get("attributes").and_then(|a| a.as_object()) { - for (key, value) in attrs { - if key.starts_with(crate::REF_PATH_ATTRIBUTE_PREFIX) { - if let Some(path_str) = value.as_str() { - index.add(path_str, &written_meta_path); - } - } - } - } - } - } - } - ``` - Add a `remove_all_for_file` method to `RefPathIndex` that removes a file from all entries (rename from `remove_file` to be explicit): - ```rust - pub fn remove_all_for_file(&mut self, meta_file: &Path) { - let mut empty_keys = Vec::new(); - for (path, files) in &mut self.paths_to_files { - files.remove(meta_file); - if files.is_empty() { - empty_keys.push(path.clone()); - } - } - for key in empty_keys { - self.paths_to_files.remove(&key); - } - } - ``` - Remove the old `remove_file` method (or rename it to `remove_all_for_file`) and remove the `removed_ref_values` and `ref_path_values` intermediate variables since they're no longer needed. -- **Risk:** Low. The re-read of the just-written file adds negligible I/O (file is in OS cache). The approach is simpler and more correct than precise tracking. -- **Verify round-trip:** Set two Rojo_Ref_* attributes on the same instance. Remove one (set to nil). Rename the target of the remaining one. Verify the remaining ref path updates. -- **Verify syncback parity:** N/A -- **Tests required:** - - Integration test: Set PrimaryPart and CustomRef on same Model. Set PrimaryPart to nil. Rename CustomRef's target. Verify CustomRef's path updates in meta file. - ---- - -### Fix 3: Use Slugified Filesystem Name in Path Remapping - -- **Status:** Approved -- **Finding:** Step 11b: Compound File Extensions / naming -- filesystem path remapping uses tree name instead of slugified filesystem name. -- **Files:** `src/change_processor.rs` (line 461) -- **Problem:** In `update_ref_paths_after_rename`, the primary match case (line 460-463) pushes `new_segment` (the tree name) as the replacement directory component. When the new name has forbidden filesystem characters, the ChangeProcessor renames the directory to the slugified version, but the remapping produces a path using the unslugified tree name. The file at the wrong path is not found, and ref paths stay stale. -- **Solution:** Replace `result.push(new_segment)` with `result.push(slugified_new())` on line 461. The `slugified_new` closure already handles both cases: returns the slugified name when needed, or the original name when no slugification is required. - ```rust - // BEFORE (line 460-463): - if s == old_segment { - result.push(new_segment); - replaced = true; - continue; - } - - // AFTER: - if s == old_segment { - result.push(slugified_new()); - replaced = true; - continue; - } - ``` -- **Risk:** Very low. Single-line change. The `slugified_new()` function is already used in the fallback path (line 467) and is known to work correctly. -- **Verify round-trip:** Rename an instance from "OldName" to "Bad:Name". Verify Rojo_Ref_* paths in children's meta files are updated correctly. The directory on disk should be "Bad_Name" and the meta file at that path should have updated ref paths. -- **Verify syncback parity:** N/A -- **Tests required:** - - Integration test: Create instance "OldModel" with child Part. Set Ref to Part. Rename OldModel to "New:Model". Verify meta file at `.../New_Model/init.meta.json5` has updated Rojo_Ref_* path. - ---- - -### Fix 4: Update Stale "EXPECTED: FAIL" Test Comments - -- **Status:** Approved -- **Finding:** Step 14: Challenge Known Limitations -- test comments from "prove the bug" phase are now incorrect. -- **Files:** `tests/tests/two_way_sync.rs` -- **Problem:** Two tests have stale doc-comments: - - `ref_stale_path_after_target_rename` (around line 6758): Says "EXPECTED: FAIL -- stored path becomes stale after target rename." But `update_ref_paths_after_rename` now handles this. - - `ref_stale_path_after_parent_rename` (around line 6807): Says "EXPECTED: FAIL -- stored path becomes stale after parent rename." Same fix applies. -- **Solution:** Update both doc-comments to explain that `update_ref_paths_after_rename` handles this case. Remove "EXPECTED: FAIL" markers. -- **Risk:** None -- documentation-only changes. -- **Verify round-trip:** Run both tests, verify they pass. -- **Verify syncback parity:** N/A -- **Tests required:** None -- existing tests ARE the coverage. - ---- - -### Fix 5: Remove Unused `_tree` Parameter from `update_ref_paths_after_rename` - -- **Status:** Approved -- **Finding:** Code quality -- dead parameter from previous design iteration. -- **Files:** `src/change_processor.rs` (line 407-408) -- **Problem:** `update_ref_paths_after_rename(&self, _tree: &mut RojoTree, old_path, new_path)` takes a mutable tree reference but never uses it. The function operates entirely through `self.ref_path_index` and filesystem I/O. -- **Solution:** Remove the `_tree` parameter from the function signature. Update the single call site (line 1538-1542) to not pass `&mut tree`. - ```rust - // BEFORE: - fn update_ref_paths_after_rename( - &self, - _tree: &mut crate::snapshot::RojoTree, - old_path: &str, - new_path: &str, - ) - - // AFTER: - fn update_ref_paths_after_rename( - &self, - old_path: &str, - new_path: &str, - ) - ``` - Call site: - ```rust - // BEFORE: - self.update_ref_paths_after_rename(&mut tree, old_ref_path, &new_ref_path); - - // AFTER: - self.update_ref_paths_after_rename(old_ref_path, &new_ref_path); - ``` -- **Risk:** None -- removing unused parameter. -- **Verify round-trip:** Existing rename tests still pass. -- **Verify syncback parity:** N/A -- **Tests required:** None. - ---- - -### Fix 6: Rename Misleading Variable and Remove Redundant Filter - -- **Status:** Approved -- **Finding:** Code quality -- misleading name and redundant filter. -- **Files:** `src/web/api.rs` (lines 2756-2760, 2887-2903) -- **Problem:** `removed_ref_values` (line 2756) contains attribute NAMES (e.g., "Rojo_Ref_PrimaryPart"), not path values. The `.filter(|a| a.starts_with(REF_PATH_ATTRIBUTE_PREFIX))` is redundant since all items in `remove_attributes` already start with that prefix (they all come from `ref_attribute_name(key)`). -- **Solution:** This variable and its associated code are removed entirely by Fix 2 (which replaces the whole index maintenance block with re-scanning). If Fix 2 is applied first, this fix is a no-op. If applied independently: rename `removed_ref_values` to `removed_ref_attr_names` and remove the redundant filter. -- **Risk:** None. -- **Verify round-trip:** N/A -- **Verify syncback parity:** N/A -- **Tests required:** None -- naming change only. - ---- - -## Skipped Fixes - -None. All findings were approved. - -## Accepted Limitations - -- **Ambiguous paths (duplicate-named siblings):** Properly warned via `is_ref_path_unique`. Ref is written but may resolve to wrong sibling on rebuild. Accepted in all three audits. Warning is logged, no silent corruption beyond documented scope. -- **Plugin reconciler duplicate on pull:** When PatchSet includes added instances, the plugin reconciler may create duplicate Studio instances. Pre-existing issue with the pull flow, not introduced by this feature. - -## Deferred Refactors - -- **ChangeProcessor::start parameter count:** Now at 8 parameters (clippy warns at 7). Consider grouping into a config struct. This is a pre-existing issue made marginally worse by adding `ref_path_index`. - -## Test Plan - -Tests are not optional. Every approved fix must have test coverage. A fix is not complete until its tests pass. - -### Rust Integration Tests (`tests/tests/two_way_sync.rs`) - -- *Fixture with pre-existing Rojo_Ref_ + rename** (Fix 1): Start server with a meta file that already contains a Rojo_Ref_PrimaryPart attribute. Rename the target instance. Verify the meta file's Rojo_Ref_* path is updated. This tests startup index population. -- **Multi-ref file partial removal + rename** (Fix 2): Set two Rojo_Ref_* attributes on the same instance (PrimaryPart and a second ref). Set PrimaryPart to nil. Rename the second ref's target. Verify the second ref's path updates in the meta file. This tests precise index maintenance. -- *Rename to slugified name + Rojo_Ref_ path update** (Fix 3): Set a Ref on a child instance. Rename the parent to a name with forbidden characters (e.g., "New:Model"). Verify the meta file at the slugified directory path has updated Rojo_Ref_* paths. - -### Rust Unit Tests (`#[cfg(test)]`) - -- **RefPathIndex `remove_all_for_file**` (Fix 2): Add test for the new method, verifying it removes a specific file from all entries without affecting other files' entries. - -### No New Tests Required - -- Fix 4: Existing tests are the coverage (update comments only). -- Fix 5: Existing rename tests verify behavior (remove dead parameter only). -- Fix 6: Subsumed by Fix 2. - -## Test Rules - -The implementer MUST follow these rules when writing tests for this plan: - -### For bugs found and fixed - -Every bug fix MUST have a test that: - -1. Would have **FAILED** before the fix -2. **PASSES** after the fix -3. Prevents the bug from regressing - -### For missing coverage identified - -For each "missing test coverage" gap: - -1. Write the test -2. Verify it passes against the current implementation -3. If it fails, investigate -- it may have found another bug - -### Scope: test every affected layer - -For each finding, determine which test layers are affected and write tests in ALL of them: - -- Does the bug manifest at the server level? -> Rust unit test or integration test -- Does it affect the round-trip? -> Integration test with `/api/write` + filesystem verification -- Could it regress from a different code path? -> Test that code path too - -## Final Step: Run CI - -After ALL fixes and tests are implemented, run the `/ci` command (see `.cursor/commands/ci.md`) to execute the full CI pipeline. Every fix must pass CI before the plan is considered complete. Do not skip this step. \ No newline at end of file diff --git a/.cursor/plans/fix_stale_tree_desync_9e74f718.plan.md b/.cursor/plans/fix_stale_tree_desync_9e74f718.plan.md deleted file mode 100644 index 337b20aa..00000000 --- a/.cursor/plans/fix_stale_tree_desync_9e74f718.plan.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -name: Fix stale tree desync -overview: Add a tree validation mechanism that re-snapshots the project tree from the real filesystem when a plugin connects, ensuring the in-memory RojoTree never serves stale data even when VFS watcher events are missed. -todos: - - id: validate-method - content: Add `validate_tree()` method to ServeSession that re-snapshots from disk and patches the tree - status: completed - - id: trigger-on-connect - content: Call `validate_tree()` in the WebSocket connection handler before serving data - status: completed - - id: broadcast-corrections - content: Push any corrections from validation to the message queue for all connected plugins - status: completed - - id: test-validation - content: "Test: start serve, externally delete/modify a tracked file, connect plugin, verify tree is corrected" - status: completed -isProject: false ---- - -# Fix Stale Tree Desync on Plugin Connect - -## Problem - -When a plugin connects (especially in one-shot mode), the server's in-memory `RojoTree` can be stale if the VFS file watcher missed external filesystem changes. The tree is built once on startup and only updated via VFS events through `ChangeProcessor`. If events are missed (watcher buffer overflow, rapid batch operations like git, OS-level quirks), the tree silently drifts from reality. The plugin reads this stale tree via `GET /api/read/:id`, computes its diff against Studio, and sees "no changes" even though the filesystem is different. - -Rebooting `rojo serve` forces a fresh read and fixes it, confirming the issue is purely stale in-memory state. - -## Solution: Tree Validation on Plugin Connect - -When a new plugin connection is established (WebSocket handshake), trigger a validation pass that re-snapshots the root project path from the real filesystem, diffs against the current tree, and applies any corrections. This is essentially what `ServeSession::new` does on startup, but incremental and without restart. - -## Key Files - -- `[src/serve_session.rs](src/serve_session.rs)` -- Owns the tree, VFS, and project. Add `validate_tree()` method here. -- `[src/change_processor.rs](src/change_processor.rs)` -- Has `apply_patches()` which re-snapshots a path and patches the tree. Reuse this pattern. -- `[src/web/api.rs](src/web/api.rs)` -- WebSocket connection handler. Call validation before serving the tree. -- `[src/snapshot/patch_compute.rs](src/snapshot/patch_compute.rs)` -- `compute_patch_set` used to diff snapshots. - -## Implementation - -### 1. Add `validate_tree()` to ServeSession - -In `[src/serve_session.rs](src/serve_session.rs)`, add a public method that: - -- Takes the root project's start path (`self.root_project.folder_location()`) -- Locks the VFS and tree -- Calls `snapshot_from_vfs(&instance_context, &vfs, start_path)` to get a fresh snapshot from disk -- Calls `compute_patch_set(snapshot, &tree, root_id)` to diff against the current tree -- If the patch is non-empty, calls `apply_patch_set(&mut tree, patch_set)` and pushes the result to the message queue - -This reuses the same functions that `ServeSession::new` uses for initial tree construction. The VFS reads directly from the filesystem (no cache), so the snapshot will reflect the real state. - -A compile-time constant at the top of `serve_session.rs` controls whether validation runs: - -```rust -/// Set to `false` to skip tree validation on plugin connect (useful for testing). -const VALIDATE_TREE_ON_CONNECT: bool = true; -``` - -The method itself: - -```rust -pub fn validate_tree(&self) -> Vec { - if !VALIDATE_TREE_ON_CONNECT { - log::debug!("Tree validation skipped (VALIDATE_TREE_ON_CONNECT = false)"); - return Vec::new(); - } - - let start = std::time::Instant::now(); - let start_path = self.root_project.folder_location(); - let instance_context = InstanceContext::new(); - - let snapshot = match snapshot_from_vfs(&instance_context, &self.vfs, start_path) { - Ok(s) => s, - Err(e) => { - log::error!("Tree validation snapshot error: {:?}", e); - return Vec::new(); - } - }; - - let mut tree = self.tree.lock().unwrap(); - let root_id = tree.get_root_id(); - let patch_set = compute_patch_set(snapshot, &tree, root_id); - - if patch_set.is_empty() { - log::info!("Tree validation complete (no corrections needed) in {:.1?}", start.elapsed()); - return Vec::new(); - } - - log::info!("Tree validation found stale state, applying corrections"); - let applied = apply_patch_set(&mut tree, patch_set); - log::info!("Tree validation complete in {:.1?}", start.elapsed()); - vec![applied] -} -``` - -Note: The `Vfs` struct wraps the backend with a mutex internally (`self.inner.lock()`), so we access it via `self.vfs` (which is `Arc`) without needing an explicit lock. The exact locking pattern will follow the existing code style. - -### 2. Trigger Validation on WebSocket Connect - -In `[src/web/api.rs](src/web/api.rs)`, the WebSocket handler establishes a new connection. Before entering the message loop (or right after the handshake), call `validate_tree()` and broadcast any corrections: - -```rust -// In the WebSocket handler, after handshake: -let corrections = self.serve_session.validate_tree(); -if !corrections.is_empty() { - self.serve_session.message_queue().push_messages(&corrections); -} -``` - -This ensures the tree is consistent with disk before the plugin starts receiving data. - -### 3. Broadcast Corrections to Already-Connected Plugins - -If multiple plugins are connected, the corrections are pushed to the message queue, which broadcasts to all connected WebSocket clients. This ensures all plugins get the updated state. - -## Edge Cases - -- **Large projects**: Full re-snapshot could add 100-500ms latency on connect for very large projects. This is acceptable for one-shot mode (happens once) and live mode (happens on reconnect). Can be optimized later with targeted path validation if needed. -- **Concurrent access**: The tree lock is held during validation. Other WebSocket handlers will block briefly. This matches the existing pattern in `ChangeProcessor::apply_patches`. -- **No changes**: If the tree is already fresh (common case), `compute_patch_set` returns an empty patch and no work is done. The overhead is one `snapshot_from_vfs` call (directory walk + file stats). -- **VFS consistency**: After validation, VFS events for the re-snapshotted paths will still fire (watches persist). The `compute_and_apply_changes` handler will process them as no-ops since the tree already matches. - -## What This Fixes - -After this change, "no changes appearing" on plugin reconnect should not happen regardless of whether VFS events were missed. The tree is always refreshed from disk on connect, matching the behavior of a fresh `rojo serve` startup. - -## What This Does NOT Fix - -The content "swap" issue (both directions firing during per-item selection) is a separate bug that needs further investigation. The stale tree fix ensures that even if a swap occurs, the developer can immediately reconnect and see the correct diff to recover. \ No newline at end of file diff --git a/.cursor/plans/fix_stem-level_dedup_8fa9a015.plan.md b/.cursor/plans/fix_stem-level_dedup_8fa9a015.plan.md deleted file mode 100644 index 545cbf80..00000000 --- a/.cursor/plans/fix_stem-level_dedup_8fa9a015.plan.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -name: Fix stem-level dedup -overview: "Fix the real defect where deduplicate_name compares bare slugs against full filenames (with extensions), making it blind to file-format collisions. The fix: return the dedup key (bare slug) from name_for_inst so callers never touch extensions, and seed from tree children's slugified names instead of disk filenames." -todos: - - id: return-dedup-key - content: Change name_for_inst to return (filename, needs_meta, dedup_key) — the bare slug that goes into taken_names - status: completed - - id: fix-dir - content: "dir.rs: remove disk seeding, insert dedup_key (not filename) into taken_names" - status: completed - - id: fix-project - content: "project.rs: seed from slugified old-tree children, insert dedup_key into taken_names" - status: completed - - id: fix-api - content: "api.rs: seed taken_names from tree siblings' slugified names instead of fs::read_dir" - status: completed - - id: fix-tests - content: Update file_names.rs and api.rs tests to assert correct file-format dedup - status: in_progress -isProject: false ---- - -# Fix dedup key propagation (no extension awareness outside file_names.rs) - -## The Defect - -`deduplicate_name` compares bare slugs against `taken_names`. But callers populate `taken_names` from filesystem entries (`vfs.read_dir` / `fs::read_dir`), which have extensions. Bare slug `"helper"` does not match `"helper.luau"`, so file-format collisions go undetected. - -```mermaid -sequenceDiagram - participant Caller as dir.rs / api.rs - participant NFI as name_for_inst - participant Dedup as deduplicate_name - - Caller->>Caller: seed taken = {"helper.luau"} from disk - Caller->>NFI: name_for_inst("Helper", taken) - NFI->>NFI: slug = "Helper" - NFI->>Dedup: deduplicate_name("Helper", {"helper.luau"}) - Dedup-->>NFI: "Helper" (no match!) - NFI-->>Caller: "Helper.luau" - Caller->>Caller: OVERWRITES existing Helper.luau -``` - -## Root Cause - -The callers violate the `taken_names` contract. Per the original plan: `taken_names` should contain **claimed names** (bare slugs), not filenames with extensions. The defect is in what goes INTO the set, not in `deduplicate_name` itself. - -## The Fix (zero extension awareness outside file_names.rs) - -Two changes, both inside the existing architecture: - -### 1. `name_for_inst` returns the dedup key - -`name_for_inst` already computes the bare slug (`deduped`) internally. For file middleware, it appends the extension AFTER dedup to produce the filename. We expose the pre-extension slug as a third return value so callers can insert it into `taken_names`. - -``` -Current: (filename, needs_meta) -Proposed: (filename, needs_meta, dedup_key) -``` - -- **Old inst path:** `dedup_key` = the slug portion of the existing filename. `name_for_inst` already receives `middleware`, so it can strip `extension_for_middleware(middleware)` from the filename. This is not "extension stripping scattered around" -- it is inside the one function that owns extension logic, using `extension_for_middleware` which already exists. -- **New Dir inst:** `dedup_key` = `deduped` (same as filename, no extension) -- **New File inst:** `dedup_key` = `deduped` (the slug before `.{extension}` was appended) - -Callers insert `dedup_key.to_lowercase()` into `taken_names`. They never see or touch an extension. - -### 2. Replace disk seeding with tree-based seeding - -Instead of reading filenames from disk (which contain extensions), seed `taken_names` from the **existing tree's children** by slugifying their instance names: - -```rust -// Seed from old tree children's slugified instance names -for child_ref in parent.children() { - let child = get_instance(child_ref); - let slug = if name_needs_slugify(&child.name) { - slugify_name(&child.name).to_lowercase() - } else { - child.name.to_lowercase() - }; - taken_names.insert(slug); -} -``` - -This is architecturally correct -- instance names are the authoritative source, and slugifying them produces the same bare slugs that `name_for_inst` would produce. No filesystem reads, no extensions, no parsing. - -**What about orphaned files?** Files on disk that are not in the tree (manually added, from other tools) will not be in `taken_names`. A new instance could overwrite them. This is acceptable -- those files are not part of Rojo's model. The old `encode_path_name` system had the same behavior, and upstream PR #1187 does not do disk seeding either. - -## Affected Files - -### [src/syncback/file_names.rs](src/syncback/file_names.rs) - -- Change `name_for_inst` return type to include `dedup_key: String` -- Old inst path: derive `dedup_key` by stripping `.{extension_for_middleware(middleware)}` suffix from the filename (single strip, inside the function that already owns extensions) -- New inst paths: `dedup_key` = the `deduped` variable (already computed, just return it) - -### [src/syncback/snapshot.rs](src/syncback/snapshot.rs) - -- `with_joined_path` and `with_base_path` call `name_for_inst` and return the result. Update them to propagate the `dedup_key` so callers in dir.rs/project.rs can use it. - -### [src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs) - -- Remove `vfs.read_dir` seeding entirely -- The loop already processes old+new children interleaved; old children go through `name_for_inst`'s old-inst path, which returns the dedup_key. Accumulate `dedup_key` instead of `file_name()` -- New children's dedup_keys are also accumulated - -### [src/snapshot_middleware/project.rs](src/snapshot_middleware/project.rs) - -- Remove `vfs.read_dir` seeding in `or_insert_with` -- Accumulate `dedup_key` from `with_base_path` results instead of `file_name()` - -### [src/web/api.rs](src/web/api.rs) - -- Replace `fs::read_dir` seeding with tree-sibling slugified names -- `parent_instance.children()` gives child refs, `tree.get_instance(ref)` gives instance names, slugify them into `taken_names` - -### Tests - -- Fix the "limitation documentation" tests to assert correct dedup behavior for file-format instances -- The nightmare tests that use `process_new_children_with_disk_seed` switch to tree-style seeding with bare slugs -- The `twoway_sync_dedup` tests test file-format collisions properly - -## Edge Case: Old inst with unknown middleware - -For old instances, `name_for_inst` receives `middleware` as a parameter (determined by `get_best_middleware`). It uses `extension_for_middleware(middleware)` to derive the dedup_key. For Dir middleware, extension is empty, so dedup_key = filename. For all file middleware, the extension is known and strippable. There is no "unknown extension" case. diff --git a/.cursor/plans/fix_sync_system_issues_e569840d.plan.md b/.cursor/plans/fix_sync_system_issues_e569840d.plan.md deleted file mode 100644 index 1e0d5691..00000000 --- a/.cursor/plans/fix_sync_system_issues_e569840d.plan.md +++ /dev/null @@ -1,276 +0,0 @@ ---- -name: Fix sync system issues -overview: "Fix all sync system issues in the two-way sync pipeline — from standalone script child placement to file watcher echo suppression — across src/web/api.rs, src/change_processor.rs, src/serve_session.rs, and crates/memofs/src/lib.rs. Includes post-implementation correctness fixes discovered during CI and agent review." -todos: - - id: issue-1-standalone-conversion - content: "Issue 1: Extract standalone-to-directory conversion into shared helpers (convert_standalone_script_to_directory, convert_standalone_instance_to_directory) and use in syncback_added_instance when parent is a standalone file" - status: completed - - id: issue-2-property-persistence - content: "Issue 2: Add syncback_updated_properties method to write non-Source property changes to meta/model files in handle_api_write" - status: completed - - id: issue-3-path-in-format - content: "Issue 3: Make ExistingFileFormat carry detected PathBuf and use it when writing to preserve .model.json vs .model.json5" - status: completed - - id: issue-4-stale-removals - content: "Issue 4: Include removed IDs in PatchSet and add existence guard in ChangeProcessor to avoid double-delete errors" - status: completed - - id: issue-5-lock-splitting - content: "Issue 5: Split handle_api_write into gather phase (with lock) and execute phase (without lock) using SyncbackAction enum" - status: completed - - id: issue-6-project-parents - content: "Issue 6: Handle InstigatingSource::ProjectNode by resolving node.path relative to project file directory" - status: completed - - id: issue-7-echo-suppression - content: "Issue 7: Add counter-based suppressed_paths map shared between ApiService and ChangeProcessor, populate before every fs write/remove/create_dir in all syncback methods" - status: completed - - id: issue-8-rename-classname - content: "Issue 8: Implement file rename for name changes and init-file-aware extension rename for script class changes in ChangeProcessor" - status: completed - - id: issue-9-filewatcher-desync - content: "Issue 9 [CRITICAL]: Fix rapid delete+recreate desync — add recovery mechanism after Remove events, retry canonicalize on failure, stop unwatching on Remove, and add pedantic INFO-level logging for ALL file watcher events and decisions" - status: completed - - id: testing - content: "Testing: Integration tests added in prior pushes (serve.rs, syncback_format_transitions.rs). This changeset increases post_api_write timeout to 60s for stress test reliability." - status: completed - - id: fix-echo-suppression-wiring - content: "Post-fix: Wire suppressed_paths into ApiService from ServeSession and add suppress_path() calls before all fs operations in syncback methods" - status: completed - - id: fix-classname-directory-scripts - content: "Post-fix: ClassName change logic now finds init file inside directory-format scripts instead of trying to rename the directory itself" - status: completed - - id: fix-project-node-property-corruption - content: "Post-fix: Guard syncback_updated_properties against ProjectNode sources to prevent writing meta JSON to project files" - status: completed - - id: fix-continue-data-loss - content: "Post-fix: Replace continue with Option-based flow in ClassName handler so missing init file only skips rename, not Source writes" - status: completed - - id: fix-meta-path-encoding - content: "Post-fix: Derive adjacent meta file base name from file_stem() instead of instance.name() to preserve Windows character encoding" - status: completed - - id: fix-model-to-meta-conversion - content: "Post-fix: Parse .model.json5 and extract only init.meta.json5-compatible fields instead of raw-copying bytes (warns about lost inline children)" - status: completed -isProject: false ---- - -# Fix All Sync System Issues - -## Data Flow Context - -```mermaid -sequenceDiagram - participant Plugin as Studio_Plugin - participant API as handle_api_write - participant FS as Filesystem - participant FW as FileWatcher_VFS - participant CP as ChangeProcessor - participant Tree as RojoTree - participant MQ as MessageQueue - - Plugin->>API: POST /api/write - Note over API: syncback_added_instance - API->>FS: Create files (with suppress_path) - Note over API: syncback_removed_instance - API->>FS: Delete files (with suppress_path) - API->>CP: PatchSet (updates + removals) - CP->>FS: Write Source to file - CP->>Tree: apply_patch_set - CP->>MQ: AppliedPatchSet - FW->>CP: VfsEvent (suppressed!) - Note over CP: Echo suppressed via counter map - MQ->>Plugin: WebSocket messages -``` - -All fixes target eliminating the problems in this flow. - ---- - -## Files Changed (5 unpushed commits) - -| File | Lines Changed | Changes | -|------|--------------|---------| -| `src/web/api.rs` | +1050 | Syncback methods, echo suppression wiring, property persistence, format detection, path encoding fixes, model-to-meta conversion | -| `src/change_processor.rs` | +589 | VFS event handling, recovery mechanism, rename/ClassName logic, find_init_file, INFO logging | -| `src/serve_session.rs` | +19 | `suppressed_paths` field (counter-based HashMap), accessor method | -| `crates/memofs/src/lib.rs` | +11/-4 | Removed unwatch-on-Remove from `commit_event` | -| `tests/rojo_test/serve_util.rs` | +5/-1 | `post_api_write` reqwest timeout increased to 60s | - -**Note:** Integration tests in `tests/tests/serve.rs` and `tests/tests/syncback_format_transitions.rs` were added in earlier commits already on origin. This changeset modifies only the core implementation and test utilities. - ---- - -## Issue 1 — [HIGH] Standalone script children created as siblings - -**File:** `src/web/api.rs` — `syncback_added_instance` - -**Problem:** When a new child is added to a standalone script parent (e.g., `MyModule.luau`), the parent path resolves to the directory containing the script, so the child is created as a sibling instead of inside a `MyModule/` directory. - -**Fix:** Two shared helpers extract the conversion logic: - -- `convert_standalone_script_to_directory()` — handles `.luau`/`.lua` scripts, moves content to `init.{suffix}.luau`, renames adjacent meta files -- `convert_standalone_instance_to_directory()` — handles `.model.json5`, `.txt`, `.csv`, and other non-script types - -Both are called from `syncback_added_instance` when the parent path is a file (not directory). - ---- - -## Issue 2 — [HIGH] Non-Source property updates not persisted to disk - -**Files:** `src/web/api.rs` — `handle_api_write`, `syncback_updated_properties` - -**Problem:** `ChangeProcessor::handle_tree_event` only writes `Source` to disk. All other property changes (Attributes, etc.) are applied to the in-memory tree only and lost on restart. - -**Fix:** New method `syncback_updated_properties` on `ApiService`: - -- Filters non-Source properties using `filter_properties_for_meta` (respects reflection database defaults, skips Ref/UniqueId, filters internal RBX* attributes) -- Determines file structure (directory → `init.meta.json5`, standalone script → `Name.meta.json5`, non-script → updates model file in place) -- Uses `merge_or_build_meta` to read existing meta, merge changes, and write back -- **Post-fix:** Guards against `InstigatingSource::ProjectNode` to prevent writing meta JSON to project files (would corrupt them) -- **Post-fix:** Derives standalone script meta file base name from `inst_path.file_stem()` with suffix stripping (`.server`, `.client`, `.plugin`, `.local`, `.legacy`) instead of `instance.name()`, preserving Windows-invalid character encoding (e.g., `%3F` for `?`) - ---- - -## Issue 3 — [MEDIUM] Potential `.model.json` / `.model.json5` duplicates - -**File:** `src/web/api.rs` — `ExistingFileFormat`, `detect_existing_script_format` - -**Problem:** `detect_existing_script_format` returned `Standalone` without the actual file path. New files were always created as `.model.json5`, potentially alongside an existing `.model.json`. - -**Fix:** `ExistingFileFormat` now carries the detected path: - -```rust -enum ExistingFileFormat { - None, - Standalone(PathBuf), - Directory(PathBuf), -} -``` - -All match arms in `syncback_instance_to_path_with_stats` use the carried path. Format transitions (standalone ↔ directory) clean up old files and meta files. - ---- - -## Issue 4 — [MEDIUM] Removed instances leave stale window in tree - -**Files:** `src/web/api.rs`, `src/change_processor.rs` - -**Problem:** `handle_api_write` sent `removed_instances: Vec::new()` even when removals happened. - -**Fix:** Removed IDs are included in the PatchSet. `ChangeProcessor::handle_tree_event` guards file deletion with existence checks and handles both files and directories. - ---- - -## Issue 5 — [MEDIUM] Tree lock held during filesystem I/O - -**File:** `src/web/api.rs` — `handle_api_write` - -**Problem:** The tree mutex was held during all synchronous filesystem operations. - -**Fix:** Two-phase approach: -- **Phase 1 (with lock):** Gather parent paths, existing children, duplicate sibling cache, removal paths -- **Phase 2 (without lock):** Execute all filesystem operations - ---- - -## Issue 6 — [LOW] Can't add children to project-defined parents - -**File:** `src/web/api.rs` — `syncback_added_instance` - -**Problem:** `InstigatingSource::ProjectNode` returns the project file path, not the filesystem directory. - -**Fix:** Match on `InstigatingSource` variants. For `ProjectNode`, resolve `node.path` (`$path` field) relative to the project file directory. - ---- - -## Issue 7 — [LOW → HIGH] File watcher echo after syncback - -**Files:** `src/serve_session.rs`, `src/change_processor.rs`, `src/web/api.rs` - -**Problem:** When the API writes files to disk, the file watcher picks them up and creates redundant re-snapshots and WebSocket messages. Under rapid writes (e.g., 50 rapid syncs), this feedback loop caused the server to become unresponsive. - -**Fix:** Counter-based echo suppression: - -1. `ServeSession` holds `suppressed_paths: Arc>>` — values are counts, not booleans, to handle rapid writes to the same file correctly -2. `ApiService` gets the map via `serve_session.suppressed_paths()` and calls `suppress_path()` before every `fs::write`, `fs::remove_file`, `fs::remove_dir_all`, and `fs::create_dir_all` across all syncback methods -3. `suppress_path()` inserts both the canonicalized path (for VFS event matching) and the raw path (as fallback), incrementing the counter each time -4. `ChangeProcessor::handle_vfs_event` checks the map before processing — if found, decrements counter (removes at zero), commits the event to VFS for consistency, but skips patching - -**Note:** The original plan specified a `HashSet` with one-shot removal. This was changed to `HashMap` because rapid writes to the same file (e.g., 50 writes to `init.luau`) would insert the same path once but generate 50 VFS events — only the first would be suppressed. The counter ensures all expected events are suppressed. - ---- - -## Issue 8 — [INFO] Rename/ClassName persistence - -**File:** `src/change_processor.rs` — `handle_tree_event` - -**Problem:** Name and ClassName changes were logged as warnings and only applied to in-memory tree. - -**Fix for renames:** File/directory rename via `fs::rename`, plus adjacent meta file rename. - -**Fix for ClassName changes:** Script-to-script class transitions rename the init file extension. Cross-category changes (script ↔ non-script) log a warning. - -**Post-fix (directory-format scripts):** The original implementation checked `path.file_name().starts_with("init.")` to detect init files, but for directory-format scripts the `InstigatingSource::Path` is the *directory* (e.g., `src/MyModule/`), not the init file. This caused `is_init` to always be false, and the code attempted to rename the directory to a file name. Fixed by adding `find_init_file()` which searches the directory for known init file candidates in priority order. - -**Post-fix (continue → Option flow):** The `None` branch of `find_init_file()` originally used `continue`, which exited the entire `for update in &patch_set.updated_instances` loop iteration. This skipped all subsequent processing for that update, including `changed_metadata` handling and the `changed_properties` loop that writes Source to disk. If a user changed both ClassName and Source in a single update, and the init file couldn't be found, the Source change was silently dropped (data loss). Fixed by restructuring to `Option`-based control flow: `init_result` is `Option<(PathBuf, PathBuf)>`, with `if let Some(...)` doing the rename and `else` logging the warning — the rest of the update always runs. - ---- - -## Issue 9 — [CRITICAL] File watcher loses track of files after rapid delete+recreate - -**Files:** `src/change_processor.rs`, `crates/memofs/src/lib.rs` - -**Reproduction:** Cursor agent modifies a file, user clicks "undo", file is deleted and immediately recreated. Rojo thinks the file is deleted even though it exists on disk. - -**Root cause — three contributing factors:** - -1. `commit_event(Remove)` unwatched the path, preventing future event detection -2. Create/Write events silently dropped at `trace` level when `canonicalize` failed -3. Race condition: `notify_debouncer_full` could coalesce rapid Remove+Create into just Remove - -**Fix — five layers of defense:** - -1. **Pedantic INFO logging** for all VFS events and decisions (canonicalize results, patch application summaries, path resolution) -2. **Stop unwatching on Remove** in `memofs::VfsInner::commit_event` — stale watches are harmless -3. **Recovery check** in `compute_and_apply_changes` — before removing an instance, verify the path is genuinely gone from the real filesystem via `std::fs::metadata` (bypassing VFS state) -4. **Retry canonicalize** for Create/Write events — 50ms delay then retry, warn if still fails -5. **Post-Remove sweep** via `pending_recovery` — paths removed from the tree are re-checked after 200ms; if the file has reappeared, trigger a re-snapshot. Runs after every event and on a 500ms periodic timer. - ---- - -## Post-Implementation Fixes - -These issues were discovered during CI runs and agent review after the initial implementation. - -### Fix: .model.json5 → init.meta.json5 conversion loses inline children - -**File:** `src/web/api.rs` — `convert_standalone_instance_to_directory` - -**Problem:** The `.model.json5` format supports a `children` field for inline child instances, but `init.meta.json5` (parsed as `DirectoryMetadata`) does not. The original code copied raw bytes, silently losing inline children. - -**Fix:** Parse the `.model.json5` as JSON and extract only the fields `DirectoryMetadata` supports (`className`, `properties`, `attributes`, `ignoreUnknownInstances`, `id`). If inline `children` are present and non-empty, log a warning. Falls back to raw-copy only if JSON parsing fails. - -### Fix: Meta file path uses decoded name instead of encoded file stem - -**File:** `src/web/api.rs` — `syncback_updated_properties` - -**Problem:** Used `instance.name()` (decoded, e.g., `What?`) to construct the adjacent meta file path. On Windows with `encodeWindowsInvalidChars` enabled, the actual file uses encoded names (e.g., `What%3F.luau`). This mismatch caused `fs::write` failures on Windows and meta files that wouldn't be found when reading. - -**Fix:** Derive the base name from `inst_path.file_stem()` with known script suffix stripping (`.server`, `.client`, `.plugin`, `.local`, `.legacy`), matching exactly what `AdjacentMetadata::read_and_apply_all` does. - ---- - -## Commits (unpushed) - -1. **`0968e742`** — Initial implementation of all 9 issues (core syncback methods, VFS recovery, logging, memofs change) -2. **`f4f07744`** — Refactor suppression from `HashSet` to counter-based `HashMap`; wire `suppress_path()` into `ApiService` before all fs operations -3. **`f38c96e1`** — Add `find_init_file()` for directory-format scripts; fix ClassName rename targeting directory instead of init file -4. **`e6944e31`** — Fix `continue` → `Option` flow in ClassName handler; guard `syncback_updated_properties` against `ProjectNode` sources -5. **`dc1a9129`** — Parse `.model.json5` → `init.meta.json5` field extraction; derive meta file base name from `file_stem()` instead of `instance.name()` - -## Testing - -- **Integration tests** in `tests/tests/serve.rs` cover syncback operations (add, remove, update, format transitions) — added in prior pushes, not part of this diff -- **Format transition tests** in `tests/tests/syncback_format_transitions.rs` cover standalone ↔ directory conversions including a 50-rapid-sync stress test — added in prior pushes, not part of this diff -- **Test utility** `post_api_write` in `tests/rojo_test/serve_util.rs` — reqwest timeout increased to 60s (this diff) -- **Stress tests** in `crates/memofs/src/std_backend.rs` provide unit-level coverage for the debouncer — pre-existing -- **CI result:** 606 Rust tests passed, 397 plugin tests passed, 0 failures diff --git a/.cursor/plans/fix_test_port_toctou_86726cb4.plan.md b/.cursor/plans/fix_test_port_toctou_86726cb4.plan.md deleted file mode 100644 index 55859e75..00000000 --- a/.cursor/plans/fix_test_port_toctou_86726cb4.plan.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -name: Fix test port TOCTOU -overview: Two-layer fix for port-in-use race conditions. (1) Server-side -- retry bind with backoff when a known port is busy. (2) Test-side -- retry with a new random port when the serve process dies from AddrInUse. -todos: - - id: server-bind-retry - content: Add bind retry with backoff in `LiveServer::start()` for known ports - status: completed - - id: respawn-method - content: Add `respawn_with_new_port()` method to `TestServeSession` - status: completed - - id: wait-retry - content: Modify `wait_to_come_online()` to detect AddrInUse and retry via respawn - status: completed - - id: fresh-rebuild-retry - content: Add port-retry logic to `fresh_rebuild_read()` - status: completed -isProject: false ---- - -# Fix Port-in-Use Race Conditions - -## Problem - -Two failure modes: - -1. **Tests (random ports):** `get_port_number()` in `[tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs)` binds port 0, reads the assigned port, drops the listener, then passes the port to the spawned serve process. Another test can grab the same port in that TOCTOU window. -2. **Server (known ports):** `TcpListener::bind(address).await.unwrap()` in `[src/web/mod.rs:80](src/web/mod.rs)` panics immediately if the port is in use, with no retry. A previous server instance shutting down or a transient conflict gives no grace period. - -## Layer 1: Server-side bind retry (`src/web/mod.rs`) - -Replace the `.unwrap()` on `TcpListener::bind()` at line 80 with a retry loop: - -- On `AddrInUse`: retry up to 5 times with exponential backoff (200ms, 400ms, 800ms, 1600ms, 3200ms -- ~6s total) -- On any other bind error, or after retries exhausted: return `anyhow::Error` (propagates up cleanly instead of panicking) - -```rust -let listener = { - const MAX_BIND_RETRIES: u32 = 5; - const BASE_BACKOFF_MS: u64 = 200; - let mut last_err = None; - for attempt in 0..MAX_BIND_RETRIES { - match TcpListener::bind(address).await { - Ok(listener) => { last_err = None; break; } - Err(err) if err.kind() == std::io::ErrorKind::AddrInUse => { - let delay = BASE_BACKOFF_MS * 2u64.pow(attempt); - log::warn!( - "Port {} in use, retrying in {}ms (attempt {}/{})", - address.port(), delay, attempt + 1, MAX_BIND_RETRIES - ); - tokio::time::sleep(Duration::from_millis(delay)).await; - last_err = Some(err); - } - Err(err) => { last_err = Some(err); break; } - } - } - // unwrap or propagate -}; -``` - -This helps both tests (brief TOCTOU window) and production (previous process releasing a port). - -## Layer 2: Test-side retry with new random port (`tests/rojo_test/serve_util.rs`) - -If the serve process still dies after the server-side retries (e.g., the port is held long-term by another test), the test infrastructure retries with a completely new port. - -### 2a. Add `respawn_with_new_port()` to `TestServeSession` - -Kills the current process, picks a new ephemeral port, and respawns: - -```rust -fn respawn_with_new_port(&mut self) { - let port = get_port_number(); - let port_string = port.to_string(); - let working_dir = get_working_dir_path(); - - let rojo_process = Command::new(ROJO_PATH) - .args(["serve", self.project_path.to_str().unwrap(), "--port", &port_string]) - .current_dir(working_dir) - .stderr(Stdio::piped()) - .spawn() - .expect("Couldn't start Rojo"); - - self.rojo_process = KillOnDrop(rojo_process); - self.port = port; -} -``` - -### 2b. Modify `wait_to_come_online()` - -In the `Ok(Some(status))` branch (line ~266-276), detect `AddrInUse` in stderr and retry: - -- Add a `port_retries` counter (max 3 attempts) -- On `AddrInUse`: call `self.respawn_with_new_port()`, reset the backoff counter, continue -- On other errors: panic as before - -### 2c. Apply same pattern to `fresh_rebuild_read()` - -`fresh_rebuild_read()` (line ~929) has its own inline wait loop. Wrap the spawn + wait in a retry loop that detects `AddrInUse` and retries with a new port. - -## Files changed - -- `[src/web/mod.rs](src/web/mod.rs)` -- bind retry with backoff (Layer 1) -- `[tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs)` -- respawn with new port (Layer 2) - diff --git a/.cursor/plans/git-based_sync_defaults_be6371b6.plan.md b/.cursor/plans/git-based_sync_defaults_be6371b6.plan.md deleted file mode 100644 index 95d6f521..00000000 --- a/.cursor/plans/git-based_sync_defaults_be6371b6.plan.md +++ /dev/null @@ -1,329 +0,0 @@ ---- -name: Git-Based Sync Defaults -overview: Add git-aware default sync direction selection to the two-way sync confirmation UI. Server sends changed-instance IDs + SHA1 hashes (both staged and HEAD) to the plugin for auto-selecting defaults. Accepted files are auto-staged via git add. -todos: - - id: sha1-dep - content: Add sha1 crate to Cargo.toml - status: completed - - id: sha1-luau - content: Add SHA1.luau to plugin/src/ from user-provided file - status: completed - - id: git-module - content: Create src/git.rs with git CLI helpers (repo root, changed files, committed content, SHA1 computation, git add) - status: completed - - id: interface-rs - content: Add GitMetadata struct and field to ServerInfoResponse, add stage_ids to WriteRequest and PatchSet - status: completed - - id: api-rs - content: Call compute_git_metadata in handle_api_rojo (two-phase lock), wire up project root, handle stage_ids in handle_api_write - status: completed - - id: patchtree-lua - content: Update PatchTree.build to accept gitMetadata and set defaultSelection based on git status + SHA1 hash comparison - status: completed - - id: app-init-lua - content: Pass serverInfo.gitMetadata to PatchTree.build call sites in App/init.lua, build stage_ids in confirmation flow - status: completed - - id: auto-stage - content: "Auto git-add: all push-accepted files + auto-selected pull-accepted files. Split staging between api.rs and change_processor." - status: completed - - id: test-verify - content: "Build and verify: cargo build, cargo test, cargo clippy" - status: completed -isProject: false ---- - -# Git-Based Sync Direction Defaults - -## Summary - -When the plugin shows the initial sync confirmation dialog, currently all items default to `nil` (unselected). This feature adds smart defaults based on git status: - -- **File has no git changes** (same as HEAD): default to "Studio" (pull) -- any diff is because Studio was changed -- **File has git changes AND is a script AND Studio Source matches committed version**: default to "Atlas" (push) -- developer changed the file, Studio hasn't diverged from the last commit -- **Otherwise**: `nil` -- user must decide (both sides changed from committed, or non-script with changes) -- **No git repo**: all defaults remain `nil` (feature is no-op) - -These defaults only apply to **Updated** items (where both Studio and filesystem have the instance). Added/Removed items remain `nil` to avoid destructive auto-selections. - -**Hash comparison is scripts-only for now.** Non-script property/misc changes that are git-changed remain `nil` (deferred feature -- would require reproducing a bit-for-bit state on the Roblox side to compare). - -Recomputed fresh on **each connect** (not cached). - -## User Stories - -1. **Scripts changed locally, hashes match Studio Source**: Developer changed scripts in git. Plugin receives committed SHA1 hashes. Studio's `script.Source` (non-draft version) matches the committed hashes. Result: **"Atlas" auto-selected** for those scripts. -2. **Scripts changed by someone else too**: Developer pulled commits that changed files, AND someone edited in Studio. Committed SHA1 won't match Studio Source. Result: **No bubble selected** -- user must decide. -3. **Property/misc changes in git**: Non-script files flagged as changed. Result: **No auto-selection** (deferred feature). -4. **No git changes on a file**: File is identical to HEAD. Any diff is because Studio was changed. Result: **"Studio" auto-selected**. - -## Architecture - -```mermaid -sequenceDiagram - participant Git as Git CLI - participant Server as Rust Server - participant Tree as RojoTree - participant Plugin as Lua Plugin - participant UI as PatchTree / UI - - Note over Server: On each GET /api/rojo - Server->>Tree: snapshot path_to_ids + class names (brief lock) - Server->>Git: git rev-parse --show-toplevel - Git-->>Server: repo root (or fail = no git) - Server->>Git: git diff HEAD --name-only - Git-->>Server: list of changed files - Server->>Server: map paths to Refs using snapshot - loop For each changed script with committed version - Server->>Git: git show HEAD:path + git show :0:path - Git-->>Server: committed + staged content - Server->>Server: SHA1 in blob format (no normalization) - end - Server->>Plugin: ServerInfoResponse + gitMetadata - - Note over Plugin: Building PatchTree - Plugin->>UI: For each Updated node - alt Not in changedIds - UI->>UI: defaultSelection = "pull" - else Script with committed hash - Plugin->>Plugin: SHA1 blob format of script.Source - alt Any hash matches - UI->>UI: defaultSelection = "push" - else No hash matches - UI->>UI: defaultSelection = nil - end - else Non-script or no committed hash - UI->>UI: defaultSelection = nil - end -``` - - - -## Server Side (Rust) - -### 1. Add `sha1` crate dependency - -In [Cargo.toml](Cargo.toml), add under `[dependencies]`: - -```toml -sha1 = "0.10" -``` - -We compute hashes ourselves using the git blob format scheme (`"blob \0"`) so both sides produce identical hashes from identical content. - -### 2. New module: `src/git.rs` - -All git interaction via `std::process::Command`. - -- `**git_repo_root(project_root: &Path) -> Option**`: Runs `git -C rev-parse --show-toplevel`. Returns `None` if not a git repo or git not installed. -- `**git_changed_files(repo_root: &Path) -> Option>**`: Runs `git -C diff HEAD --name-only` to get files differing from HEAD (covers staged + unstaged). Also runs `git -C ls-files --others --exclude-standard` for untracked files. Returns paths relative to repo root. **Edge case**: if HEAD doesn't exist (no commits yet), treat all tracked files as changed or return None gracefully. -- `**git_show_head(repo_root: &Path, rel_path: &Path) -> Option`**: Runs `git -C show HEAD:`. Returns committed content at HEAD. Returns `None` for new files. -- `**git_show_staged(repo_root: &Path, rel_path: &Path) -> Option`**: Runs `git -C show :0:`. Returns staged (index) content. Returns `None` if not staged or file doesn't exist in index. -- `**compute_blob_sha1(content: &str) -> String`**: Computes `SHA1("blob \0")`. Returns 40-char lowercase hex string. No normalization. -- `**git_add(repo_root: &Path, paths: &[PathBuf])`**: Runs `git -C add -- `. Stages files for commit. No-op if paths is empty. -- `**compute_git_metadata(path_snapshot: &PathSnapshot, project_root: &Path) -> Option`**: Takes a pre-extracted `PathSnapshot` (see section 4). Orchestrates git commands: - 1. Find repo root - 2. Get changed files set - 3. Map changed file paths to instance Refs using the path snapshot - 4. For each changed script: collect up to 2 hashes -- HEAD version and staged version (skip staged if identical to HEAD) - 5. Returns `None` if no git repo - -### 3. Update data structures in [src/web/interface.rs](src/web/interface.rs) - -**GitMetadata** (new struct for ServerInfoResponse): - -```rust -#[derive(Debug, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct GitMetadata { - /// Instance IDs whose backing files have changes relative to HEAD - pub changed_ids: Vec, - /// For changed script instances: SHA1 hashes of prior versions (git blob format). - /// Contains 1-2 hashes per script: HEAD version and staged version (if different). - /// Plugin checks if Studio Source matches ANY hash to default "Atlas". - pub script_committed_hashes: HashMap>, -} -``` - -Add to `ServerInfoResponse`: - -```rust -#[serde(default, skip_serializing_if = "Option::is_none")] -pub git_metadata: Option, -``` - -**WriteRequest** (add `stage_ids` field): - -```rust -pub struct WriteRequest { - pub session_id: SessionId, - pub removed: Vec, - #[serde(default)] - pub added: HashMap, - pub updated: Vec, - /// Instance IDs whose backing files should be staged via git add. - /// Includes: all push-accepted IDs + auto-selected pull-accepted IDs. - #[serde(default)] - pub stage_ids: Vec, -} -``` - -**PatchSet** (add `stage_ids` field for change_processor): - -Add to the existing PatchSet struct in [src/snapshot/patch.rs](src/snapshot/patch.rs): - -```rust -/// Instance IDs whose backing files should be staged after writing. -/// Populated from WriteRequest.stage_ids, consumed by change_processor. -#[serde(default, skip)] -pub stage_ids: HashSet, -``` - -### 4. Update `handle_api_rojo()` in [src/web/api.rs](src/web/api.rs) -- two-phase lock - -**Critical**: Do NOT hold the tree lock while running git subprocesses. - -**Phase 1 (with lock)**: Snapshot the data needed from the tree: - -- `path_to_ids` entries (clone the relevant mappings) -- Instance class names for each Ref -- `instigating_source` paths - -**Phase 2 (no lock)**: Run git commands and compute hashes using the snapshot. - -```rust -// Phase 1: brief lock -let path_snapshot = { - let tree = self.serve_session.tree(); - extract_path_snapshot(&tree) // Clone path_to_ids, class names, instigating sources -}; -// Lock released here - -// Phase 2: slow git work, no lock held -let git_metadata = compute_git_metadata(&path_snapshot, project_root); -``` - -### 5. Wire up in [src/serve_session.rs](src/serve_session.rs) - -Expose `project_root()` from `ServeSession` (the project file's parent directory). Compute and store `git_repo_root` as `Option` at session start for use by auto-staging in `handle_api_write` and change_processor. - -### 5b. Auto-stage accepted files - -After the user confirms sync selections, automatically `git add` affected files based on these rules: - -- **Push (Atlas) accepted**: Always stage the backing file. The filesystem changes are being finalized into Studio, so they're ready to commit. Applies to ALL push items (auto-selected and manually-selected), including non-scripts. -- **Pull (Studio) accepted**: Only stage if the item was auto-selected (had a non-nil `defaultSelection`). Manually-chosen pulls are left unstaged so the user can diff them. - -**Staging is split between two components** to handle the async Source write timing: - -1. `**handle_api_write()` in [src/web/api.rs](src/web/api.rs)**: Stages files that api.rs writes directly -- additions (new files), removals (deleted files), and push-accepted files (already on disk, just need staging). Resolves Ref IDs to filesystem paths via `instigating_source` in the tree. Calls `git_add` in one batch. Also copies `stage_ids` into the PatchSet before sending to change_processor. -2. `**handle_tree_event()` in [src/change_processor.rs](src/change_processor.rs)**: After writing Source to disk (line ~1807), checks if the instance's Ref is in `patch.stage_ids`. If so, calls `git_add` on the written path. The change_processor receives `repo_root: Option` during construction (computed once at session start). - -**Why split?** Source writes are async -- api.rs sends the PatchSet to change_processor via a channel and returns immediately. If api.rs staged those files, it would stage the OLD content before change_processor writes the new content. Staging must happen AFTER the write. - -**Plugin side** ([plugin/src/ServeSession.lua](plugin/src/ServeSession.lua)): In `__confirmAndApplyInitialPatch`, build the `stage_ids` list: - -- For each push-selected item: always include in `stage_ids` -- For each pull-selected item: include only if the PatchTree node had `defaultSelection ~= nil` -- Always send the write request if there are either pull changes OR stage IDs (currently only sent when pullPatch is non-empty -- expand the condition to also fire when `stage_ids` is non-empty) - -If not in a git repo (`repo_root` is `None`), all stage calls are no-ops. - -## Plugin Side (Lua) - -### 6. Add SHA1.luau to plugin - -Copy the user-provided [SHA1.luau](c:\Users\Joe\Downloads\SHA1.luau) to `plugin/src/SHA1.luau`. This is a native-optimized SHA1 implementation that takes a `buffer` and returns a 40-char hex string. - -### 7. Update `PatchTree.build()` in [plugin/src/PatchTree.lua](plugin/src/PatchTree.lua) - -Add a 4th parameter `gitMetadata` (the `gitMetadata` table from `serverInfo`, may be nil). - -At the start of `build()`, convert `changedIds` array to a Set for O(1) lookup: - -```lua -local changedIdSet = nil -if gitMetadata and gitMetadata.changedIds then - changedIdSet = {} - for _, id in gitMetadata.changedIds do - changedIdSet[id] = true - end -end -``` - -For **Updated** nodes (around line 308-318), replace `defaultSelection = nil` with: - -```lua -local defaultSelection = nil -if changedIdSet then - if not changedIdSet[change.id] then - defaultSelection = "pull" - elseif instance:IsA("LuaSourceContainer") - and gitMetadata.scriptCommittedHashes then - local hashes = gitMetadata.scriptCommittedHashes[change.id] - if hashes then - local source = instance.Source - local gitBlob = "blob " .. tostring(#source) .. "\0" .. source - local studioHash = SHA1(buffer.fromstring(gitBlob)) - for _, hash in hashes do - if studioHash == hash then - defaultSelection = "push" - break - end - end - end - end -end -``` - -**Key**: `script.Source` returns the non-draft (published) version when Script Drafts are enabled. Both sides use the git blob format `"blob \0"` as SHA1 input. No normalization -- committed content is LF (repo standard), Studio Source is LF. - -**Added** and **Removed** nodes: keep `defaultSelection = nil` (unchanged). - -### 8. Update `PatchTree.build()` call sites in [plugin/src/App/init.lua](plugin/src/App/init.lua) - -Must support both **"Initial"** and **"Always"** confirmation modes. In "Always" mode, every incoming WebSocket patch triggers the confirmation dialog via `__onWebSocketMessage` -> `__userConfirmCallback(instanceMap, patch, self.__serverInfo)`, so `serverInfo.gitMetadata` is available for ongoing patches too. - -**Note**: Per-item push/pull/ignore selections for ongoing WebSocket patches (Always mode) are a pre-existing limitation (see `ServeSession.lua` line 311-314). The git defaults will be set in the PatchTree but the existing "Accept"/"Abort" handling for ongoing patches doesn't yet support them. This is not introduced by this feature. - -Three call sites in `App:startSession()` and one approach to wire them: - -**Cache `serverInfo` in a closure-scoped local** accessible to all callbacks: - -```lua -local cachedServerInfo = nil -``` - -- **Line 867** (`setConfirmCallback`, initial + ongoing confirms): Has `serverInfo` directly. Cache it: `cachedServerInfo = serverInfo`. Pass `serverInfo.gitMetadata` to `PatchTree.build`. Works for both Initial and Always modes since `__onWebSocketMessage` passes `self.__serverInfo`. -- **Line 918** (`setPatchUpdateCallback`, patches merging during active confirmation): Doesn't receive `serverInfo`. Use cached: `cachedServerInfo and cachedServerInfo.gitMetadata`. This is safe because the confirm callback always fires first (sets `cachedServerInfo`) before any patch updates can arrive. -- **Line 659** (precommit hook, auto-accepted patches): For patches that bypass confirmation (e.g., "Never" mode), this builds a tree for the Connected page display. Use `cachedServerInfo and cachedServerInfo.gitMetadata`. Will be `nil` if no confirmation has happened yet (first connect stores it). - -### 9. Import SHA1 in PatchTree.lua - -```lua -local SHA1 = require(Plugin.SHA1) -``` - -## Key Design Decisions - -- **Self-computed SHA1 with git blob format scheme**: Read content via `git show HEAD:` and `git show :0:` (staged), compute SHA1 using `"blob \0"`. Send both hashes (HEAD + staged if different) so the plugin can match against either version. -- **Two-phase tree lock**: Snapshot path mappings under brief lock, then release before running git subprocesses. Prevents blocking all API requests during I/O-bound git operations. -- **Auto-staging with asymmetric rules**: Push-accepted items are always staged (filesystem changes finalized). Pull-accepted items are only staged if auto-selected (manually-chosen pulls left unstaged for manual diff). Plugin sends `stage_ids` in the WriteRequest; server resolves to paths and runs `git add`. -- **Split staging responsibility**: api.rs stages additions, removals, and push files directly. change_processor stages Source writes after they complete (via `stage_ids` on PatchSet). This avoids staging old content before async writes finish. -- **Only Updated items get defaults**: Added (would destructively delete files if "pull") and Removed (IDs aren't in server tree) are left as `nil` -- **Scripts-only hash comparison**: Non-script property changes are deferred (see note below) -- **Git via subprocess**: No git2/libgit2 dependency, just `std::process::Command`. Graceful fallback if git not installed or not a repo. Per-file `git show` calls are acceptable for typical changed file counts; `git cat-file --batch` is a future optimization for large changesets. -- **Draft handling**: `script.Source` returns the non-draft version when Script Drafts are enabled, which is exactly what we compare against the committed version -- **Fresh computation per connect**: Not cached -- each `GET /api/rojo` recomputes git state -- **No normalization anywhere**: Committed content is LF (repo standard), Studio Source is LF, VFS normalizes reads. Both sides hash identical LF content. -- **Init-style scripts (init.luau) handled correctly**: `dir.rs` registers all init file paths (init.luau, init.server.luau, etc.) in `relevant_paths`, so `path_to_ids` maps `MyFolder/init.luau` to the correct Ref. `instigating_source` is the actual init file path (not the directory), so Source writes and git-add target the correct file. Git reports file-level changes (`MyFolder/init.luau`), matching the indexed path. -- **No-HEAD edge case**: If the repo has no commits (`git diff HEAD` fails), treat as "no git metadata" and return None. All defaults remain nil. - -## Deferred: Non-Script (Attribute/Property/Tag) Hash Comparison - -Hash comparison for non-script changes (properties, attributes, tags) is **not included in this feature** and would be significantly harder: - -- Would require building a **deterministic payload** of the instance's properties/attributes/tags (possibly msgpack with guaranteed key ordering, including default values) to hash against the committed file content (meta.json5, model.json5, etc.) -- Even with a deterministic serialization, there is **no "draft" concept** for non-script properties in Studio. `script.Source` has the draft/non-draft distinction, but property values are always live. There's no way to get "the version before the user started editing" for properties. -- This makes the comparison fundamentally less useful: if a user drags a Part in Studio, the property is immediately the new value with no way to recover the "original" for comparison. -- For now, non-script changes that are git-changed simply get `defaultSelection = nil` (user must decide). - diff --git a/.cursor/plans/git-style_change_metadata_9d8c8345.plan.md b/.cursor/plans/git-style_change_metadata_9d8c8345.plan.md deleted file mode 100644 index da2c7a2b..00000000 --- a/.cursor/plans/git-style_change_metadata_9d8c8345.plan.md +++ /dev/null @@ -1,242 +0,0 @@ ---- -name: Git-style change metadata -overview: Extract ad-hoc change calculation from PatchTree into a dedicated ChangeMetadata module, update WhitespaceUtil to return separate added/removed line counts, and display git-style "-M +N" tags in DomLabel (grayed when whitespace-only). -todos: - - id: create-diff-util - content: Replace WhitespaceUtil with DiffUtil -- Myers diff algorithm (line-level), returns { added, removed, isWhitespaceOnly, overflow } - status: completed - - id: diff-util-spec - content: Create DiffUtil.spec.lua with comprehensive tests (empty, identical, pure add/remove, mixed, whitespace-only, overflow, edge cases) - status: completed - - id: create-change-metadata - content: Create plugin/src/ChangeMetadata.lua module with compute() function that takes changeList and returns metadata struct - status: completed - - id: update-patch-tree - content: Refactor PatchTree.build() and updateMetadata() to use ChangeMetadata.compute() instead of inline calculation - status: completed - - id: update-dom-label - content: Update DomLabel to display git-style -M/+N tags (red/green), grayed when whitespace-only - status: completed - - id: diff-bar - content: Add GitHub-style mini diff bar (5 colored segments) next to the line change tags in DomLabel - status: completed - - id: tooltips - content: Add hover tooltips to change tags with human-readable detail text - status: completed - - id: restyle-props - content: Restyle the Props tag to be visually consistent with the new git-style tags - status: completed - - id: update-theme - content: Update Theme.lua Diff colors to use the new hardcoded values (#F21717, - status: completed -isProject: false ---- - -# Git-Style Change Metadata Module - -## Current State - -Change calculation is scattered across multiple files with an ad-hoc data flow: - -- **[WhitespaceUtil.lua](plugin/src/WhitespaceUtil.lua)** uses LCS-based algorithm, returns a combined `(totalDiff, whitespaceDiff)` tuple -- no split between added/removed lines -- **[PatchTree.lua](plugin/src/PatchTree.lua)** lines 252-318 builds `changeInfo` inline during tree construction -- intermixed with changeList building, hard to follow -- **[DomLabel.lua](plugin/src/App/Components/PatchVisualizer/DomLabel.lua)** lines 519-528 displays "Lines 5" or "Whitespace 3" -- not git-style - -```mermaid -flowchart LR - WT["WhitespaceUtil LCS"] -->|"(totalDiff, wsDiff)"| PT["PatchTree.build()"] - PT -->|"ad-hoc changeInfo"| DL["DomLabel"] - DL -->|"'Lines 5' or 'Whitespace 3'"| UI["UI Tags"] -``` - - - -## Target State - -```mermaid -flowchart LR - WT["DiffUtil Myers"] -->|"LineDiffResult struct"| CM["ChangeMetadata"] - PT["PatchTree.build()"] -->|"changeList"| CM - CM -->|"ChangeMetadata struct"| DL["DomLabel"] - DL -->|"'-3 +5' or gray '-3 +5'"| UI["UI Tags"] -``` - - - -## Changes - -### 1. Replace WhitespaceUtil with DiffUtil (Myers diff) - -Delete [WhitespaceUtil.lua](plugin/src/WhitespaceUtil.lua) and create `plugin/src/DiffUtil.lua` with a proper line-level Myers diff algorithm -- the same algorithm git uses internally. - -**Goal: exact match with GitHub's commit diff counts.** The `-3 +5` numbers must be identical to what GitHub shows in the file header of a commit diff. This means matching `git diff` behavior exactly: - -- A modified line counts as 1 deletion + 1 insertion (old line removed, new line added) -- NOT as 1 "edit" -- Line splitting on `\n` (same as git) -- Lines compared byte-for-byte (no normalization for the primary count) -- Trailing newline handling: a missing final `\n` does NOT create a phantom line difference (match git's `\ No newline at end of file` behavior) - -**Algorithm:** Myers O(ND) diff (see "An O(ND) Difference Algorithm and Its Variations", Myers 1986) -- the exact algorithm git uses internally. The existing [StringDiff.lua](plugin/src/App/Components/StringDiffVisualizer/StringDiff.lua) already has a character-level Myers bisect implementation (`_bisect`). DiffUtil adapts this for line-level diffing: - -1. Split both strings into line arrays on `\n` (strip trailing empty line from final `\n` to avoid phantom diffs) -2. Run Myers diff on line arrays (each line is an atomic unit, compared as whole strings) -3. Walk the edit script: right moves = deletions (removed), down moves = insertions (added), diagonal = equal -4. The resulting `removed` and `added` counts are exactly what `git diff --stat` reports and what GitHub displays -5. For whitespace detection: run a second pass with normalized lines (trailing whitespace/`\r` stripped). If normalized diff has 0 changes, `isWhitespaceOnly = true` - -**API:** - -```lua --- Lightweight: just counts (for display tags) -function DiffUtil.countLineDifferences(current: string, incoming: string): LineDiffResult - -type LineDiffResult = { - added: number, - removed: number, - isWhitespaceOnly: boolean, - overflow: boolean, -- true when line count diff > 100 (early bail, no exact split) -} - --- Full diff: returns edit script grouped into hunks (for future merge dialogue) -function DiffUtil.diffLines(current: string, incoming: string, contextLines: number?): DiffResult - -type DiffLine = { - type: "context" | "add" | "remove", - content: string, -} - -type DiffHunk = { - oldStart: number, -- 1-indexed line in old version - oldCount: number, -- lines from old version in this hunk - newStart: number, -- 1-indexed line in new version - newCount: number, -- lines from new version in this hunk - lines: {DiffLine}, -- ordered lines with type markers -} - -type DiffResult = { - added: number, - removed: number, - isWhitespaceOnly: boolean, - overflow: boolean, - hunks: {DiffHunk}, -- contiguous change groups with context (default 3 lines, matching git) -} -``` - -Both functions share the same internal Myers diff engine. `countLineDifferences` is the fast path that discards the edit script after counting. `diffLines` retains it and groups into hunks with `contextLines` (default 3, matching git). `diffLines` is not consumed by anything yet -- it exists so the future merge dialogue has a ready-made hunk source. - -**Performance:** Keep the existing early-bail when `math.abs(#currentLines - #incomingLines) > 100` to avoid expensive computation on massive diffs. Myers is O(ND) where D is the number of differences, so it's fast for similar files (common case). - -**Test file:** Create `plugin/src/DiffUtil.spec.lua` (TestEZ pattern, same as [PatchSet.spec.lua](plugin/src/PatchSet.spec.lua)) covering: - -- Identical strings (0 added, 0 removed) -- Empty to non-empty (pure additions) -- Non-empty to empty (pure removals) -- Mixed changes (some lines added, some removed, some unchanged) -- Whitespace-only changes (trailing spaces, tabs, mixed) -- Non-whitespace changes (isWhitespaceOnly = false) -- Overflow threshold (>100 line diff) -- Edge cases: single line, empty strings, nil/non-string inputs -- Accuracy: verify exact added/removed counts against known diffs that can be cross-checked with `git diff --stat` -- Modified lines: confirm a changed line counts as 1 removal + 1 addition (not 1 edit) -- Trailing newline: no phantom diff from presence/absence of final `\n` -- `diffLines` hunks: verify hunk boundaries, context lines (default 3), oldStart/newStart/oldCount/newCount match git's unified diff format -- `diffLines` hunks: adjacent changes merge into single hunk, separated changes produce separate hunks - -### 2. Create ChangeMetadata module - -New file: `plugin/src/ChangeMetadata.lua` - -Provides `ChangeMetadata.compute(changeList)` which: - -- Takes the already-built `changeList` array of `{prop, currentValue, incomingValue}` entries -- Scans for Source property to compute line diff via DiffUtil -- Counts non-Source property changes -- Returns a clean struct with both summary (for display) and detail (for future merge dialogue): - -```lua -type PropertyDetail = { - name: string, - oldValue: any?, -- nil for added instances - newValue: any?, -- nil for removed instances - valueType: string, -- typeof() result, for display/merge type dispatch - isWarning: boolean?, -- set later by updateMetadata -} - -type ChangeMetadata = { - -- Summary (drives the display tags and diff bar) - linesAdded: number?, -- nil if no Source change - linesRemoved: number?, -- nil if no Source change - isWhitespaceOnly: boolean?, -- true only when ALL Source changes are whitespace - overflow: boolean?, -- true when diff exceeds 100 lines threshold - propChanges: number?, -- count of non-Source property changes - failed: number?, -- set later by updateMetadata - edits: number?, -- total edits (used by added instances and failure tracking) - - -- Detail (for future merge dialogue -- not consumed yet) - hunks: {DiffHunk}?, -- Source diff hunks from DiffUtil.diffLines(), nil if no Source change - propertyDetails: {PropertyDetail}?, -- structured property changes with old/new values and types -} -``` - -`ChangeMetadata.compute()` populates both the summary fields (used now) and the detail fields (used later). The `hunks` come from `DiffUtil.diffLines()` when a Source change is present. The `propertyDetails` array is built from the changeList entries, giving the merge dialogue structured access to each property's old/new value and type without re-decoding. - -### 3. Update PatchTree -- use ChangeMetadata module - -In [PatchTree.lua](plugin/src/PatchTree.lua): - -- Remove the inline metadata calculation (lines 253-318 simplified) -- After building `changeList`, call `ChangeMetadata.compute(changeList)` to get the metadata struct -- Keep changeList construction where it is (it's tree-building logic) -- Update `updateMetadata()` to work with the new struct fields (it currently sets `edits` and `failed`, which remain in the struct) - -### 4. Update DomLabel -- git-style display - -In [DomLabel.lua](plugin/src/App/Components/PatchVisualizer/DomLabel.lua): - -- Replace the single "Lines X" / "Whitespace X" tag (lines 519-528) with two separate tags: - - `-M` tag using `theme.Diff.Remove` (red) -- shown first - - `+N` tag using `theme.Diff.Add` (green) -- shown second -- Each tag individually picks its color via `if isWhitespaceOnly then theme.Diff.WhitespaceOnly else theme.Diff.Remove` (and same pattern for Add). `isWhitespaceOnly` is only true when the entire Source change is whitespace -- so both go gray together naturally, but the code for each tag is independent -- When `overflow` is true, fall back to a single `100+` tag (current behavior, since we don't have exact split) -- Suppress a tag if its count is 0 (e.g., pure additions show only `+5`, no `-0`) - -### 4a. Update Theme.lua with new diff colors - -In [Theme.lua](plugin/src/App/Theme.lua), update the `Diff` section to add/replace colors used by the new tags: - -- `Diff.Add` = `Color3.fromHex("47CB7C")` (green, for `+N` tags and bar segments) -- `Diff.Remove` = `Color3.fromHex("F21717")` (red, for `-M` tags and bar segments) -- `Diff.Property` = `Color3.fromHex("FFC601")` (yellow, for `2P` tag) - -These replace the existing magenta placeholders for `Diff.Add`/`Diff.Remove` and add a new `Diff.Property` entry. DomLabel references these theme values instead of hardcoding hex colors. - -### 5. Add mini diff bar (GitHub-style) - -Add a small 5-segment colored bar next to the line change tags, like GitHub's `--stat` view. Each segment is a small square frame; the ratio of red-to-green segments reflects the ratio of removals-to-additions. - -- A single fixed-width bar (e.g., 40x8px) with a `UICorner` for rounded ends -- Inside: a horizontal `UIListLayout` with child `Frame`s sized proportionally using `UDim2.fromScale(ratio, 1)` where `ratio = count / total` - - Red section (`theme.Diff.Remove`) = `removed / total` - - Green section (`theme.Diff.Add`) = `added / total` - - Yellow section (`theme.Diff.Property`) = `propChanges / total` - - Total = `removed + added + propChanges` -- Sections with 0 count are omitted (no zero-width frames) -- For whitespace-only line changes: the red/green sections become gray (`theme.Diff.WhitespaceOnly`), yellow section stays yellow if props exist -- For overflow (100+): skip the bar (no meaningful ratio) -- Placed after all tags: `-3 +5 3P ` via the existing UIListLayout -- Clip children on the outer bar frame so the proportional fills stay within the rounded corners - -### 6. Add hover tooltips to change tags - -Add `TooltipText` or a custom tooltip on hover for each change tag: - -- Line tags: `"N lines removed"` / `"N lines added"` (when whitespace-only: `"N lines removed (whitespace only)"` / `"N lines added (whitespace only)"`) -- Overflow: `"More than 100 lines changed"` -- Props tag: `"N property changes (excluding Source)"` -- Failed tag: `"N changes failed to apply"` - -Implementation: Build a custom `Tooltip` component -- a small floating `TextLabel` that appears on `MouseEnter` of the tag, positioned above/below the tag. This gives full control over styling and positioning. Wrap the existing `ChangeTag` function component to accept an optional `tooltipText` prop and manage hover state internally. - -### 7. Restyle Props tag for consistency - -Change the "Props 2" tag to use the compact suffix format `2P` in yellow (`theme.Diff.Property`), matching the style of the `-3` / `+5` tags. This makes the full tag row read naturally as a single stat line: `-3 +5 2P` -- removals, additions, property changes. The `P` suffix distinguishes it from line changes while keeping it compact and visually consistent. \ No newline at end of file diff --git a/.cursor/plans/git_sync_defaults_audit_557237e0.plan.md b/.cursor/plans/git_sync_defaults_audit_557237e0.plan.md deleted file mode 100644 index 4dea27b1..00000000 --- a/.cursor/plans/git_sync_defaults_audit_557237e0.plan.md +++ /dev/null @@ -1,272 +0,0 @@ ---- -name: Git Sync Defaults Audit -overview: Audit of the git-based sync defaults feature spanning git.rs (server), PatchTree.lua (plugin default selection logic), SHA1.luau (plugin hashing), and the auto-staging pipeline. -todos: [] -isProject: false ---- - -# Audit: Git-Based Sync Defaults - -## Feature Summary - -When the plugin connects during `atlas serve`, the server computes git metadata (which files changed, SHA1 hashes of committed/staged script content) and sends it to the plugin. The plugin uses this to auto-select sync directions in the confirmation dialog: - -- **File unchanged in git** -> default "pull" (Studio changed it) -- **File changed + script + Studio Source matches committed hash** -> default "push" (developer changed file, Studio still has old version) -- **Otherwise** -> nil (user must decide) - -After confirmation, accepted files are auto-staged via `git add`. - -```mermaid -sequenceDiagram - participant Plugin - participant Server - participant Git - - Plugin->>Server: GET /api/rojo - Server->>Git: git diff HEAD --name-only - Server->>Git: git ls-files --others - Note over Server: Brief tree lock: resolve paths to Refs - Server->>Git: git show HEAD:path (per changed script) - Server->>Git: git show :0:path (per changed script) - Note over Server: compute_blob_sha1 for each version - Server-->>Plugin: ServerInfoResponse with gitMetadata - - Note over Plugin: PatchTree.build() computes defaultSelection per node - Note over Plugin: User reviews/overrides defaults - - Plugin->>Server: POST /api/write with stageIds - Note over Server: api.rs resolves stageIds to paths - Note over Server: change_processor writes Source, appends paths - Server->>Git: git add (consolidated, single call) -``` - - - -## Files Audited - - -| File | Lines | Purpose | -| ---------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------ | -| `[src/git.rs](src/git.rs)` | 766 | Server-side git helpers: changed files, blob SHA1, auto-staging | -| `[plugin/src/PatchTree.lua](plugin/src/PatchTree.lua)` | 715 | Default selection logic, tree building | -| `[plugin/src/SHA1.luau](plugin/src/SHA1.luau)` | 112 | Native SHA1 implementation | -| `[src/web/interface.rs](src/web/interface.rs)` | ~20 lines | `GitMetadata` struct, `stage_ids` on `WriteRequest` | -| `[src/web/api.rs](src/web/api.rs)` | ~30 lines | `handle_api_rojo` metadata computation, `handle_api_write` staging | -| `[src/change_processor.rs](src/change_processor.rs)` | ~40 lines | Source write staging, rename path tracking | -| `[src/snapshot/patch.rs](src/snapshot/patch.rs)` | ~10 lines | `stage_ids`/`stage_paths` fields on `PatchSet` | -| `[plugin/src/App/init.lua](plugin/src/App/init.lua)` | ~30 lines | `autoSelectedIds` construction, `cachedServerInfo` | -| `[plugin/src/ServeSession.lua](plugin/src/ServeSession.lua)` | ~80 lines | `stageIds` construction per selection type | -| `[plugin/src/App/StatusPages/Confirming.lua](plugin/src/App/StatusPages/Confirming.lua)` | 459 | Selection state management, `didUpdate` merge logic | -| `[tests/tests/git_sync_defaults.rs](tests/tests/git_sync_defaults.rs)` | 952 | Integration tests | -| `[plugin/src/PatchTree.spec.lua](plugin/src/PatchTree.spec.lua)` | ~200 lines | Plugin unit tests for git defaults | - - ---- - -## Verdict: No Critical Issues Found - -The feature is well-designed and correctly implemented. The round-trip identity invariant is not directly affected by this feature -- git metadata is read-only advisory data that influences UI defaults, not filesystem writes. The auto-staging is purely additive (`git add`) and cannot corrupt the filesystem. - ---- - -## Findings - -### Finding 1: Performance -- O(N) Subprocess Spawning [Medium] - -`compute_git_metadata` spawns **2 + 2N** git subprocesses for N changed scripts: - -```35:35:src/git.rs -// 1 call -``` - -- `git diff HEAD --name-only` (1 process) -- `git ls-files --others --exclude-standard` (1 process) -- Per changed script: `git show HEAD:` (N processes) -- Per changed script: `git show :0:` (N processes) - -On Windows, process creation is 10-100x slower than Linux. For 50 changed scripts, this is 102 subprocess spawns on every plugin connect. - -**Recommendation**: Replace per-file `git show` calls with a single `git cat-file --batch` invocation that reads all file contents in one subprocess. This collapses 2N calls to 1. Not a correctness issue, but could cause noticeable connect latency on large repos with many changes. Defer unless users report slow connects. - -### Finding 2: Windows Path Normalization Edge Case [Low] - -Git commands return paths with `/` separators. `PathBuf::from("src/module.luau")` on Windows preserves the forward slashes. The tree lookup may fail if the tree stores paths with `\` separators. - -```188:199:src/git.rs - for rel_path in &changed_files { - let abs_path = repo_root.join(rel_path); - let canonical_path = std::fs::canonicalize(&abs_path).ok(); - - let first = tree.get_ids_at_path(&abs_path); - let ids = if !first.is_empty() { - first - } else if let Some(ref canon) = canonical_path { - tree.get_ids_at_path(canon) - } else { - first - }; -``` - -The `canonicalize` fallback mitigates this, but `canonicalize` can fail (file deleted, permissions). When it fails, the instance won't appear in `changedIds` -- it degrades to "no default" which is safe. - -**Recommendation**: No action needed. The fallback is sufficient and the failure mode is safe (user decides manually). - -### Finding 3: `refresh_git_index` Duplicates Repo Detection [Low -- Code Quality] - -`[src/git.rs:252-260](src/git.rs)` walks up the directory tree to find `.git`, but the repo root is already cached in `ServeSession.git_repo_root`. - -```251:260:src/git.rs -pub fn refresh_git_index(project_dir: &Path) { - let mut check_dir = Some(project_dir); - let mut is_git_repo = false; - while let Some(dir) = check_dir { - if dir.join(".git").exists() { - is_git_repo = true; - break; - } - check_dir = dir.parent(); - } -``` - -Both call sites (`[src/cli/serve.rs:133](src/cli/serve.rs)` and `[src/cli/syncback.rs:282](src/cli/syncback.rs)`) could pass the known repo root instead. However, `syncback.rs` doesn't have a `ServeSession` -- it runs standalone. The current approach is correct for both call sites. - -**Recommendation**: Accept as-is. The directory walk is negligible cost and keeps the function self-contained for both serve and CLI syncback contexts. - -### Finding 4: Hash Parity Verified [No Issue] - -The critical correctness requirement is that the Rust server and Luau plugin produce identical SHA1 hashes for the same content. Both implementations use the git blob format `"blob \0"`: - -**Rust** (`[src/git.rs:118-124](src/git.rs)`): - -```118:124:src/git.rs -pub fn compute_blob_sha1(content: &str) -> String { - let header = format!("blob {}\0", content.len()); - let mut hasher = Sha1::new(); - hasher.update(header.as_bytes()); - hasher.update(content.as_bytes()); - format!("{:x}", hasher.finalize()) -} -``` - -**Luau** (`[plugin/src/PatchTree.lua:363-364](plugin/src/PatchTree.lua)`): - -```363:364:plugin/src/PatchTree.lua - local gitBlob = "blob " .. tostring(#source) .. "\0" .. source - local studioHash = SHA1(buffer.fromstring(gitBlob)) -``` - -- Rust `content.len()` = byte length. Luau `#source` = byte length. Consistent. -- Both use UTF-8 encoding. `\0` is the null byte in both languages. -- The `sha1` crate (Rust) and `SHA1.luau` (native Luau implementation with `--!native` + `--!optimize 2`) are standard SHA1. -- Integration tests in `[tests/tests/git_sync_defaults.rs](tests/tests/git_sync_defaults.rs)` verify against real `git hash-object` output. - -### Finding 5: Draft Source Fallback is a Nice Touch [No Issue] - -```372:384:plugin/src/PatchTree.lua - if defaultSelection == nil then - local ok, draft = pcall(ScriptEditorService.GetEditorSource, ScriptEditorService, instance) - if ok and draft ~= source then - local draftBlob = "blob " .. tostring(#draft) .. "\0" .. draft - local draftHash = SHA1(buffer.fromstring(draftBlob)) - for _, hash in hashes do - if draftHash == hash then - defaultSelection = "push" - break - end - end - end - end -``` - -When Script Drafts is enabled, `instance.Source` may not reflect the user's current editor content until they "commit" the draft. This fallback checks the draft source against committed hashes, ensuring the default selection is still accurate even with Script Drafts. - -### Finding 6: Consolidated git_add Prevents index.lock Races [No Issue] - -The staging pipeline correctly consolidates all paths into a single `git add` call: - -```1875:1880:src/change_processor.rs - // Consolidated git staging: one git_add call for all paths - // ... - if !pending_stage_paths.is_empty() { - if let Some(ref repo_root) = self.git_repo_root { - crate::git::git_add(repo_root, &pending_stage_paths); - } - } -``` - -Pre-resolved paths from `api.rs` are merged with Source-write paths from `change_processor.rs`. Rename handling correctly updates `pending_stage_paths` (retains old path, pushes new path) at lines 1363-1368, 1531-1534, and 1713-1717. The batch staging test (`batch_stage_20_files_no_index_lock_race`) confirms this works for 20 files. - -### Finding 7: Stale Git Metadata After Connect [Low -- By Design] - -Git metadata is computed once per `GET /api/rojo` call (plugin connect/reconnect). If git state changes while the user reviews the confirmation dialog, the defaults may be stale. This is acceptable because: - -1. The defaults are advisory -- the user can always override -2. Recomputing during the dialog would require a round-trip and could confuse the user if defaults change mid-review -3. Reconnecting (which triggers a fresh `GET /api/rojo`) gets fresh metadata - -### Finding 8: Selection State Management in Confirming.lua is Correct [No Issue] - -The `didUpdate` logic in `[Confirming.lua:107-132](plugin/src/App/StatusPages/Confirming.lua)` correctly handles streaming patch updates during confirmation: - -1. Preserves existing selections for unchanged items -2. Unselects items in `changedIds` (forces re-review) -3. Merges new default selections for newly added items -4. Only overwrites if the item doesn't already have a selection - -This prevents the confusing UX of defaults overriding conscious user choices during streaming updates. - -### Finding 9: `autoSelectedIds` Staging Logic is Sound [No Issue] - -The staging rules in `[ServeSession.lua:719-886](plugin/src/ServeSession.lua)`: - -- **Push-accepted**: Always staged (lines 732, 792, 837) -- the user accepted the filesystem version -- **Pull-accepted + auto-selected**: Staged (lines 759-761, 806-808) -- high confidence automatic selection -- **Pull-accepted + manually selected**: NOT staged -- deliberate design choice: manually chosen pulls may need review before staging -- **Ignored**: Never staged - -This is a thoughtful design that avoids staging files the user chose manually (they might want to `git diff` first). - ---- - -## Test Coverage Assessment - -**Excellent coverage across all three layers:** - - -| Layer | File | Tests | Coverage | -| ------------------ | ---------------------------------- | --------- | -------------------------------------------------------- | -| Unit (Rust) | `src/git.rs` | 20+ tests | SHA1 parity, changed files, staging, edge cases | -| Integration (Rust) | `tests/tests/git_sync_defaults.rs` | 20 tests | Full pipeline: metadata, staging, renames, batch 20-file | -| Unit (Luau) | `plugin/src/PatchTree.spec.lua` | ~15 tests | Default selections, hash matching, edge cases | - - -**Notable test scenarios covered:** - -- No git repo (feature disabled) -- No commits yet (empty HEAD) -- Untracked, staged, unstaged, deleted files -- Init-style scripts (`init.luau` in directories) -- All script types (Module, Server, Client) -- Non-script changes (model files) -- Batch staging of 20 files (index.lock race prevention) -- Source write + staging interaction -- Rename + staging (new path staged, not old) -- Reconnect gets fresh metadata -- Draft source fallback -- Mixed push/pull batch operations - ---- - -## Summary - -The git-based sync defaults feature is **well-architected and correctly implemented**. Key design strengths: - -1. **Three-phase tree lock** in `compute_git_metadata` minimizes lock contention -2. **Consolidated `git add`** prevents index.lock races -3. **Safe degradation** at every level (no git = no defaults, hash mismatch = user decides) -4. **Draft source fallback** handles Script Drafts edge case -5. **Thorough test coverage** across all three layers -6. **Clear separation of concerns**: server computes data, plugin makes UI decisions, staging is consolidated - -The only actionable recommendation is the subprocess spawning optimization (Finding 1), which is a performance concern, not a correctness issue. It should be deferred unless users report slow plugin connects on repos with many changed files. \ No newline at end of file diff --git a/.cursor/plans/live_syncback_audit_fixes_561d17c7.plan.md b/.cursor/plans/live_syncback_audit_fixes_561d17c7.plan.md deleted file mode 100644 index 509cf17a..00000000 --- a/.cursor/plans/live_syncback_audit_fixes_561d17c7.plan.md +++ /dev/null @@ -1,373 +0,0 @@ ---- -name: Live Syncback Audit Fixes -overview: "Fix 6 issues found during the live syncback audit: resource leaks from mem::forget, crash-on-error instead of recovery, concurrent syncback races, silent malformed input corruption, misleading doc comments, and missing test coverage." -todos: - - id: fix1-mem-forget - content: "Fix 1: Replace `mem::forget` with `drop()` in serve.rs (lines 61, 135)" - status: completed - - id: fix2-error-recovery - content: "Fix 2: Catch syncback errors and log+recover instead of crashing (serve.rs lines 84-88)" - status: completed - - id: fix3-concurrent-guard - content: "Fix 3: Reject concurrent syncback requests (SyncbackSignal::fire returns bool, api.rs returns 409)" - status: completed - - id: fix4-validate-counts - content: "Fix 4: Validate chunk counts match rbxm blob size (build_dom_from_chunks)" - status: completed - - id: fix5-doc-comment - content: "Fix 5: Correct misleading ServiceChunk doc comment (interface.rs lines 30-42)" - status: completed - - id: fix6-tests - content: "Fix 6: Add 5 new integration tests (attributes/tags, multiple refs, concurrent, malformed, properties-only)" - status: completed - - id: run-ci - content: Run CI after all fixes to verify everything passes - status: completed -isProject: false ---- - -# Live Syncback Audit Fixes - -> This plan was generated by `/audit` from a Plan-mode session. -> Refer to `.cursor/rules/atlas.mdc` for full project standards. - -## Standards - -These standards govern every fix in this plan. An implementer MUST read `.cursor/rules/atlas.mdc` before starting. - -### Round-Trip Identity (from `atlas.mdc` Quality Standard) - -Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -### CLI Syncback Parity (from `atlas.mdc` Two-Way Sync Strategy) - -Plugin-based sync must produce **exactly the same filesystem output** that `atlas syncback` would give for the same input. Byte-for-byte identical files, identical directory structures, identical naming. Any divergence is a bug until proven otherwise. - -### Code Quality (from `atlas.mdc` Code Quality Standard) - -DRY code that is easy to reason about and hard to get wrong. The same slugify/dedup/meta-update pattern should not be copy-pasted across files. Small refactors (2-3 call sites) are included as fixes. Major rewrites (10+ call sites) are deferred. - -## Context - -Audited the "Live syncback" feature on the `ambiguous-paths` branch. This feature adds a one-click full sync from Studio to filesystem via `POST /api/syncback`. The plugin serializes all services (properties via msgpack, children via a single rbxm blob), sends them to the server, which reconstructs a `WeakDom`, runs `syncback_loop(incremental=false)`, and writes the result. The server shuts down and restarts after each syncback. - -**Key files audited:** - -- `src/cli/serve.rs` -- serve loop, `run_live_syncback()`, `build_dom_from_chunks()` -- `src/web/api.rs` -- `handle_api_syncback()` endpoint -- `src/web/mod.rs` -- `SyncbackSignal`, `LiveServer` -- `src/web/interface.rs` -- `ServiceChunk`, `SyncbackRequest`, `SyncbackPayload` -- `plugin/src/App/init.lua` -- `performSyncback()`, `SYNCBACK_SERVICES` -- `plugin/src/ChangeBatcher/encodeService.lua` -- service property/ref encoding - -**No critical round-trip identity violations found.** The CLI parity tests (`assert_live_matches_cli`) provide strong guarantees. The round-trip test (`roundtrip_build_syncback_rebuild`) covers the full lifecycle. All 6 fixes below are correctness hardening, resilience, and test coverage. - -## Fixes - -Each fix below was approved by the user during the audit quiz. Implement them in order. Each fix includes its test requirements -- a fix is not complete until its tests pass. - ---- - -### Fix 1: Replace `mem::forget` with proper `drop` - -- **Status:** Approved -- **Finding:** Step 14 (Challenged Limitations) -- resource leak accumulating per syncback invocation -- **Files:** `[src/cli/serve.rs](src/cli/serve.rs)` (lines 61, 135) -- **Problem:** `forget(session_old)` at line 135 leaks the entire oneshot `ServeSession` (tree, VFS, project) after every live syncback. `forget(session)` at line 61 leaks the initial config-reading session at startup. The oneshot session has `change_processor: None`, `suppressed_paths: None`, `ref_path_index: None`, `git_repo_root: None` -- all `Option` types that drop cleanly as `None`. The `Vfs` destructor will stop its watcher thread. There is no reason to use `forget()`. -- **Solution:** - - Line 135: Replace `forget(session_old);` with `drop(session_old);` - - Line 61: Replace `forget(session);` with `drop(session);` - - Remove `use std::mem::forget;` from the imports (line 4) if no other uses remain -- **Risk:** Very low. The oneshot session's fields are all `Option::None` or standard types. The VFS watcher thread is dormant (no watches registered). Existing live syncback tests exercise this path. -- **Verify round-trip:** Run `parity_scripts` and `roundtrip_build_syncback_rebuild` -- both must pass. -- **Verify syncback parity:** Run `assert_live_matches_cli` tests -- filesystem output unchanged. -- **Tests required:** - - No new tests needed. Existing tests `syncback_twice_different_data` and `server_comes_back_functional` already exercise repeated syncback and verify the server recovers correctly. - ---- - -### Fix 2: Recover from syncback errors instead of crashing - -- **Status:** Approved -- **Finding:** Step 14 (Challenged Limitations) -- server crashes permanently on syncback failure -- **Files:** `[src/cli/serve.rs](src/cli/serve.rs)` (lines 84-88) -- **Problem:** `run_live_syncback(&project_path, payload)?` propagates errors via `?`, crashing the serve process. The plugin shows "Syncback data sent" but the server never comes back. -- **Solution:** Catch the error and log it, then continue to restart the server: - -```rust -ServerExitReason::SyncbackRequested(payload) => { - log::info!("Live syncback requested, running..."); - match run_live_syncback(&project_path, payload) { - Ok(()) => log::info!("Syncback complete, restarting serve..."), - Err(err) => log::error!("Live syncback failed: {err:#}. Restarting serve..."), - } - continue; -} -``` - -- **Risk:** Very low. The server restarts fresh regardless (new VFS, new session). An error just means the filesystem wasn't updated -- the old state persists. -- **Verify round-trip:** Existing tests still pass. The error path is tested by Fix 6 test 4. -- **Verify syncback parity:** N/A -- this fix doesn't change the syncback logic, only error handling. -- **Tests required:** - - **Rust integration test** (Fix 6, test 4): Send malformed chunk counts that trigger an error in `build_dom_from_chunks`. Verify the server recovers and comes back online. - ---- - -### Fix 3: Reject concurrent syncback requests - -- **Status:** Approved -- **Finding:** Step 14 (Challenged Limitations) -- second syncback silently overwrites first payload -- **Files:** `[src/web/mod.rs](src/web/mod.rs)` (`SyncbackSignal::fire`, lines 43-46), `[src/web/api.rs](src/web/api.rs)` (`handle_api_syncback`, line 259) -- **Problem:** `fire()` unconditionally overwrites any existing payload. If two requests arrive before the accept loop processes the first, the first payload is silently lost. -- **Solution:** - 1. Change `SyncbackSignal::fire()` to return `bool`: - -```rust -pub fn fire(&self, payload: SyncbackPayload) -> bool { - let mut guard = self.payload.lock().unwrap_or_else(|e| e.into_inner()); - if guard.is_some() { - return false; - } - *guard = Some(payload); - self.notify.notify_one(); - true -} -``` - -1. In `handle_api_syncback`, check the return value: - -```rust -if !syncback_signal.fire(payload) { - return msgpack( - ErrorResponse::bad_request("A syncback is already in progress"), - StatusCode::CONFLICT, - ); -} -``` - -- **Risk:** Very low. Happy path unchanged. Only adds rejection for the concurrent case. -- **Verify round-trip:** Existing tests pass (single syncback). New test verifies rejection. -- **Verify syncback parity:** N/A -- this fix doesn't change syncback output. -- **Tests required:** - - **Rust integration test** (Fix 6, test 3): Fire two syncback requests rapidly, verify the second returns 409 Conflict and the server still processes the first successfully. - ---- - -### Fix 4: Validate chunk counts match rbxm blob size - -- **Status:** Approved -- **Finding:** Step 11g (Audit Step 4, server-side processing) -- silent cursor clamping corrupts subsequent services -- **Files:** `[src/cli/serve.rs](src/cli/serve.rs)` (`build_dom_from_chunks`, lines 184-210) -- **Problem:** Line 187 `let end = (cursor + total).min(cloned_children.len());` silently clamps when counts exceed blob size. This corrupts cursor position for all subsequent services. -- **Solution:** - 1. Inside the service loop, replace the `.min()` clamp with an early error: - -```rust -let end = cursor + total; -anyhow::ensure!( - end <= cloned_children.len(), - "Service '{}' claims {} children + {} carriers but only {} instances remain in blob", - chunk.class_name, child_count, ref_count, - cloned_children.len().saturating_sub(cursor) -); -``` - -1. After the service loop, validate all instances were consumed: - -```rust -anyhow::ensure!( - cursor == cloned_children.len(), - "Service chunks account for {} instances but rbxm blob contains {}", - cursor, cloned_children.len() -); -``` - -- **Risk:** Very low. Only triggers on malformed input. Normal requests are unaffected. With Fix 2, the error is caught and the server recovers. -- **Verify round-trip:** Existing tests pass (all have correct counts). New test verifies rejection. -- **Verify syncback parity:** N/A -- this fix doesn't change output for valid input. -- **Tests required:** - - **Rust integration test** (Fix 6, test 4): Send a request where service chunks claim more children than the blob contains. Verify the server logs an error and recovers. - ---- - -### Fix 5: Correct misleading `ServiceChunk` doc comment - -- **Status:** Approved -- **Finding:** Step 4 (server-side processing audit) -- doc describes behavior that doesn't exist -- **Files:** `[src/web/interface.rs](src/web/interface.rs)` (lines 30-42) -- **Problem:** Doc says "Indices <= child_count point directly to a child instance" but the implementation only indexes into the carrier subrange. This misleads future maintainers. -- **Solution:** Replace the doc comment block (lines 30-42) with: - -```rust -/// Metadata for a single service in the live syncback request. -/// -/// Children are NOT stored here -- they live in the top-level `data` blob -/// (a single rbxm containing all children from all services). -/// -/// Each service's range in the blob is `child_count + ref_target_count` -/// consecutive entries. The first `child_count` are real children (parented -/// to the service). The next `ref_target_count` are ObjectValue carriers -/// whose `Value` property holds a Ref to the actual target. -/// -/// `refs` maps property names to 1-based indices into the carrier subrange -/// (NOT the full service range). Index 1 = first carrier, index 2 = second, -/// etc. Index 0 or out-of-range values are ignored (treated as nil). -``` - -- **Risk:** Zero. Documentation-only change. -- **Verify round-trip:** N/A -- **Verify syncback parity:** N/A -- **Tests required:** None. - ---- - -### Fix 6: Add missing test coverage - -- **Status:** Approved -- **Finding:** Step 13 (audit report) -- several edge cases lack test coverage -- **Files:** `[tests/tests/live_syncback.rs](tests/tests/live_syncback.rs)` -- **Problem:** Missing tests for service attributes/tags, multiple Ref properties, concurrent requests, malformed input, and properties-only services. -- **Solution:** Add the following tests to `tests/tests/live_syncback.rs`: - -**Test 1: `parity_service_attributes_and_tags`** - -- Create a Lighting service with custom Attributes (e.g., `{"CustomFloat": Float32(1.5)}`) and Tags (e.g., `["TestTag"]`) -- Use `make_service_chunk_full` with Attributes and Tags encoded as `Variant::Attributes` and `Variant::Tags` in the properties map -- Run `assert_live_matches_cli` - -**Test 2: `parity_multiple_service_refs`** - -- Create a service (Workspace) with two Ref properties: one pointing to a Part child, one pointing to a Light child -- Use `make_service_chunk_full` with two carrier ObjectValues and two `refs` entries -- Run `assert_live_matches_cli` - -**Test 3: `rejects_concurrent_syncback`** (for Fix 3) - -- Use `run_serve_test` to start a server -- Send a valid syncback request (don't wait for restart) -- Immediately send a second syncback request -- Verify the second returns 409 Conflict -- Wait for the server to come back online (first syncback completes) - -**Test 4: `recovers_from_malformed_chunks`** (for Fixes 2+4) - -- Use `run_serve_test` to start a server -- Record the initial session info -- Send a syncback request with mismatched counts (e.g., `child_count: 999` but empty data blob) -- Verify the server comes back online (new session ID) -- Verify the filesystem is unchanged (the malformed syncback was rejected before writing) - -**Test 5: `parity_properties_only_no_children`** - -- Create 3 services (Lighting, SoundService, TextChatService) all with properties but zero children -- Verify empty rbxm blob case works with properties -- Run `assert_live_matches_cli` -- **Risk:** Zero. Test-only additions. -- **Verify round-trip:** The parity tests verify round-trip by design. -- **Verify syncback parity:** The parity tests verify CLI parity by design. -- **Tests required:** Self-contained -- the fix IS the tests. - ---- - -## Skipped Fixes - -None -- all identified fixes were approved. - -## Accepted Limitations - -### rbxm Child Ordering Assumption - -- **Limitation:** Live syncback relies on `SerializationService:SerializeInstancesAsync()` preserving the array order of top-level instances in the resulting rbxm blob. If Roblox ever changes the serializer to reorder by class, the cursor-based partitioning in `build_dom_from_chunks` would break. -- **Scenario:** A future Roblox engine update changes serialization order, causing children to be assigned to wrong services. -- **User decision:** Accepted for this release. This is the standard approach used by all Rojo-family tools. The rbxm format preserves parent-child relationships and child ordering through the PRNT chunk. Roblox has never changed this behavior. -- **Mitigation:** Fix 4 adds count validation that would catch the symptom (cursor doesn't consume all instances) even if not the root cause. - -### Asymmetric ClockTime Exclusion - -- **Limitation:** `encodeService.lua` excludes `Lighting.ClockTime` (alias for `TimeOfDay`) but the server-side `build_dom_from_chunks` doesn't have this exclusion. -- **Scenario:** A crafted request with both `ClockTime` and `TimeOfDay` could produce conflicting properties. This never happens in normal usage since the plugin prevents it. -- **User decision:** Accepted. The plugin is the only intended client, and it already filters correctly. -- **Mitigation:** None needed beyond the existing plugin-side filter. - -### No Session ID on `/api/syncback` - -- **Limitation:** Unlike `/api/write`, the syncback endpoint has no session ID validation. Any client that knows the host/port can trigger a syncback. -- **Scenario:** On a shared network with `serveAddress: "0.0.0.0"`, someone could overwrite project files. -- **User decision:** Accepted by design. The syncback is intended to work from the NotConnected page (no active session). The `servePlaceIds`/`blockedPlaceIds` whitelist provides protection for team environments. -- **Mitigation:** Existing place ID validation. The serve address defaults to `127.0.0.1` (localhost only). - -## Deferred Refactors - -### Duplicate Service Lists - -The service list exists in 3 places that must stay synchronized: - -1. `SYNCBACK_SERVICES` in `plugin/src/App/init.lua` (lines 7-22) -2. `VISIBLE_SERVICES` in `src/syncback/mod.rs` (lines 73-88) -3. Implicitly in test helper code (`serve_util.rs`) - -Currently they match exactly (14 services). If these diverge, Ref properties targeting instances in a missing service would be silently lost. A cross-language shared constant is impossible (Lua vs Rust), but a CI check or a test that compares the lists (e.g., parsing the Lua source) could prevent drift. Deferred because it's a build/CI infrastructure change, not a code change. - -### `build_dom_from_chunks` Duplication with Test Helper - -`build_dom_from_chunks` in `serve.rs` and `make_rbxl_from_chunks` in `serve_util.rs` implement nearly identical DOM reconstruction logic. The test helper was written to mirror the production code for CLI parity tests. If the production code changes, the test helper must be updated in lockstep. Consider extracting the shared logic into a `librojo` function that both can call. Deferred because it requires making `build_dom_from_chunks` public and adjusting its API. - -## Test Plan - -Tests are not optional. Every approved fix must have test coverage. A fix is not complete until its tests pass. - -### Rust Integration Tests (`tests/tests/live_syncback.rs`) - -- `parity_service_attributes_and_tags` -- service with Attributes + Tags survives round-trip (Fix 6, test 1) -- `parity_multiple_service_refs` -- service with 2+ Ref properties, all carriers resolved correctly (Fix 6, test 2) -- `rejects_concurrent_syncback` -- second syncback returns 409 Conflict (Fix 6, test 3) -- `recovers_from_malformed_chunks` -- mismatched counts cause error, server recovers (Fix 6, test 4) -- `parity_properties_only_no_children` -- 3 services with properties, zero children, empty blob (Fix 6, test 5) - -### Existing Tests (Must Continue Passing) - -All existing tests in `tests/tests/live_syncback.rs` must pass after all fixes: - -- `parity_scripts`, `parity_models_with_properties`, `parity_special_names`, `parity_duplicate_names` -- `parity_deep_hierarchy`, `parity_mixed_file_types`, `parity_multi_service` -- `parity_empty_services_mixed`, `parity_lighting_properties`, `parity_soundservice_properties` -- `parity_starterplayer_properties`, `parity_textchatservice_properties` -- `parity_childless_service_with_properties`, `parity_service_properties_with_children` -- `parity_multiple_services_with_properties`, `parity_cross_service_refs` -- `parity_camera_not_synced`, `rejects_bad_protocol`, `rejects_bad_version` -- `rejects_blocked_place`, `rejects_unlisted_place`, `allows_whitelisted_place` -- `allows_any_place_when_unrestricted`, `server_comes_back_functional` -- `syncback_twice_different_data`, `syncback_replaces_all_old_files` -- `roundtrip_build_syncback_rebuild` - -## Test Rules - -The implementer MUST follow these rules when writing tests for this plan: - -### For bugs found and fixed - -Every bug fix MUST have a test that: - -1. Would have **FAILED** before the fix -2. **PASSES** after the fix -3. Prevents the bug from regressing - -### For missing coverage identified - -For each missing test coverage gap: - -1. Write the test -2. Verify it passes against the current implementation -3. If it fails, investigate -- it may have found another bug - -### Scope: test every affected layer - -For each finding, determine which test layers are affected and write tests in ALL of them: - -- Fixes 1-5 affect the Rust server -- integration tests in `tests/tests/live_syncback.rs` -- No Lua spec tests needed (plugin encoding is unchanged) -- No snapshot tests needed (syncback output format is unchanged) - -## Final Step: Run CI - -After ALL fixes and tests are implemented, run the `/ci` command (see `.cursor/commands/ci.md`) to execute the full CI pipeline. Every fix must pass CI before the plan is considered complete. Do not skip this step. \ No newline at end of file diff --git a/.cursor/plans/live_syncback_float_precision_1be79350.plan.md b/.cursor/plans/live_syncback_float_precision_1be79350.plan.md deleted file mode 100644 index 1aa5f16d..00000000 --- a/.cursor/plans/live_syncback_float_precision_1be79350.plan.md +++ /dev/null @@ -1,195 +0,0 @@ ---- -name: Live syncback fixes -overview: "Fix five issues: lost Workspace attributes, spurious ClockTime, Rojo_Ref_CurrentCamera leak, and float precision noise via f32 truncation." -todos: - - id: fix-attributes-encoding - content: Add explicit Attributes/Tags encoding to encodeService.lua (mirroring encodeInstance.lua) - status: completed - - id: fix-clocktime - content: Filter non-serializable properties server-side in build_dom_from_chunks using the Rust reflection DB - status: completed - - id: fix-currentcamera-ref - content: "Stop Rojo_Ref_CurrentCamera from leaking: filter deferred_referents after camera destruction in syncback_loop" - status: completed - - id: fix-float-rounding - content: Truncate all float values to f32 in UnresolvedValue::from_variant for rbxl parity - status: completed - - id: fix-index-refs - content: Change service-level refs to index-based with ObjectValue carriers (childCount + refTargetCount, 1-based index, 0=nil) - status: completed -isProject: false ---- - -# Live Syncback Fixes - -## Issues 1-4: DONE - -## Issue 5: Index-Based Service Refs via ObjectValue Carriers - -**Problem:** Service Ref targets aren't always direct children. Can't include arbitrary instances directly in the rbxm without duplicating or breaking serialization. - -**Solution:** Create temporary ObjectValue instances as Ref carriers. The ObjectValue's `Value` property IS a Ref that gets preserved in the rbxm because both the ObjectValue and the target are in the same blob. - -**Layout:** - -``` -allChildren = [ - ...svc1_children, ...svc1_objectValues, - ...svc2_children, ...svc2_objectValues, - ... -] -``` - -### Plugin -- `[plugin/src/ChangeBatcher/encodeService.lua](plugin/src/ChangeBatcher/encodeService.lua)` - -Return metadata + list of ObjectValue carrier instances to append: - -```lua -local children = service:GetChildren() -local refTargets = {} -- ObjectValue carriers - -for propertyName ... do - if descriptor.dataType == "Ref" then - local readOk, target = descriptor:read(service) - if readOk and target then - -- Check if target is a direct child - for i, child in children do - if child == target then - refs[propertyName] = i -- 1-based into children range - goto found - end - end - -- Not a child: create ObjectValue carrier - local carrier = Instance.new("ObjectValue") - carrier.Name = propertyName - carrier.Value = target - table.insert(refTargets, carrier) - refs[propertyName] = #children + #refTargets - ::found:: - end - continue - end -end - -chunk.childCount = #children -chunk.refTargetCount = #refTargets -return chunk, refTargets -``` - -### Plugin -- `[plugin/src/App/init.lua](plugin/src/App/init.lua)` `performSyncback` - -Append children + ObjectValue carriers, clean up after serialization: - -```lua -local allRefTargets = {} -for _, className in SYNCBACK_SERVICES do - local ok, service = pcall(game.FindService, game, className) - if ok and service then - local chunk, refTargets = encodeService(service) - for _, child in service:GetChildren() do - table.insert(allChildren, child) - end - for _, carrier in refTargets do - table.insert(allChildren, carrier) - table.insert(allRefTargets, carrier) - end - table.insert(services, chunk) - end -end - -local data = buffer.create(0) -if #allChildren > 0 then - data = SerializationService:SerializeInstancesAsync(allChildren) -end - --- Clean up temporary ObjectValue carriers -for _, carrier in allRefTargets do - carrier:Destroy() -end -``` - -### Server -- `[src/web/interface.rs](src/web/interface.rs)` - -```rust -pub struct ServiceChunk { - pub class_name: String, - #[serde(default)] - pub child_count: u32, - #[serde(default)] - pub ref_target_count: u32, - #[serde(default)] - pub properties: HashMap, - #[serde(default)] - pub refs: HashMap, // prop_name -> 1-based index, 0=nil -} -``` - -Remove `ServiceRef` struct. - -### Server -- `[src/cli/serve.rs](src/cli/serve.rs)` `build_dom_from_chunks` - -```rust -let child_count = chunk.child_count as usize; -let ref_count = chunk.ref_target_count as usize; -let total = child_count + ref_count; -let end = (cursor + total).min(cloned_children.len()); -let service_range = &cloned_children[cursor..end]; - -// Parent only the real children -for &child_ref in &service_range[..child_count.min(service_range.len())] { - dom.transfer_within(child_ref, service_ref); -} - -// Resolve refs using the full range -let mut carriers_to_destroy = Vec::new(); -if !chunk.refs.is_empty() { - for (prop_name, &idx) in &chunk.refs { - if idx == 0 || (idx as usize - 1) >= service_range.len() { - continue; - } - let carrier_ref = service_range[idx as usize - 1]; - // If in the ref target range, it's an ObjectValue carrier - if (idx as usize) > child_count { - let carrier = dom.get_by_ref(carrier_ref).unwrap(); - if let Some(Variant::Ref(actual_target)) = carrier.properties.get("Value") { - let service = dom.get_by_ref_mut(service_ref).unwrap(); - service.properties.insert( - prop_name.as_str().into(), - Variant::Ref(*actual_target), - ); - } - carriers_to_destroy.push(carrier_ref); - } else { - // Direct child ref - let service = dom.get_by_ref_mut(service_ref).unwrap(); - service.properties.insert( - prop_name.as_str().into(), - Variant::Ref(carrier_ref), - ); - } - } -} - -// Destroy ObjectValue carriers -for carrier_ref in carriers_to_destroy { - dom.destroy(carrier_ref); -} - -cursor = end; -``` - -### Test helpers -- `[tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs)` - -- `ServiceEntry` gets `ref_targets: Vec` for ObjectValue carriers -- `make_service_chunk_full` refs param: `Vec<(&str, u32)>` (prop_name, 1-based index) -- `build_syncback_request` appends ref_targets after children per service -- `make_rbxl_from_chunks` resolves refs: direct children by index, carriers by reading `Value` property - -### Tests - -- Update `parity_camera_not_synced` to use index-based ref with ObjectValue carrier -- Existing tests that don't use refs continue to work (empty refs map, refTargetCount=0) - -## Deferred: Matching Parity - -Revisit after these fixes land. \ No newline at end of file diff --git a/.cursor/plans/luau-optimize_cursor_command_ce1448a8.plan.md b/.cursor/plans/luau-optimize_cursor_command_ce1448a8.plan.md deleted file mode 100644 index 10bf0311..00000000 --- a/.cursor/plans/luau-optimize_cursor_command_ce1448a8.plan.md +++ /dev/null @@ -1,743 +0,0 @@ ---- -name: luau-optimize cursor command -overview: Create a `/luau-optimize` Cursor command at `.cursor/commands/luau-optimize.md` that uses the `luau-compile`, `luau-analyze`, and `luau-ast` CLI tools to analyze and optimize Luau files for maximum performance, type safety, and native codegen quality. -todos: - - id: create-command - content: Create `.cursor/commands/luau-optimize.md` with the full multi-phase optimization workflow - status: completed -isProject: false ---- - -# /luau-optimize Cursor Command - -## Deliverable - -Single file: `[.cursor/commands/luau-optimize.md](.cursor/commands/luau-optimize.md)` - -## Context - -**This command is always for Roblox Luau.** All scripts being optimized run in the Roblox engine (Studio / live servers / clients). This means: - -- Roblox APIs (`game`, `workspace`, `Players`, `RunService`, etc.) are always available -- The vector type is `Vector3` (Roblox userdata), not the `vector` primitive -- Native codegen (`--!native`) primarily benefits server-side Scripts; client LocalScripts benefit less due to device diversity -- The `luau` standalone runtime cannot execute most Roblox scripts (they depend on engine APIs); it is only useful for pure-logic library modules with no Roblox dependencies -- `luau-compile` should use `--vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3` for accurate Roblox vector optimization analysis -- Roblox performance patterns (event-driven design, frame budgets, RunService events, instance streaming, replication) are always relevant -- Studio testing uses `--!optimize 1` by default; live experiences use `--!optimize 2` - -## Design - -The command is a structured prompt file that instructs the AI agent through a multi-phase optimization workflow. It supports both single-file and multi-file/directory modes. - -### Phase Structure - -**Phase 0 -- Scope Resolution and Configuration** - -Resolve the target: - -- If user specifies a file: optimize that file -- If user specifies a directory: discover all `.luau`/`.lua` files, prioritize by traffic/complexity -- If no argument: optimize the currently open file - -Infer script context from filename and path (checked in this order): - -1. **Filename suffix** (highest priority, overrides path): - - `*.server.luau` / `*.server.lua` -> always server Script (`--!native` is high-value) - - `*.client.luau` / `*.client.lua` -> always client Script/LocalScript (`--!native` less beneficial due to device diversity) - - `*.legacy.luau` / `*.legacy.lua` -> **ambiguous** (could be cloned/moved at runtime). Ask the user where it runs. - - `*.luau` / `*.lua` (no suffix) -> ModuleScript, context depends on who requires it. Fall through to path check. -2. **Path-based inference** (for ModuleScripts and ambiguous cases): - - Path contains `ServerScriptService`/`ServerStorage` -> server-side module - - Path contains `StarterPlayer`/`StarterGui`/`StarterCharacterScripts`/`ReplicatedFirst` -> client-side module - - Path contains `ReplicatedStorage`/`shared` -> shared module (runs on both; conservative `--!native` recommendation) - - If path is ambiguous or outside a Roblox project structure -> ask the user - -**Quiz the user using AskQuestion tool (combined, structured):** - -``` -Title: "/luau-optimize Configuration" - -Question 1: "Compilation optimization intensity" - - minimal -- Headers (--!strict/--!native/--!optimize 2), type annotations on all function signatures, simple deprecated pattern replacements - - moderate -- + function restructuring for inlining, import hoisting, compound operators, fastcall enablement, allocation reduction - - insane -- + every micro-optimization from the pattern catalog, full bytecode analysis, register pressure optimization, closure caching analysis - - (other: freeform) - -Question 2: "Algorithm optimization" - - none -- Don't touch logic or data flow - - low hanging fruit -- Obvious O(n^2)->dict, redundant iterations, missing caches - - moderate -- + data structure changes, caching strategies, event-driven refactors, loop fusion - - insane -- + full algorithmic redesign where beneficial, dynamic programming, architectural restructuring - - (other: freeform) - -Question 3: "Benchmarking" - - yes -- Benchmark all non-trivial changes with luau CLI (when function is standalone) - - no -- Trust bytecode/codegen metrics only - - +EV only -- Benchmark only when algorithmic changes or ambiguous bytecode results warrant it -``` - -**Derived behavior from quiz answers:** - - -| Setting | minimal | moderate | insane | -| ------------------------ | --------------------------- | ------------------------------------- | ---------------------------------------- | -| Headers | Always | Always | Always | -| Type annotations | Function signatures | Function signatures + hot path locals | Function signatures + all locals | -| Pattern replacements | Deprecated only | Full Priority 2 catalog | Full Priority 2 + Priority 5 | -| Function restructuring | No | Yes (Priority 3) | Yes + aggressive splitting | -| Algorithmic changes | Per algo quiz | Per algo quiz | Per algo quiz | -| Bytecode verification | After all changes | After each priority | After each individual change | -| `@native` vs `--!native` | `--!native` unless big file | Selective `@native` on hot functions | Full analysis of which functions benefit | - - -**Restructuring scope** scales with compilation intensity: - -- minimal: No restructuring. Only additive changes (headers, annotations, pattern swaps). -- moderate: Break up monoliths, reorder locals for inlining, hoist imports. Preserve existing exports/API. -- insane: Aggressive restructuring permitted. May change internal function boundaries, introduce helper modules, rewrite data flow. - -**Phase 1 -- Deep Code Read and Algorithmic Analysis (FIRST)** - -Read the entire source file thoroughly before touching any tools. This is the highest-leverage phase -- algorithmic improvements produce order-of-magnitude speedups that dwarf any bytecode-level optimization. This is also the largest code change, so it must come first (everything else builds on top of it). - -Understand the code's purpose, data flow, and architecture. - -**Step 1 -- Structural decomposition (read and mentally refactor)** - -Monolithic functions hide their actual algorithmic structure behind walls of interleaved concerns. Before analyzing complexity, first understand what the code is *actually doing* by decomposing it mentally (and then physically if restructuring is allowed): - -- **Identify responsibilities**: What distinct jobs does each large function perform? A 200-line function usually contains 3-5 logical steps that should be separate functions. -- **Trace data flow**: What goes in, what comes out, what is mutated along the way? Map the pipeline. -- **Separate concerns**: Validation, transformation, I/O, state management, error handling -- these are often tangled together. Separating them reveals the core algorithm. -- **Name the steps**: If you can't name what a code block does in 3-5 words, it's doing too much. -- **Look for hidden abstractions**: Repeated patterns of "iterate, filter, transform, collect" that could be a single well-named helper. - -When the quiz allows restructuring (moderate/insane compilation intensity): - -- Physically decompose monoliths into focused local functions. Each function should do one thing. -- This decomposition often *reveals* optimization opportunities that were invisible in the monolith: you can now see that step 2 recomputes what step 1 already knew, or that the inner loop could be replaced with a lookup table built in the outer loop. -- Smaller functions are also easier for the compiler to inline at `-O2`, so this restructuring pays double -- clearer code AND better bytecode. -- Preserve the original function as a thin orchestrator that calls the decomposed pieces. - -Even when the quiz says "minimal" (no restructuring), still perform this mental decomposition to inform the analysis below. - -**Step 2 -- Algorithmic analysis** - -With the structure understood (or cleaned up), analyze: - -- **Complexity analysis**: Identify the time complexity of every significant function. Look for: - - O(n^2) or worse: nested loops over the same data, repeated linear searches, quadratic string building - - O(n) where O(1) is possible: linear search replaceable with dictionary/set lookup - - Repeated work: same computation done multiple times when it could be cached/memoized - - Unnecessary copies: cloning data that could be referenced or mutated in place - - Hidden quadratics: a function that looks O(n) but calls another O(n) function inside a loop -- **Data structure fitness**: Is the right data structure being used? - - Array used for membership testing -> should be a set (dictionary with `true` values) - - Linear scan for lookup by key -> should be a dictionary - - Repeated sort of mostly-sorted data -> consider maintaining sorted order on insert - - Flat list with frequent removal from middle -> consider swap-and-pop - - Large string built incrementally -> `table.concat` pattern or `buffer` - - Multiple parallel arrays tracking related data -> single array of structs (table of tables) - - Unbounded growth without cleanup -> consider size limits, LRU eviction, or periodic pruning -- **Caching and memoization**: - - Pure functions called with the same args repeatedly -> memoize - - Expensive property reads in loops -> cache in local before loop - - Computed values that don't change within a scope -> hoist out - - Derived state recomputed from scratch on every access -> maintain incrementally -- **Redundant work elimination**: - - Multiple passes over the same data that could be fused into one - - Recomputing derived state that could be maintained incrementally - - Sorting or filtering that could be done once and reused - - Deep cloning where shallow clone or reference suffices - - Building an intermediate result that is immediately discarded after extracting one field -- **Architectural patterns**: - - Per-frame polling where event-driven would work (RunService events are expensive) - - Synchronous work that could be chunked across frames with `task.wait()` - - Undisconnected event connections (memory leak + wasted computation) - - Rebuilding entire state on small change where incremental update would work - - God-object that owns too much state -> split responsibilities -- **Hot path identification**: Which functions are called most frequently? - - Event handlers connected to RunService (PreAnimation, PreRender, PreSimulation, PostSimulation, Heartbeat) - - Functions called inside loops - - Recursive functions - - Functions called from other hot functions - -**Step 3 -- Present findings and quiz the user** - -Before applying any changes, present a summary of all findings organized by impact: - -``` -For each finding, present: -- What: One-line description of the issue -- Where: Function name / line range -- Why: What makes it slow (e.g., "O(n^2) nested scan on every frame") -- Fix: Proposed change in plain language -- Impact: Estimated improvement (order-of-magnitude, constant-factor, or clarity-only) -``` - -Then quiz the user using AskQuestion tool to let them control the flow: - -``` -Title: "Phase 1 Findings -- Select which changes to apply" - -For each finding, one question with options: - - apply -- Apply this change - - skip -- Skip this change - - modify -- I want a different approach (wait for user input) - -If there are many findings (5+), group them by category and present one question per category: - - "Structural decomposition: [list of proposed decompositions]. Apply all / cherry-pick / skip all" - - "Data structure changes: [list]. Apply all / cherry-pick / skip all" - - "Algorithm changes: [list]. Apply all / cherry-pick / skip all" - - "Architectural changes: [list]. Apply all / cherry-pick / skip all" -``` - -If the algorithm quiz from Phase 0 was "none", present findings as informational only (no apply option). The user still sees what was found. - -**Step 4 -- Apply approved changes** - -Apply only the user-approved changes, in this order: - -1. Structural decomposition first (if approved) -- break monoliths into focused functions. This is the foundation; other changes may depend on it. -2. Data structure changes -- swap arrays for dicts, add indexes, etc. -3. Algorithm changes -- replace O(n^2) with O(n), add caching/memoization -4. Architectural changes -- event-driven refactors, incremental updates - -If the user selected "modify" on any finding, wait for their input before proceeding with that specific change. - -Benchmark algorithmic changes if the benchmarking quiz answer warrants it (Phase 4.5 pattern). - -**Phase 2 -- Baseline Capture (read-only)** - -Run all diagnostic tools on the code (post-algorithmic changes if any were made in Phase 1) and capture baseline metrics for the bytecode optimization phases: - -1. `luau-analyze --mode=strict ` -- type errors and lint warnings -2. `luau-analyze --annotate ` -- inferred types (count `any` occurrences for type coverage score) -3. `luau-compile --remarks -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 ` -- inlining success/failure, allocation remarks (with Roblox vector optimization) -4. `luau-compile --text -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 ` -- full bytecode listing (instruction count, opcodes) -5. `luau-compile --codegen --target=x64_ms --record-stats=function -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 ` -- native codegen stats (spills, skipped functions, block counts). Use `--target=x64` on Linux/Mac. - -Parse and summarize: - -- Total bytecode instruction count -- Allocation count (NEWTABLE, NEWCLOSURE from remarks) -- Inlining success/failure count (from remarks) -- Type coverage: count of `any` types in annotate output -- Register spills and skipped functions from codegen stats -- Lint warnings count - -**Phase 3 -- Compilation-Level Code Analysis** - -Using both the source (already read in Phase 1) and the tool output from Phase 2, identify bytecode-level optimization opportunities: - -- **Missing types**: `any` inferences that hurt native codegen (especially `Vector3`, `CFrame`, `buffer` params) -- **Import patterns**: Global chains like `math.max` are resolved at load time (not execution) via GETIMPORT. Broken by `getfenv`/`setfenv`/`loadstring` which mark environment "impure" and disable this. -- **Allocation in loops**: Table/closure creation inside hot loops (NEWTABLE, NEWCLOSURE). High allocation rate = more GC assist work. Avoid temporary tables and userdata in hot loops. -- **Closure caching**: Repeated function expressions can be cached (same closure reused) when: no upvalues, or all upvalues are immutable and declared at module scope. Mutable upvalue captures prevent caching. -- **Upvalue mutability**: ~90% of upvalues are immutable in typical code. Immutable upvalues = no extra allocation, no closing, faster access, better locality. Mutable upvalues need extra objects. -- **Method call patterns**: `obj:Method()` uses specialized fast method call instruction. Avoid `obj.Method(obj)`. For tables: `__index` should point at a table directly (not a function or deep chain). Ideal: metatable whose `__index` points to itself. -- **Inline caching**: VM uses inline caching for table field access. Best when field name is known at compile time, no metatables, and object shapes are uniform. Varying keys/shapes degrade performance. -- **pcall in hot paths**: Prevents native codegen optimization -- **String concatenation patterns**: `..` in loops vs `table.concat` -- **Deprecated/deoptimizing API usage**: `getfenv`/`setfenv` (marks env "impure", disables ALL import optimization and fastcalls), `loadstring` (same deoptimization), `table.getn`/`table.foreach`/`table.foreachi`, `wait()`. Even read-only `getfenv()` deoptimizes. -- **Builtin global writes**: Overwriting builtins (e.g., `math = ...`) disables fastcall optimization. Lint rule `BuiltinGlobalWrite` catches this. -- **Metamethod cost**: `__eq` is always called on `==`/`~=` even for rawequal values; ensure cheap implementations -- **GC pressure**: Incremental GC uses "GC assists" -- allocating code pays for collection work proportionally. Fewer allocations = less GC overhead. - -**Phase 4 -- Compilation Optimization (graduated priority)** - -Apply changes in priority order, re-running `luau-compile --remarks -O2` after structural changes to verify the compiler actually benefits: - -**Priority 1 -- Headers and type safety (always apply)** - -- Add `--!strict` / `--!native` / `--!optimize 2` header (note: `--!optimize 2` is default in live experiences but not in Studio testing) -- Fix type errors reported by `luau-analyze` -- Add missing type annotations where `--annotate` shows `any` (focus on function signatures first, then locals in hot paths) -- Annotate `Vector3`, `CFrame`, `buffer` parameters explicitly -- native codegen generates specialized vector code when types are known; unannotated params are assumed to be tables with extra checks -- Replace `getfenv`/`setfenv` usage -- these disable builtin calls, imports, and optimizations globally for the affected function -- Replace `table.getn` with `#t` or `rawlen(t)`, `table.foreach`/`table.foreachi` with `for..in` loops - -**Priority 2 -- Low-hanging structural wins** - -- Hoist frequently-used library functions: `local floor = math.floor` enables `GETIMPORT` fastcall. Fastcall builtins include: `assert`, `type`, `typeof`, `rawget`/`rawset`/`rawequal`, `getmetatable`/`setmetatable`, `tonumber`/`tostring`, most `math.`* (not `noise`, `random`/`randomseed`), `bit32.`*, and some `string.`*/`table.*`. Partial specializations: `assert` when return value unused and condition truthy; `bit32.extract` when field/width constant; `select(n, ...)` is O(1) via builtin dispatch. -- Replace `pairs(t)` / `ipairs(t)` with generalized `for k, v in t do` iteration. Generalized iteration skips the `pairs()` call, which matters for very short tables. Performance of all three is similar for longer tables. Note: `for i=1,#t` is slightly slower due to extra element access cost. -- Use `//` floor division instead of `math.floor(a / b)` -- dedicated VM opcode, supports `__idiv` metamethod, also `//=` compound form -- Use compound assignment (`+=`, `-=`, `*=`, `//=`, `..=`) -- LHS evaluated once, e.g. `data[index].cost += 1` avoids double-indexing -- Replace string concatenation in loops with `table.concat` or string interpolation (backticks lower to `string.format` with no extra overhead) -- Use `table.create(n)` for known-size arrays -- preallocates capacity, much faster than repeated `table.insert` -- For sequential fill with known index, use indexed writes with `table.create`: `local t = table.create(N); for i=1,N do t[i] = ... end` (fastest pattern) -- Use `table.insert(t, v)` for appending when size unknown -- `#t` is usually O(1) (cached, updated by `table.insert`/`table.remove`; worst case O(log N) branch-free binary search, "50%+ faster" than Lua's O(N)) -- Use `math.lerp(a, b, t)` instead of `a + (b - a) * t` -- exact for t=0/1, monotonic, bounded -- Use `bit32.byteswap(n)` instead of manual shifting/masking for endian conversion (uses CPU bswap instruction) -- Use `bit32.countlz`/`bit32.countrz` instead of manual log2 loops (uses CPU instructions, ~8x faster) -- Use `table.find(t, v)` instead of manual linear search loops -- Use `table.clone(t)` instead of manual `pairs` copy loops -- Use `string.pack`/`string.unpack` instead of manual `string.byte`/`string.char`/`bit32` for binary data -- Use `rawlen(t)` when metamethods are not needed for table length -- Use explicit `./`/`../`/`@` prefixes in `require()` to avoid extra path-resolution work - -**Priority 3 -- Function structure for inlining** - -- Break monolith functions into smaller, focused local functions (compiler inlines automatically at `-O2`; small local functions = best inlining candidates) -- Inlining requirements: function must be local, non-mutated, non-recursive, not an OOP method (`Foo:bar()`), not a metamethod. Exported functions in mutable tables CANNOT be inlined. Disabled in modules using `getfenv`/`setfenv`. -- Inlining + constant folding: inlined functions with constant args can enable further constant folding (e.g., `local function double(x) return x*2 end; local y = double(5)` folds to `y = 10`) -- For high-traffic functions that call imported module methods frequently, create local function wrappers at module top-level to enable inlining -- Move `pcall` out of hot loops where possible (wrap the loop, not the body) -- pcall prevents native codegen optimization -- Use `obj:Method()` not `obj.Method(obj)` -- colon syntax gets specialized fast method call instruction -- Keep `__index` pointing at a table directly (not a function or deep chain) for optimal inline caching -- Reduce upvalue captures in closures created inside loops. Immutable upvalues (never reassigned) are much cheaper -- no extra allocation, no closing. Mutable upvalues need an extra object. -- Prefer object-like table construction with all fields set at once (enables compiler capacity inference): `local v = {}; v.x = 1; v.y = 2; v.z = 3` -- compiler infers hash capacity from subsequent assignments -- Loop unrolling: only for compile-time constant bounds (`for i=1,4 do`); body must be simple. Unrolling enables further constant folding on the loop index. -- Watch for native codegen size limits: 64K instructions per code block, 32K blocks per function, 1M instructions per module. Split large functions if limits are hit. - -**Priority 4 -- Micro-optimizations (hot paths only)** - -- Table shape consistency (same fields, same order across constructors) -- VM uses inline caching (HREF-style) that predicts hash slots; uniform shapes = better cache hit rates -- Use `buffer` for binary data manipulation instead of string ops (fixed-size, offsets start at 0, far more space/time efficient) -- Use `buffer.readu32` + `bit32` operations instead of `buffer.readbits` when schema is known (faster due to fewer bounds checks) -- Strength reduction: multiplication by power-of-2 to `bit32.lshift`, division by power-of-2 to `bit32.rshift` -- Minimize `tostring`/`tonumber` in tight loops -- Use `table.freeze` for readonly config tables (avoids need for proxy tables and `__index` overhead) -- Keep `__eq` metamethods cheap -- they fire on every `==`/`~=` and `table.find` comparison -- Use `math.isfinite`/`math.isnan`/`math.isinf` instead of `x ~= x` patterns for clarity (no perf difference) -- For vector math: use `Vector3.new(x, y, z)` (Roblox userdata, not the `vector` primitive); annotate params as `Vector3` for native specialization -- Use `if expr then A else B` instead of `cond and A or B` ternary (only evaluates one branch; avoids falsy-value bugs) - -**Phase 4.5 -- Benchmark with `luau` CLI (when warranted)** - -When a non-trivial optimization is applied to an isolated, pure-logic function (no Roblox API dependencies), write a small benchmark harness and run it with the `luau` CLI to measure actual wall-clock impact. This is especially valuable for: - -- Algorithmic changes (Priority 4) where bytecode metrics alone can't prove the win -- Micro-optimizations (Priority 5) where the improvement is ambiguous -- Competing approaches where both look reasonable in bytecode but one may be faster at runtime - -**Benchmark harness pattern:** - -```luau --- bench.luau (temporary file, deleted after benchmarking) -local function original(...) - -- paste original implementation -end - -local function optimized(...) - -- paste optimized implementation -end - -local ITERATIONS = 1_000_000 -local clock = os.clock - --- Warmup -for _ = 1, 1000 do original(...) end -for _ = 1, 1000 do optimized(...) end - -local t0 = clock() -for _ = 1, ITERATIONS do original(...) end -local t1 = clock() -for _ = 1, ITERATIONS do optimized(...) end -local t2 = clock() - -print(`Original: {t1 - t0:.4f}s`) -print(`Optimized: {t2 - t1:.4f}s`) -print(`Speedup: {(t1 - t0) / (t2 - t1):.2f}x`) -``` - -**Run with both interpreter and native codegen to compare:** - -``` -luau -O2 bench.luau # Interpreter at -O2 -luau -O2 --codegen bench.luau # Native codegen at -O2 -``` - -**When to benchmark:** - -- The function is self-contained (no `game`, `workspace`, Roblox services) -- The optimization changes algorithm or data structure (not just headers/types) -- The bytecode diff is ambiguous (instruction count similar, or more instructions but fewer allocations) -- Two candidate approaches need a tiebreak - -**When NOT to benchmark:** - -- The function depends on Roblox APIs (use Studio Script Profiler instead) -- The change is purely additive (headers, type annotations) -- trust the bytecode metrics -- The function is not hot (benchmarking cold code is misleading) - -**Cleanup:** Delete the temporary benchmark file after capturing results. Do not leave bench files in the project. - -**Phase 5 -- Verification** - -Re-run all Phase 2 tools and present a before/after comparison: - -- Bytecode instruction count delta -- Allocation count delta -- Inlining success rate delta -- Type coverage improvement (fewer `any` types) -- Register spill delta -- Lint warning delta -- Benchmark results (if Phase 4.5 was used) -- wall-clock speedup for interpreter and native codegen - -If any metric regressed, investigate and explain why (or revert that change). - -**Phase 6 -- Multi-file mode (directory scope only)** - -When optimizing a directory: - -- Run Phase 1 (code read) on all files first to identify which files have the most algorithmic improvement potential -- Run Phase 2 (baseline capture) on all files to identify which have the most bytecode optimization potential -- Prioritize files by: worst algorithmic complexity, most lint warnings, most `any` types, most allocations, most failed inlines -- Process files one at a time through Phases 1-5 -- Present aggregate metrics at the end - -### Key Principles (embedded in command) - -- **Same implementation, better performance** -- behavioral equivalence is non-negotiable -- **Low-hanging fruit first** -- headers and types before restructuring -- **Compiler feedback loop** -- verify each structural change with `--remarks` -- **Small functions over monoliths** -- easier for compiler, easier to maintain -- **Local functions for inlining** -- even at cost of duplicating imported behavior in high-traffic code -- **Quantify everything** -- before/after metrics for every optimization pass -- **Type annotations drive native codegen quality** -- every `any` is a missed specialization opportunity -- **Event-driven over polling** -- avoid per-frame calculations when events suffice - -### Type System Availability (Old Typechecker) - -The command must only recommend type features available with the OLD typechecker (we are NOT using the new type solver). - -**Available NOW (old typechecker):** - -- `--!strict` / `--!nonstrict` / `--!nocheck` directives -- Basic type annotations: `local x: number`, `function f(a: string): boolean` -- Optional types: `string?` (sugar for `string | nil`) -- Union types: `number | string` -- Intersection types: `type1 & type2` -- Generic functions: `function id(x: T): T` -- Explicit generic instantiation: `f<>()` -- Type ascription (cast): `x :: string` -- Array types: `{number}`, dictionary types: `{[string]: number}` -- Typed table constructors: `type Car = { Speed: number, Drive: (Car) -> () }` -- `typeof()` for inferring types from values -- `export type` for cross-module type sharing -- Typed variadics: `function f(...: number)` -- Type alias defaults: `type Map = {[K]: V}` -- Singleton/literal types: `"hello"`, `true` -- `never` and `unknown` types (exhaustiveness checking, safe top type) -- `read` / `write` property modifiers -- Sealed/unsealed table subtyping -- `table.freeze` type narrowing - -**REQUIRES new typechecker (DO NOT recommend):** - -- `keyof`, `index`, `rawkeyof`, `rawget` type functions -- `getmetatable`, `setmetatable` type functions -- User-defined type functions (`type function ...`) -- Negation types (`~T`) -- Relaxed recursive type restrictions -- Local type inference improvements (better bounds tracking) -- `new-nonstrict` unified engine - -### Native Codegen Knowledge Base - -Embedded in the command for reference during optimization: - -**When to use `@native` vs `--!native`:** - -- `--!native`: entire script compiled natively. Good for math-heavy utility modules. -- `@native`: per-function. Better when only specific hot functions benefit, or when script is close to the 1M instruction module limit. -- Inner functions do NOT inherit `@native` -- each needs its own annotation. -- Top-level module code usually runs once; `@native` on it has minimal benefit. - -**What hurts native execution:** - -- `getfenv()` / `setfenv()` -- disables optimizations -- Passing wrong types to typed functions (triggers type guard failures) -- Non-numeric args to math builtins -- Breakpoints disable native execution for affected functions -- Functions exceeding size limits: 64K instructions/block, 32K blocks/function, 1M instructions/module - -**What helps native execution:** - -- Type annotations, especially `Vector3` parameters (specialized vector codegen). JIT uses annotations directly -- no runtime type analysis. -- Small, focused functions (fewer register spills, better block optimization) -- Consistent table shapes (predictable field access, inline caching hits) -- `buffer` operations (efficient native lowering) -- `bit32` operations (map directly to CPU instructions) -- Native 3-component 32-bit float vector type: 16-byte tagged values, VM-level 3-wide SIMD, lower GC pressure than userdata Vector3 - -### VM Architecture Knowledge - -The command should understand how the Luau VM works to give accurate advice: - -**Bytecode interpreter:** - -- Highly tuned portable bytecode interpreter in C. Core dispatch loop ~16 KB on x64 (cache-friendly). -- Can match LuaJIT interpreter on some workloads. -- Computationally intensive scripts mostly use the interpreter core + builtins. - -**Compiler pipeline:** - -- Multi-pass: frontend parses AST, backend emits bytecode. -- Without type info: deep constant folding (across functions and locals), upvalue optimization for non-mutated upvalues, builtin usage analysis, multi-assignment optimization, peephole optimizations. -- With `-O2`: function inlining, loop unrolling (constant bounds only), more aggressive constant folding after inlining. -- Type-directed: currently small peephole optimizations; potential for CSE and allocation hoisting. -- Interprocedural: limited to single modules. Local function calls optimized with known arg/return counts. - -**Inline caching:** - -- Table field access uses HREF-style inline caching. Compiler predicts hash slot; VM corrects dynamically. -- Best when: field name known at compile time, no metatables, uniform object shapes. -- `table.field` and `table["constantString"]` both get inline caching. - -**Import resolution:** - -- Global chains like `math.max` resolved at load time, not execution time. -- Invalidated by `getfenv`/`setfenv`/`loadstring` (marks environment "impure"). - -**Fastcall builtins (complete list):** - -- `assert`, `type`, `typeof`, `rawget`, `rawset`, `rawequal`, `rawlen` -- `getmetatable`, `setmetatable` -- `tonumber`, `tostring` -- Most `math.`* (NOT `math.noise`, `math.random`, `math.randomseed`) -- `bit32.`* -- Some `string.`*, `table.`* -- Partial specializations: `assert` (unused return + truthy), `bit32.extract` (constant field/width), `select(n, ...)` (O(1) via builtin dispatch) -- `math.floor` and similar use SSE4.1 when available -- With `-O2`: builtins with constant args and single return can be constant-folded; `math.pi`, `math.huge` etc. are folded - -**GC architecture:** - -- Incremental mark-sweep with "GC assists" (allocating code pays proportional GC work) -- Paged sweeper: 16 KB pages by size class, 2-3x faster than linked-list, saves 16 bytes/object on 64-bit -- No `__gc` metamethod (removed for performance) -- Weak tables with `__mode = "s"` are "shrinkable" (resized during GC) - -### Type Refinement Patterns - -The compiler narrows types after certain checks, improving both type safety and native codegen quality: - -- **Truthiness:** `if x then` narrows `x` from falsy (`nil`/`false`) -- **Type guards:** `if type(x) == "number" then` narrows `x` to `number` -- **Typeof guards (Roblox):** `if typeof(x) == "Vector3" then` narrows to `Vector3`; `x:IsA("TextLabel")` narrows `Instance` to subclass -- **Equality:** `if x == "hello" then` narrows `x` to singleton `"hello"` -- **Assert:** `assert(type(x) == "string")` narrows `x` to `string` after the call -- **Composition:** Supports `and`, `or`, `not` for compound refinements - -Use refinements to provide type information to the compiler without explicit annotations in contexts where the type is known from a runtime check. - -### Comprehensive Pattern Catalog - -The command will embed this as the reference for pattern replacement: - -**Bytecode-level improvements:** - - -| Slow pattern | Fast pattern | Why | -| ----------------------------- | ------------------------------ | ----------------------------------- | -| `math.floor(a / b)` | `a // b` | Dedicated VM opcode | -| `data[i].x = data[i].x + 1` | `data[i].x += 1` | LHS evaluated once | -| `a + (b - a) * t` | `math.lerp(a, b, t)` | Exact at endpoints, monotonic | -| `"prefix" .. var .. "suffix"` | `prefix{var}suffix` | Lowers to optimized `string.format` | -| Manual byte swap | `bit32.byteswap(n)` | CPU bswap instruction | -| Manual log2 loop | `bit32.countlz(n)` | CPU instruction, ~8x faster | -| `table.getn(t)` | `#t` or `rawlen(t)` | Deprecated, slower | -| `table.foreach(t, f)` | `for k, v in t do f(k, v) end` | Deprecated, slower | -| `cond and A or B` | `if cond then A else B` | Safe for falsy values, one branch | -| `x ~= x` (NaN check) | `math.isnan(x)` | Clearer, same performance | - - -**Allocation reduction:** - - -| Slow pattern | Fast pattern | Why | -| --------------------------------- | ---------------------------------- | ----------------------------------- | -| `local t = {}` in loop | `table.clear(t)` + reuse | Avoids GC pressure | -| `table.insert(t, v)` repeated | `table.create(n)` + indexed writes | Preallocated capacity | -| Manual `pairs` clone | `table.clone(t)` | Faster, copies layout | -| `string.byte`/`string.char` loops | `string.pack`/`string.unpack` | Native implementation | -| String-based binary data | `buffer` type | Fixed-size, offset-based, efficient | - - -**Inlining enablers:** - - -| Blocks inlining | Enables inlining | Why | -| ----------------------- | ----------------------------- | ---------------------------------------- | -| `function Module.foo()` | `local function foo()` | Exported/mutable table prevents inlining | -| `function Obj:method()` | `local function method(self)` | OOP colon syntax not inlineable | -| Recursive function | Split base/recursive cases | Recursion prevents inlining | -| Deep upvalue captures | Pass as parameters | Reduces closure cost | - - -**Deprecated patterns to detect and replace:** - - -| Deprecated | Replacement | Impact | -| ------------------------- | -------------------------- | -------------------------------------------------------------------------------------------------- | -| `getfenv()` / `setfenv()` | `debug.info(i, "snl")` | Disables ALL optimizations (imports, fastcalls, inlining). Even read-only `getfenv()` deoptimizes. | -| `loadstring()` | Restructure with `require` | Marks environment "impure", disables import optimization | -| `table.getn(t)` | `#t` | Slower | -| `table.foreach(t, f)` | `for k, v in t do` | Slower | -| `table.foreachi(t, f)` | `for i, v in t do` | Slower | -| `wait()` | `task.wait()` | Deprecated Roblox API | -| `obj.Method(obj, ...)` | `obj:Method(...)` | Misses fast method call instruction | -| `string:method()` | `string.method(s)` | `string.byte(s)` is faster than `s:byte()` for builtins | - - -**Lint rules to check (via `luau-analyze`):** - -The command should flag these lint warnings as optimization opportunities: - - -| Lint | Name | Optimization impact | -| ---- | ------------------ | ------------------------------------------------------------------------------------------------ | -| 10 | BuiltinGlobalWrite | Overwriting builtins disables fastcall optimization | -| 22 | DeprecatedApi | Deprecated APIs may have performance/correctness issues | -| 23 | TableOperations | `table.insert(t, 0, x)` (wrong index), `table.insert(t, #t+1, x)` (redundant), `#` on non-arrays | -| 3 | GlobalUsedAsLocal | Global used in one function -- should be local for performance | -| 7 | LocalUnused | Dead locals (cleanup candidate) | -| 12 | UnreachableCode | Dead code (removal candidate) | -| 25 | MisleadingAndOr | `a and false or c` bugs -- use `if a then false else c` | - - -### CLI Tool Reference - -All four tools live at `C:\Program Files\Atlas\` and are in PATH. - -#### `luau-compile` -- Static bytecode/codegen analysis (primary tool) - -**Modes** (mutually exclusive, controls output format): - -- `binary` -- Raw bytecode blob (default, not human-readable) -- `text` -- Human-readable bytecode listing with source line annotations. Shows every opcode, register, constant, and jump label per function. -- `remarks` -- Original source with compiler remarks injected as `-- remark:` comments. Shows inlining success/failure (with cost/profit), allocation tracking (`table hash N`, `table array N`). **Single most useful mode for optimization.** -- `codegen` -- Native assembly output. Shows full register allocation, memory ops, branch structure, and outlined helpers. Requires `--target`. - -**Options:** - -- `-O` -- Optimization level 0-2 (default 1). `**-O2` enables automatic inlining.** Always use `-O2` to see production compiler behavior. `-O0` useful as baseline comparison. -- `-g` -- Debug info level 0-2 (default 1). `-g0` strips debug info for smallest bytecode. -- `--target=` -- Architecture for codegen mode: `x64` (Linux/Mac), `x64_ms` (Windows x64 calling convention), `a64` (ARM64), `a64_nf` (ARM64 no-FP). **Use `x64_ms` on Windows.** -- `--record-stats=` -- JSON compilation stats at `total`, `file`, or `function` granularity. At `function` level shows: `bytecodeInstructionCount`, codegen size, parse/compile time, and `lowerStats` (spillsToSlot, spillsToRestore, maxSpillSlotsUsed, skippedFunctions, blocksPreOpt, blocksPostOpt, regAllocErrors, loweringErrors). -- `--bytecode-summary` -- Bytecode operation distribution. Requires `--record-stats=function`. Shows which opcodes dominate. -- `--stats-file=` -- Where to write stats JSON (default `stats.json`). Useful when analyzing multiple files. -- `--timetrace` -- Writes `trace.json` with compiler phase timings (Chrome `chrome://tracing` compatible). -- `--vector-lib=` -- Library name for vector ops (e.g., `"Vector3"`). Tells compiler about vector type for better optimization. -- `--vector-ctor=` -- Constructor function name (e.g., `"new"`). Paired with `--vector-lib` for constant-folding. -- `--vector-type=` -- Vector type name. Completes the vector triplet for full vector optimization. - -**Key invocations for the command (always include Roblox vector flags):** - -``` -luau-compile --remarks -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 -luau-compile --text -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 -luau-compile --codegen --target=x64_ms --record-stats=function -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 # Windows -luau-compile --codegen --target=x64 --record-stats=function -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 # Linux/Mac -luau-compile --bytecode-summary --record-stats=function -O2 --vector-lib=Vector3 --vector-ctor=new --vector-type=Vector3 -``` - -#### `luau-analyze` -- Type checking and linting - -**Modes:** - -- *(omitted)* -- Default: typecheck + lint. Reports type errors and lint warnings to stderr. -- `--annotate` -- Outputs source with all inferred types written inline. Every variable, parameter, and return gets its inferred type. **Critical for finding `any` types that hurt native codegen.** - -**Options:** - -- `--mode=strict` -- Forces `--!strict` type checking even if file lacks the directive. Catches type errors silent in nonstrict mode. -- `--formatter=plain` -- Luacheck-compatible output (machine-parseable, good for counting errors). -- `--formatter=gnu` -- GNU-compatible output (`file:line:col: message`), grep-friendly. -- `--timetrace` -- Writes `trace.json` with analysis phase timings. - -**Key invocations:** - -``` -luau-analyze --mode=strict # Type errors + lint warnings -luau-analyze --annotate # Inferred types (find 'any' types) -``` - -#### `luau` -- Runtime execution, profiling, and coverage - -**Limited utility for Roblox scripts.** Most Roblox scripts depend on engine APIs (`game`, `workspace`, `Players`, etc.) that the standalone `luau` runtime does not provide. This tool is only usable for pure-logic library modules with zero Roblox dependencies. - -**Options:** - -- `-O` -- Optimization level 0-2 (default 1). Same as compile. -- `-g` -- Debug level 0-2 (default 1). Same as compile. -- `--codegen` -- Execute using native code generation. -- `--profile[=N]` -- CPU profiling at N Hz sampling (default 10000). Outputs `profile.out`. -- `--coverage` -- Code coverage collection. Outputs `coverage.out`. Can identify dead code paths. -- `--timetrace` -- Compiler time tracing to `trace.json`. -- `-i, --interactive` -- REPL after script execution. -- `-a, --program-args` -- Pass arguments to the Luau program. - -**Key invocations (only for pure-logic modules without Roblox API dependencies):** - -``` -luau --codegen --profile -O2 # Profile with native codegen -luau --coverage -O2 # Dead code detection -``` - -**For Roblox scripts:** Use Roblox Studio's Script Profiler and `debug.dumpcodesize()` instead. The command should note this when the target file uses Roblox APIs. - -#### `luau-ast` -- AST dump - -**No flags.** Takes a single file, outputs full JSON AST. - -- Node types, source locations, variable scopes, type annotations -- Programmatically parseable for: function nesting depth, function body size (monolith detection), closure captures (upvalue analysis), table construction patterns, loop-invariant expression detection - -**Key invocation:** - -``` -luau-ast # Full JSON AST -``` - -### Reference Documentation - -The command will reference these docs (read during execution if needed for detail): - -**Core optimization:** - -- `.cursor/rules/luau.mdc` -- Luau language rules, optimization tips, performance patterns -- `.cursor/rules/luau/function-inlining.md` -- Inlining RFC (no user `@inline`, automatic at `-O2`, requirements for inlineability) -- `.cursor/rules/luau/syntax-attribute-functions-native.md` -- `@native` per-function attribute RFC -- `.cursor/rules/roblox/en-us/luau/native-code-gen.md` -- Native codegen docs (size limits, type annotation impact, gotchas) - -**Type system (old typechecker only):** - -- `.cursor/rules/roblox/en-us/luau/type-checking.md` -- Type annotation syntax and modes -- `.cursor/rules/luau/generic-functions.md` -- Generic function syntax -- `.cursor/rules/luau/never-and-unknown-types.md` -- `never`/`unknown` for exhaustiveness -- `.cursor/rules/luau/syntax-type-ascription.md` -- `::` cast operator - -**Library optimizations:** - -- `.cursor/rules/luau/function-table-create-find.md` -- `table.create`, `table.find` -- `.cursor/rules/luau/function-table-clear.md` -- `table.clear` for reuse -- `.cursor/rules/luau/function-table-clone.md` -- `table.clone` vs manual copy -- `.cursor/rules/luau/function-table-freeze.md` -- `table.freeze` for readonly -- `.cursor/rules/luau/function-math-lerp.md` -- `math.lerp` properties and correctness -- `.cursor/rules/luau/function-bit32-byteswap.md` -- CPU-level byte swap -- `.cursor/rules/luau/function-bit32-countlz-countrz.md` -- CPU-level bit counting -- `.cursor/rules/luau/function-buffer-bits.md` -- Buffer bit operations -- `.cursor/rules/luau/type-byte-buffer.md` -- `buffer` type for binary data -- `.cursor/rules/luau/vector-library.md` -- Vector library and fastcalls -- `.cursor/rules/luau/function-string-pack-unpack.md` -- Binary string operations -- `.cursor/rules/luau/syntax-floor-division-operator.md` -- `//` dedicated opcode -- `.cursor/rules/luau/syntax-compound-assignment.md` -- `+=` single LHS evaluation - -**Deprecation/avoidance:** - -- `.cursor/rules/luau/deprecate-getfenv-setfenv.md` -- Why fenv disables optimizations -- `.cursor/rules/luau/deprecate-table-getn-foreach.md` -- Deprecated table functions -- `.cursor/rules/luau/generalized-iteration.md` -- Modern iteration patterns - -**Roblox performance (always applicable):** - -- `.cursor/rules/roblox/en-us/performance-optimization/improve.md` -- Script computation, memory, physics, rendering, networking, assets -- `.cursor/rules/roblox/en-us/performance-optimization/design.md` -- Event-driven patterns, frame budgets (~16.67ms at 60 FPS), multithreading -- `.cursor/rules/roblox/en-us/luau/variables.md` -- Local vs global: "global in a time-critical loop can make it perform more than 10% slower" -- `.cursor/rules/roblox/en-us/luau/scope.md` -- Scope performance implications -- `.cursor/rules/roblox/en-us/luau/native-code-gen.md` -- `@native` attribute, Vector3 annotation impact, size limits, `debug.dumpcodesize()` - diff --git a/.cursor/plans/luau-style_ref_paths_845083e1.plan.md b/.cursor/plans/luau-style_ref_paths_845083e1.plan.md deleted file mode 100644 index 3fc1a242..00000000 --- a/.cursor/plans/luau-style_ref_paths_845083e1.plan.md +++ /dev/null @@ -1,1034 +0,0 @@ ---- -name: Luau-style ref paths -overview: "Migrate Rojo_Ref_* attribute paths from bare absolute paths to Luau require-by-string style: @self/, ./, ../, and @game/. Prefer relative paths for maximum copy/paste portability. Update all syncback, forward sync, and two-way sync codepaths, plus comprehensive tests." -todos: - - id: core-compute - content: Add compute_relative_ref_path() to rojo_ref.rs + unit tests for all prefix selection scenarios - status: completed - - id: resolve-fn - content: Add resolve_ref_path() to tree.rs that handles @game/, @self/, ./, ../ prefixes and .. mid-path - status: completed - - id: forward-sync - content: Update patch_compute.rs and patch_apply.rs to pass source_ref when resolving Rojo_Ref_* paths - status: completed - - id: syncback-placeholders - content: Redesign placeholder system in ref_properties.rs to encode (source, target) pairs, compute relative paths in post-processing - status: completed - - id: syncback-final - content: Update fs_snapshot.rs fix_ref_paths and syncback/mod.rs post-processing to produce relative substitutions - status: completed - - id: two-way-write - content: Update api.rs syncback_updated_properties and added_paths to write relative ref paths - status: completed - - id: change-processor - content: Rewrite update_ref_paths_after_rename in change_processor.rs to resolve-then-recompute instead of string prefix replacement - status: completed - - id: ref-path-index - content: Change RefPathIndex.populate_from_dir to populate_from_tree, store resolved absolute paths, update serve_session.rs call site - status: completed - - id: update-existing-tests - content: Fix all existing test fixtures and assertions to use new prefix format - status: completed - - id: new-test-compute - content: Add comprehensive compute_relative_ref_path unit tests (all scenarios from plan) - status: completed - - id: new-test-resolve - content: Add comprehensive resolve_ref_path unit tests (all prefix types, .., edge cases) - status: completed - - id: new-test-roundtrip - content: Add syncback round-trip integration tests with relative refs (@self, ./, ../, @game) - status: completed - - id: new-test-twoway - content: Add two-way sync integration tests (ref writes, renames, dedup cleanup with relative paths) - status: completed - - id: new-test-edge - content: Add edge case tests (cross-service, ancestor refs, slugified names, dedup suffixes, same-batch add+ref) - status: completed - - id: cleanup - content: Remove dead escape/unescape functions, update documentation comments throughout - status: completed -isProject: false ---- - -# Luau-Style Ref Paths - -## Current State - -`Rojo_Ref_*` attributes store bare absolute paths from DataModel's children: - -```json5 -{ "Rojo_Ref_PrimaryPart": "Workspace/TestModel/Part1.model.json5" } -``` - -## Target State - -Use Luau require-by-string semantics with four prefix types: - -```json5 -// Descendant of source instance -{ "Rojo_Ref_PrimaryPart": "@self/Part1.model.json5" } - -// Sibling (child of parent) -{ "Rojo_Ref_Value": "./Sibling.model.json5" } - -// Navigate up then down (within same service) -{ "Rojo_Ref_Attachment0": "../Attachments/Att1.model.json5" } - -// Cross-service or target is ancestor of source -{ "Rojo_Ref_Value": "@game/ReplicatedStorage/Shared/Module.luau" } -``` - -## Prefix Selection Algorithm - -Given source and target absolute ref paths: - -1. **target == source** --> `@self` (self-reference, rare) -2. **target is descendant of source** --> `@self/` -3. **LCA is DataModel root** (cross-service, `common_prefix_len == 0`) --> `@game/` -4. **target is ancestor of source** (`remaining` is empty after LCA) --> `@game/` -5. **Otherwise** (same service, different branches): - - `ups == 1` (LCA is parent) --> `./` - - `ups >= 2` --> `"../" * (ups - 1)` + `` - -This maximizes portability: subtrees can be copied/moved within a service without breaking refs. - -**Worked examples:** - - -| Source | Target | LCA | Result | -| ---------------------- | ------------------------------- | ------------- | ------------------------------------- | -| `Workspace/A/Script` | `Workspace/A/Script/Child` | (descendant) | `@self/Child` | -| `Workspace/A/Script` | `Workspace/A/Part.model.json5` | `Workspace/A` | `./Part.model.json5` | -| `Workspace/A/Script` | `Workspace/B/Part.model.json5` | `Workspace` | `../B/Part.model.json5` | -| `Workspace/A/B/Script` | `Workspace/C/Part.model.json5` | `Workspace` | `../../C/Part.model.json5` | -| `Workspace/A/Script` | `ReplicatedStorage/Module.luau` | root | `@game/ReplicatedStorage/Module.luau` | -| `Workspace/A/B/Script` | `Workspace/A` | (ancestor) | `@game/Workspace/A` | - - -## Resolution Algorithm - -Per the [Roblox require-by-string docs](https://create.roblox.com/docs/reference/engine/globals/LuaGlobals#require): - -``` -resolve_ref_path(path, source_ref, tree): - @game/rest --> resolve segments from root (game) - @self --> return source_ref (script itself) - @self/rest --> resolve segments from source_ref (script) - ./rest --> resolve segments from parent(source_ref) (script.Parent) - ../rest --> resolve segments from parent(parent(source_ref)) (script.Parent.Parent) - bare_path --> resolve segments from root (backward compat fallback) - - During segment walk: - ".." --> go to parent of previous component - other --> find child by filesystem name (case-insensitive) -``` - -**How `../` chaining works** (from Roblox docs): - -- `../X` = script.Parent.Parent.X (2 ups total) -- `../../X` = script.Parent.Parent.Parent.X (3 ups -- `../` prefix gives 2, then `..` component gives 1 more) -- `../../../X` = 4 ups (prefix gives 2, two `..` components give 2 more) - -**Generation formula** (ups = levels from source to LCA): - -- ups=1: `"./" + remaining` -- ups>=2: `"../" * (ups-1) + remaining` - -Verification: ups=3 --> `"../" * 2` = `"../../"` + remaining. Parse: `../` prefix = 2 ups, one `..` component = 1 more = 3. Correct. - -Bare paths (no prefix) are treated as `@game/` for backward compatibility with old-format files. New writes never produce bare paths. - ---- - -## Phase 1: Core Path Functions - -**File: [src/rojo_ref.rs](src/rojo_ref.rs)** - -- Add `compute_relative_ref_path(source_abs: &str, target_abs: &str) -> String` -- pure string function implementing the prefix selection algorithm above. Both inputs are absolute ref paths (slash-separated filesystem names from root children). Output is the prefixed relative/absolute path. -- Keep `ref_target_path_from_tree()` and `ref_target_path()` for computing absolute paths (they become internal building blocks). -- The escape/unescape functions (`escape_ref_path_segment`, `split_ref_path`, etc.) become dead code since filesystem names can't contain `/`. Remove or deprecate them. - -## Phase 2: Path Resolution (Forward Sync) - -**File: [src/snapshot/tree.rs](src/snapshot/tree.rs)** - -- Add `resolve_ref_path(&self, path: &str, source_ref: Ref) -> Option` -- new public function. Parses prefix, sets starting Ref, then walks segments. Handles `..` as "go to parent" at any position. -- `get_instance_by_path()` remains as internal helper for absolute segment walking (used by `resolve_ref_path` for the `@game/` and bare-path cases). - -**File: [src/snapshot/patch_compute.rs](src/snapshot/patch_compute.rs)** - -- `compute_ref_properties()` currently calls `tree.get_instance_by_path(path)`. Change to call `tree.resolve_ref_path(path, source_ref)` where `source_ref` is the instance that owns the attributes. - -**File: [src/snapshot/patch_apply.rs](src/snapshot/patch_apply.rs)** - -- `finalize_patch_application()` resolves deferred refs in `path_refs_to_rewrite`. Currently uses `tree.get_instance_by_path()`. Change to `tree.resolve_ref_path(path, source_ref)` where source_ref comes from the `MultiMap` key. - -## Phase 3: CLI Syncback (Writing Relative Paths) - -**File: [src/syncback/ref_properties.rs](src/syncback/ref_properties.rs)** - -- **Placeholder redesign:** Placeholders must be unique per (source, target) pair since the same target gets different relative paths from different sources. Change from `__ROJO_REF_`__ to `__ROJO_REF__TO_`__. -- Change `placeholder_to_target: HashMap` to `placeholder_to_source_and_target: HashMap`. -- When `final_paths` IS available, call `compute_relative_ref_path(source_path, target_path)` directly instead of storing the absolute target path. -- `collect_all_paths()` is unchanged (still collects absolute paths for all instances). - -**File: [src/syncback/fs_snapshot.rs](src/syncback/fs_snapshot.rs)** - -- `fix_ref_paths()` substitution map entries are now `(placeholder, relative_path)`. The post-processing step in [src/syncback/mod.rs](src/syncback/mod.rs) must look up BOTH source and target in `ref_path_map`, call `compute_relative_ref_path()`, and produce the substitution. - -**File: [src/syncback/snapshot.rs](src/syncback/snapshot.rs)** - -- `record_ref_path()` is unchanged -- it still records absolute paths in `ref_path_map`. These are used as inputs to `compute_relative_ref_path`. - -## Phase 4: Two-Way Sync (Writing Relative Paths) - -**File: [src/web/api.rs](src/web/api.rs)** - -- `syncback_updated_properties()`: Currently computes target absolute path via `ref_target_path_from_tree()` and stores it directly. Change to also compute source absolute path, then call `compute_relative_ref_path(source_abs, target_abs)` for the attribute value. -- `added_paths` pre-computation: Same change -- compute relative paths from source to the newly-added target. - -**File: [src/change_processor.rs](src/change_processor.rs)** - -- `update_ref_paths_after_rename()`: Currently does string prefix replacement on absolute paths. With relative paths on disk, the approach changes: - 1. Find affected files via RefPathIndex (still indexed by absolute target path) - 2. For each file, parse JSON, resolve each `Rojo_Ref`_* value to absolute (using source instance's absolute path) - 3. If resolved absolute matches old prefix, compute new absolute, then recompute relative path from source - 4. Write updated relative path back -- This requires knowing each file's source instance absolute path. Add a helper that derives this from the file's filesystem path + tree metadata (instigating source lookup). - -## Phase 5: RefPathIndex Updates - -**File: [src/rojo_ref.rs*](src/rojo_ref.rs)* (RefPathIndex) - -The index stores **resolved absolute paths** as keys (not the on-disk relative strings). This preserves the efficient prefix-based lookup. - -- `populate_from_dir()` --> Change to `populate_from_tree(tree: &RojoTree)`. Walk instances in the tree, read `Rojo_Ref`_* attributes, resolve relative paths to absolute using the source instance's position, index the absolute path. Called after initial tree build in [src/serve_session.rs](src/serve_session.rs) line 177-181. -- `add()` / `remove()`: Callers pass resolved absolute paths (same as before). -- `find_by_prefix()` / `update_prefix()`: Unchanged (operate on absolute keys). -- `update_ref_paths_in_file()` in [src/syncback/meta.rs](src/syncback/meta.rs): Rewrite to parse + resolve + recompute instead of string prefix replacement. - -## Phase 6: Tests - -### Update Existing Tests - -All test fixtures and assertions with bare absolute ref paths need updating to use the new prefix format. - -**Key files:** - -- [rojo-test/serve-tests/ref_two_way_sync/](rojo-test/serve-tests/ref_two_way_sync/) -- fixture meta files -- [rojo-test/serve-tests/ref_forward_sync/](rojo-test/serve-tests/ref_forward_sync/) -- fixture meta files -- [tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs) -- ref assertions -- [tests/tests/serve.rs](tests/tests/serve.rs) -- ref assertions -- [src/rojo_ref.rs](src/rojo_ref.rs) -- unit tests -- [src/syncback/ref_properties.rs](src/syncback/ref_properties.rs) -- unit tests -- [src/syncback/fs_snapshot.rs](src/syncback/fs_snapshot.rs) -- fix_ref_paths tests -- [src/snapshot/tests/](src/snapshot/tests/) -- patch compute/apply tests - ---- - -### Test Specification: `compute_relative_ref_path(source_abs, target_abs)` - -Every test below shows the two absolute path inputs and the exact expected output string. - -#### `@self` -- Target is the source itself or a descendant - - -| # | Source | Target | Expected | Why | -| --- | ----------------- | -------------------------------------------- | ---------------------------------- | ---------------------------------------- | -| 1 | `Workspace/Model` | `Workspace/Model` | `@self` | Self-reference | -| 2 | `Workspace/Model` | `Workspace/Model/Handle.model.json5` | `@self/Handle.model.json5` | Direct child | -| 3 | `Workspace/Model` | `Workspace/Model/SubFolder/Part.model.json5` | `@self/SubFolder/Part.model.json5` | Nested descendant | -| 4 | `Workspace/Model` | `Workspace/Model/A/B/C/D.luau` | `@self/A/B/C/D.luau` | Deeply nested descendant (4 levels) | -| 5 | `Workspace/Tool` | `Workspace/Tool/Handle.model.json5` | `@self/Handle.model.json5` | Tool with Handle (common Roblox pattern) | -| 6 | `Workspace/Model` | `Workspace/Model/Init` | `@self/Init` | Child that is a directory (init-style) | -| 7 | `Workspace/Gun` | `Workspace/Gun/Sounds/Fire.model.json5` | `@self/Sounds/Fire.model.json5` | Tool referencing nested sound | -| 8 | `Workspace/Model` | `Workspace/Model/Hey_Bro.server.luau` | `@self/Hey_Bro.server.luau` | Slugified child name | -| 9 | `Workspace/Model` | `Workspace/Model/Data~2` | `@self/Data~2` | Dedup'd child | - - -#### `./` -- Target is a sibling (shares same parent, 1 level up) - - -| # | Source | Target | Expected | Why | -| --- | ------------------------------------------ | -------------------------------------- | ----------------------- | -------------------------------------- | -| 10 | `Workspace/Folder/ScriptA.server.luau` | `Workspace/Folder/ScriptB.server.luau` | `./ScriptB.server.luau` | Sibling script | -| 11 | `Workspace/Folder/ScriptA.server.luau` | `Workspace/Folder/Config.luau` | `./Config.luau` | Sibling module | -| 12 | `Workspace/Folder/ScriptA.server.luau` | `Workspace/Folder/SubFolder` | `./SubFolder` | Sibling directory | -| 13 | `Workspace/Folder/ScriptA.server.luau` | `Workspace/Folder/SubFolder/Deep.luau` | `./SubFolder/Deep.luau` | Sibling then descend | -| 14 | `Workspace/Folder/ObjectValue.model.json5` | `Workspace/Folder/Target.model.json5` | `./Target.model.json5` | ObjectValue.Value pointing to sibling | -| 15 | `Workspace/Beams/Beam.model.json5` | `Workspace/Beams/Att1.model.json5` | `./Att1.model.json5` | Beam.Attachment0 to sibling attachment | -| 16 | `Workspace/Beams/Beam.model.json5` | `Workspace/Beams/Att2.model.json5` | `./Att2.model.json5` | Beam.Attachment1 to another sibling | -| 17 | `Workspace/Folder/A.luau` | `Workspace/Folder/Hey_Bro.server.luau` | `./Hey_Bro.server.luau` | Sibling with slugified name | -| 18 | `Workspace/Folder/A.luau` | `Workspace/Folder/Data~2` | `./Data~2` | Sibling with dedup suffix | -| 19 | `Workspace/Folder/A.luau` | `Workspace/Folder/Data~3.model.json5` | `./Data~3.model.json5` | Sibling model with dedup suffix | - - -#### `../` -- Navigate up 2+ levels then down (within same service) - - -| # | Source | Target | Expected | Why | -| --- | ----------------------------------------------- | ---------------------------------------------- | -------------------------------- | ------------------------------------------- | -| 20 | `Workspace/A/Script.server.luau` | `Workspace/B/Part.model.json5` | `../B/Part.model.json5` | Parent's sibling's child (2 ups) | -| 21 | `Workspace/A/Script.server.luau` | `Workspace/B` | `../B` | Parent's sibling directory (2 ups) | -| 22 | `Workspace/A/B/Script.server.luau` | `Workspace/C/Part.model.json5` | `../../C/Part.model.json5` | Grandparent's sibling's child (3 ups) | -| 23 | `Workspace/A/B/C/Script.luau` | `Workspace/D/E/Part.model.json5` | `../../../D/E/Part.model.json5` | 4 ups within same service | -| 24 | `Workspace/A/B/C/D/Script.luau` | `Workspace/E/Part.model.json5` | `../../../../E/Part.model.json5` | 5 ups within same service | -| 25 | `Workspace/Models/Car/Body.model.json5` | `Workspace/Models/Truck/Body.model.json5` | `../Truck/Body.model.json5` | Peer model in sibling folder | -| 26 | `Workspace/A/Deep/Script.luau` | `Workspace/A/Other.luau` | `../Other.luau` | Up from deep, target is cousin (2 ups) | -| 27 | `Workspace/A/B/Beam.model.json5` | `Workspace/A/C/Att.model.json5` | `../C/Att.model.json5` | Beam referencing attachment in uncle folder | -| 28 | `Workspace/Systems/Combat/Hitbox.server.luau` | `Workspace/Systems/Audio/HitSound.model.json5` | `../Audio/HitSound.model.json5` | Cross-system ref within same parent | -| 29 | `Workspace/Map/Zone1/Spawns/Spawn1.model.json5` | `Workspace/Map/Zone1/Props/Tree.model.json5` | `../Props/Tree.model.json5` | Same zone, different category | -| 30 | `Workspace/Map/Zone1/Spawns/Spawn1.model.json5` | `Workspace/Map/Zone2/Flag.model.json5` | `../../Zone2/Flag.model.json5` | Cross-zone ref | - - -#### `@game/` -- Cross-service or target is ancestor - - -| # | Source | Target | Expected | Why | -| --- | ----------------------------------------- | -------------------------------------------- | -------------------------------------------------- | ------------------------------------- | -| 31 | `Workspace/Script.server.luau` | `ReplicatedStorage/Module.luau` | `@game/ReplicatedStorage/Module.luau` | Classic cross-service require pattern | -| 32 | `Workspace/Script.server.luau` | `ServerStorage/Data.luau` | `@game/ServerStorage/Data.luau` | Server script to ServerStorage | -| 33 | `ServerScriptService/Main.server.luau` | `ReplicatedStorage/Shared/Utils.luau` | `@game/ReplicatedStorage/Shared/Utils.luau` | SSS to RS (common pattern) | -| 34 | `StarterGui/ScreenGui/Button.client.luau` | `ReplicatedStorage/UI/Theme.luau` | `@game/ReplicatedStorage/UI/Theme.luau` | Client UI to shared module | -| 35 | `Workspace/A/B/C/Script.luau` | `Lighting` | `@game/Lighting` | Ref to a service itself | -| 36 | `Workspace/A/B/C/Script.luau` | `Workspace` | `@game/Workspace` | Ref to own service (ancestor) | -| 37 | `Workspace/A/B/Script.luau` | `Workspace/A` | `@game/Workspace/A` | Ref to own grandparent (ancestor) | -| 38 | `Workspace/A/B/C/Script.luau` | `Workspace/A/B` | `@game/Workspace/A/B` | Ref to own great-grandparent | -| 39 | `Workspace/Model` | `ReplicatedStorage/Assets/Model.model.json5` | `@game/ReplicatedStorage/Assets/Model.model.json5` | Cross-service model ref | -| 40 | `Workspace/Beam.model.json5` | `Lighting/Atmosphere.model.json5` | `@game/Lighting/Atmosphere.model.json5` | Workspace to Lighting | -| 41 | `ReplicatedStorage/A.luau` | `ReplicatedStorage` | `@game/ReplicatedStorage` | Ref to own service (ancestor) | -| 42 | `Workspace/Script.luau` | `SoundService/BGM.model.json5` | `@game/SoundService/BGM.model.json5` | To SoundService | - - -#### Special names: slugified, dedup'd, init-style - - -| # | Source | Target | Expected | Why | -| --- | ------------------------- | -------------------------------------- | ----------------------- | ----------------------------------------------- | -| 43 | `Workspace/Folder/A.luau` | `Workspace/Folder/Hey_Bro.server.luau` | `./Hey_Bro.server.luau` | Sibling with slug (real name "Hey/Bro") | -| 44 | `Workspace/Folder/A.luau` | `Workspace/Other/CON_.luau` | `../Other/CON_.luau` | Windows reserved name (slugified) | -| 45 | `Workspace/A.luau` | `Workspace/Data~2` | `./Data~2` | Dedup'd sibling (Folder) | -| 46 | `Workspace/A.luau` | `Workspace/Data~3.model.json5` | `./Data~3.model.json5` | Dedup'd model sibling | -| 47 | `Workspace/A.luau` | `Workspace/Data~2/Child.luau` | `./Data~2/Child.luau` | Into dedup'd folder | -| 48 | `Workspace/Model` | `Workspace/Model/Scripts` | `@self/Scripts` | Child is init-style directory | -| 49 | `Workspace/Scripts` | `Workspace/Scripts/Foo` | `@self/Foo` | Source is init-style, child is too | -| 50 | `Workspace/MyFolder`_ | `Workspace/MyFolder_/Child.luau` | `@self/Child.luau` | Source name has trailing underscore (from slug) | - - -#### Tricky edge cases - - -| # | Source | Target | Expected | Why | -| --- | ----------------------------------- | ----------------------------------- | ------------------------------------- | ------------------------------------------------------------ | -| 51 | `Workspace` | `Workspace/Model.model.json5` | `@self/Model.model.json5` | Service referencing own child | -| 52 | `Workspace` | `ReplicatedStorage/Module.luau` | `@game/ReplicatedStorage/Module.luau` | Service to service (cross-service) | -| 53 | `Workspace` | `Workspace` | `@self` | Service self-ref | -| 54 | `Workspace` | `Lighting` | `@game/Lighting` | Service to different service | -| 55 | `Workspace/A` | `Workspace/AB` | `./AB` | Prefix ambiguity: "A" is NOT prefix of "AB" in segment terms | -| 56 | `Workspace/Foo.server.luau` | `Workspace/Foo.luau` | `./Foo.luau` | Same stem different extension = different instances | -| 57 | `Workspace/A/B/C/D/E/F/Script.luau` | `Workspace/A/B/C/D/E/G/Target.luau` | `../G/Target.luau` | Deep nesting, close cousins | -| 58 | `Workspace/A/B/C/D/E/F/Script.luau` | `Workspace/X/Target.luau` | `../../../../../X/Target.luau` | Deep nesting, far apart but same service | - - ---- - -### Test Specification: `resolve_ref_path(path, source_ref, tree)` - -Build a RojoTree for each test. The tree structure is shown in comments. Each test verifies that the path resolves to the correct Ref (or None). - -#### Prefix resolution - -Tree for tests 59-78 (instance hierarchy with filesystem names in parens): - -``` -DataModel (root) - Workspace - ModelA (Model, fs: "ModelA") - Script (Script server, fs: "Script.server.luau") - Handle (Part, fs: "Handle.model.json5") - SubFolder (Folder, fs: "SubFolder") - Deep (Part, fs: "Deep.model.json5") - ModelB (Folder, fs: "ModelB") - Part (Part, fs: "Part.model.json5") - ReplicatedStorage - Module (ModuleScript, fs: "Module.luau") - Shared (Folder, fs: "Shared") - Utils (ModuleScript, fs: "Utils.luau") - Lighting -``` - -Key relationships: Script and Handle are **siblings** under ModelA. ModelA **has children** (Script, Handle, SubFolder). ModelA and ModelB are **siblings** under Workspace. - - -| # | Path | Source | Expected | Why | -| --- | ------------------------------------------- | ------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 59 | `@self/Handle.model.json5` | ModelA | Handle | `@self/` starts at ModelA, child Handle | -| 60 | `@self/SubFolder/Deep.model.json5` | ModelA | Deep | `@self/` nested descent from ModelA | -| 61 | `@self` | Script | Script | Self-reference (no path after prefix) | -| 62 | `./Handle.model.json5` | Script | Handle | `./` starts at Script.Parent = ModelA, child Handle | -| 63 | `./SubFolder/Deep.model.json5` | Script | Deep | `./` starts at ModelA, descend through SubFolder | -| 64 | `./Script.server.luau` | Handle | Script | `./` from Handle.Parent = ModelA, child Script | -| 65 | `../ModelB/Part.model.json5` | Script | Part | `../` starts at Script.Parent.Parent = Workspace, then ModelB/Part | -| 66 | `../../ReplicatedStorage/Module.luau` | Script | Module | `../` starts at Workspace; remaining `../ReplicatedStorage/Module.luau` goes `..` up to DataModel root, then descends. Valid path (just not one we'd generate -- we'd use `@game/` instead) | -| 67 | `@game/ReplicatedStorage/Module.luau` | Script | Module | `@game/` absolute from root | -| 68 | `@game/Workspace/ModelA/Handle.model.json5` | Script | Handle | `@game/` works even when target is nearby | -| 69 | `@game/Lighting` | Script | Lighting | `@game/` to a service | -| 70 | `Workspace/ModelA/Handle.model.json5` | Script | Handle | Bare path (no prefix) = backward compat, resolves like `@game/` | -| 71 | `@game/Workspace/ModelA/NonExistent` | Script | None | Target doesn't exist | -| 72 | `./NonExistent.luau` | Script | None | Sibling doesn't exist | - - -#### `..` mid-path - - -| # | Path | Source | Expected | Why | -| --- | ------------------------------------------- | ------ | -------- | ------------------------------------------------------------------------------------ | -| 73 | `@self/SubFolder/../Handle.model.json5` | ModelA | Handle | Start at ModelA, into SubFolder, `..` back to ModelA, child Handle | -| 74 | `./SubFolder/../Script.server.luau` | Handle | Script | `./` at ModelA, into SubFolder, `..` back to ModelA, child Script | -| 75 | `./SubFolder/../../ModelB/Part.model.json5` | Script | Part | `./` at ModelA, into SubFolder, `..` to ModelA, `..` to Workspace, child ModelB/Part | - - -#### Case-insensitive matching - - -| # | Path | Source | Expected | Why | -| --- | ------------------------------------------- | ------ | -------- | ---------------------------------------- | -| 76 | `@self/handle.model.json5` | ModelA | Handle | Lowercase "handle" matches "Handle" | -| 77 | `./SCRIPT.SERVER.LUAU` | Handle | Script | All-caps matches filesystem name | -| 78 | `@game/workspace/modela/Handle.model.json5` | Script | Handle | Lowercase service and folder names match | - - -#### Filesystem name vs instance name fallback - -Tree with metadata: - -``` -DataModel - Workspace - MyFolder (fs_name: "MyFolder", instance_name: "MyFolder") - Slugged (fs_name: "Hey_Bro.server.luau", instance_name: "Hey/Bro") - Normal.luau (fs_name: "Normal.luau", instance_name: "Normal") -``` - - -| # | Path | Source | Expected | Why | -| --- | ---------------------------------------------- | ------ | -------- | -------------------------- | -| 79 | `./Hey_Bro.server.luau` | Normal | Slugged | Matches by filesystem name | -| 80 | `@game/Workspace/MyFolder/Hey_Bro.server.luau` | Normal | Slugged | Absolute with fs name | - - ---- - -### Test Specification: Syncback Round-Trip - -Each test: build a WeakDom with specific instances and Ref properties, run syncback, verify the on-disk `Rojo_Ref_*` attribute values, then rebuild from disk and verify the Ref properties resolve to the same targets. - -#### RT-1: Model with PrimaryPart (`@self/`) - -``` -Workspace - TestModel (Model) - PrimaryPart → Handle - Handle (Part) - Other (Part) -``` - -**Expected on disk** (`Workspace/TestModel/init.meta.json5`): - -```json5 -{ "className": "Model", "attributes": { "Rojo_Ref_PrimaryPart": "@self/Handle.model.json5" } } -``` - -Rebuild: `TestModel.PrimaryPart` == Handle. Round-trip identical. - -#### RT-2: Cross-service ObjectValue (`@game/`) - -``` -Workspace - OV (ObjectValue) - Value → Target -ReplicatedStorage - Target (ModuleScript, source="return {}") -``` - -**Expected on disk** (`Workspace/OV.model.json5`): - -```json5 -{ "className": "ObjectValue", "attributes": { "Rojo_Ref_Value": "@game/ReplicatedStorage/Target.luau" } } -``` - -#### RT-3: Beam with attachments in same parent (`./`) - -``` -Workspace - Beams (Folder) - Beam (Beam) - Attachment0 → Att1 - Attachment1 → Att2 - Att1 (Attachment) - Att2 (Attachment) -``` - -**Expected on disk** (`Workspace/Beams/Beam.model.json5`): - -```json5 -{ - "className": "Beam", - "attributes": { - "Rojo_Ref_Attachment0": "./Att1.model.json5", - "Rojo_Ref_Attachment1": "./Att2.model.json5" - } -} -``` - -#### RT-4: Beam with attachments in sibling subfolder (`./`) - -``` -Workspace - Beams (Folder) - Beam (Beam) - Attachment0 → Att1 - Attachments (Folder) - Att1 (Attachment) -``` - -Beam and Attachments are siblings under Beams. Source = `Workspace/Beams/Beam.model.json5`. Target = `Workspace/Beams/Attachments/Att1.model.json5`. LCA = `Workspace/Beams`. ups = 1 --> `./`. - -**Expected on disk** (`Workspace/Beams/Beam.model.json5`): - -```json5 -{ - "className": "Beam", - "attributes": { "Rojo_Ref_Attachment0": "./Attachments/Att1.model.json5" } -} -``` - -#### RT-5: Beam with attachments across branches (`../`) - -``` -Workspace - GroupA (Folder) - Beam (Beam) - Attachment0 → Att1 - GroupB (Folder) - Att1 (Attachment) -``` - -**Expected on disk** (`Workspace/GroupA/Beam.model.json5`): - -```json5 -{ "className": "Beam", "attributes": { "Rojo_Ref_Attachment0": "../GroupB/Att1.model.json5" } } -``` - -Source = `Workspace/GroupA/Beam.model.json5`. Target = `Workspace/GroupB/Att1.model.json5`. LCA = `Workspace`. ups = 2. `../GroupB/Att1.model.json5`. - -#### RT-6: Mixed prefix types across multiple meta files - -``` -Workspace - Container (Folder) - Model (Model) - Handle (Part) <-- child of Model - RefToSibling (ObjectValue, Value → Sibling) <-- child of Model - Sibling (Part) <-- child of Container (sibling of Model) -ReplicatedStorage - SharedModule (ModuleScript) -``` - -Two refs produce different prefix types: - -1. **Model.PrimaryPart → Handle**: Source = Model (`Workspace/Container/Model`). Handle is a descendant of Model --> `@self/Handle.model.json5`. Written in `Model/init.meta.json5`. -2. **RefToSibling.Value → Sibling**: Source = RefToSibling (`Workspace/Container/Model/RefToSibling.model.json5`). Target = Sibling (`Workspace/Container/Sibling.model.json5`). LCA = Container. ups = 2 --> `../Sibling.model.json5`. Written in `RefToSibling.model.json5`. - -**Expected** (`Workspace/Container/Model/init.meta.json5`): - -```json5 -{ "className": "Model", "attributes": { "Rojo_Ref_PrimaryPart": "@self/Handle.model.json5" } } -``` - -**Expected** (`Workspace/Container/Model/RefToSibling.model.json5`): - -```json5 -{ "className": "ObjectValue", "attributes": { "Rojo_Ref_Value": "../Sibling.model.json5" } } -``` - -Verifies two different ref prefix types coexist in the same directory tree. - -#### RT-7: Refs through dedup'd siblings - -``` -Workspace - Container (Folder) - Data (Folder, child1) - Data (Folder, child2) --> gets dedup'd to Data~2 - Pointer (ObjectValue) - Value → Data(child2) -``` - -**Expected** (`Workspace/Container/Pointer.model.json5`): - -```json5 -{ "className": "ObjectValue", "attributes": { "Rojo_Ref_Value": "./Data~2" } } -``` - -#### RT-8: Ref to init-style script - -``` -Workspace - Folder - Pointer (ObjectValue, Value → BigScript) - BigScript (ModuleScript with children) - Helper (ModuleScript) -``` - -BigScript has children, so it becomes a directory: `Folder/BigScript/init.luau`. Filesystem name = `BigScript`. - -**Expected** (`Workspace/Folder/Pointer.model.json5`): - -```json5 -{ "className": "ObjectValue", "attributes": { "Rojo_Ref_Value": "./BigScript" } } -``` - -#### RT-9: Ref to instance with slugified name - -``` -Workspace - Folder - Pointer (ObjectValue, Value → Target) - Target (Script, name="Hey:There", server) -``` - -"Hey:There" slugifies to "Hey_There". File = `Hey_There.server.luau`. - -**Expected** (`Workspace/Folder/Pointer.model.json5`): - -```json5 -{ "className": "ObjectValue", "attributes": { "Rojo_Ref_Value": "./Hey_There.server.luau" } } -``` - -#### RT-10: Deep nesting within same service - -``` -Workspace - A (Folder) - B (Folder) - C (Folder) - D (Folder) - Source (ObjectValue, Value → Target) - X (Folder) - Target (Part) -``` - -Source = `Workspace/A/B/C/D/Source.model.json5`. Target = `Workspace/A/X/Target.model.json5`. LCA = `Workspace/A`. ups = 4. --> `../../../X/Target.model.json5`. - -**Expected**: - -```json5 -{ "className": "ObjectValue", "attributes": { "Rojo_Ref_Value": "../../../X/Target.model.json5" } } -``` - -#### RT-11: Multiple instances referencing same target from different depths - -``` -Workspace - Target (Part) - Shallow (ObjectValue, Value → Target) - Deep (Folder) - Mid (Folder) - DeepOV (ObjectValue, Value → Target) -``` - -- Shallow: Source = `Workspace/Shallow.model.json5`, Target = `Workspace/Target.model.json5`. ups = 1. --> `./Target.model.json5` -- DeepOV: Source = `Workspace/Deep/Mid/DeepOV.model.json5`, Target = `Workspace/Target.model.json5`. LCA = `Workspace`. ups = 3. --> `../../Target.model.json5` - -Verifies same target gets different paths from different sources. - -#### RT-12: Duplicate-named attachments (dedup + placeholder system) - -``` -Workspace - Beams (Folder) - Att (Attachment, child1) - Att (Attachment, child2) --> Att~2 - Att (Attachment, child3) --> Att~3 - Beam (Beam) - Attachment0 → Att(child2) - Attachment1 → Att(child3) -``` - -**Expected** (`Workspace/Beams/Beam.model.json5`): - -```json5 -{ - "className": "Beam", - "attributes": { - "Rojo_Ref_Attachment0": "./Att~2.model.json5", - "Rojo_Ref_Attachment1": "./Att~3.model.json5" - } -} -``` - -Verifies source-aware placeholders produce correct per-source relative paths even with dedup. - ---- - -### Test Specification: Two-Way Sync - -#### TW-1: Ref property change writes relative path - -Setup: Serve session with tree: - -``` -Workspace - Model (Model) - Handle (Part) -``` - -Plugin sends: `Model.PrimaryPart = Handle` (Ref property change). - -**Verify** `init.meta.json5` on disk contains: - -```json5 -{ "attributes": { "Rojo_Ref_PrimaryPart": "@self/Handle.model.json5" } } -``` - -#### TW-2: Cross-service ref writes `@game/` - -Setup: - -``` -Workspace - OV (ObjectValue) -ReplicatedStorage - Target (ModuleScript) -``` - -Plugin sends: `OV.Value = Target`. - -**Verify** `OV.model.json5` contains: - -```json5 -{ "attributes": { "Rojo_Ref_Value": "@game/ReplicatedStorage/Target.luau" } } -``` - -#### TW-3: Nil ref removes attribute - -Setup: Model already has `Rojo_Ref_PrimaryPart: "@self/Handle.model.json5"` on disk. - -Plugin sends: `Model.PrimaryPart = nil`. - -**Verify**: `Rojo_Ref_PrimaryPart` is removed from the meta file. - -#### TW-4: Same-batch add + ref - -Plugin sends in one write request: - -- Add: new Part "NewPart" under Model -- Update: `Model.PrimaryPart = NewPart` - -**Verify**: meta file contains `Rojo_Ref_PrimaryPart` with relative path to the newly added instance (should be `@self/NewPart.model.json5`). - -#### TW-5: Rename target updates refs - -Setup: - -``` -Workspace - Folder - Pointer (ObjectValue, Value → OldName) - OldName (Part) -``` - -On disk: `Pointer.model.json5` has `"Rojo_Ref_Value": "./OldName.model.json5"`. - -Plugin renames `OldName` to `NewName`. - -**Verify**: `Pointer.model.json5` updated to `"Rojo_Ref_Value": "./NewName.model.json5"`. - -#### TW-6: Rename source does NOT change its own outgoing refs - -Setup: - -``` -Workspace - Folder - SourceOV (ObjectValue, Value → Target) - Target (Part) -``` - -On disk: `SourceOV.model.json5` has `"Rojo_Ref_Value": "./Target.model.json5"`. - -Plugin renames `SourceOV` to `RenamedOV`. - -**Verify**: `RenamedOV.model.json5` still has `"Rojo_Ref_Value": "./Target.model.json5"` (unchanged -- the relative relationship didn't change). - -#### TW-7: Dedup cleanup rename updates refs - -Setup: - -``` -Workspace - Folder - Data (Folder) - Data~2 (Folder) - Pointer (ObjectValue, Value → Data~2) -``` - -On disk: `Pointer.model.json5` has `"Rojo_Ref_Value": "./Data~2"`. - -Delete `Data` (the base). Dedup cleanup promotes `Data~2` --> `Data`. - -**Verify**: `Pointer.model.json5` updated to `"Rojo_Ref_Value": "./Data"`. - -#### TW-8: Base-name promotion with cross-branch ref - -Setup: - -``` -Workspace - GroupA - Pointer (ObjectValue, Value → Target) - GroupB - Target (Part) - Target~2 (Part) -``` - -On disk: `Pointer.model.json5` has `"Rojo_Ref_Value": "../GroupB/Target~2"`. - -Delete `Target` (base). Cleanup: `Target~2` --> `Target`. - -**Verify**: `Pointer.model.json5` updated to `"Rojo_Ref_Value": "../GroupB/Target"`. - -#### TW-9: Multiple referencing files with different relative paths - -Setup: - -``` -Workspace - Target (Part) - ShallowOV (ObjectValue, Value → Target) - Deep - DeepOV (ObjectValue, Value → Target) -``` - -Rename `Target` to `Renamed`. - -**Verify**: - -- `ShallowOV.model.json5`: `"Rojo_Ref_Value": "./Renamed.model.json5"` (was `./Target.model.json5`) -- `Deep/DeepOV.model.json5`: `"Rojo_Ref_Value":` ../Renamed.model.json5"`(was`../Target.model.json5`) - -Both files updated with correct relative paths from their respective positions. - -#### TW-10: Rename intermediate ancestor - -Setup: - -``` -Workspace - Parent - Child - Target (Part) - Pointer (ObjectValue, Value → Target) -``` - -On disk: `Pointer.model.json5` has `"Rojo_Ref_Value": "./Parent/Child/Target.model.json5"`. - -Rename `Parent` to `RenamedParent`. - -**Verify**: `Pointer.model.json5` updated to `"Rojo_Ref_Value": "./RenamedParent/Child/Target.model.json5"`. - ---- - -### Test Specification: Placeholder System (Syncback) - -#### PH-1: Source-aware placeholders are unique - -Build DOM with two ObjectValues pointing to the same target: - -``` -Workspace - Target (Part) - OV_A (ObjectValue, Value → Target) - OV_B (ObjectValue, Value → Target) -``` - -Call `collect_referents` without `final_paths`. - -**Verify**: - -- OV_A gets placeholder `__ROJO_REF__TO_`__ -- OV_B gets placeholder `__ROJO_REF__TO_`__ -- Placeholders are different strings -- `placeholder_to_source_and_target` maps each to `(source_ref, target_ref)` - -#### PH-2: Post-processing produces different relative paths for same target - -After walk, `ref_path_map` contains: - -- OV_A --> `Workspace/OV_A.model.json5` -- OV_B --> `Workspace/Deep/OV_B.model.json5` -- Target --> `Workspace/Target.model.json5` - -**Verify substitutions**: - -- OV_A's placeholder --> `./Target.model.json5` (sibling) -- OV_B's placeholder --> `../Target.model.json5` (2 ups) - -#### PH-3: Duplicate-named targets with source-aware placeholders - -``` -Workspace - Beams - Att (Attachment, child1) - Att (Attachment, child2) - Beam (Beam, Attachment0 → child1, Attachment1 → child2) -``` - -Both attachments are named "Att" so they get different Refs but tentatively the same path. Placeholders encode both source (Beam) and target (child1, child2) so they're unique. - -After walk with dedup: child1 = `Att.model.json5`, child2 = `Att~2.model.json5`. - -**Verify**: - -- Attachment0: `./Att.model.json5` -- Attachment1: `./Att~2.model.json5` -- No chaining corruption - -#### PH-4: With `final_paths` available, computes relative directly - -Call `collect_referents` WITH `final_paths`: - -``` -OV_A source path: "Workspace/OV_A.model.json5" -Target final path: "Workspace/Target.model.json5" -``` - -**Verify**: No placeholders generated. Path stored directly as `./Target.model.json5`. - ---- - -### Test Specification: RefPathIndex with Relative Paths - -#### RI-1: populate_from_tree indexes resolved absolute paths - -Tree has: - -``` -Workspace/Model/init.meta.json5 with Rojo_Ref_PrimaryPart: "@self/Handle.model.json5" -``` - -Source instance absolute path: `Workspace/Model`. Resolve `@self/Handle.model.json5` from Model = `Workspace/Model/Handle.model.json5`. - -**Verify**: Index contains key `Workspace/Model/Handle.model.json5` mapping to the meta file. - -#### RI-2: find_by_prefix still works with absolute keys - -After RI-1, call `find_by_prefix("Workspace/Model/Handle.model.json5")`. - -**Verify**: Returns the meta file path. - -#### RI-3: Relative refs from different files pointing to same target - -Two files: - -- `Workspace/A/Pointer.model.json5` with `"Rojo_Ref_Value": "./Target.model.json5"` (resolves to `Workspace/A/Target.model.json5`) -- `Workspace/B/Pointer.model.json5` with `"Rojo_Ref_Value": "../A/Target.model.json5"` (resolves to `Workspace/A/Target.model.json5`) - -**Verify**: Both files indexed under key `Workspace/A/Target.model.json5`. - -#### RI-4: Rename updates files with recomputed relative paths - -After RI-3, rename `Workspace/A/Target.model.json5` to `Workspace/A/Renamed.model.json5`. - -**Verify**: - -- `Workspace/A/Pointer.model.json5` updated to `"Rojo_Ref_Value": "./Renamed.model.json5"` -- `Workspace/B/Pointer.model.json5` updated to `"Rojo_Ref_Value": "../A/Renamed.model.json5"` -- Index key updated from `Workspace/A/Target.model.json5` to `Workspace/A/Renamed.model.json5` - ---- - -### Test Specification: `fix_ref_paths` (fs_snapshot.rs) - -#### FP-1: Source-aware substitution with different relative paths - -Snapshot has two meta files: - -``` -/test/ShallowOV.model.json5: - { "attributes": { "Rojo_Ref_Value": "__ROJO_REF_shallow_TO_target__" } } - -/test/Deep/DeepOV.model.json5: - { "attributes": { "Rojo_Ref_Value": "__ROJO_REF_deep_TO_target__" } } -``` - -Substitutions: - -- `__ROJO_REF_shallow_TO_target__` --> `./Target.model.json5` -- `__ROJO_REF_deep_TO_target__` --> `../Target.model.json5` - -**Verify**: Each file gets its own correct relative path. - -#### FP-2: Non-ref lines are never touched - -Meta file has a `properties.Description` containing "Rojo_Ref_" as a string value. - -**Verify**: Only lines with actual `Rojo_Ref`_ attribute keys are substituted. - -#### FP-3: Non-meta files are never touched - -A `.luau` file happens to contain a placeholder string in a comment. - -**Verify**: File is not modified. - -#### FP-4: Multiple refs in same file with mixed prefixes - -```json5 -{ - "attributes": { - "Rojo_Ref_PrimaryPart": "__ROJO_REF_model_TO_handle__", - "Rojo_Ref_Value": "__ROJO_REF_model_TO_target__" - } -} -``` - -Substitutions produce `@self/Handle.model.json5` and `@game/ReplicatedStorage/Target.luau`. - -**Verify**: Both substituted correctly in same file. - ---- - -### Test Specification: Backward Compatibility - -#### BC-1: Old bare paths resolve correctly - -Meta file on disk: `{ "attributes": { "Rojo_Ref_PrimaryPart": "Workspace/Model/Handle.model.json5" } }`. - -**Verify**: Forward sync resolves this to the correct Handle instance (bare path treated as `@game/`). - -#### BC-2: Old bare paths still work during transition - -Build from a project that has old-format `Rojo_Ref_`* values. Refs should resolve correctly. No errors or warnings that break the build. - -#### BC-3: Syncback overwrites old format with new - -Project has old bare paths on disk. Run syncback. **Verify** all `Rojo_Ref_`* values are rewritten with the correct prefix (`@self/`, `./`, `../`, or `@game/`). - ---- - -### Test Specification: Format Transition (syncback_format_transitions) - -#### FT-1: Old absolute --> new relative on re-syncback - -Project has `"Rojo_Ref_PrimaryPart": "Workspace/Model/Handle.model.json5"` (old format). - -Run syncback with same rbxl. - -**Verify**: File updated to `"Rojo_Ref_PrimaryPart": "@self/Handle.model.json5"`. - -#### FT-2: Mixed old and new formats in same project - -Some files have old bare paths, others have already been updated to new format. Run syncback. - -**Verify**: ALL files now use new format. No old bare paths remain. \ No newline at end of file diff --git a/.cursor/plans/matching_algorithm_parity_01524d4c.plan.md b/.cursor/plans/matching_algorithm_parity_01524d4c.plan.md deleted file mode 100644 index e5eec1b7..00000000 --- a/.cursor/plans/matching_algorithm_parity_01524d4c.plan.md +++ /dev/null @@ -1,275 +0,0 @@ ---- -name: matching algorithm parity -overview: Fix scoring parity between the 3 matching algorithm implementations (Rust forward sync, Rust syncback, Lua plugin) and add parity/round-trip tests. -todos: - - id: fix-1-ref-scoring - content: "Fix 1: Add Ref-target-aware scoring to Rust countOwnDiffs in both forward sync and syncback matching" - status: completed - - id: fix-2-tags-attrs - content: "Fix 2: Add granular Tags/Attributes scoring to Rust countOwnDiffs in both implementations" - status: completed - - id: fix-3-epsilon - content: "Fix 3: Replace float_cmp::approx_eq! with custom fuzzy_eq matching Lua's 0.0001 epsilon in variant_eq.rs" - status: completed - - id: fix-4-sort - content: "Fix 4: Add matched_indices sort to forward sync build_result; remove TODO from syncback" - status: completed - - id: fix-5-vcache - content: "Fix 5: Cache VCache at session level in Lua matching.lua to avoid redundant decoding" - status: completed - - id: fix-6-tests - content: "Fix 6: Add parity tests (Rust forward vs syncback), round-trip matching test, and Lua parity spec test" - status: completed - - id: run-ci - content: Run /ci after all fixes to verify CI passes - status: completed -isProject: false ---- - -# Matching Algorithm Parity Audit Fixes - -> This plan was generated by `/audit` from a Plan-mode session. -> Refer to `.cursor/rules/atlas.mdc` for full project standards. - -## Standards - -These standards govern every fix in this plan. An implementer MUST read `.cursor/rules/atlas.mdc` before starting. - -### Round-Trip Identity (from `atlas.mdc` Quality Standard) - -Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -### CLI Syncback Parity (from `atlas.mdc` Two-Way Sync Strategy) - -Plugin-based sync must produce **exactly the same filesystem output** that `atlas syncback` would give for the same input. Byte-for-byte identical files, identical directory structures, identical naming. Any divergence is a bug until proven otherwise. - -### Code Quality (from `atlas.mdc` Code Quality Standard) - -DRY code that is easy to reason about and hard to get wrong. The same slugify/dedup/meta-update pattern should not be copy-pasted across files. Small refactors (2-3 call sites) are included as fixes. Major rewrites (10+ call sites) are deferred. - -## Context - -The matching algorithm was audited across all 3 parallel implementations: - -- `src/snapshot/matching.rs` (Rust forward sync) -- `src/syncback/matching.rs` (Rust syncback) -- `plugin/src/Reconciler/matching.lua` (Lua plugin) - -The audit found **scoring parity issues** that could cause different implementations to produce different pairings for the same logical input. The most critical is Ref property scoring (UNMATCHED_PENALTY in Lua vs +1 in Rust), followed by Tags/Attributes granularity and float epsilon differences. - -## Fixes - -### Fix 1: Add Ref-Target-Aware Scoring to Rust `countOwnDiffs` - -- **Status:** Approved -- **Finding:** Step 11l: Matching Algorithm Parity -- Ref property scoring -- **Files:** `src/snapshot/matching.rs`, `src/syncback/matching.rs` -- **Problem:** Lua `countOwnDiffs` (matching.lua lines 309-325) scores Ref property mismatches at `UNMATCHED_PENALTY = 10000` by comparing target Name+ClassName. Rust `count_own_diffs` in both files treats Ref properties as regular Variant properties scoring +1 per mismatch. In syncback matching, Ref IDs are always different between WeakDom instances, so ALL Ref properties score +1 regardless of logical equivalence. -- **Solution:** - - In **forward sync** `count_own_diffs` (matching.rs line 452-496): When comparing properties, detect `Variant::Ref` values. For each Ref property: - - If both sides have a Ref value, resolve both Refs to their target instances (via `tree.get_instance(ref)` for tree side, look up snapshot children by snapshot_id for snap side). Compare target Name+ClassName. If different, add `UNMATCHED_PENALTY` instead of 1. - - If one side has Ref and other doesn't (or Ref::none vs valid ref), add `UNMATCHED_PENALTY`. - - Skip `Variant::Ref` from regular property comparison to avoid double-counting. - - In **syncback** `count_own_diffs` (matching.rs line 501-548): Same approach using `new_dom.get_by_ref(ref)` and `old_dom.get_by_ref(ref)` to resolve targets. - - Both functions need access to the DOM/tree for Ref resolution -- add the necessary parameters. -- **Risk:** Adding DOM access to `count_own_diffs` increases its parameter count. The function is `#[inline]`, so ensure the extra parameter doesn't cause performance regression. The Ref resolution is a simple hash lookup (O(1)). -- **Verify round-trip:** Create 3 Models named "Weapon" with different PrimaryPart targets. Syncback, then forward sync. Verify all 3 match to their correct counterparts. -- **Verify syncback parity:** Compare CLI syncback output with two-way sync output for a tree with Ref-differentiated instances. -- **Tests required:** - - Rust unit test: `ref_scoring_forward_sync` -- 2 Models with different PrimaryPart targets, verify correct pairing - - Rust unit test: `ref_scoring_syncback` -- same scenario for syncback matching - - Lua spec test: already has ref scoring test in matching.spec.lua, verify it passes - -### Fix 2: Add Granular Tags/Attributes Scoring to Rust `countOwnDiffs` - -- **Status:** Approved -- **Finding:** Step 11l: Matching Algorithm Parity -- Tags/Attributes granularity -- **Files:** `src/snapshot/matching.rs`, `src/syncback/matching.rs` -- **Problem:** Lua `countOwnDiffs` counts per-tag (+1 each in symmetric difference) and per-attribute (+1 each diff). Rust counts Tags as one Variant property (+1 total) and Attributes as one Variant property (+1 total). An instance with 5 extra tags scores +5 in Lua but +1 in Rust. -- **Solution:** - - In both Rust `count_own_diffs` functions: - - When encountering `Variant::Tags(tags)`, extract and compare granularly: +1 per tag in symmetric difference. Skip from regular property comparison. - - When encountering `Variant::Attributes(attrs)`, extract and compare granularly: +1 per attribute whose value differs (using `variant_eq`), +1 per attribute present only on one side. Skip from regular property comparison. - - The key check is `key == "Tags"` (for `Variant::Tags`) and `key == "Attributes"` (for `Variant::Attributes`). -- **Risk:** Low. Only changes the cost value for Tags/Attributes, making it more discriminating. Existing tests should still pass since they don't depend on exact cost values, only on correct pairings. -- **Verify round-trip:** Instances differing by tags should be paired correctly. -- **Verify syncback parity:** N/A -- Tags/Attributes rarely distinguish instances in typical syncback scenarios. -- **Tests required:** - - Rust unit test: `tags_granular_scoring` -- 2 Parts with different tag sets, verify scoring matches Lua behavior - - Rust unit test: `attributes_granular_scoring` -- 2 Parts with different attribute maps, verify scoring - -### Fix 3: Loosen Rust Float Epsilon to Match Lua - -- **Status:** Approved (Modified: loosen Rust to match Lua) -- **Finding:** Step 11l: Matching Algorithm Parity -- Float epsilon -- **Files:** `src/variant_eq.rs` -- **Problem:** Lua `trueEquals` uses epsilon=0.0001 with absolute+relative check. Rust `variant_eq` uses `float_cmp::approx_eq!` defaults (epsilon~1.19e-7, ulps=4), which is ~1000x tighter. This means Rust considers values different that Lua considers equal, potentially causing different match scores and different pairings. -- **Solution:** - - Replace the `approx_eq!` macro wrapper in `variant_eq.rs` with a custom `fuzzy_eq` function that matches Lua's dual epsilon approach: - -```rust - const EPSILON: f32 = 0.0001; - fn fuzzy_eq_f32(a: f32, b: f32) -> bool { - if a.is_nan() && b.is_nan() { return true; } - let diff = (a - b).abs(); - let max_val = a.abs().max(b.abs()).max(1.0); - diff < EPSILON || diff < max_val * EPSILON - } - - -``` - -- Apply similar `fuzzy_eq_f64` for f64 comparisons. -- Update all float comparison call sites in `variant_eq` (Color3, CFrame, Vector3, UDim, etc.) to use the new function instead of `approx_eq!`. -- Remove the `float-cmp` dependency from `Cargo.toml` if no other code uses it. -- **Risk:** Medium. Loosening epsilon means values that were previously considered different are now equal. This affects: - - `variant_eq` used in matching (intended -- this fix) - - `variant_eq` used in `patch_compute.rs` for property diff detection (side effect -- could suppress legitimate property patches for near-equal values) - - Verify that the 0.0001 epsilon doesn't suppress meaningful Studio property changes. -- **Verify round-trip:** Float properties should round-trip without phantom diffs (the looser epsilon should REDUCE phantom diffs, not create them). -- **Verify syncback parity:** N/A -- **Tests required:** - - Rust unit test: update existing `variant_eq` float tests to verify the new epsilon behavior - - Rust unit test: `fuzzy_eq_matches_lua` -- verify same boundary values as `trueEquals.spec.lua` (0.0001 threshold, relative scaling, NaN handling) - -### Fix 4: Add Sort to Forward Sync `build_result` for Consistency - -- **Status:** Approved -- **Finding:** Code quality -- inconsistent sort between implementations -- **Files:** `src/snapshot/matching.rs`, `src/syncback/matching.rs` -- **Problem:** Syncback `build_result` (line 217) sorts `matched_indices` by new_ref index. Forward sync `build_result` (line 206) does NOT sort. The Lua `matchChildren` returns matched pairs in insertion order (which is group iteration order, then sorted within groups). -- **Solution:** - - Add `matched_indices.sort_by_key(|&(si, _)| si);` to the forward sync `build_result` function (line 203, before the matched Vec construction). - - Remove the TODO comment from the syncback version (line 217): the sort is intentional for consistent downstream iteration order. -- **Risk:** Very low. Only changes the ORDER of matched pairs in the result, not WHICH pairs are matched. Downstream code iterates matched pairs for patch computation, and order should not affect correctness. -- **Verify round-trip:** N/A -- order of matched pairs doesn't affect round-trip identity. -- **Verify syncback parity:** N/A -- **Tests required:** - - No new tests needed. Existing tests verify correct pairings, not ordering. - -### Fix 5: Cache VCache at Session Level in Lua Matching - -- **Status:** Approved -- **Finding:** Performance -- redundant `cacheVirtual` calls -- **Files:** `plugin/src/Reconciler/matching.lua` -- **Problem:** `cacheVirtual` is called during ambiguous group scoring (line 492) AND again inside `computePairCost` (line 362). The same virtual instance's properties are decoded multiple times per session. -- **Solution:** - - Add a `vCacheStore: { [string]: VCache }` field to `MatchingSession`. - - In `cacheVirtual`, check `session.vCacheStore[virtualId]` first. If present, return cached. Otherwise, compute and store. - - Update `computePairCost` to use the session-level cache instead of re-calling `cacheVirtual`. - - The `classKeys` parameter varies by group, but for a given virtualId the classKeys is always the same (determined by ClassName). So caching by virtualId is safe. -- **Risk:** Very low. Pure performance optimization. The VCache content is deterministic for a given virtualId. -- **Verify round-trip:** N/A -- **Verify syncback parity:** N/A -- **Tests required:** - - No new tests needed. Existing matching.spec.lua tests verify correctness. Could add a timing test but not required. - -### Fix 6: Add Parity Tests Between All 3 Implementations - -- **Status:** Approved -- **Finding:** Steps 5-6: Missing parity and round-trip tests -- **Files:** `tests/tests/matching_fixtures.rs` (extend), `plugin/src/Reconciler/matching.spec.lua` (extend) -- **Problem:** No tests verify that the 3 implementations produce identical pairings for the same input. Given Fixes 1-3 close the scoring gaps, parity tests are needed to prevent future divergence. -- **Solution:** - - **Rust integration test** (`tests/tests/matching_fixtures.rs`): Add a test `parity_forward_vs_syncback` that: - 1. Creates a WeakDom with an ambiguous group (e.g., 4 Parts named "Line" with different Transparency values, in reversed order) - 2. Runs syncback matching on `(new_children, old_children)` - 3. Builds a RojoTree from `new_children` snapshots, runs forward sync matching on `(old_children_as_snapshots, tree_children)` - 4. Verifies both produce the same pairings (by comparing matched Name+Property values) - - **Lua spec test** (`matching.spec.lua`): Add a test `parity_with_rust_fixture` that: - 1. Uses the same input data as the Rust test (4 Parts with specific Transparency values) - 2. Runs Lua matching - 3. Verifies the same pairings as the Rust tests (by property comparison) - - **Round-trip matching test** (`tests/tests/matching_fixtures.rs`): Add `round_trip_matching_identity`: - 1. Uses the UFOWave fixture (12 Textures with default-omitted Face) - 2. Runs syncback to produce filesystem - 3. Runs forward sync on the filesystem output - 4. Verifies all 12 Textures are matched to their correct counterparts (by Face value) -- **Risk:** None. Tests only. -- **Verify round-trip:** This IS the round-trip test. -- **Verify syncback parity:** N/A (these are matching-level tests, not filesystem-level) -- **Tests required:** (this fix IS the test) - -## Skipped Fixes - -None. All identified fixes were approved. - -## Accepted Limitations - -### Greedy Matching Not Globally Optimal - -- **Limitation:** The greedy assignment algorithm is not globally optimal. Edge cases exist where a locally-best pick forces a globally-worse assignment. -- **Scenario:** Large ambiguous groups (10+ instances) with specific cost patterns where the Hungarian algorithm would produce different (better) pairings. -- **User decision:** Accepted for all releases (documented in `atlas-dedup.mdc`). -- **Mitigation:** Ambiguous groups are typically small (2-10 instances). The depth limit (MAX_SCORING_DEPTH=3) bounds worst-case performance. Monitoring via test coverage for large groups. - -## Deferred Refactors - -- **Shared matching core:** The 3 implementations share the same algorithm but differ in input types (InstanceSnapshot vs WeakDom vs Studio Instance). A generic/trait-based approach could consolidate the duplicated logic (~2700 total lines), but the type differences are fundamental to each context. Estimated scope: 10+ files, significant API redesign. Deferred. -- **Duplicated grouping pattern:** All 3 implementations repeat the same HashMap-based `(Name, ClassName) -> Vec` grouping. Could be factored into a shared helper, but types differ. Minor DRY violation. Deferred. - -## Test Plan - -### Rust Unit Tests (`#[cfg(test)]` blocks) - -- `ref_scoring_forward_sync` -- 2 Models with different PrimaryPart targets, verify correct pairing (Fix 1) -- `ref_scoring_syncback` -- same scenario for syncback matching (Fix 1) -- `tags_granular_scoring` -- 2 Parts with different tag sets, verify scoring (Fix 2) -- `attributes_granular_scoring` -- 2 Parts with different attribute maps, verify scoring (Fix 2) -- Update existing `variant_eq` float tests for new epsilon behavior (Fix 3) -- `fuzzy_eq_matches_lua` -- verify same boundary values as `trueEquals.spec.lua` (Fix 3) - -### Rust Integration Tests (`tests/tests/`) - -- `parity_forward_vs_syncback` -- same ambiguous group through both Rust matchers, verify identical pairings (Fix 6) -- `round_trip_matching_identity` -- UFOWave fixture through syncback then forward sync, verify correct pairings (Fix 6) - -### Lua Spec Tests (`.spec.lua` files) - -- `parity_with_rust_fixture` -- same input as Rust parity test, verify identical pairings (Fix 6) - -### Snapshot Tests (`insta` crate) - -- None needed for matching fixes. - -### Failing Tests for Known Limitations - -- None. The greedy limitation is accepted and no test is needed to demonstrate it. - -## Test Rules - -The implementer MUST follow these rules when writing tests for this plan: - -### For bugs found and fixed - -Every bug fix MUST have a test that: - -1. Would have **FAILED** before the fix -2. **PASSES** after the fix -3. Prevents the bug from regressing - -### For missing coverage identified - -For each "missing test coverage" gap: - -1. Write the test -2. Verify it passes against the current implementation -3. If it fails, investigate -- it may have found another bug - -### For known limitations (Accepted Limitations section) - -No known-limitation tests needed for this plan. - -### Scope: test every affected layer - -For each finding, determine which test layers are affected and write tests in ALL of them: - -- Does the bug manifest at the plugin level? -> Lua spec test -- Does it manifest at the server level? -> Rust unit test or integration test -- Does it affect the round-trip? -> Integration test with `/api/write` + filesystem verification -- Does it affect forward-sync? -> Serve test with `recv_socket_packet` -- Could it regress from a different code path? -> Test that code path too - -## Final Step: Run CI - -After ALL fixes and tests are implemented, run the `/ci` command (see `.cursor/commands/ci.md`) to execute the full CI pipeline. Every fix must pass CI before the plan is considered complete. Do not skip this step. \ No newline at end of file diff --git a/.cursor/plans/matching_cost_semantics_376e45e2.plan.md b/.cursor/plans/matching_cost_semantics_376e45e2.plan.md deleted file mode 100644 index ce8ad41c..00000000 --- a/.cursor/plans/matching_cost_semantics_376e45e2.plan.md +++ /dev/null @@ -1,324 +0,0 @@ ---- -name: matching cost semantics -overview: "Split `variant_eq` into two variants: keep fuzzy comparison for Studio-facing operations (patch_compute, api, property_filter), and add a new disk-representation comparison for both Rust matching files where cost should reflect actual file changes." -todos: - - id: expose-fns - content: Make format_f32/format_f64 pub(crate) in json.rs and cleanup_f32 pub(crate) in resolution.rs - status: completed - - id: disk-eq-helpers - content: Add disk_eq_f32, disk_eq_f32_cleaned, disk_eq_f64 zero-allocation helpers to variant_eq.rs - status: completed - - id: variant-eq-disk - content: Implement variant_eq_disk in variant_eq.rs dispatching per Variant type (Float32 standalone vs composite cleanup) - status: completed - - id: update-fwd-matching - content: Replace variant_eq with variant_eq_disk in src/snapshot/matching.rs (count_own_diffs, diff_variant_pair, count_attributes_diff) - status: completed - - id: update-sb-matching - content: Replace variant_eq with variant_eq_disk in src/syncback/matching.rs (count_own_diffs, diff_variant_pair, attribute diff) - status: completed - - id: tests-veq - content: "Add variant_eq_disk unit tests: fuzzy-vs-disk divergence, cleanup normalization, NaN/Inf/-0, all composite types" - status: completed - - id: tests-fwd-large - content: Add 50+ same-named instance matching tests to src/snapshot/matching.rs with 5 variation groups - status: completed - - id: tests-sb-large - content: Add 50+ same-named instance matching tests to src/syncback/matching.rs with 5 variation groups - status: completed - - id: tests-disk-boundary - content: Add tests with values at format_f32 boundaries (close-but-different-on-disk, different-but-same-on-disk) - status: completed - - id: tests-update-existing - content: Update existing matching test assertions to match variant_eq_disk semantics - status: completed -isProject: false ---- - -# Matching Cost Semantics Fix - -## Problem - -`variant_eq` currently uses fuzzy epsilon comparison (absolute + relative, `EPSILON = 0.0001`) in both Rust matching files. This is wrong because: - -- **Rust cost = "will this value result in a file change?"** Two values that format identically on disk should score 0 cost, even if their raw f32 bits differ. Conversely, two values within epsilon but with different disk representations should score 1. -- **Lua cost = "will this change be applied in Studio?"** Fuzzy epsilon is correct here -- it prevents oscillation from Studio float precision rounding. - -The fuzzy epsilon can diverge from disk reality in both directions: - -- `format_f32(1.00005)` = `"1.00005"`, `format_f32(1.00015)` = `"1.00015"` -- different on disk, but `fuzzy_eq_f32` says "equal" (diff = 0.0001) -- `format_f32(0.123456)` could round both `0.1234561` and `0.1234559` to the same string -- same on disk, but `fuzzy_eq_f32` might say "different" - -## Data Flow Analysis - -### Disk serialization pipeline (how floats reach files) - -``` -Variant value - | - v -resolution.rs::from_variant() - |-- Standalone Float32 → AmbiguousValue::Number32(v) [NO cleanup] - |-- Standalone Float64 → AmbiguousValue::Number(v as f64) [NO cleanup] - |-- Composite types (Vector3, Color3, CFrame, UDim, etc.) - | → cleanup_f32(component) then into Array/FullyQualified - v -json.rs::Json5ValueSerializer - |-- serialize_f32 → format_f32(v) [6 significant digits, lexical-write-float] - |-- serialize_f64 → format_f64(v) [full precision] - v -.meta.json5 / .model.json5 on disk -``` - -`**cleanup_f32` matters for composites.** It rounds to 6 decimal places (via `format!("{:.6}")` round-trip), which zeros out very small values. Example: `cleanup_f32(0.0000001)` = `0.0`, so `format_f32(0.0)` = `"0"` vs `format_f32(0.0000001)` = `"1e-7"` -- completely different disk output. - -### Where values come from in each matching file - -`**[src/syncback/matching.rs](src/syncback/matching.rs)`:** - -- `new_dom` = from rbxl/rbxm binary parse. Raw Studio values, NOT through resolution.rs -- `old_dom` = from filesystem build. Values already in disk-normalized form - -`**[src/snapshot/matching.rs](src/snapshot/matching.rs)`:** - -- `snap` = from filesystem re-snapshot. Values read from disk, already in disk form -- `tree` = from RojoTree. Could be from initial forward sync (disk form) or two-way sync push (raw Studio values) - -In both cases, at least one side may not have been through `cleanup_f32 + format_f32`. The comparison must normalize both sides through the full disk pipeline. - -### Other callers of `variant_eq` (KEEP fuzzy -- different semantics) - - -| File | Purpose | Why fuzzy is correct | -| ------------------------------------------------------- | ----------------------------------- | -------------------------------------------------------------- | -| `[patch_compute.rs](src/snapshot/patch_compute.rs)` | Compute patches to send to plugin | Must agree with Lua `diff.lua` (which uses fuzzy `trueEquals`) | -| `[api.rs](src/web/api.rs)` | Filter defaults during two-way sync | "Is this at default?" -- not a disk question | -| `[property_filter.rs](src/syncback/property_filter.rs)` | Filter defaults during syncback | Same rationale | -| `[hash/mod.rs](src/syncback/hash/mod.rs)` | Exclude defaults from content hash | Same rationale | -| `[project.rs](src/snapshot_middleware/project.rs)` | Check project node value drift | Same rationale | - - -## Implementation - -### 1. Expose formatting functions - -- `**[src/json.rs](src/json.rs)`:** Make `format_f32`, `format_f64` and the `Options` constants `pub(crate)` -- `**[src/resolution.rs](src/resolution.rs)`:** Make `cleanup_f32` `pub(crate)` - -### 2. Add disk-representation comparison to `[src/variant_eq.rs](src/variant_eq.rs)` - -Add zero-allocation comparison helpers that write to stack buffers: - -```rust -fn disk_eq_f32(a: f32, b: f32) -> bool { - if a.to_bits() == b.to_bits() { return true; } - // format both into stack buffers, compare byte slices -} - -fn disk_eq_f32_cleaned(a: f32, b: f32) -> bool { - disk_eq_f32(cleanup_f32(a), cleanup_f32(b)) -} - -fn disk_eq_f64(a: f64, b: f64) -> bool { - if a.to_bits() == b.to_bits() { return true; } - // format both into stack buffers, compare byte slices -} -``` - -Then `pub fn variant_eq_disk(a: &Variant, b: &Variant) -> bool` that dispatches: - - -| Variant type | Comparison | -| ----------------------------------------------- | -------------------------------------------------- | -| Float32 | `disk_eq_f32` (no cleanup -- standalone) | -| Float64 | `disk_eq_f64` (no cleanup) | -| Vector3, Color3, CFrame components | `disk_eq_f32_cleaned` (cleanup -- composite) | -| UDim scale / UDim2 scales | `disk_eq_f32_cleaned` (cleanup) | -| NumberRange, Rect min/max | `disk_eq_f32_cleaned` (cleanup) | -| NumberSequence, ColorSequence keypoint floats | `disk_eq_f32_cleaned` (cleanup) | -| PhysicalProperties floats | `disk_eq_f32_cleaned` (cleanup) | -| Ray, Region3 components | `disk_eq_f32_cleaned` (cleanup) | -| Non-float types (Bool, Int, String, Enum, etc.) | Exact equality (no epsilon) | -| Tags | Sorted set comparison (same as now) | -| Attributes | Recursive with `variant_eq_disk` for nested values | - - -### 3. Update both matching files - -`**[src/snapshot/matching.rs](src/snapshot/matching.rs)`:** Replace all `variant_eq` calls in `count_own_diffs`, `diff_variant_pair`, and `count_attributes_diff` with `variant_eq_disk`. - -`**[src/syncback/matching.rs](src/syncback/matching.rs)`:** Same replacements in `count_own_diffs`, `diff_variant_pair`, and attribute comparison. - -### 4. Lua side -- no changes needed (verified) - -The plugin's cost model is correct as-is: - -- `trueEquals` is shared by both `matching.lua` (scoring) and `diff.lua` (patch generation), so they cannot disagree -- if matching says "equal", diff will also say "equal", and the change won't appear in the patch visualizer -- The fuzzy epsilon prevents Studio float-precision oscillation (set 0.5 -> Studio stores 0.49999999 -> reads back as ~0.5 -> trueEquals says "equal" -> no phantom re-diff) -- `matching.lua`'s `countOwnDiffs` fills defaults from `classKeys.defaults` for missing virtual properties, matching what diff/hydrate will do - -The Lua side's cost is correctly "will this change be flagged in the patch visualizer / applied to Studio." - -### 5. Testing Suite - -Existing `variant_eq` tests stay unchanged (they test the fuzzy function which is still used by patch_compute, api, etc.). All new tests below are additive. - -#### 5a. `variant_eq_disk` unit tests (in `src/variant_eq.rs`) - -**Fuzzy-vs-disk divergence tests** -- these are the cases that prove fuzzy is wrong for file-change detection: - -```rust -// Fuzzy says "equal" but disk would differ -assert!(fuzzy_eq_f32(1.00005, 1.00015)); // within epsilon -assert!(!disk_eq_f32(1.00005, 1.00015)); // format_f32 gives different strings - -// Fuzzy says "different" but disk would be identical -assert!(!fuzzy_eq_f32(0.1234561, 0.1234559)); // outside relative epsilon -assert!(disk_eq_f32(0.1234561, 0.1234559)); // format_f32 rounds both the same -``` - -**cleanup_f32 normalization tests** -- composite types get cleaned before formatting: - -```rust -// Very small values zeroed by cleanup -assert!(disk_eq_f32_cleaned(0.0000001, 0.0)); // cleanup makes both 0.0 -assert!(!disk_eq_f32(0.0000001, 0.0)); // without cleanup, different - -// Full Vector3 comparison -assert!(variant_eq_disk( - &Variant::Vector3(Vector3::new(1.0, 2.0, 0.0000001)), - &Variant::Vector3(Vector3::new(1.0, 2.0, 0.0)), -)); // cleanup zeros the tiny z component -``` - -**Edge cases:** - -- NaN == NaN (both format to "NaN") -- Inf == Inf (both format to "Infinity") -- -0.0 == 0.0 (both format to "0") -- All composite types: Vector2, Vector3, Color3, CFrame, UDim, UDim2, Rect, Ray, Region3, NumberRange, NumberSequence, ColorSequence, PhysicalProperties -- Non-float types: exact equality (Bool, Int32, Int64, String, Enum, BrickColor) -- Tags: sorted set comparison -- Attributes: recursive disk comparison of nested Variants - -#### 5b. Large ambiguous group matching -- forward sync (`src/snapshot/matching.rs`) - -**Test: `fifty_same_name_parts_five_variation_groups`** - -50 Parts all named `"Line"` with 5 variation groups of 10 exact duplicates each: - - -| Group | Position | Color | Count | -| ----- | ------------ | ------------------- | ----- | -| A | `[0, 0, 0]` | `[1, 0, 0]` (red) | 10 | -| B | `[0, 5, 0]` | `[1, 0, 0]` (red) | 10 | -| C | `[0, 10, 0]` | `[0, 1, 0]` (green) | 10 | -| D | `[0, 0, 0]` | `[0, 1, 0]` (green) | 10 | -| E | `[0, 5, 0]` | `[0, 0, 1]` (blue) | 10 | - - -- Groups A vs D: same position, different color (color-only diff) -- Groups A vs B: same color, different position (position-only diff) -- Groups B vs E: same position, different color -- Within each group: 10 exact duplicates (any pairing is correct) - -Build snapshots in order A,B,C,D,E. Build tree in **reversed** order E,D,C,B,A. - -**Assertions:** - -1. All 50 matched, 0 unmatched on either side -2. For every matched pair: `Position` values match (within disk equality) -3. For every matched pair: `Color` values match (within disk equality) -4. Completes in < 5 seconds (depth limit prevents exponential blowup) - -**Test: `fifty_parts_position_only_variations`** - -50 Parts named `"Block"` -- same Color on all, 5 distinct Position values (10 duplicates each). Tree reversed. Verify all 50 pair correctly by Position. - -**Test: `fifty_parts_color_only_variations`** - -50 Parts named `"Block"` -- same Position on all, 5 distinct Color values (10 duplicates each). Tree reversed. Verify all 50 pair correctly by Color. - -**Test: `sixty_parts_with_near_float_values`** - -60 Parts named `"Segment"` with Transparency values chosen at `format_f32` boundaries: - - -| Group | Transparency | Count | Notes | -| ----- | ------------ | ----- | ------------------------------------------------ | -| F | `0.100000` | 12 | disk repr: `"0.1"` | -| G | `0.100001` | 12 | disk repr: `"0.100001"` -- different from F | -| H | `0.500000` | 12 | disk repr: `"0.5"` | -| I | `0.500001` | 12 | disk repr differs from H | -| J | `0.999999` | 12 | disk repr rounds to same or different from `1.0` | - - -The exact Transparency values will be chosen by testing `format_f32` output during implementation to find values that: - -- Are within fuzzy epsilon of each other but format differently (must NOT cross-pair) -- Are outside fuzzy epsilon but format the same (must cross-pair) - -This test specifically catches the bug where fuzzy equality would match Group F with Group G instances, causing 12 unnecessary file rewrites. - -#### 5c. Large ambiguous group matching -- syncback (`src/syncback/matching.rs`) - -Same test matrix as 5b but using `WeakDom` + `InstanceBuilder`: - -**Test: `fifty_same_name_parts_five_groups_syncback`** - -Same 5 variation groups (A-E) of 10 Parts each. `new_dom` in order, `old_dom` reversed. - -```rust -let mut new_dom = WeakDom::new(InstanceBuilder::new("DataModel")); -let new_root = new_dom.root_ref(); -for (pos, color) in &groups { - for _ in 0..10 { - new_dom.insert(new_root, InstanceBuilder::new("Part") - .with_name("Line") - .with_property("Position", Variant::Vector3(*pos)) - .with_property("Color", Variant::Color3(*color))); - } -} -``` - -Assertions identical to 5b: all 50 paired, Position+Color match on every pair. - -**Test: `sixty_parts_near_float_syncback`** - -Same boundary test as 5b's `sixty_parts_with_near_float_values`, but in syncback context. - -#### 5d. Disk boundary stress test - -**Test: `disk_representation_boundary_matching`** (in both matching files) - -Explicitly construct instances where fuzzy and disk comparison disagree, and verify matching picks the disk-correct pairing: - -2 Parts named `"Edge"`: - -- Snap/New A: Transparency = `1.00005` (format_f32 = `"1.00005"`) -- Snap/New B: Transparency = `1.00015` (format_f32 = `"1.00015"`) - -Tree/Old (reversed): - -- Tree/Old X: Transparency = `1.00015` -- Tree/Old Y: Transparency = `1.00005` - -With fuzzy equality: both (A,X) and (A,Y) score 0 (within epsilon) -- random pairing, 50% chance of wrong. -With disk equality: (A,Y) scores 0 and (A,X) scores 1 -- deterministically correct. - -Verify A matches Y and B matches X. - -#### 5e. Update existing tests - -Existing matching tests that assert `variant_eq` behavior in matching contexts will continue to pass because: - -- Most use exact integer/enum values (not affected by fuzzy vs disk) -- Float tests use values that are either identical or far apart - -Tests that use float values at fuzzy epsilon boundaries may need value adjustments if the old assertion relied on fuzzy tolerance. Specifically review: - -- `many_same_name_parts_matched_by_properties` (uses `i * 0.1` increments -- safe, these format distinctly) -- `ten_ambiguous_textures_stress` (uses Enum values -- safe, not float) -- `variant_eq_float32_with_new_epsilon` (tests `variant_eq` not `variant_eq_disk` -- unchanged) - -No existing test should break, but verify during implementation. \ No newline at end of file diff --git a/.cursor/plans/matching_session_caching_cbfa7bda.plan.md b/.cursor/plans/matching_session_caching_cbfa7bda.plan.md deleted file mode 100644 index 5a3c7eb0..00000000 --- a/.cursor/plans/matching_session_caching_cbfa7bda.plan.md +++ /dev/null @@ -1,609 +0,0 @@ ---- -name: Matching session caching -overview: Rewrite the Lua matching module for native codegen performance (--!strict, --!native, --!optimize 2) with session-based caching, clean 2-function mutual recursion, concrete types, and local functions for inlining. Add session caching to both Rust implementations for consistency. -todos: - - id: lua-trueEquals - content: "Rewrite trueEquals.lua: --!strict/--!native/--!optimize 2, single typeof dispatch, dedicated helper functions per type (no temp arrays), adopt DeepEqualsPureUnsafe pattern for table comparison (rawlen/rawget/next, no checkedKeys set), keep fuzzy equality + null-ref + EnumItem cross-type" - status: completed - - id: lua-rewrite - content: "Rewrite matching.lua: --!strict/--!native/--!optimize 2, all functions as local function in dependency order (one forward declare for mutual recursion), 2-function mutual recursion (matchChildren + computePairCost), session caching, totalCost return, O(n) removeMatched, remove pcall in grouping" - status: completed - - id: lua-hydrate-threading - content: Thread session through hydrate.lua, Reconciler/init.lua, and ServeSession.lua (create session before hydrate call at line 628) - status: completed - - id: lua-verify-codegen - content: Run luau-compile --remarks on trueEquals.lua and matching.lua to verify inlining and native codegen quality, iterate until clean - status: completed - - id: lua-test - content: Build plugin, test Lua changes in Studio (hydrate + matching works correctly with session caching) before proceeding to Rust - status: completed - - id: rust-forward-session - content: "AFTER Lua passes: Add MatchingSession to src/snapshot/matching.rs with cost_cache, add total_cost to ForwardMatchResult, thread session through all functions and patch_compute.rs" - status: completed - - id: rust-syncback-session - content: "AFTER Lua passes: Add MatchingSession to src/syncback/matching.rs with cost_cache, add total_cost to MatchResult, thread session through all functions and dir.rs" - status: completed - - id: rust-test-updates - content: Update tests/tests/matching_fixtures.rs, run cargo test to verify Rust changes - status: completed -isProject: false ---- - -# Matching Session Caching + Native Codegen Rewrite - -## Problem - -1. **Redundant computation**: Scoring recurses into children, then hydrate re-calls matchChildren on the same children. The intermediate `_computeChildrenCost` calls matchChildren, iterates matched pairs calling `_computeChangeCount`, which recurses again -- all discarded after scoring. -2. **Poor native codegen structure**: All functions are on the `Matching` table (table lookup per call, uninlineable). No type annotations. No `--!strict`/`--!native`/`--!optimize 2`. A `pcall` with closure allocation in the hot grouping loop. -3. **4-function recursion chain** (`matchChildren -> _computeChildrenCost -> _computeChangeCount -> _computeChildrenCost -> matchChildren`) is complex and hard for both the optimizer and the developer to reason about. - -## Design - -### Conceptual Model - -`matchChildren` is fundamentally `computeSubtreeCost` -- it finds the cost-minimizing pairing of children and returns the total cost. The actual match assignments are a bonus output. The 2-function mutual recursion reflects this: - -- `**matchChildren(session, vChildren, sChildren, virtualInstances, parentVId, parentSInst)`**: Given two child sets, find optimal pairing. Returns `MatchResult` with `totalCost`. -- `**computePairCost(session, virtualId, studioInstance, virtualInstances, bestSoFar)`**: Given one virtual and one studio instance, compute total cost including subtree. Calls `matchChildren` for children cost. - -`_computeChildrenCost` and `_computeChangeCount` are eliminated. Their logic is absorbed into these two functions. - -### MatchingSession - -```lua -type MatchingSession = { - matchCache: { [string]: { [Instance]: MatchResult } }, - costCache: { [string]: { [Instance]: number } }, -} -``` - -- **matchCache**: keyed by `(parentVirtualId, parentStudioInstance)`. Parent uniquely determines children set. -- **costCache**: keyed by `(virtualId, studioInstance)`. Only stored when `cost < bestSoFar` (exact, not early-exited). - -Caching replaces the need for a depth limit: each unique pair/children-set is computed at most once. - -### bestSoFar Interaction - -- **costCache**: only store when computation was complete (`cost < bestSoFar`). If cached, return immediately regardless of caller's `bestSoFar` (the cached value IS the exact cost). -- **matchCache**: `matchChildren` always completes (no `bestSoFar` on it), so results are always cacheable. - ---- - -## Lua Plugin Rewrite: [matching.lua](plugin/src/Reconciler/matching.lua) - -### Module Header - -```lua ---!strict ---!native ---!optimize 2 -``` - -### Type Definitions (all concrete, minimal `any`) - -```lua -type MatchPair = { - virtualId: string, - studioInstance: Instance, -} - -type MatchResult = { - matched: { MatchPair }, - unmatchedVirtual: { string }, - unmatchedStudio: { Instance }, - totalCost: number, -} - -type MatchingSession = { - matchCache: { [string]: { [Instance]: MatchResult } }, - costCache: { [string]: { [Instance]: number } }, -} - -type VCache = { - props: { [string]: any }, - extraProps: { string }?, - tags: { [string]: boolean }?, - attrs: { [string]: any }?, - childCount: number, -} - -type SCache = { - instance: Instance, - props: { [string]: any }, - tags: { [string]: boolean }?, - attrs: { [string]: any }?, - children: { Instance }, - childCount: number, -} -``` - -### All Functions as `local function` in Dependency Order - -Every function is a `local function` defined in dependency order. No `Matching.foo()` table lookups. One forward declaration for the mutual recursion pair. - -```lua -local UNMATCHED_PENALTY: number = 10000 - -local function newSession(): MatchingSession - return { matchCache = {}, costCache = {} } -end - -local function cacheVirtual(vInst: any, classKeys: any): VCache - -- same logic as current _cacheVirtual, with return type annotation -end - -local function cacheStudio(studioInstance: Instance, classKeys: any, extraProps: { string }?): SCache - -- same logic as current _cacheStudio - -- ADDITION: store sCache.instance = studioInstance -end - -local function countOwnDiffs(vCache: VCache, sCache: SCache, classKeys: any): number - -- same logic as current _countOwnDiffsCached -end - -local function removeMatched(arr: { any }, matchedIndices: { [number]: boolean }): () - -- O(n) in-place compaction instead of O(n^2) table.remove loop - local write = 1 - for read = 1, #arr do - if not matchedIndices[read] then - arr[write] = arr[read] - write += 1 - end - end - for i = write, #arr do - arr[i] = nil - end -end -``` - -### Single Forward Declaration for Mutual Recursion - -`computePairCost` calls `matchChildren` and vice versa. Define `matchChildren` first (forward-declared), then `computePairCost` as a `local function`, then assign `matchChildren`: - -```lua -local matchChildren -- forward declare (matchChildren is defined after computePairCost) - -local function computePairCost(...) - -- can reference matchChildren (captured as upvalue, assigned before first call) -end - -matchChildren = function(...) - -- can reference computePairCost (already defined above) -end -``` - -### computePairCost (replaces `_computeChangeCount` + `_computeChildrenCost`) - -```lua -computePairCost = function( - session: MatchingSession, - virtualId: string, - studioInstance: Instance, - virtualInstances: { [string]: any }, - bestSoFar: number -): number - -- 1. Cache lookup - local vc = session.costCache[virtualId] - if vc then - local cached = vc[studioInstance] - if cached ~= nil then return cached end - end - - local vInst = virtualInstances[virtualId] - if not vInst then return UNMATCHED_PENALTY end - - -- 2. Own diffs - local classKeys = RbxDom.getClassComparisonKeys(vInst.ClassName) - local vCache = cacheVirtual(vInst, classKeys) - local sCache = cacheStudio(studioInstance, classKeys, vCache.extraProps) - local cost: number = countOwnDiffs(vCache, sCache, classKeys) - if cost >= bestSoFar then return cost end - - -- 3. Children cost (direct matchChildren call, no intermediate function) - local vChildren = vInst.Children - local studioKids = sCache.children - - if (not vChildren or #vChildren == 0) and #studioKids == 0 then - -- leaf: no children on either side - elseif not vChildren or #vChildren == 0 then - cost += #studioKids * UNMATCHED_PENALTY - elseif #studioKids == 0 then - for _, childId in vChildren do - if virtualInstances[childId] then cost += UNMATCHED_PENALTY end - end - else - local validVChildren: { string } = {} - for _, childId in vChildren do - if virtualInstances[childId] then - table.insert(validVChildren, childId) - end - end - local childResult = matchChildren( - session, validVChildren, studioKids, virtualInstances, - virtualId, studioInstance - ) - cost += childResult.totalCost - end - - -- 4. Cache if exact (no early exit) - if cost < bestSoFar then - if not session.costCache[virtualId] then - session.costCache[virtualId] = {} - end - session.costCache[virtualId][studioInstance] = cost - end - - return cost -end -``` - -### matchChildren (restructured, returns totalCost) - -```lua -matchChildren = function( - session: MatchingSession, - virtualChildren: { string }, - studioChildren: { Instance }, - virtualInstances: { [string]: any }, - parentVirtualId: string?, - parentStudioInstance: Instance? -): MatchResult - -- 1. Cache lookup - if parentVirtualId and parentStudioInstance then - local pc = session.matchCache[parentVirtualId] - if pc then - local cached = pc[parentStudioInstance] - if cached then return cached end - end - end - - local matched: { MatchPair } = {} - local remainingVirtual: { string } = table.clone(virtualChildren) - local remainingStudio: { Instance } = table.clone(studioChildren) - - -- 2. Group by (Name, ClassName) -- NO pcall, direct property access - local vByKey: { [string]: { number } } = {} - for i, id in remainingVirtual do - local vInst = virtualInstances[id] - if vInst then - local key = vInst.Name .. "\0" .. vInst.ClassName - local group = vByKey[key] - if not group then - group = {} - vByKey[key] = group - end - table.insert(group, i) - end - end - - local sByKey: { [string]: { number } } = {} - for i, inst in remainingStudio do - local key = inst.Name .. "\0" .. inst.ClassName - local group = sByKey[key] - if not group then - group = {} - sByKey[key] = group - end - table.insert(group, i) - end - - -- 3. 1:1 instant match - local matchedV: { [number]: boolean } = {} - local matchedS: { [number]: boolean } = {} - - for key, vIndices in vByKey do - local sIndices = sByKey[key] - if sIndices and #vIndices == 1 and #sIndices == 1 then - local vi, si = vIndices[1], sIndices[1] - if not matchedV[vi] and not matchedS[si] then - table.insert(matched, { - virtualId = remainingVirtual[vi], - studioInstance = remainingStudio[si], - }) - matchedV[vi] = true - matchedS[si] = true - end - end - end - - removeMatched(remainingVirtual, matchedV) - removeMatched(remainingStudio, matchedS) - - -- 4. Ambiguous groups (same structure as before but using computePairCost) - if #remainingVirtual > 0 and #remainingStudio > 0 then - -- Rebuild groups, pre-compute caches, N*M scoring... - -- Score via: ownDiffs (from pre-computed caches) + childrenCost - -- For childrenCost: call computePairCost (which calls matchChildren recursively) - -- BUT: the ambiguous loop uses pre-computed caches for ownDiffs directly - -- (cacheVirtual/cacheStudio/countOwnDiffs), then adds children cost via - -- a direct matchChildren call (same as computePairCost but with caches already built) - -- - -- The inner scoring for an ambiguous (vi, si) pair: - -- cost = countOwnDiffs(vCaches[vi], sCaches[si], classKeys) - -- if cost < bestSoFar then - -- local vInst = virtualInstances[remainingVirtual[vi]] - -- local studioKids = sCaches[si].children - -- -- filter valid virtual children, call matchChildren, add totalCost - -- end - -- - -- Greedy assign sorted by cost ascending (tie-break by insertion index) - end - - -- 5. Compute totalCost for ALL matched pairs (uses session cache) - local totalCost: number = 0 - for _, pair in matched do - totalCost += computePairCost( - session, pair.virtualId, pair.studioInstance, virtualInstances, math.huge - ) - end - totalCost += (#remainingVirtual + #remainingStudio) * UNMATCHED_PENALTY - - local result: MatchResult = { - matched = matched, - unmatchedVirtual = remainingVirtual, - unmatchedStudio = remainingStudio, - totalCost = totalCost, - } - - -- 6. Cache result - if parentVirtualId and parentStudioInstance then - if not session.matchCache[parentVirtualId] then - session.matchCache[parentVirtualId] = {} - end - session.matchCache[parentVirtualId][parentStudioInstance] = result - end - - return result -end -``` - -### pcall Removal in Studio Grouping - -The current code wraps `inst.Name, inst.ClassName` in a `pcall(function() ... end)`. This allocates a closure per studio child and prevents inlining. During matching, studio children come from `:GetChildren()` on a live instance within a single-threaded sync frame -- they cannot be destroyed mid-operation. Replace with direct property access. - -### O(n) removeMatched - -Current `_removeMatched` uses `table.remove` in a reverse loop -- O(n^2) due to element shifting. Replace with single-pass in-place compaction (shown above). - -### Module Export - -```lua -return { - newSession = newSession, - matchChildren = matchChildren, -} -``` - -Only two symbols exported. All helpers are local (invisible outside module, inlineable by compiler). - ---- - -## Lua Callers - -### [hydrate.lua](plugin/src/Reconciler/hydrate.lua) - -```lua -local Matching = require(script.Parent.matching) - -local function hydrate(instanceMap, virtualInstances, rootId, rootInstance, session) - -- ... - local result = Matching.matchChildren( - session, validVirtualIds, existingChildren, virtualInstances, - rootId, rootInstance - ) - for _, pair in result.matched do - hydrate(instanceMap, virtualInstances, pair.virtualId, pair.studioInstance, session) - end - -- ... -end -``` - -### [Reconciler/init.lua](plugin/src/Reconciler/init.lua) - -```lua -function Reconciler:hydrate(virtualInstances, rootId, rootInstance, session) - Timer.start("Reconciler:hydrate") - local result = hydrate(self.__instanceMap, virtualInstances, rootId, rootInstance, session) - Timer.stop() - return result -end -``` - -### [ServeSession.lua](plugin/src/ServeSession.lua) - -Create session before hydrate at line 628: - -```lua -local Matching = require(script.Parent.Reconciler.matching) --- ... -local session = Matching.newSession() -self.__reconciler:hydrate(readResponseBody.instances, serverInfo.rootInstanceId, game, session) -``` - ---- - -## trueEquals Rewrite: [trueEquals.lua](plugin/src/Reconciler/trueEquals.lua) - -### Module Header - -```lua ---!strict ---!native ---!optimize 2 -``` - -### Problems in Current Implementation - -1. **Redundant type dispatch**: Every branch checks both `typeA` and `typeB` (`typeA == "CFrame" and typeB == "CFrame"`). Check type once, early-out if they differ. -2. **Heap allocations in hot path**: `{ a:GetComponents() }`, `{ a.X, a.Y, a.Z }`, `{ a.X, a.Y }` build temporary arrays for every CFrame/Vector3/Vector2 comparison. -3. `**checkedKeys` set**: Allocates a table for every table-vs-table comparison. Unnecessary -- second loop only needs to check for extra keys in `b`. -4. **No type annotations**, no `--!strict`, no `--!native`, no `--!optimize 2`. - -### Structure: Single typeof Dispatch + Dedicated Helpers - -Adopt the [DeepEqualsPureUnsafe](escape-tsunami reference) pattern: `rawequal` identity check, `rawlen` for quick array length, `rawget`/`next` for table traversal, no temporary allocations. Bake in fuzzy equality for the matching use case. - -```lua -local EPSILON: number = 0.0001 - -local function fuzzyEq(a: number, b: number): boolean - local diff = math.abs(a - b) - local maxVal = math.max(math.abs(a), math.abs(b), 1) - return diff < EPSILON or diff < maxVal * EPSILON -end - -local function color3Eq(a: Color3, b: Color3): boolean - return math.floor(a.R * 255) == math.floor(b.R * 255) - and math.floor(a.G * 255) == math.floor(b.G * 255) - and math.floor(a.B * 255) == math.floor(b.B * 255) -end - -local function vector2Eq(a: Vector2, b: Vector2): boolean - return fuzzyEq(a.X, b.X) and fuzzyEq(a.Y, b.Y) -end - -local function vector3Eq(a: Vector3, b: Vector3): boolean - return fuzzyEq(a.X, b.X) and fuzzyEq(a.Y, b.Y) and fuzzyEq(a.Z, b.Z) -end - -local function cframeEq(a: CFrame, b: CFrame): boolean - local ax, ay, az, aR00, aR01, aR02, aR10, aR11, aR12, aR20, aR21, aR22 = a:GetComponents() - local bx, by, bz, bR00, bR01, bR02, bR10, bR11, bR12, bR20, bR21, bR22 = b:GetComponents() - return fuzzyEq(ax, bx) and fuzzyEq(ay, by) and fuzzyEq(az, bz) - and fuzzyEq(aR00, bR00) and fuzzyEq(aR01, bR01) and fuzzyEq(aR02, bR02) - and fuzzyEq(aR10, bR10) and fuzzyEq(aR11, bR11) and fuzzyEq(aR12, bR12) - and fuzzyEq(aR20, bR20) and fuzzyEq(aR21, bR21) and fuzzyEq(aR22, bR22) -end -``` - -All helpers are small `local function`s -- the compiler can inline them into `trueEquals`. - -### Main Function: Single typeof Dispatch - -```lua -local function trueEquals(a: any, b: any): boolean - if rawequal(a, b) then return true end - - -- Null-ref equivalence: nil == {Ref = "000...0"} - if a == nil then - return type(b) == "table" and rawget(b, "Ref") == "00000000000000000000000000000000" - end - if b == nil then - return type(a) == "table" and rawget(a, "Ref") == "00000000000000000000000000000000" - end - - local t = typeof(a) - if t ~= typeof(b) then - -- EnumItem/number cross-type - if t == "number" and typeof(b) == "EnumItem" then return a == (b :: EnumItem).Value end - if t == "EnumItem" and typeof(b) == "number" then return (a :: EnumItem).Value == b end - return false - end - - -- Same-type dispatch (no redundant second type check) - if t == "table" then - -- DeepEqualsPureUnsafe pattern with fuzzy recursive equality - if rawlen(a) ~= rawlen(b) then return false end - for k, v in next, a do - local ov = rawget(b, k) - if ov == nil or not trueEquals(v, ov) then return false end - end - for k in next, b do - if rawget(a, k) == nil then return false end - end - return true - end - - if t == "number" then return fuzzyEq(a, b) end - if t == "Color3" then return color3Eq(a, b) end - if t == "Vector3" then return vector3Eq(a, b) end - if t == "Vector2" then return vector2Eq(a, b) end - if t == "CFrame" then return cframeEq(a, b) end - - -- NaN check (number case already handled above, this catches any remaining NaN-like values) - if a ~= a and b ~= b then return true end - - return false -end -``` - -**Key improvements:** - -- **Zero heap allocations**: No temporary arrays for CFrame/Vector3/Vector2. CFrame uses 12 direct `fuzzyEq` calls. Vector3/Vector2 use direct component access. -- **No `checkedKeys` set**: Second table loop only checks existence via `rawget`, doesn't compare values (already done in first loop). -- **Single `typeof` call path**: Check type of `a` once, verify `b` matches, then dispatch. No redundant `typeA == X and typeB == X` at every branch. -- `**rawequal` identity check first**: Catches same-reference case before any type checking. -- `**rawlen` fast-path for tables**: Different array lengths = not equal, no iteration needed. - ---- - -## Codegen Verification - -After each rewrite, run: - -```bash -luau-compile --remarks plugin/src/Reconciler/trueEquals.lua -luau-compile --remarks plugin/src/Reconciler/matching.lua -``` - -**trueEquals.lua** -- check that: - -- `fuzzyEq`, `color3Eq`, `vector2Eq`, `vector3Eq`, `cframeEq` are inlined into `trueEquals` -- No "can't inline" remarks on any helper - -**matching.lua** -- check that: - -- `countOwnDiffs`, `cacheVirtual`, `cacheStudio`, `removeMatched` are inlined at call sites -- `computePairCost` inlines or at minimum shows no optimization barriers -- No generic dispatch warnings for typed parameters - -Iterate on any functions that fail to inline (split if too large, simplify control flow). - ---- - -## Rust Forward Sync: [src/snapshot/matching.rs](src/snapshot/matching.rs) - -Add session struct and thread through. Rust already has the clean 2-function structure (`match_forward` + `compute_change_count` / `match_children_for_scoring`). - -```rust -pub struct MatchingSession { - cost_cache: RefCell>, -} -``` - -- Add `total_cost: u32` to `ForwardMatchResult` -- Add `session: &MatchingSession` param to `match_forward`, `compute_change_count`, `match_children_for_scoring` -- Cache `compute_change_count` results by `(snap.snapshot_id, tree_ref)`, only when `cost < best_so_far` -- Create session in [patch_compute.rs](src/snapshot/patch_compute.rs) `compute_patch_set`, thread through `compute_patch_set_internal` and `compute_children_patches` - -## Rust Syncback: [src/syncback/matching.rs](src/syncback/matching.rs) - -Same pattern. Session struct, `total_cost` on `MatchResult`, session param on all functions. - -- Create session in [dir.rs](src/snapshot_middleware/dir.rs) before `match_children` call - -## Test Updates: [matching_fixtures.rs](tests/tests/matching_fixtures.rs) - -Pass `&MatchingSession::new()` to `match_children` and `match_forward` calls. - ---- - -## Summary of Optimizations - - -| Change | Impact | -| ------------------------------------------------------- | ----------------------------------------------------------------- | -| **trueEquals**: single typeof dispatch | Eliminates redundant type checks at every branch | -| **trueEquals**: dedicated type helpers | Zero heap allocations (no temp arrays for CFrame/Vector3/Vector2) | -| **trueEquals**: DeepEqualsPureUnsafe table pattern | No checkedKeys set; rawlen/rawget/next | -| **trueEquals**: `--!strict`/`--!native`/`--!optimize 2` | Native codegen for the most-called function in matching | -| **matching**: local functions (not table methods) | Enables compiler inlining | -| **matching**: `--!strict`/`--!native`/`--!optimize 2` | Native codegen, type-guided optimization | -| **matching**: concrete types on all params/returns | Specialized native code paths | -| **matching**: remove pcall in grouping | Eliminates closure + pcall overhead per child | -| **matching**: 2-function recursion (from 4) | Simpler for optimizer, easier to reason about | -| **matching**: session caching (matchCache + costCache) | Eliminates redundant subtree scoring across recursion levels | -| **matching**: totalCost on matchChildren | Eliminates _computeChildrenCost re-iteration of matched pairs | -| **matching**: O(n) removeMatched | Linear vs quadratic element removal | - - diff --git a/.cursor/plans/mcp_get_script_endpoint_4c4e80af.plan.md b/.cursor/plans/mcp_get_script_endpoint_4c4e80af.plan.md deleted file mode 100644 index 69cb9ea7..00000000 --- a/.cursor/plans/mcp_get_script_endpoint_4c4e80af.plan.md +++ /dev/null @@ -1,269 +0,0 @@ ---- -name: MCP get_script endpoint -overview: Add a `get_script` MCP tool that reads script source from Studio. Accepts `id` (server Ref) or `fsPath` (resolved server-side to id via RojoTree). Plugin uses a shallow copy of instanceMap.fromIds retained from the last MCP sync for O(1) lookup. -todos: - - id: generalize-channels - content: Rename McpSyncState -> McpState, generalize command/result channels to serde_json::Value, rename sync_in_progress -> command_in_progress, update all references in mcp.rs, api.rs, mod.rs - status: completed - - id: rust-structs-and-tool - content: Add GetScriptCommand/GetScriptResult structs in mcp.rs, add get_script tool definition (with full workflow description) in handle_tools_list, add handle_get_script handler - status: completed - - id: api-resolution - content: "In api.rs: add command type routing in MCP stream handler (getScript bypasses active_api_connections guard), resolve fsPath -> id via tree for getScript commands, enrich result with id/fsPath" - status: completed - - id: plugin-mcpstream - content: "In McpStream.lua: add handler for data.type == 'getScript', forward to onGetScriptCommand callback" - status: completed - - id: plugin-retain-map - content: "In App/init.lua: at top of setConfirmCallback, shallow-copy instanceMap.fromIds into self._lastMcpFromIds (survives InstanceMap:stop())" - status: completed - - id: plugin-handler - content: "In App/init.lua: wire onGetScriptCommand, implement handleMcpGetScript with id-based lookup via self._lastMcpFromIds, source reading (regular + draft), SHA1 hash, include instancePath in response" - status: completed - - id: tests - content: Rust unit tests (serde, handler, guards, response formatting), api.rs resolution tests, plugin tests (id lookup via retained map, shallow copy survives stop(), source reading, hash) - status: completed -isProject: false ---- - -# MCP `get_script` Endpoint - -## Design - -The agent provides `id` (server Ref from a sync response) or `fsPath` (Atlas filesystem path). Both resolve to a server Ref which the plugin looks up via a shallow copy of `instanceMap.fromIds` retained from the last MCP sync. No raw instance paths, no QueryDescendants, no name ambiguity issues. - -This endpoint exists for conflict resolution: agent calls `atlas_sync`, gets a conflict response with `id` and `fsPath` per change, then calls `get_script` to read the Studio version of conflicting scripts. The `studioHash` in the response feeds back into subsequent sync override verification. - -```mermaid -sequenceDiagram - participant Agent - participant mcpRs as mcp.rs - participant apiRs as api.rs - participant Plugin as Plugin McpStream - - Agent->>mcpRs: get_script(id OR fsPath, fromDraft?) - mcpRs->>apiRs: command_tx (Value) - Note over apiRs: If fsPath: resolve to id via RojoTree - apiRs->>Plugin: {type: "getScript", requestId, id, fromDraft} - Plugin->>Plugin: self._lastMcpFromIds[id] (O(1)) - Plugin->>Plugin: Read Source (or draft), compute SHA1 - Plugin->>apiRs: {requestId, status, source, studioHash, className, instancePath} - Note over apiRs: Enrich with id, fsPath - apiRs->>mcpRs: result_tx (Value) - mcpRs->>Agent: Tool response with source + metadata -``` - - - -## Channel Generalization - -Change `McpSyncState` channels from typed structs to `serde_json::Value` so any command/result can flow through. This enables `get_script` and future endpoints without additional channel plumbing. - -- Rename `McpSyncState` -> `McpState` -- Rename `sync_in_progress` -> `command_in_progress` (any MCP command blocks others) -- `command_tx: watch::Sender>` (was `Option`) -- `result_tx: Mutex>>` (was `oneshot::Sender`) - -Each handler serializes its command struct to Value before sending, deserializes from Value on response. - -## Retained InstanceMap (Shallow Copy) - -**Critical:** `InstanceMap:stop()` iterates all entries and calls `removeInstance`, which sets `fromIds[id] = nil` for every entry. This is called by `ServeSession:__stopInternal()` during `endSession()`. Storing a reference to the InstanceMap object or its `fromIds` table gives an empty map after session teardown. - -**Solution:** At the top of `setConfirmCallback` (before any branch that could trigger session teardown), make a shallow copy of `fromIds`: - -```lua -serveSession:setConfirmCallback(function(instanceMap, patch, serverInfo) - local retainedFromIds = {} - for id, inst in instanceMap.fromIds do - retainedFromIds[id] = inst - end - self._lastMcpFromIds = retainedFromIds - - -- ... rest of existing callback logic -end) -``` - -This copy: - -- Survives `InstanceMap:stop()` because it's a separate table -- Is O(N) but fast (just string key -> Instance ref copies, typical project has a few thousand entries) -- Is replaced on the next MCP sync (each sync creates a fresh copy) -- Stale entries handled gracefully: if `instance.Parent == nil`, the instance was destroyed since the sync -- Cleared when MCP stream disconnects (`self._lastMcpFromIds = nil`) - -**Note:** The `already_connected` early return (line 1131-1138 in `startMcpSync`) does NOT create a ServeSession, so `_lastMcpFromIds` is not updated in that case -- it retains whatever value it had from the last actual sync. This is correct behavior. - -## get_script Input Schema - -```json -{ - "id": "00abcdef01234567890abcdef0123456", - "fsPath": "src/server/MyScript.server.luau", - "fromDraft": false -} -``` - -- `id`: Server Ref (32-char hex) from a previous sync response. Looked up via retained `_lastMcpFromIds` on plugin. -- `fsPath`: Atlas filesystem path relative to project root. Resolved server-side to `id` via RojoTree. -- Priority: `id` > `fsPath`. At least one required. -- `fromDraft`: If true, read unsaved editor content via `ScriptEditorService:GetEditorSource`. Default: false. - -## get_script Response - -``` -Script source for ServerScriptService/MyScript (Script): -Hash: a1b2c3d4e5... - - -{"status":"success","source":"print('hello')","studioHash":"a1b2c3...","className":"Script","instancePath":"ServerScriptService/MyScript","id":"00abcdef...","fsPath":"src/server/MyScript.server.luau","isDraft":false} - -``` - -- `instancePath`: Human-readable instance path derived from `instance:GetFullName()` on the plugin side, reformatted from `game.A.B.C` to `A/B/C`. Included for readability and logging; not used for any lookup. - -## Tool Description - -The `get_script` tool definition in `handle_tools_list` must include a comprehensive description that teaches the agent the full workflow: - -``` -Read a script's source code from Roblox Studio. The id and fsPath parameters come from -a previous atlas_sync response's change entries. - -If you haven't run atlas_sync yet, call atlas_sync(mode: "dryrun") first -- this -establishes the instance mapping without applying any changes, then you can call -get_script with the id or fsPath from that response. - -Conflict resolution workflow: -1. atlas_sync(mode: "fastfail") -- get changes with studioHash, fail if unresolved -2. get_script(id: "...") -- read the Studio version of a conflicting script -3. Merge the Studio source with your local changes, write to filesystem -4. atlas_sync(overrides: [{id, direction: "push", studioHash: "...from get_script response..."}]) - -The studioHash in the response is the SHA1 of the git blob format of the script's Source -property. Pass it as the studioHash in sync overrides to verify the script hasn't changed -between your get_script call and the retry sync. -``` - -## Server-Side Resolution (api.rs) - -When api.rs receives a `getScript` command from the channel: - -1. **If `fsPath` present** (and no `id`): `project_root.join(fsPath)` -> `tree.get_ids_at_path(&abs_path)` -> get first Ref -> verify exists and is a script class -> inject as `id` in the command forwarded to plugin. Store fsPath for response enrichment. -2. **If `id` present**: optionally verify it exists in the tree and is a script class. Pass through to plugin. Resolve fsPath from tree metadata for response enrichment. -3. **On response from plugin**: enrich with `id` (Ref hex) and `fsPath`. - -## Plugin-Side Resolution - -The plugin receives `{ type: "getScript", requestId, id, fromDraft }`: - -```lua -local fromIds = self._lastMcpFromIds -if not fromIds then - -- error: "No previous sync session. Run atlas_sync(mode: \"dryrun\") first to establish the instance mapping." -end - -local instance = fromIds[id] -if not instance then - -- error: "Instance not found by id. The sync session may be stale, run atlas_sync again." -end -if instance.Parent == nil then - -- error: "Instance was deleted since last sync. Run atlas_sync again." -end - -if not instance:IsA("LuaSourceContainer") then - -- error: "Instance is not a script (ClassName)" -end -``` - -After resolution: - -1. Read source: if `fromDraft`, use `ScriptEditorService:GetEditorSource(instance)`; else `instance.Source` -2. Compute studioHash: `SHA1(buffer.fromstring("blob " .. #source .. "\0" .. source))` -3. Build instancePath: `string.gsub(instance:GetFullName(), "^game%.", ""):gsub("%.", "/")` -4. Return `{ requestId, status = "success", source, studioHash, className = instance.ClassName, instancePath }` - -## Guards - -- `command_in_progress` prevents concurrent MCP commands (channel has one result slot) -- `plugin_stream_connected` required (otherwise no way to communicate with Studio) -- NOT blocked by `active_api_connections > 0`: In api.rs, the `active_api_connections` guard must only apply to `sync` commands, not `getScript`. The command type routing checks the `type` field before this guard. Reading a script is safe during live sync; if no retained map exists, the plugin returns a clear error. -- If `id` or `fsPath` resolves to a non-script class in the tree, return error immediately from api.rs without plugin round-trip - -## Files to Change - -### Rust: `[src/web/mcp.rs](src/web/mcp.rs)` - -- Rename `McpSyncState` -> `McpState`, generalize channels to `Value` -- Add `GetScriptCommand` struct: `{ request_id, id?, fs_path?, from_draft }` -- Add `GetScriptResult` struct: `{ status, source?, studio_hash?, class_name?, instance_path?, id?, fs_path?, is_draft?, message? }` -- Add `get_script` tool definition in `handle_tools_list` with full workflow description and inputSchema (id, fsPath, fromDraft) -- Add `handle_get_script` handler (parse params, validate at least one of id/fsPath, send command, format response) -- Update `handle_atlas_sync` to serialize/deserialize via Value -- Update all references from `McpSyncState` to `McpState` -- Tests: wire type serde, handler parse, response formatting - -### Rust: `[src/web/api.rs](src/web/api.rs)` - -- Update `McpSyncState` -> `McpState` references -- Update channel types to `Value` in MCP stream handler -- Add command type routing: check `type` field on received command Value BEFORE the `active_api_connections` guard. `sync` goes through the guard; `getScript` bypasses it. -- For `getScript`: resolve fsPath -> id via tree if needed, verify script class, forward to plugin with `id`, enrich result with id/fsPath on response -- For `sync`: existing behavior (forward, enrich fsPath on result) - -### Rust: `[src/web/mod.rs](src/web/mod.rs)` (if `McpSyncState` is referenced) - -- Update type references - -### Plugin: `[plugin/src/McpStream.lua](plugin/src/McpStream.lua)` - -- Add handler for `data.type == "getScript"` -- Call `self._onGetScriptCommand(data.requestId, data)`, expect Promise result -- Send JSON result back over WebSocket (same pattern as sync) - -### Plugin: `[plugin/src/App/init.lua](plugin/src/App/init.lua)` - -- **Shallow copy instanceMap.fromIds**: At the top of `setConfirmCallback` in `startMcpSync`, copy `instanceMap.fromIds` into `self._lastMcpFromIds`. This must happen before any branch (the copy survives `InstanceMap:stop()` which clears the original). -- Clear `self._lastMcpFromIds = nil` when MCP stream disconnects. -- Wire `onGetScriptCommand` callback in McpStream constructor. -- Add `handleMcpGetScript(requestId, params)` method: - - Lookup via `self._lastMcpFromIds[id]` - - Handle missing map ("Run atlas_sync first") - - Handle stale entries (not found, Parent == nil) - - LuaSourceContainer check - - Source reading (regular + draft via ScriptEditorService) - - SHA1 hash computation (using existing `SHA1.luau`) - - Build instancePath from `instance:GetFullName()` - - Return Promise resolving to result table - -## Test Plan - -### Rust unit tests (mcp.rs) - -- `GetScriptResult` serde round-trip with all fields (including `instancePath`) -- `handle_tools_list` includes `get_script` tool with correct inputSchema and workflow description -- `handle_get_script` returns error when no plugin stream connected -- `handle_get_script` returns error when command already in progress -- `handle_get_script` requires at least one of id/fsPath -- Response formatting: success case includes `` block, error case sets `isError` - -### Rust integration (api.rs) - -- `getScript` with `fsPath`: resolves via `get_ids_at_path`, injects `id`, forwards to plugin -- `getScript` with `id`: passes through, resolves `fsPath` for enrichment -- `getScript` with non-script `fsPath`: returns error before forwarding -- `getScript` with non-existent `fsPath`: returns error -- `getScript` bypasses `active_api_connections > 0` guard (command type routing) -- Result enrichment adds `id` and `fsPath` - -### Plugin tests - -- Shallow copy survives `InstanceMap:stop()`: copy retains entries after original is cleared -- Id lookup: found, not found, stale (Parent nil), no retained map -- Non-script instance: returns error -- Source reading: regular source, draft source via ScriptEditorService -- StudioHash: correct git blob format SHA1 -- instancePath: correctly derived from GetFullName -- Retained map cleared on MCP stream disconnect -- `already_connected` early return does not update retained map - diff --git a/.cursor/plans/mcp_sync_endpoint_enhancement_20ff55ce.plan.md b/.cursor/plans/mcp_sync_endpoint_enhancement_20ff55ce.plan.md deleted file mode 100644 index ce38ec0b..00000000 --- a/.cursor/plans/mcp_sync_endpoint_enhancement_20ff55ce.plan.md +++ /dev/null @@ -1,379 +0,0 @@ ---- -name: MCP sync endpoint enhancement -overview: Enhance the `atlas_sync` MCP tool to support modes (standard/manual/fastfail/dryrun), agent-specified override auto-accepts with hash + property verification, and enriched change metadata (studioHash, property before/after values, className, patchType, fsPath) in the response. -todos: - - id: rust-structs - content: Add SyncOverride struct (id-based matching, with expectedProperties), expand McpSyncCommand (mode, overrides), expand SyncChange (id, className, patchType, studioHash, defaultSelection, fsPath, properties) in mcp.rs - status: completed - - id: rust-handler - content: Update handle_atlas_sync to parse mode/overrides from params, include in command, handle new statuses (dryrun, fastfail_unresolved), emit structured JSON in response - status: completed - - id: rust-tool-schema - content: Update atlas_sync inputSchema in handle_tools_list with mode and overrides parameters - status: completed - - id: rust-api-enrich - content: In api.rs MCP stream handler, enrich changes with fsPath by looking up Ref in tree's InstigatingSource::Path after receiving plugin result. Handle Ref::from_str failures gracefully (plugin-generated GUIDs for removed nodes). - status: completed - - id: plugin-mcpstream - content: Update McpStream.lua to forward mode and overrides from sync command to onSyncCommand callback - status: completed - - id: plugin-startmcpsync - content: Update startMcpSync in App/init.lua to accept mode/overrides, implement mode logic (manual/fastfail/dryrun) and id-based override matching with studioHash + expectedProperties verification (decodeValue before trueEquals). Thread patch/instanceMap to _buildMcpChangeList. - status: completed - - id: plugin-changelist - content: Expand _buildMcpChangeList signature to receive patch + instanceMap. Encode properties using raw changedProperties (incoming) and encodeProperty via descriptor lookup (current). Skip Source for scripts. Handle encode failures gracefully. - status: completed - - id: rust-tests - content: Update existing mcp.rs tests and add new tests for modes, overrides, enriched SyncChange fields, and new statuses - status: completed - - id: test-suite - content: Full coverage test suite. Rust side - wire type serde for all new structs, mode passthrough, fsPath enrichment (valid Ref, invalid Ref, ProjectNode, missing instance), JSON response block parsing. Plugin side - _buildMcpChangeList property encoding (scripts skip Source, encode failures, multiple property types), override verification (studioHash match/mismatch, expectedProperties match/mismatch/decode, stale id), mode behavior (standard fast-forward, standard user-review, manual always-review, fastfail unresolved, fastfail all-resolved, dryrun returns without applying), end-to-end MCP stream forwarding of mode/overrides. - status: completed -isProject: false ---- - -# MCP Sync Endpoint Enhancement - -## Context - -The current `atlas_sync` tool takes no parameters and has one behavior: if all changes are git-auto-selected, fast-forward; otherwise show Studio UI and block. The agent has no way to control this, no way to auto-accept specific changes, and gets minimal metadata back. - -The enhanced endpoint enables an agent workflow like: - -1. `atlas_sync(mode: "fastfail")` -- get changes with hashes, fail if any are unresolved -2. `get_script(id)` -- read conflicting script from Studio (future endpoint, uses `id` from sync response) -3. Merge changes, write to filesystem -4. `atlas_sync(overrides: [{id, direction, studioHash}])` -- auto-accept with hash verification - -## New Input Schema - -```json -{ - "mode": "standard", - "overrides": [ - { - "id": "00abcdef01234567890abcdef0123456", - "direction": "push", - "studioHash": "a1b2c3...", - "expectedProperties": { - "Disabled": false - } - }, - { - "id": "00abcdef01234567890abcdef0123457", - "direction": "push", - "expectedProperties": { - "Position": {"Vector3": [0, 5, 0]}, - "Anchored": true - } - } - ] -} -``` - -- **mode**: `"standard"` (default) | `"manual"` | `"fastfail"` | `"dryrun"` -- **overrides**: array of auto-accept directives per instance: - - `id` (required): the server Ref (32-char hex) from a previous sync response. Matched directly via `patchTree:getNode(id)` -- O(1), no ambiguity possible. - - `direction` (required): `"push"` or `"pull"` - - `studioHash` (scripts only): SHA1 of git blob of Source, verifies Source hasn't changed since agent last inspected - - `expectedProperties` (optional): map of property name to expected current Studio value. Plugin verifies each against the live instance. Uses RbxDom encoded format (same as response). If any mismatch, the override is rejected and the change becomes unresolved. - -### Why `id` instead of `path` - -Instance names are not unique in Roblox -- a parent can have multiple children with the same name. Paths built from `instance.Name` segments (e.g. `Workspace/Part`) are ambiguous when duplicates exist. The server Ref (`id`) is a unique 128-bit identifier per instance, assigned by the server and round-tripped through all responses. Using it eliminates the path ambiguity problem entirely on both the response and override sides, with no need for path escaping or debugId disambiguation. - -The `path` field in responses remains for human readability (agents can display it, use it in logs). The `fsPath` field provides the unique Atlas filesystem path for file editing. Neither is used for override matching. - -## New Response Change Schema - -Currently each change is `{path, direction}`. Enhanced: - -```json -{ - "path": "ServerScriptService/MyScript", - "id": "00abcdef...", - "direction": "push", - "patchType": "Edit", - "className": "Script", - "studioHash": "a1b2c3...", - "defaultSelection": "push", - "fsPath": "src/server/MyScript.server.luau", - "properties": { - "Disabled": { - "current": false, - "incoming": true - } - } -} -``` - -For a non-script instance with property changes: - -```json -{ - "path": "Workspace/MyPart", - "id": "00abcdef...", - "direction": "push", - "patchType": "Edit", - "className": "Part", - "defaultSelection": "pull", - "fsPath": "src/workspace/MyPart.model.json5", - "properties": { - "Position": { - "current": {"Vector3": [0, 5, 0]}, - "incoming": {"Vector3": [10, 5, 0]} - }, - "Anchored": { - "current": false, - "incoming": true - } - } -} -``` - -- `studioHash`: SHA1 of `"blob \0"` (git blob format) of the script's Source in Studio. Only present for script classes. Used by agents for override verification. -- `fsPath`: Atlas filesystem path relative to project root. Enriched server-side from `InstigatingSource::Path`. Null for project-node instances or additions. -- `defaultSelection`: what git auto-selected (`"push"` / `"pull"` / null) -- `properties`: map of changed property name to `{current, incoming}` values in RbxDom encoded format. `current` is the live Studio value, `incoming` is the Atlas value. For scripts, Source is omitted from `properties` (use `studioHash` + `get_script` instead to avoid massive payloads). Only present for Edit patchType. - -## Mode Behavior (plugin confirm callback) - - -| Mode | Behavior | -| ---------- | ------------------------------------------------------------------------------------------------------------------------- | -| `standard` | Current: fast-forward if all pre-selected, otherwise show UI | -| `manual` | Always show UI, never auto-accept | -| `fastfail` | If any change has null `defaultSelection` AND no matching override, resolve immediately with `fastfail_unresolved` status | -| `dryrun` | Compute full change list with hashes, resolve immediately, abort session without applying | - - -## Override Matching and Verification (plugin side) - -For each override, the plugin: - -1. **Match by `id`**: Look up the PatchTree node via `patchTree:getNode(override.id)`. If not found (stale id from a previous session), skip the override. -2. **studioHash verification** (scripts): If `override.studioHash` is provided, compute SHA1 of git blob of `node.instance.Source` and compare. Mismatch = override rejected (someone changed the script since the agent last looked). -3. **expectedProperties verification** (any instance): If `override.expectedProperties` is provided, for each property in the map: - a. **Decode** the expected value via `decodeValue(expectedValue, instanceMap)` -- the override arrives as RbxDom-encoded JSON (e.g. `{"Vector3": [0, 5, 0]}`), which must be decoded to a live Roblox value before comparison. - b. Read the current Studio value via `getProperty(node.instance, propName)`. - c. Compare using `trueEquals(decodedExpected, currentValue)` -- fuzzy float comparison, EnumItem handling, etc. - d. Any mismatch = override rejected (someone changed a property since the agent last looked). -4. If all verifications pass, set the node's selection to `override.direction`, treating it as pre-selected for mode logic. -5. If verification fails, the node remains unresolved. In `fastfail` mode this means the sync fails immediately with the unresolved changes listed. In `standard` mode the user sees them in the Studio UI. - -This design ensures: no path ambiguity (id is unique), no path escaping needed, O(1) node lookup, and the agent never silently overwrites concurrent changes from other developers. - -## Files to Change - -### Rust: `[src/web/mcp.rs](src/web/mcp.rs)` - -- Add `SyncOverride` struct: `{id, direction, studio_hash?, expected_properties?}` -- Expand `McpSyncCommand`: add `mode: String`, `overrides: Vec` -- Expand `SyncChange`: add `id`, `class_name`, `patch_type`, `studio_hash`, `default_selection`, `fs_path`, `properties` (all optional) -- Update `atlas_sync` tool definition in `handle_tools_list` with new inputSchema -- Update `handle_atlas_sync` to parse mode + overrides from params and include them in the command -- Handle new statuses (`fastfail_unresolved`, `dryrun`) in response formatting -- Update `handle_atlas_sync` response text to include richer change info (structured JSON instead of plain text list) -- Update tests - -### Rust: `[src/web/api.rs](src/web/api.rs)` (MCP stream handler) - -- Serialize mode + overrides into the WebSocket command to the plugin -- After receiving `McpSyncResult`, enrich each change's `fs_path`: - - Attempt to parse `change.id` as `Ref` (32-char hex, via `Ref::from_str`). If parse fails (e.g. plugin-generated GUID for removed nodes), leave `fs_path = None` and continue. - - Look up `tree.get_instance(ref).metadata.instigating_source` - - If `InstigatingSource::Path(p)`, strip project root prefix, set `fs_path` - - If instance not found or source is `ProjectNode`, leave `fs_path = None` -- Forward enriched result via oneshot - -### Plugin: `[plugin/src/McpStream.lua](plugin/src/McpStream.lua)` - -- Forward `data.mode` and `data.overrides` from the sync command to `self._onSyncCommand(data.requestId, data.mode, data.overrides)` - -### Plugin: `[plugin/src/App/init.lua](plugin/src/App/init.lua)` - -`**startMcpSync(requestId, mode, overrides)`:** - -- Accept `mode` and `overrides` parameters -- In the confirm callback (which receives `instanceMap, patch, serverInfo`), after building PatchTree: - - Apply overrides: for each override, look up node by `patchTree:getNode(override.id)`, verify studioHash for scripts, verify expectedProperties via `decodeValue` + `trueEquals`, set selection - - `dryrun`: build full change list via `_buildMcpChangeList(patchTree, patch, instanceMap, nil, true)`, resolve with `status: "dryrun"`, return `"Abort"` - - `fastfail`: check if any node is unresolved after defaults + overrides; if so, resolve with `fastfail_unresolved` + full change list, return `"Abort"` - - `manual`: force into user-review flow (skip the `allPreSelected` fast-forward) - - `standard`: current behavior -- All calls to `_buildMcpChangeList` in this function must pass `patch` and `instanceMap` (available as closure variables from the confirm callback) - -`**_buildMcpChangeList(patchTree, patch, instanceMap, selections, includeAll)`:** - -Signature change: receives the original `patch` object and `instanceMap` in addition to the tree, because: - -- `node.changeList` stores **decoded** Roblox values (Vector3 userdata, EnumItem, etc.) that cannot be JSON-serialized -- We need the raw `patch.updated[].changedProperties` for incoming values (already in RbxDom-encoded wire format) -- We need `encodeProperty(instance, propName, descriptor)` to encode current Studio values into the same wire format -- Both require looking up the `RbxDom.findCanonicalPropertyDescriptor(instance.ClassName, propName)` for each property - -Implementation: - -- Add `includeAll` parameter (for dryrun/fastfail: include all changes regardless of selection) -- Add `className = node.className` -- Add `patchType = node.patchType` -- Add `id = node.id` (server Ref, for fsPath enrichment). Note: for Removed nodes, this may be a plugin-generated GUID rather than a server Ref -- the Rust `fsPath` enrichment must handle `Ref::from_str` parse failures gracefully (set `fsPath = null`). -- Add `defaultSelection = node.defaultSelection` -- For script instances (`node.instance:IsA("LuaSourceContainer")`): compute and add `studioHash` = SHA1 of git blob of `instance.Source` -- Add `properties` map for Edit nodes: build a `patchLookup` from `patch.updated` keyed by `change.id`, then for each property in `patchLookup[node.id].changedProperties`: - - **Skip** `Source` for script classes (handled by `studioHash` + future `get_script`) - - `incoming`: use the raw value from `changedProperties[propName]` (already RbxDom-encoded wire format, JSON-safe) - - `current`: look up descriptor via `RbxDom.findCanonicalPropertyDescriptor(node.className, propName)`, then call `encodeProperty(node.instance, propName, descriptor)` to get the RbxDom-encoded current value - - Store as `{current = encodedCurrent, incoming = encodedIncoming}` - - If encoding fails for either side, skip that property (don't crash the response) - -## New Statuses - - -| Status | When | isError | -| -------------------------------------------------------- | ---------------------------------------- | --------- | -| `dryrun` | Dryrun mode, returning what would happen | false | -| `fastfail_unresolved` | Fastfail mode, unresolved changes exist | true | -| (existing) `success`, `empty`, `rejected`, `error`, etc. | Unchanged | Unchanged | - - -## Response Format Enhancement - -Currently the MCP tool response is plain text. After this change, for all statuses that include changes (success, fastfail, dryrun, rejected), include a structured JSON block inside the text content so the agent can parse it: - -``` -Sync completed successfully. - -Changes: -- [push] ServerScriptService/MyScript (Edit, Script, fs=src/server/MyScript.server.luau) -- [pull] Workspace/MyPart (Edit, Part, fs=src/workspace/MyPart.model.json5) - - -{"status":"success","changes":[{"path":"ServerScriptService/MyScript","id":"00ab...","direction":"push","patchType":"Edit","className":"Script","studioHash":"abc123","defaultSelection":"push","fsPath":"src/server/MyScript.server.luau","properties":{"Disabled":{"current":false,"incoming":true}}},{"path":"Workspace/MyPart","id":"00cd...","direction":"pull","patchType":"Edit","className":"Part","defaultSelection":"pull","fsPath":"src/workspace/MyPart.model.json5","properties":{"Position":{"current":{"Vector3":[0,5,0]},"incoming":{"Vector3":[10,5,0]}}}}]} - -``` - -The `` block gives the agent machine-readable data while keeping the human-readable summary above it. Note: script Source is deliberately excluded from `properties` to avoid massive payloads -- agents use `studioHash` for verification and the future `get_script` tool to read actual source content when needed. - -## Test Suite - -Full coverage testing across both Rust and Lua, organized by layer. - -### Rust: `src/web/mcp.rs` unit tests - -**Wire type serde (extend existing `wire_types` module):** - -- `SyncOverride` serializes/deserializes with camelCase (`id`, `direction`, `studioHash`, `expectedProperties`) -- `SyncOverride` defaults: missing `studioHash` and `expectedProperties` deserialize to `None` -- `McpSyncCommand` serializes `mode` and `overrides` fields -- `SyncChange` serializes all new optional fields (`id`, `className`, `patchType`, `studioHash`, `defaultSelection`, `fsPath`, `properties`) -- `SyncChange` omits `None` optional fields (skip_serializing_if) -- `McpSyncResult` with enriched `SyncChange` entries round-trips correctly - -**Handler tests (extend existing `handler_tests` module):** - -- `handle_tools_list` returns updated inputSchema with `mode` and `overrides` -- `handle_atlas_sync` parses `mode` from params and passes through to command -- `handle_atlas_sync` parses `overrides` from params and passes through to command -- `handle_atlas_sync` defaults `mode` to `"standard"` when omitted -- `handle_atlas_sync` defaults `overrides` to empty array when omitted - -**Guard tests (extend existing `atlas_sync_guards` module):** - -- Success result with enriched changes includes `` block in response text -- Dryrun status maps to `isError: false` -- `fastfail_unresolved` status maps to `isError: true` -- Empty status still returns `isError: false` -- Rejected with enriched changes includes `` block - -### Rust: `src/web/api.rs` fsPath enrichment tests - -- Valid Ref resolves to `InstigatingSource::Path` -> fsPath is set (relative to project root) -- Valid Ref with `InstigatingSource::ProjectNode` -> fsPath is None -- Invalid Ref string (plugin GUID) -> fsPath is None, no panic -- Ref for instance not in tree -> fsPath is None -- Multiple changes: only those with valid paths get fsPath - -### Plugin: `_buildMcpChangeList` tests (`plugin/src/App/init.spec.lua` or dedicated file) - -**Basic enrichment:** - -- Edit node includes `id`, `className`, `patchType`, `defaultSelection` -- Add node includes `id`, `className`, `patchType = "Add"` -- Remove node includes `id`, `className`, `patchType = "Remove"` -- Script node includes `studioHash` (correct git blob SHA1) -- Non-script node has no `studioHash` - -**Property encoding:** - -- Edit node with `changedProperties` produces `properties` map with `{current, incoming}` in RbxDom-encoded format -- `Source` is skipped for script classes -- `Name` change appears in properties as `changedName` -- Failed encode for current value skips that property (no crash) -- Failed encode for incoming value skips that property (no crash) -- Multiple property types: Bool, Number, String, Vector3, Color3, Enum - -**includeAll parameter:** - -- `includeAll = false` with selections: only includes selected nodes -- `includeAll = false` without selections: includes all with defaultSelection or "push" -- `includeAll = true`: includes every node with patchType regardless of selection - -### Plugin: Override verification tests - -**id-based matching:** - -- Override with valid node id matches correctly -- Override with unknown id is silently skipped -- Multiple overrides match their respective nodes - -**studioHash verification:** - -- Matching hash: override accepted, node selection set -- Mismatching hash: override rejected, node stays unresolved -- No studioHash on override for script: override accepted (no verification) -- studioHash on non-script: ignored (only Source hashing applies to scripts) - -**expectedProperties verification:** - -- All properties match: override accepted -- One property mismatch: override rejected entirely -- Empty expectedProperties: override accepted (no verification) -- Property value decoded via `decodeValue` before `trueEquals` comparison -- Fuzzy float comparison works (e.g. `0.30000001` matches `0.3`) -- EnumItem comparison works (e.g. `{Enum = 2}` vs `Enum.Material.Plastic`) - -### Plugin: Mode behavior tests - -**standard mode:** - -- All pre-selected: fast-forwards, resolves `success`, returns Confirm with selections -- Some unresolved: shows Confirming UI, waits for user -- Empty patch: resolves `empty` - -**manual mode:** - -- All pre-selected: still shows Confirming UI (no fast-forward) -- User confirms: resolves `success` -- User aborts: resolves `rejected` - -**fastfail mode:** - -- All resolved (via defaults + overrides): fast-forwards, resolves `success` -- Some unresolved after defaults + overrides: resolves `fastfail_unresolved` immediately, returns `"Abort"`, includes full change list with `includeAll = true` -- Override verification failure makes node unresolved, triggers fastfail - -**dryrun mode:** - -- Resolves immediately with `status: "dryrun"`, returns `"Abort"` -- Change list includes all nodes with full metadata (properties, studioHash) -- Session is aborted without applying any changes -- Works with empty patch (resolves `empty`) - -### Plugin: McpStream forwarding tests - -- `{type: "sync", requestId, mode, overrides}` forwards all three fields to `onSyncCommand` -- Missing `mode` defaults to `"standard"` (or nil, handled by `startMcpSync`) -- Missing `overrides` defaults to empty table -- Result is JSON-encoded and sent back over WebSocket - diff --git a/.cursor/plans/merge_plugin_upload_workflow_0943cf6c.plan.md b/.cursor/plans/merge_plugin_upload_workflow_0943cf6c.plan.md deleted file mode 100644 index 33a1b785..00000000 --- a/.cursor/plans/merge_plugin_upload_workflow_0943cf6c.plan.md +++ /dev/null @@ -1,161 +0,0 @@ ---- -name: Merge plugin upload workflow -overview: Manually apply the upstream commit "Upload plugin as part of release workflow" to the Atlas fork, adapting all file references and metadata to match the fork's diverged codebase. -todos: - - id: new-files - content: Create .lune/.config.luau, .lune/scripts/plugin-upload.luau, .lune/upload-plugin.luau (adapted for atlas), plugin/UploadDetails.json (with Atlas values) - status: completed - - id: submodule - content: Add opencloud-execute submodule at .lune/opencloud-execute - status: completed - - id: build-rs - content: Add UploadDetails.json to plugin snapshot in build.rs - status: completed - - id: project-json - content: Add UploadDetails node to plugin.project.json - status: completed - - id: rokit - content: Add lune tool to rokit.toml - status: completed - - id: release-yml - content: Add Roblox upload step to release.yml build-plugin job - status: completed - - id: plugin-rs - content: Apply trivial test change in src/cli/plugin.rs - status: completed - - id: local-scripts - content: Replace scripts/publish-plugin.ps1 and add scripts/publish-plugin.sh to use lune-based upload - status: completed -isProject: false ---- - -# Merge Plugin Upload Release Workflow - -Cherry-picking will produce conflicts in 6+ files due to heavy divergence. Manual application is the cleanest path. - -## Upstream bugs to fix - -**Swapped env vars in `release.yml`:** The upstream commit has `RBX_UNIVERSE_ID` mapped to `vars.PLUGIN_CI_PLACE_ID` and `RBX_PLACE_ID` mapped to `vars.PLUGIN_CI_UNIVERSE_ID` -- clearly crossed. We will use the correct mapping. - -## Local scripts replacement - -`scripts/publish-plugin.ps1` currently uses `cargo run -- upload`. Replace it (and add missing `.sh`) to use the same Lune-based upload pipeline locally. The `.lune/upload-plugin.luau` script already handles the local case (builds the plugin via `atlas build` when `CI != "true"`), so the wrapper scripts just load `.env` and run `lune run upload-plugin Atlas.rbxm`. - -`.env` uses the same names as GitHub Actions secrets/vars: - -``` -PLUGIN_UPLOAD_TOKEN=your-opencloud-api-key -PLUGIN_CI_UNIVERSE_ID=your-universe-id -PLUGIN_CI_PLACE_ID=your-place-id -``` - -The local scripts map these to `RBX_API_KEY`/`RBX_UNIVERSE_ID`/`RBX_PLACE_ID` before calling lune, matching what the CI workflow `env:` block does. - -## What the commit adds - -Automated plugin upload to Roblox as part of the GitHub release workflow, using [Lune](https://lune-org.github.io/docs) + OpenCloud Luau Execute to publish the built `.rbxm` to Roblox's plugin marketplace. - -## New files (create as-is, with Atlas adaptations) - -### `.lune/.config.luau` - -Lune config with strict mode and typedefs alias. Copy verbatim from upstream. - -### `.lune/scripts/plugin-upload.luau` - -Roblox engine script that deserializes the plugin `.rbxm`, reads `UploadDetails`, and calls `AssetService:CreateAssetVersionAsync`. Copy verbatim -- it's generic (reads values from UploadDetails at runtime). - -### `.lune/upload-plugin.luau` - -Lune entry point that reads the `.rbxm`, sends it to OpenCloud for execution. One adaptation needed: change `process.exec("rojo", ...)` to `process.exec("atlas", ...)` on the local-testing path (line 25 in upstream). - -### `plugin/UploadDetails.json` - -Atlas-specific values per user input: - -```json -{ - "assetId": 111151139098227, - "name": "Atlas", - "description": "The plugin portion of Atlas, a tool to enable professional tooling for Roblox developers.", - "creatorId": 422368266, - "creatorType": "Group" -} -``` - -## Submodule addition - -### `.lune/opencloud-execute` - -Add git submodule: `https://github.com/Dekkonot/opencloud-luau-execute-lune.git` at `.lune/opencloud-execute`. This also adds an entry to `[.gitmodules](.gitmodules)`. - -## Existing file modifications - -### `[.github/workflows/release.yml](.github/workflows/release.yml)` - -Two additions to the `build-plugin` job: - -1. **Add Rokit install step** (after "Install Rust", before "Build Atlas") so `lune` is on PATH: - -```yaml -- name: Install Rokit - uses: CompeyDev/setup-rokit@v0.1.2 -``` - -1. **Add upload step** (after "Upload Plugin to Artifacts" at line 47) with **corrected** env var mapping (upstream had these swapped): - -```yaml -- name: Upload Plugin to Roblox - env: - RBX_API_KEY: ${{ secrets.PLUGIN_UPLOAD_TOKEN }} - RBX_UNIVERSE_ID: ${{ vars.PLUGIN_CI_UNIVERSE_ID }} - RBX_PLACE_ID: ${{ vars.PLUGIN_CI_PLACE_ID }} - run: lune run upload-plugin Atlas.rbxm -``` - -### `[build.rs](build.rs)` - -Add `"UploadDetails.json"` entry to the plugin snapshot hashmap, after `"Version.txt"` on line 98: - -```rust -"UploadDetails.json" => snapshot_from_fs_path(&plugin_dir.join("UploadDetails.json"))?, -``` - -### `[plugin.project.json](plugin.project.json)` - -Add `UploadDetails` child node after `Version` (line 25): - -```json -"UploadDetails": { - "$path": "plugin/UploadDetails.json" -} -``` - -### `[rokit.toml](rokit.toml)` - -Add lune tool (latest version) after the existing entries: - -```toml -lune = "lune-org/lune@0.10.4" -``` - -### `[src/cli/plugin.rs](src/cli/plugin.rs)` - -Trivial test change on line 101: `assert!(initialize_plugin().is_ok())` becomes `let _ = initialize_plugin().unwrap();` - -### `[scripts/publish-plugin.ps1](scripts/publish-plugin.ps1)` - -Replace entirely. New version: load `.env`, export `RBX_API_KEY`/`RBX_UNIVERSE_ID`/`RBX_PLACE_ID`, run `lune run upload-plugin Atlas.rbxm`. - -### `scripts/publish-plugin.sh` (new) - -Bash equivalent: source `.env`, export vars, run `lune run upload-plugin Atlas.rbxm`. - -## Required GitHub secrets/vars - -After merging, the repo needs these configured in GitHub settings: - -- **Secret:** `PLUGIN_UPLOAD_TOKEN` -- Roblox OpenCloud API key -- **Variable:** `PLUGIN_CI_UNIVERSE_ID` -- Universe ID for the place used by OpenCloud Execute -- **Variable:** `PLUGIN_CI_PLACE_ID` -- Place ID within that universe - diff --git a/.cursor/plans/merge_ui_button_changes_6608afe8.plan.md b/.cursor/plans/merge_ui_button_changes_6608afe8.plan.md deleted file mode 100644 index 65d4021f..00000000 --- a/.cursor/plans/merge_ui_button_changes_6608afe8.plan.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -name: Merge UI Button Changes -overview: Rename Push/Pull buttons to Rojo/Studio, remove "all" helper buttons, add double-click cascade functionality with hover-reveal buttons for parent nodes. -todos: - - id: rename-buttons - content: Rename Pull->Studio and Push->Rojo in DomLabel.lua SelectionRadio - status: completed - - id: remove-all-buttons - content: Remove PullAll, SkipAll, PushAll buttons from Confirming.lua - status: completed - - id: add-subtree-callback - content: Create onSubtreeSelectionChange callback in Confirming.lua that sets selection for node and all descendants - status: completed - - id: add-double-click - content: Add double-click handler to SelectionOption buttons with caret indicator - status: completed - - id: hover-reveal-buttons - content: Show selection buttons on hover for parent nodes without patchType - status: completed -isProject: false ---- - -# Merge UI Button Improvements - -## Key Files to Modify - -- `[plugin/src/App/Components/PatchVisualizer/DomLabel.lua](plugin/src/App/Components/PatchVisualizer/DomLabel.lua)` - Selection buttons and hover behavior -- `[plugin/src/App/StatusPages/Confirming.lua](plugin/src/App/StatusPages/Confirming.lua)` - Remove "all" buttons, add subtree selection callback -- `[plugin/src/App/Components/PatchVisualizer/init.lua](plugin/src/App/Components/PatchVisualizer/init.lua)` - Pass patchTree to DomLabel - -## Changes - -### 1. Rename Buttons (DomLabel.lua) - -In `SelectionRadio` function, change button text: - -- "Pull" -> "Studio" (line 113) -- "Push" -> "Rojo" (line 137) - -### 2. Remove "All" Button Helpers (Confirming.lua) - -Remove these elements from the `Buttons` frame (lines 156-184): - -- `PullAll` button -- `SkipAll` button -- `PushAll` button - -Keep the `setAllSelections` function as it will be repurposed for subtree selection. - -### 3. Add Double-Click Cascade with Caret (DomLabel.lua) - -Modify `SelectionOption` component: - -- Add a "▼" caret character after the button text -- Track double-click using `clickCount` in the `Activated` event -- On double-click, call a new `onSubtreeSelectionChange` callback - -Add to `SelectionRadio`: - -- Pass `onSubtreeSelectionChange` prop to each option - -### 4. Add Subtree Selection Callback (Confirming.lua) - -Create new callback `onSubtreeSelectionChange(nodeId, selection)`: - -```lua -self.onSubtreeSelectionChange = function(nodeId, selection) - if not self.props.patchTree then return end - - local node = self.props.patchTree:getNode(nodeId) - if not node then return end - - self:setState(function(state) - local newSelections = table.clone(state.selections) - -- Set this node if it has a patchType - if node.patchType then - newSelections[nodeId] = selection - end - -- Set all descendants - self.props.patchTree:forEach(function(childNode) - if childNode.patchType then - newSelections[childNode.id] = selection - end - end, node) - return { selections = newSelections } - end) -end -``` - -### 5. Show Buttons on Hover for Parents Without Changes (DomLabel.lua) - -For nodes where `patchType == nil` but `hasChildren == true`: - -Add hover state tracking in `DomLabel`: - -```lua -self:setState({ isHovered = false }) -``` - -Add `MouseEnter`/`MouseLeave` events to the main Frame. - -Modify `SelectionRadio` visibility logic: - -- `visible = (props.patchType ~= nil) or (props.hasChildren and self.state.isHovered)` - -The buttons for parent-only nodes will use `onSubtreeSelectionChange` directly (no single-click behavior needed since there's no selection to make for the node itself). - -### 6. Pass Required Props Through Component Tree - -In `PatchVisualizer/init.lua`, pass to DomLabel: - -- `patchTree = patchTree` -- `onSubtreeSelectionChange = self.props.onSubtreeSelectionChange` - -In `Confirming.lua`, pass to PatchVisualizer: - -- `onSubtreeSelectionChange = self.onSubtreeSelectionChange` - -## Component Flow - -```mermaid -flowchart TD - A[Confirming.lua] -->|selections, onSelectionChange, onSubtreeSelectionChange| B[PatchVisualizer] - B -->|node props, selection callbacks| C[DomLabel] - C -->|single click| D[onSelectionChange] - C -->|double click| E[onSubtreeSelectionChange] - D --> F[Update single node selection] - E --> G[Update node + all descendants] -``` - - - diff --git a/.cursor/plans/nuke_path_encoding_migration_7dfffc4d.plan.md b/.cursor/plans/nuke_path_encoding_migration_7dfffc4d.plan.md deleted file mode 100644 index 054f991f..00000000 --- a/.cursor/plans/nuke_path_encoding_migration_7dfffc4d.plan.md +++ /dev/null @@ -1,310 +0,0 @@ ---- -name: Nuke path_encoding migration -overview: "Remove the `%NAME%` path encoding system entirely and replace it with PR #1187's `name` property approach: slugify filenames (replace forbidden chars with `_`), deduplicate with `~N` suffixes on collision, and store the real instance name in `.meta.json`/`.model.json` `name` fields." -todos: - - id: phase1-infrastructure - content: "Manual port of PR #1187 infrastructure: specified_name on InstanceMetadata, slugify_name(), deduplicate_name(), name field on meta file structs, apply_name() methods, json_model name field support" - status: completed - - id: phase2-replace-encode-decode - content: Replace all encode_path_name/decode_path_name callsites with slugify + dedup + name property approach in snapshot middleware, syncback/file_names.rs, syncback/snapshot.rs - status: completed - - id: phase3-two-way-sync - content: "Replace encoding in two-way sync: change_processor.rs renames and web/api.rs added instances, with dedup checks" - status: completed - - id: phase4-remove-config - content: Remove decode_windows_invalid_chars from InstanceContext, encode_windows_invalid_chars from SyncbackRules, serve_session propagation, JSON schema - status: completed - - id: phase5-delete-module - content: Delete src/path_encoding.rs and remove pub mod declaration from lib.rs - status: completed - - id: phase6-hardcore-tests - content: "Hardcore test suite: unit tests for slugify/dedup, integration tests for build/syncback/two-way-sync roundtrips, collision tests, edge case tests; update existing encoded pattern tests; regenerate snapshots" - status: completed - - id: phase7-update-docs - content: Update cursor rules (.cursor/rules/rojo.mdc, src.mdc) to reflect new approach - status: completed -isProject: false ---- - -# Nuke path_encoding.rs and Migrate to PR #1187's `name` Property - -## Approach Summary - -**Current system (path_encoding.rs):** Encodes special chars as `%NAME%` patterns in filenames (`/` -> `%SLASH%`, `.` -> `%DOT%`, etc.), decodes them back during snapshot. Round-trips perfectly but creates ugly filenames like `What%QUESTION%Module.server.luau`. - -**New system (slugify + dedup + metadata name):** Two layers working together: - -1. `**slugify_name()**` -- pure, stateless. Replaces forbidden chars with `_`. Identical inputs produce identical outputs. -2. `**deduplicate_name()**` -- stateful, called at write sites. Takes a slug and a set of already-claimed names, appends `~1`, `~2`, etc. on collision. The filesystem name is just an opaque identifier. -3. **Metadata `name` field** -- the authoritative instance name, stored in `.meta.json` / `.model.json`. Always written when the slug differs from the real name (including when `~N` suffix is appended). - -``` -Instance "Hey_Bro" -> Hey_Bro.luau (no meta needed, name == slug) -Instance "Hey/Bro" -> Hey_Bro~1.luau (meta: {"name": "Hey/Bro"}) -Instance "Hey:Bro" -> Hey_Bro~2.luau (meta: {"name": "Hey:Bro"}) - -Future duplicate trees: -Instance "Folder" -> Folder/ (first claim, no meta needed) -Instance "Folder" -> Folder~1/ (meta: {"name": "Folder"}) -``` - -**Why `~`?** Valid on all OS, rarely in instance names, visually distinct, established convention (Windows short names, git ancestry), sorts next to base name. - -**Forward sync (reading):** `~N` is just part of the filename stem. The real name comes from metadata `name` field. If no metadata, the full stem (including `~N`) IS the instance name -- backwards-compatible for files without metadata. - -**Breaking change:** Any existing files with `%SLASH%`, `%DOT%`, `%QUESTION%` etc. in their filenames will no longer be decoded. This is intentional and clean. - -## Merge Strategy - -**Manual port, NOT git merge.** Our fork has diverged too far from upstream for a classical merge of PR #1187. Instead, we read their diff and manually implement the same concepts into our codebase, adapting to our existing code structure. Key differences from a raw merge: - -- PR #1187 doesn't have `deduplicate_name()` -- we add that on top -- PR #1187 doesn't have our two-way sync system, `change_processor.rs`, or many of our custom middleware tweaks -- we handle those ourselves -- PR #1187's test fixtures target upstream's test structure -- we write our own tests tailored to our fork -- We do NOT cherry-pick or apply their commits. We read their approach and reimplement it. - -## Complete File Catalogue - -### Touched Files by Category - -Every file that references `path_encoding`, `encode_path_name`, `decode_path_name`, `decode_windows_invalid_chars`, or `encode_windows_invalid_chars`: - -**Delete:** - -- [src/path_encoding.rs](src/path_encoding.rs) -- entire module - -**Core metadata (3 files):** - -- [src/lib.rs](src/lib.rs) -- remove `pub mod path_encoding;` -- [src/snapshot/metadata.rs](src/snapshot/metadata.rs) -- add `specified_name`, remove `decode_windows_invalid_chars` -- [src/serve_session.rs](src/serve_session.rs) -- remove `decode_windows_invalid_chars` setup - -**Forward sync: filesystem -> Roblox (4 files):** - -- [src/snapshot_middleware/mod.rs](src/snapshot_middleware/mod.rs) -- remove `decode_path_name` usage, name comes from meta files now -- [src/snapshot_middleware/meta_file.rs](src/snapshot_middleware/meta_file.rs) -- add `name` field to both `AdjacentMetadata` and `DirectoryMetadata`, add `apply_name()` method -- [src/snapshot_middleware/json_model.rs](src/snapshot_middleware/json_model.rs) -- respect `name` field instead of ignoring it -- [src/snapshot_middleware/lua.rs](src/snapshot_middleware/lua.rs) -- replace `encode_path_name` with `slugify_name` for meta file naming - -**Reverse sync: Roblox -> filesystem (5 files):** - -- [src/syncback/file_names.rs](src/syncback/file_names.rs) -- add `slugify_name()` + `deduplicate_name()`, remove `encode_path_name`, remove `encode_invalid_chars` param, add `taken_names` param -- [src/syncback/mod.rs](src/syncback/mod.rs) -- export `slugify_name`, `deduplicate_name`, remove `encode_windows_invalid_chars` from `SyncbackRules` -- [src/syncback/snapshot.rs](src/syncback/snapshot.rs) -- remove `encode_windows_invalid_chars()` method, track claimed names per directory, pass `taken_names` to `name_for_inst` -- [src/snapshot_middleware/txt.rs](src/snapshot_middleware/txt.rs) -- replace `encode_path_name` with `slugify_name` -- [src/snapshot_middleware/csv.rs](src/snapshot_middleware/csv.rs) -- replace `encode_path_name` with `slugify_name` - -**Two-way sync (2 files):** - -- [src/change_processor.rs](src/change_processor.rs) -- replace `encode_path_name` with `slugify_name` + dedup against directory contents + meta file handling -- [src/web/api.rs](src/web/api.rs) -- replace `encode_path_name` with `slugify_name` + dedup against directory contents + meta file handling - -**Tests (~28 encoded patterns in two_way_sync):** - -- [tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs) -- update all `%QUESTION%`, `%COLON%`, `%DOT%` patterns to slugified names + meta files -- [tests/tests/build.rs](tests/tests/build.rs) and [tests/tests/syncback.rs](tests/tests/syncback.rs) -- add new tests - -**Config/Schema (1 file):** - -- [vscode-rojo/schemas/project.template.schema.json](vscode-rojo/schemas/project.template.schema.json) -- remove `encodeWindowsInvalidChars` - -**Snapshot test files (~20+ .snap files):** - -- All `.snap` files under `src/snapshot/tests/snapshots/` contain `decode_windows_invalid_chars: true` -- will need regeneration - -**Cursor rules (2 files):** - -- [.cursor/rules/rojo.mdc](.cursor/rules/rojo.mdc) -- update `InstanceContext` docs -- [.cursor/rules/src.mdc](.cursor/rules/src.mdc) -- update middleware docs - ---- - -## Key New Functions - -### `slugify_name()` in `src/syncback/file_names.rs` - -Pure, stateless. Ported from PR #1187 with no changes needed: - -```rust -pub fn slugify_name(name: &str) -> String { - let mut result = String::with_capacity(name.len()); - for ch in name.chars() { - if FORBIDDEN_CHARS.contains(&ch) { - result.push('_'); - } else { - result.push(ch); - } - } - // Handle Windows reserved names, trailing dot/space, empty result - // ... (same as PR #1187) - result -} -``` - -### `deduplicate_name()` in `src/syncback/file_names.rs` - -Stateful collision resolver. Takes a base name (slug or natural) and a set of already-claimed names in that directory: - -```rust -/// Appends ~1, ~2, etc. to avoid collisions. Returns the name as-is if unclaimed. -/// `taken_names` contains names already used in this directory (both from existing -/// files on disk and from siblings processed earlier in the current batch). -pub fn deduplicate_name(base: &str, taken_names: &HashSet) -> String { - if !taken_names.contains(base) { - return base.to_string(); - } - for i in 1.. { - let candidate = format!("{base}~{i}"); - if !taken_names.contains(&candidate) { - return candidate; - } - } - unreachable!() -} -``` - -### Updated `name_for_inst()` signature - -```rust -pub fn name_for_inst<'a>( - middleware: Middleware, - new_inst: &'a Instance, - old_inst: Option>, - taken_names: &HashSet, // replaces encode_invalid_chars: bool -) -> anyhow::Result<(Cow<'a, str>, bool)> -// ^filename ^needs_meta_name (true if slug != real name) -``` - -The return type gains a `bool` indicating whether metadata needs a `name` field (because the filesystem name differs from the instance name). Callers use this to know when to emit/update meta files. - ---- - -## Implementation Phases - -### Phase 1: Add the new infrastructure (manual port, additive only) - -Read PR #1187's diff and manually implement the same concepts into our fork. Add dedup on top. No git merge/cherry-pick. Nothing is removed yet -- only new code added alongside existing code: - -- `**src/snapshot/metadata.rs**`: Add `specified_name: Option` to `InstanceMetadata` with builder method -- `**src/syncback/file_names.rs**`: Add `slugify_name()` (from PR #1187) and `deduplicate_name()` (new) -- `**src/syncback/mod.rs**`: Export `slugify_name`, `deduplicate_name` -- `**src/snapshot_middleware/meta_file.rs**`: Add `name: Option` to both `AdjacentMetadata` and `DirectoryMetadata`, add `apply_name()` methods, update `is_empty()`, update syncback to emit `name` when slug differs from real name -- `**src/snapshot_middleware/json_model.rs**`: Respect `name` field from JSON (stop ignoring it), pass `specified_name` through metadata - -### Phase 2: Replace encode/decode with slugify + dedup - -Swap every callsite: - -- `**src/snapshot_middleware/mod.rs**`: Remove `decode_path_name` import and conditionals -- filenames used as-is, real names from meta `name` field -- `**src/snapshot_middleware/lua.rs**`: Replace `encode_path_name` with `slugify_name` for meta file naming -- `**src/snapshot_middleware/txt.rs**`: Same -- `**src/snapshot_middleware/csv.rs**`: Same -- `**src/syncback/file_names.rs**`: Remove `encode_path_name` import, replace `encode_invalid_chars` param with `taken_names: &HashSet`, use `slugify_name` + `deduplicate_name` + `validate_file_name` -- `**src/syncback/snapshot.rs**`: Remove `encode_windows_invalid_chars()` method, accumulate `taken_names` per directory, pass to `name_for_inst()` - -### Phase 3: Replace encoding in two-way sync (with dedup) - -- `**src/change_processor.rs**`: Replace `encode_path_name` renames with `slugify_name` + dedup against directory listing + meta file creation/update -- `**src/web/api.rs**`: Replace `encode_path_name` in `syncback_added_instance` with `slugify_name` + dedup against directory listing + meta file handling - -### Phase 4: Remove config plumbing - -- `**src/snapshot/metadata.rs**`: Remove `decode_windows_invalid_chars` field, setter, default fn from `InstanceContext` -- `**src/serve_session.rs**`: Remove `decode_windows_invalid_chars` propagation -- `**src/syncback/mod.rs**`: Remove `encode_windows_invalid_chars` field and getter from `SyncbackRules` -- `**vscode-rojo/schemas/project.template.schema.json**`: Remove `encodeWindowsInvalidChars` - -### Phase 5: Delete path_encoding.rs - -- `**src/path_encoding.rs**`: Delete file -- `**src/lib.rs**`: Remove `pub mod path_encoding;` - -### Phase 6: Hardcore test suite - -Tests are the safety net for this entire migration. Every angle must be covered. - -**Unit tests in `src/syncback/file_names.rs`:** - -- `slugify_name()`: all 9 forbidden chars individually, combinations, Windows reserved names (CON, PRN, etc.), trailing dot/space, empty string, all-forbidden-chars string, string that's already clean, string with `~` in it (edge case) -- `deduplicate_name()`: no collision (returns base), single collision (`~1`), multiple collisions (`~1`, `~2`, `~3`), collision where `~1` is also taken (skips to `~2`), natural name collision with slug (`Hey_Bro` vs slugified `Hey/Bro`), empty taken set -- `validate_file_name()`: existing tests still pass, slugified names always pass validation -- `name_for_inst()`: old inst preserves path, new inst with clean name, new inst with forbidden chars (slugifies), new inst with collision (deduplicates), directory middleware vs file middleware - -**Integration tests -- build roundtrips (`tests/tests/build.rs` + `rojo-test/build-tests/`):** - -- `slugified_name_roundtrip`: instance with `/` in name via `init.meta.json` `name` field builds correctly -- `model_json_name_input`: `.model.json` with `name` field overrides filename-derived name -- `dedup_collision_build`: two siblings where one natural name collides with another's slug -- both build with correct names - -**Integration tests -- syncback roundtrips (`tests/tests/syncback.rs` + `rojo-test/syncback-tests/`):** - -- `slugified_name`: instance with forbidden chars writes slugified filename + meta with `name` -- `model_json_name`: `.model.json` preserves `name` field through syncback -- `dedup_collision_syncback`: two instances whose slugs collide -- second gets `~1` suffix, both get correct meta `name` fields -- `natural_vs_slug_collision`: instance `Hey_Bro` and instance `Hey/Bro` in same directory -- no overwrite, `~1` suffix on the slug - -**Two-way sync tests (`tests/tests/two_way_sync.rs`):** - -- Convert all 28 existing `%QUESTION%`, `%COLON%`, `%DOT%` encoded pattern references to use slugified names + meta file assertions -- Add rename test: instance renamed to name with forbidden chars -> file renamed to slug, meta file created/updated -- Add add test: new instance with forbidden chars added via two-way sync -> slug + meta written, no collision with existing files -- Add collision test: add instance whose slug collides with existing file -> `~1` suffix applied - -**Snapshot regeneration:** - -- `cargo insta review` after all changes to accept updated `.snap` files -- All `decode_windows_invalid_chars: true` entries disappear from snapshots after Phase 4 - -### Phase 7: Update documentation - -- Update `.cursor/rules/rojo.mdc` and `.cursor/rules/src.mdc` to reflect slugify + dedup + name property approach - ---- - -## FUTURE: Phase 2 Plan Preview -- Duplicate Name Resolution - -**Goal:** Remove all code that skips/prevents syncing of duplicate-named instances. Replace with an N-to-M property-based matcher in the plugin that resolves ambiguous instances by best-fit matching. - -**Prerequisite:** This plan (path_encoding nuke + `~N` dedup) must be complete first. The `~N` suffix + metadata `name` field provides the filesystem foundation for hosting duplicate-named instances. - -### Duplicate Prevention Code to Remove (14+ files) - -**Rust server -- skip/filter logic:** - -- `src/web/api.rs` -- `compute_tree_refs_with_duplicate_siblings()`, `is_tree_path_unique_with_cache()`, `filter_duplicate_children()`, parent path uniqueness bail (~lines 463-696, 947-977, 1353-1513) -- `src/syncback/stats.rs` -- `duplicate_name_count`, `record_duplicate_name()`, `record_duplicate_names_batch()`, log messages -- `src/syncback/ref_properties.rs` -- `compute_refs_with_duplicate_siblings()`, `is_path_unique_with_cache()`, ID fallback logic (~lines 54-180) -- `src/syncback/snapshot.rs` -- `warn_duplicate_names()` config getter -- `src/syncback/mod.rs` -- `warn_duplicate_names` field in `SyncbackRules` -- `src/snapshot_middleware/dir.rs` -- duplicate detection/skip in syncback (~lines 142-252) -- `src/snapshot_middleware/project.rs` -- duplicate child error messages (~lines 589-602) - -**Lua plugin -- skip/filter logic:** - -- `plugin/src/Reconciler/diff.lua` -- `findDuplicateNames()`, `ambiguousIds`, `scanForDuplicates()`, all skip logic (~lines 19-466) -- `plugin/src/ChangeBatcher/encodeInstance.lua` -- `findDuplicateNames()`, `hasDuplicateSiblings()`, `isPathUnique()`, skip logic (~lines 12-300) -- `plugin/src/Reconciler/reify.lua` -- ambiguous path skip (~line 52-57) - -**Tests to remove/replace:** - -- `plugin/src/Reconciler/diff.spec.lua` -- duplicate-named siblings test block -- `plugin/src/ChangeBatcher/encodeInstance.stress.spec.lua` -- duplicate subtree test -- `src/web/api.rs` -- ~~20 duplicate path detection tests (~~lines 4542-4898) - -**Config to remove:** - -- `warn_duplicate_names` from `SyncbackRules` and project schema - -### New System: N-to-M Property-Based Matcher (Plugin Side) - -**Concept:** When the plugin encounters N instances in Studio with the same name and M incoming sync entries that could match them, it runs a best-fit matching algorithm: - -1. **Collect candidates:** N Studio instances with the same name under the same parent -2. **Collect targets:** M sync entries (from server patch) that map to those candidates -3. **Score each (candidate, target) pair** by property similarity (ClassName, Source, properties, attributes) with weighted scoring -4. **Greedy assignment:** Pick the highest-scoring pair, assign it, remove both from pools. Repeat until one pool is exhausted. -5. **Leftovers:** Unmatched Studio instances are "extra" (potentially removed). Unmatched targets are "new" (need creation with `~N` dedup). - -**Where it lives:** `plugin/src/Reconciler/matchAmbiguous.lua`, called from `diff.lua` when duplicate names are detected instead of skipping them. - -**Server changes:** Remove all skip/filter/bail logic. Let duplicate-named instances flow through. The `~N` dedup from this plan handles filesystem collisions. The plugin matcher handles Studio-side resolution. \ No newline at end of file diff --git a/.cursor/plans/parallel_filesystem_io_39399341.plan.md b/.cursor/plans/parallel_filesystem_io_39399341.plan.md deleted file mode 100644 index d7eae94d..00000000 --- a/.cursor/plans/parallel_filesystem_io_39399341.plan.md +++ /dev/null @@ -1,343 +0,0 @@ ---- -name: Parallel filesystem IO -overview: Add parallel file reading via VFS prefetch cache, parallel snapshot building via rayon at directory level, and parallel RefPathIndex population to speed up all project loading paths. -todos: - - id: vfs-prefetch-cache - content: Add PrefetchCache struct (files + canonical maps), prefetch_cache field on VfsInner, read_raw() helper, wire into read()/read_to_string()/canonicalize() - status: completed - - id: vfs-prefetch-api - content: Add Vfs::set_prefetch_cache() and Vfs::clear_prefetch_cache() public methods - status: completed - - id: vfs-prefetch-tests - content: Add unit tests for prefetch cache (file hit/miss, read_to_string, canonicalize hit/miss, watch registration, clear) - status: completed - - id: prefetch-builder - content: Write prefetch_project_files() using walkdir + rayon to parallel-read all files under root - status: completed - - id: parallel-snapshot-build - content: Add rayon par_iter to snapshot_dir_no_meta in dir.rs for parallel child processing - status: completed - - id: env-var-fallback - content: Add ATLAS_SEQUENTIAL env var to disable all parallelization for debugging - status: completed - - id: integrate-serve-session - content: Call prefetch in ServeSession::init_tree() before snapshot_from_vfs() - status: completed - - id: parallel-refpathindex - content: Parallelize RefPathIndex::populate_from_dir() using walkdir + rayon for file reads/parsing - status: completed - - id: test-determinism - content: Add parallel snapshot determinism test - run snapshot_from_vfs N times, verify identical output - status: completed - - id: test-and-verify - content: Run full cargo test, verify no regressions, add timing logs to confirm speedup - status: completed -isProject: false ---- - -# Parallel Filesystem I/O for Project Loading - -## Problem - -Every file read goes through `Vfs` -> `Mutex` -> `StdBackend::read()` -> `fs_err::read()`. This serializes all I/O. For a 3500-file project, startup is bottlenecked by ~3500 sequential syscalls, plus sequential CPU-bound parsing of each file. - -**Affected commands:** `serve`, `build`, `upload`, `syncback`, `sourcemap` -- all call `snapshot_from_vfs()` which recursively reads every file through the VFS one at a time. - -## Current Sequential Hotspots - -1. `**snapshot_from_vfs()` initial tree build** ([src/serve_session.rs](src/serve_session.rs) line 141) -- The biggest bottleneck. Recursive directory traversal in [src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs) lines 54-63, each child read goes through VFS mutex. -2. `**RefPathIndex::populate_from_dir()`** ([src/rojo_ref.rs](src/rojo_ref.rs) lines 372-431) -- Sequential walk + `std::fs::read()` for every `.meta.json5`/`.model.json5` file. Runs after tree build on `serve`. -3. **Two-way sync writes in `api.rs`** -- Sequential `fs::write()` calls (low priority, small batches). - -## Strategy: Full Pipeline - -Three layers, all using `rayon` (already a dependency): - -1. **VFS Prefetch Cache** -- parallel I/O: read all files upfront -2. **Parallel Snapshot Build** -- parallel CPU: parse files concurrently at directory level -3. **Parallel RefPathIndex** -- parallel I/O+CPU: read and parse meta/model files concurrently - -Combined timeline (vs current sequential): - -``` -Current: [read→parse→read→parse→read→parse→read→parse→...] (serial everything) - -Pipelined: [=====parallel read all files=====] (Phase 1: I/O) - ......[==parallel parse+build snapshots==] (Phase 2: CPU) -``` - -### Part 1: VFS Prefetch Cache - -**Concept:** Before `snapshot_from_vfs()` runs, walk the directory tree and read all file contents in parallel using `std::fs` + rayon (bypassing the VFS lock). Store results in a HashMap on VfsInner. The subsequent parallel snapshot build hits the cache (HashMap lookup, no I/O) instead of disk. - -**Changes to [crates/memofs/src/lib.rs](crates/memofs/src/lib.rs):** - -- Add `PrefetchCache` struct with `files: HashMap>` and `canonical: HashMap` -- Add `prefetch_cache: Option` field to `VfsInner` -- Extract a shared `read_raw(&mut self, path) -> io::Result>` helper that checks `prefetch_cache.files` first (using `HashMap::remove` to free memory on hit), falls back to backend -- Wire BOTH `VfsInner::read()` AND `VfsInner::read_to_string()` through `read_raw()` -- Add cache check to `VfsInner::canonicalize()`: check `prefetch_cache.canonical` first (using `HashMap::remove`), fall back to backend -- Add `Vfs::set_prefetch_cache(cache)` and `Vfs::clear_prefetch_cache()` - -```rust -pub struct PrefetchCache { - pub files: HashMap>, - pub canonical: HashMap, -} -``` - -**Critical: `read_to_string_lf_normalized` coverage.** The `Vfs::read_to_string_lf_normalized()` method (used by ALL `.luau` files via `lua.rs:55`) calls `VfsInner::read_to_string()` internally. Since we wire `VfsInner::read_to_string()` through `read_raw()`, LF-normalized reads hit the cache automatically. The flow: `Vfs::read_to_string_lf_normalized` -> lock -> `VfsInner::read_to_string` -> `read_raw` (cache hit) -> UTF-8 convert -> unlock -> CRLF->LF normalize. - -**Critical: `canonicalize` coverage.** Every middleware calls `vfs.canonicalize(path)` once, storing the result in `InstanceMetadata::relevant_paths` for file-change-to-instance mapping. During init, these are parallelized in the prefetch phase. After init, the cache is cleared and `change_processor.rs` calls `canonicalize()` through the backend for fresh results. - -**What is NOT cached** (and why that's acceptable): - -- `read_dir()`: directory listing syscall, ~10us each, ~500 dirs = ~5ms total -- `metadata()`: stat syscall, ~~1-10us each. `get_dir_middleware` probes up to 13 init files per directory (~~6500 calls for 500 dirs = ~6.5ms) -- `exists()`: only used by `Project::load_initial_project` (1-2 calls before prefetch starts) - -**No stale canonicalize entries:** The cache exists only during `init_tree()`. During this window, the filesystem is static (no watcher running, no mutations). After `clear_prefetch_cache()`, all canonicalize calls go through the backend -- the `ChangeProcessor` always gets fresh results for rename/move detection. **No memory leak:** `clear_prefetch_cache()` drops the entire `PrefetchCache` struct. - -**New helper (in `src/` or inline in `serve_session.rs`):** - -```rust -fn prefetch_project_files(root: &Path) -> io::Result { - use memofs::PrefetchCache; - use rayon::prelude::*; - use walkdir::WalkDir; - - let entries: Vec = WalkDir::new(root) - .follow_links(true) // Match VFS behavior: StdBackend::read() follows symlinks - .into_iter() - .filter_map(|e| e.ok()) - .collect(); - - // Parallel file reads (files only) - let file_data: Vec<_> = entries - .par_iter() - .filter(|e| e.file_type().is_file()) - .filter_map(|e| { - let path = e.path().to_path_buf(); - std::fs::read(&path).ok().map(|c| (path, c)) - }) - .collect(); - - // Parallel canonicalize (files AND directories) - let canonical_data: Vec<_> = entries - .par_iter() - .filter_map(|e| { - let path = e.path().to_path_buf(); - std::fs::canonicalize(&path).ok().map(|c| (path, c)) - }) - .collect(); - - Ok(PrefetchCache { - files: file_data.into_iter().collect(), - canonical: canonical_data.into_iter().collect(), - }) -} -``` - -`walkdir` (already a dependency) handles the directory walk. `.follow_links(true)` ensures symlinked files are prefetched (walkdir handles symlink loop detection). `rayon::par_iter` parallelizes both file reads AND canonicalize syscalls. The canonicalize cache covers both files and directories since `dir.rs:66` canonicalizes directory paths. - -**Integration in [src/serve_session.rs](src/serve_session.rs) `init_tree()`:** - -```rust -fn init_tree(vfs: &Vfs, start_path: &Path) -> Result<...> { - let root_project = Project::load_initial_project(vfs, start_path)?; - - if std::env::var("ATLAS_SEQUENTIAL").is_err() { - let cache = prefetch_project_files(root_project.folder_location())?; - vfs.set_prefetch_cache(cache); - } - - let snapshot = snapshot_from_vfs(&instance_context, vfs, start_path)?; - - vfs.clear_prefetch_cache(); - // ... rest unchanged -} -``` - -**Note:** The serve command calls `init_tree()` twice -- once via `new_oneshot()` for config (port/address), once via `new()` for the real session. Both get prefetch. The oneshot is immediately dropped so its prefetch is "wasted", but the overhead is small (~50ms) and the code stays simple. - -**Why this is safe:** The prefetch reads files with `std::fs` (no VFS lock). The cache is loaded into VfsInner behind the mutex. The snapshot build then acquires the mutex per-read as before, but each read is a HashMap remove (nanoseconds) instead of a disk syscall. Existing behavior is preserved for cache misses (falls through to backend). Watch registration still happens normally (gated by `watch_enabled`). - -`**StdBackend::read_dir()` is eager:** It collects and sorts all directory entries before returning the `ReadDir` iterator (`std_backend.rs:283-296`). The iterator does not hold any reference into the backend. This means `read_dir` results are safe to use from rayon threads after the VFS lock is released. - -### Part 2: Parallel Snapshot Build at Directory Level - -**Concept:** In `snapshot_dir_no_meta`, process each directory's children in parallel using rayon. With the prefetch cache warm, each rayon thread acquires the VFS mutex briefly for a cache hit (~1us), then parses the file content lock-free (the expensive part). Mutex contention is negligible since critical sections are just HashMap removes. - -**Changes to [src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs) `snapshot_dir_no_meta()`:** - -```rust -// Current (sequential): -for entry in vfs.read_dir(path)? { - let entry = entry?; - if !passes_filter_rules(&entry) { continue; } - if let Some(child) = snapshot_from_vfs(context, vfs, entry.path())? { - snapshot_children.push(child); - } -} - -// Parallel (with order preservation): -use rayon::prelude::*; - -let entries: Vec<_> = vfs.read_dir(path)? - .filter_map(|e| e.ok()) - .collect(); - -let results: Vec>> = entries - .par_iter() - .map(|entry| { - if !passes_filter_rules(entry) { - return Ok(None); - } - snapshot_from_vfs(context, vfs, entry.path()) - }) - .collect(); - -let mut snapshot_children = Vec::new(); -for result in results { - if let Some(snapshot) = result? { - snapshot_children.push(snapshot); - } -} -``` - -**Why `map` instead of `filter_map`:** rayon's `par_iter().map().collect()` preserves original order (map is an indexed operation). `filter_map` converts to an unindexed iterator where order is implementation-dependent. Using `map` + sequential flatten ensures children appear in the same order as `read_dir` returns them. - -**Why this is safe for concurrent VFS access:** Each VFS call (metadata, read, read_dir) independently acquires/releases the Mutex -- no nested locking, so no deadlock risk. `&InstanceContext` is `Sync` (contains `Arc>` + `Vec`). `&Vfs` is `Sync` (wraps `Mutex`). `anyhow::Error` is `Send` (required for rayon's `collect::>>()`). - -**Multiple VFS calls per middleware:** Each middleware makes several VFS calls during snapshot building. For example, `lua.rs` calls `read_to_string_lf_normalized` (cache hit), `canonicalize` (backend), and reads companion `.meta.json5` (cache hit). With parallel builds, the cached reads are fast (~1us lock + HashMap remove), while `metadata` and `canonicalize` still serialize on the mutex with real syscalls. This limits maximum parallelism but the file-read savings dominate. - -**Recursion:** Since `snapshot_from_vfs` is recursive, a directory with 10 subdirectories kicks off 10 parallel subtrees, each of which parallelizes their own children. rayon's work-stealing keeps all cores busy across the entire tree. - -**Rayon thread pool:** The `sourcemap` command configures a global rayon pool with `max(num_cpus, 6)` threads at `src/cli/sourcemap.rs:93`, but this happens AFTER `init_tree()` completes. Our parallel snapshot build runs before that configuration, using rayon's default pool (CPU count). No conflict. - -**Environment variable gate:** - -```rust -if std::env::var("ATLAS_SEQUENTIAL").is_ok() { - // Sequential fallback (existing code) -} else { - // Parallel path -} -``` - -### Part 3: Parallel RefPathIndex Population - -**Changes to [src/rojo_ref.rs](src/rojo_ref.rs) `populate_from_dir()`:** - -Current: sequential stack-based walk + `std::fs::read()` per file. - -New approach: - -1. Walk tree with `walkdir`, collect all `.meta.json5`/`.model.json5` paths (sequential, fast -- just filename checks) -2. Read + parse + extract `Rojo_Ref_*` entries in parallel with rayon. `&RojoTree` is read-only and safe to share across threads (`get_ids_at_path()` and `ref_target_path_from_tree()` are in-memory lookups). -3. Collect `Vec<(String, PathBuf)>` results, then insert into index (sequential) - -## Race Condition Analysis - -### No risk (by design) - -- **VFS data races:** Impossible. `Mutex` serializes all access. Multiple rayon threads contend briefly on cache lookups (~1us critical sections), which is safe. -- **Deadlock from re-entrant locking:** Impossible. Each VFS call (metadata, read, read_dir) acquires and releases the lock independently. No VFS call internally calls another VFS method. `ReadDir` iterator is fully materialized before lock release. -- **InMemoryFs thread safety:** `InMemoryFs` wraps `Arc>`, additionally protected by VFS's outer Mutex. Unit tests using InMemoryFs are safe with parallel snapshot building. - -### Mitigated risks - -- **Child ordering non-determinism:** `par_iter().filter_map().collect()` does NOT guarantee order (filter_map makes the iterator unindexed). We use `par_iter().map().collect()` instead, which preserves input order because `map` on an indexed iterator stays indexed. The sequential flatten step then filters Nones. A determinism test (run N times, compare output) validates this. -- **Prefetch cache stale reads:** If a file is modified between prefetch and snapshot_from_vfs, the cached content is stale. In practice this cannot happen during the few milliseconds of startup. Same time-of-check-time-of-use window exists with sequential reads. No additional risk. -- **Error propagation in parallel:** `par_iter().map().collect::>>()` collects all results. Errors are propagated sequentially in the flatten step via `?`. First error wins, consistent with sequential behavior. - -### Covered by environment variable fallback - -`ATLAS_SEQUENTIAL=1` disables both prefetch cache and parallel snapshot building, reverting to the exact current sequential code path. Useful for: - -- Debugging if parallelization causes platform-specific issues -- A/B performance comparison -- CI environments requiring deterministic sequential execution - -## Testing Strategy - -### Existing tests that automatically exercise the new system - -All integration tests spawn the CLI binary, which goes through `init_tree()` -> prefetch + parallel snapshot: - -- **Build tests** ([tests/tests/build.rs](tests/tests/build.rs)) -- Run `rojo build` on real filesystem fixtures. Exercise full prefetch + parallel snapshot pipeline. -- **Serve tests** ([tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs) `TestServeSession`) -- Spawn `atlas serve` on temp dirs. Exercise prefetch + parallel snapshot + RefPathIndex. -- **Syncback/roundtrip tests** ([tests/tests/syncback.rs](tests/tests/syncback.rs), [tests/tests/syncback_roundtrip.rs](tests/tests/syncback_roundtrip.rs)) -- Full CLI syncback pipeline. -- **Two-way sync tests** ([tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs)) -- Serve session + write API. -- **Matching fixture tests** ([tests/tests/matching_fixtures.rs](tests/tests/matching_fixtures.rs)) -- Call `snapshot_from_vfs()` directly with `Vfs::new_default()`. Exercise parallel snapshot building in dir.rs but NOT prefetch (no init_tree call). -- **Unit tests in dir.rs** -- Use `InMemoryFs`. Exercise parallel snapshot building but not prefetch. This is correct -- InMemoryFs files don't exist on the real filesystem. - -### New tests to add - -1. **VFS prefetch cache unit tests** (in [crates/memofs/src/lib.rs](crates/memofs/src/lib.rs) test module): - - Cache hit: `set_prefetch_cache` with known path -> `read()` returns cached data - - Cache depletion: second `read()` of same path falls through to backend (entry was removed on first read) - - Cache miss: `read()` of path not in cache falls through to backend - - `read_to_string` uses cache: verify UTF-8 conversion from cached bytes - - Watch registration: if `watch_enabled`, watches are registered even on cache hits - - `clear_prefetch_cache`: after clear, all reads go through backend - - Empty/None cache behaves identically to no cache -2. **Parallel snapshot determinism test** (in [tests/tests/build.rs](tests/tests/build.rs) or new file): - - Run `snapshot_from_vfs` on a non-trivial fixture 5 times - - Assert all 5 snapshots are identical (catches ordering bugs from rayon) - - Use a fixture with multiple children per directory to stress the parallel path -3. **Prefetch + parallel integration sanity** (implicit): - - All existing insta snapshot tests serve as regression tests. If prefetch returns wrong data or parallel build reorders children, snapshot comparisons fail immediately. - -### Tests we do NOT need - -- **VFS mutex stress test:** The Mutex is a well-tested primitive. Contention with ~1us critical sections and rayon's thread pool is a solved problem. -- **Prefetch TOCTOU test:** The time-of-check-time-of-use window between prefetch and read is identical to the existing sequential window. No additional test. -- **InMemoryFs concurrency test:** InMemoryFs is protected by both its own Mutex and the VFS's outer Mutex. Double-locked by design. - -## What About the File Watcher? - -The ChangeProcessor handles individual file events one at a time. Single-file reads don't benefit from parallelization. Two scenarios where deeper parallelism could help: - -- **Batch events after `git checkout`**: Many files change at once, processed sequentially. Could batch and parallelize, but adds complexity. Deferred. -- **Rescan after watcher critical error**: Re-snapshots the full tree. Would benefit from prefetch, but rescan is rare. Can be added later. - -## Other Sequential I/O (Lower Priority, Not in This Plan) - -- **Two-way sync writes** (`api.rs`): Small batches (1-10 files). Not worth the complexity. -- **Build output encoding**: Single file write. Cannot parallelize. -- **Upload encoding**: Single buffer + HTTP upload. Network-bound. -- `**validate_tree()` / `check_tree_freshness()`**: Re-snapshots full tree. Could use prefetch. Secondary benefit, can add later. - -## Files Changed - - -| File | Change | -| ---------------------------------------------------------------- | ----------------------------------------------------------------------------------- | -| [crates/memofs/src/lib.rs](crates/memofs/src/lib.rs) | Add prefetch cache field, `read_raw()` helper, `set/clear_prefetch_cache()` methods | -| [src/snapshot_middleware/dir.rs](src/snapshot_middleware/dir.rs) | Add rayon `par_iter` for parallel child snapshot building | -| [src/serve_session.rs](src/serve_session.rs) | Call prefetch before snapshot build in `init_tree()` | -| [src/rojo_ref.rs](src/rojo_ref.rs) | Parallelize `populate_from_dir()` with rayon | - - -No changes to VFS backend trait. No new dependencies (rayon, walkdir already present). - -## Stack Compatibility Checklist - -Verified across the full stack: - -- `Vfs` is `Sync` (wraps `Mutex`, `VfsBackend: Send`) -- `InstanceContext` is `Sync` (contains `Arc>` + `Vec`) -- `anyhow::Error` is `Send` (required for rayon error collection) -- `StdBackend::read_dir()` eagerly collects entries before returning (`std_backend.rs:283-296`) -- no lazy iteration holding the lock -- No `vfs.lock()` calls in any snapshot middleware -- only syncback writes use `VfsLock` -- `InMemoryFs` is thread-safe (`Arc>`) -- unit tests with parallel dir.rs are safe -- `read_to_string_lf_normalized` routes through `VfsInner::read_to_string` -> `read_raw` -- cache hit for all `.luau` files -- `VfsInner::canonicalize` checks `prefetch_cache.canonical` -- eliminates ~400ms Windows serialization point -- Canonicalize cache safe: only alive during `init_tree()` (no mutations), `ChangeProcessor` always gets fresh backend results after cache clear -- `walkdir` with `.follow_links(true)` matches `StdBackend::read` symlink behavior; handles loop detection -- `Project::load_initial_project` reads via VFS BEFORE prefetch starts -- correct, only reads 1 project file -- Rayon global pool not configured until after `init_tree` completes (sourcemap configures at `sourcemap.rs:93`) -- `ReadDir` iterator fully materialized -- safe to use from rayon threads after lock release -- No stateful side-effects in any snapshot middleware -- all are pure functions of (context, vfs, path) - diff --git a/.cursor/plans/parallel_io_audit_fixes_35f49f83.plan.md b/.cursor/plans/parallel_io_audit_fixes_35f49f83.plan.md deleted file mode 100644 index 88f4c885..00000000 --- a/.cursor/plans/parallel_io_audit_fixes_35f49f83.plan.md +++ /dev/null @@ -1,267 +0,0 @@ ---- -name: Parallel IO audit fixes -overview: "Fix three issues found during audit of the parallelization/optimization commits: a data loss bug in the orphan scanner, a duplicate-children bug in the prefetch cache, and a nested-detection correctness issue, plus a small DRY refactor." -todos: - - id: fix1-hidden-dirs - content: Fix orphan scanner walkdir to prune hidden directories using filter_entry() - status: completed - - id: fix2-dedup-roots - content: Deduplicate overlapping $path roots in prefetch_project_files before walking - status: completed - - id: fix3-nested-detection - content: Replace broken binary search nested detection with O(n log n) ancestor-tracking approach - status: completed - - id: fix4-unc-refactor - content: Extract shared strip_unc_prefix helper from 3 inline copies - status: completed - - id: test-hidden-dir - content: Add integration test for hidden directory survival in clean syncback - status: completed - - id: test-overlap - content: Add test for overlapping $path roots with prefetch cache - status: completed - - id: test-nested - content: Add unit test for nested path detection correctness - status: completed - - id: run-ci - content: Run full CI pipeline (cargo test, clippy, fmt) - status: completed -isProject: false ---- - -# Parallel I/O Audit Fixes - -> This plan was generated by `/audit` from a Plan-mode session. -> Refer to `.cursor/rules/atlas.mdc` for full project standards. - -## Standards - -These standards govern every fix in this plan. An implementer MUST read `.cursor/rules/atlas.mdc` before starting. - -### Round-Trip Identity (from `atlas.mdc` - Quality Standard) - -Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -### CLI Syncback Parity (from `atlas.mdc` - Two-Way Sync Strategy) - -Plugin-based sync must produce **exactly the same filesystem output** that `atlas syncback` would give for the same input. Byte-for-byte identical files, identical directory structures, identical naming. Any divergence is a bug until proven otherwise. - -### Code Quality (from `atlas.mdc` - Code Quality Standard) - -DRY code that is easy to reason about and hard to get wrong. The same slugify/dedup/meta-update pattern should not be copy-pasted across files. Small refactors (2-3 call sites) are included as fixes. Major rewrites (10+ call sites) are deferred. - -## Context - -Audited the last 7 commits on the current branch (from `1ffed121` through `56e1ab4a`), which add: - -- VFS prefetch cache for parallel file reading at startup -- Parallel snapshot building via rayon in `dir.rs` -- Parallel RefPathIndex population via rayon + walkdir -- Parallel tree hashing in syncback -- Orphan scanner rewrite using walkdir -- Placeholder-based ref path substitution optimization -- ServeCommand refactor and dead code cleanup - -## Fixes - -### Fix 1: Prune hidden directories from walkdir orphan scanner - -- **Status:** Approved -- **Finding:** Orphan scanner walkdir replacement doesn't prune hidden directories -- **Files:** `[src/syncback/mod.rs](src/syncback/mod.rs)` -- **Problem:** Lines ~406-424. The `walkdir::WalkDir` iterator yields ALL entries including children of hidden directories. The hidden-name filter only checks `file_name().starts_with('.')`, so `settings.json` inside `.vscode/` passes the filter and gets added to `existing_paths`. In clean mode, these files would be deleted. -The old recursive `scan_directory` function skipped hidden directories AND never recursed into them. The walkdir replacement must replicate this behavior. -- **Solution:** Replace the flat `.flatten()` + post-hoc hidden check with `filter_entry()` to prune the walk at hidden directories: - -```rust - for entry in walkdir::WalkDir::new(&canonical_dir) - .follow_links(true) - .into_iter() - .filter_entry(|e| { - if e.depth() == 0 { - return true; - } - e.file_name() - .to_str() - .map_or(true, |n| !n.starts_with('.') || n == ".gitkeep") - }) - .flatten() - { - if entry.depth() == 0 { - continue; - } - let path = entry.path().to_path_buf(); - if !is_valid_path(&ignore_patterns, project_path, &path) { - continue; - } - // Hidden check no longer needed here -- filter_entry handles it - paths.insert(path); - } - - -``` - - `filter_entry` controls which directories walkdir descends into. When it returns `false` for a directory, walkdir skips the directory AND all its descendants. This exactly matches the old recursive behavior. - -- **Risk:** Low -- only touches the orphan scanner loop. `filter_entry` is walkdir's standard pruning mechanism. -- **Verify round-trip:** Clean mode syncback with a `.vscode/` directory inside a `$path` source dir should NOT delete `.vscode/` contents. -- **Verify syncback parity:** N/A -- this only affects clean mode orphan removal, not the sync pipeline. -- **Tests required:** - - Integration test: create a temp project with `src/.hidden/keep.txt`, run clean-mode syncback, verify `.hidden/keep.txt` survives. - -### Fix 2: Deduplicate overlapping roots in prefetch cache - -- **Status:** Approved -- **Finding:** Overlapping `$path` roots cause duplicate children in prefetch cache -- **Files:** `[src/serve_session.rs](src/serve_session.rs)` -- **Problem:** Lines ~136-156 in `prefetch_project_files`. `collect_path_roots` collects ALL `$path` entries including nested ones. For a project with `$path: "src"` and `$path: "src/shared"`, walkdir walks `src/shared` twice -- once as part of `src` and once as its own root. The `children_map` accumulates duplicate entries for `src/shared`'s children. When consumed by VFS `read_dir`, these duplicates cause duplicate instance snapshots. -- **Solution:** After collecting roots in `prefetch_project_files`, deduplicate by removing any root that is a descendant of another root: - -```rust - let mut roots: Vec = Vec::new(); - collect_path_roots(&project.tree, folder, &mut roots); - - // Remove roots that are descendants of other roots to avoid - // walking the same directory twice and producing duplicate children. - roots.sort(); - let mut deduped: Vec = Vec::new(); - for root in roots { - if !deduped.iter().any(|existing| root.starts_with(existing)) { - deduped.push(root); - } - } - let roots = deduped; - - -``` - - After sorting, a parent path always sorts before its descendants. By iterating in order and only keeping roots that are NOT descendants of already-kept roots, we eliminate all overlaps in O(n^2) worst case but typically O(n) since most projects have few `$path` entries. - -- **Risk:** Low -- only modifies which directories are walked during prefetch. The dedup logic is simple and well-understood. -- **Verify round-trip:** Build a project with overlapping `$path` entries. Verify snapshot tree has no duplicate instances. Run build 5 times, verify deterministic output. -- **Verify syncback parity:** N/A -- prefetch cache only affects forward sync initial load. -- **Tests required:** - - Unit test in `tests/tests/build.rs`: create a project with `$path: "src"` and a child with `$path: "src/shared"`. Run `snapshot_from_vfs` with prefetch cache. Verify no duplicate children under the `shared` directory instance. - -### Fix 3: Fix nested path detection in orphan removal - -- **Status:** Approved (O(n log n) approach) -- **Finding:** Binary search nested detection misses sibling paths -- **Files:** `[src/syncback/mod.rs](src/syncback/mod.rs)` -- **Problem:** Lines ~869-888. The optimization uses `binary_search` to find the current path's position, then checks only `sorted_removals[idx - 1]`. This misses cases where a sibling path sits between the parent and the current path in sorted order. -Example: `sorted = ["a/b", "a/b/c", "a/b/d"]`. For `a/b/d` at idx 2, the code checks `sorted[1] = "a/b/c"` (a sibling, not an ancestor). The actual ancestor `"a/b"` at idx 0 is not checked. -- **Solution:** Replace binary search with a sorted single-pass using an `current_ancestor` tracker: - -```rust - let mut sorted_removals: Vec<_> = paths_to_remove.iter().cloned().collect(); - sorted_removals.sort(); - - let mut current_ancestor: Option<&PathBuf> = None; - for old_path in &sorted_removals { - if let Some(ancestor) = current_ancestor { - if old_path.starts_with(ancestor) && old_path != ancestor { - continue; // nested under current ancestor, skip - } - } - current_ancestor = Some(old_path); - - let relative_path = old_path - .strip_prefix(&canonical_project_path) - .unwrap_or(old_path); - - log::debug!("Removing orphaned path: {}", relative_path.display()); - if old_path.is_dir() { - fs_snapshot.remove_dir(relative_path); - } else { - fs_snapshot.remove_file(relative_path); - } - } - - -``` - - In sorted path order, all descendants of a path appear consecutively after it (because `Path` comparison is component-based). So a single variable tracking the current top-level ancestor is sufficient. When we encounter a non-descendant, it becomes the new ancestor. This is O(n log n) for the sort + O(n) for the walk. - - This also removes the intermediate `paths_vec` and the `binary_search` code, simplifying the function. - -- **Risk:** Low -- the logic is simpler than what it replaces. The correctness argument is straightforward: sorted paths guarantee all descendants appear consecutively. -- **Verify round-trip:** Clean mode syncback with nested directories. Verify parent-only removal (no redundant child removals). -- **Verify syncback parity:** N/A -- orphan removal is internal to clean mode. -- **Tests required:** - - Unit test: create paths `["a/b", "a/b/c", "a/b/d", "x/y", "x/y/z"]`, verify only `"a/b"` and `"x/y"` are top-level removals. - -### Fix 4: Extract shared `strip_unc_prefix` helper - -- **Status:** Approved -- **Finding:** Duplicated UNC prefix stripping logic in 3 locations -- **Files:** `[src/syncback/mod.rs](src/syncback/mod.rs)` -- **Problem:** The same UNC prefix stripping pattern appears at: - 1. Lines ~396-404 (orphan scanner: canonicalize `dirs_to_scan` entries) - 2. Lines ~649-656 (`strip_unc_prefix` helper definition inside orphan removal block) - 3. Lines ~703-711 (inline canonicalize in `collect_all_path_refs_and_mappings`) - Location 2 defines a proper `fn strip_unc_prefix`, but locations 1 and 3 inline the same logic. -- **Solution:** Move `strip_unc_prefix` to module level (or just above the clean-mode block), and replace all 3 inline instances with calls to it. The function is already defined at location 2: - -```rust - fn strip_unc_prefix(p: PathBuf) -> PathBuf { - let path_str = p.to_string_lossy(); - if path_str.starts_with(r"\\?\") || path_str.starts_with("//?/") { - PathBuf::from(&path_str[4..]) - } else { - p - } - } - - -``` - - Move this definition before the `existing_paths` block (around line ~258), then replace the inline code at lines ~396-404 with `strip_unc_prefix(std::fs::canonicalize(dir).unwrap_or_else(|_| dir.clone()))` and at lines ~703-711 with `strip_unc_prefix(p)`. - -- **Risk:** Zero -- pure refactor, no behavior change. -- **Verify round-trip:** N/A -- refactor only. -- **Verify syncback parity:** N/A -- refactor only. -- **Tests required:** None -- existing tests cover this code path. - -## Skipped Fixes - -### Skipped: Serve command loads project twice - -- **Finding:** `src/cli/serve.rs` loads the project file via `Project::load_initial_project` for port/address, then `ServeSession::new` loads it again in `init_tree`. -- **Problem:** Minor performance -- project file read twice from disk at startup. -- **Reason skipped:** Acceptable overhead. Project files are small and this only happens once. - -### Skipped: Commented-out git config in init.rs - -- **Finding:** Four commented-out git config lines in `src/cli/init.rs` lines 134-137. -- **Reason skipped:** User indicated these are planned for future enablement. - -## Accepted Limitations - -- **Limitation:** Symlinks within project `$path` directories may cause path mismatches -- **Scenario:** If a symlink inside a `$path` source directory points elsewhere, walkdir-collected paths won't match `added_paths` during clean-mode orphan removal. Files behind the symlink could be incorrectly removed. -- **User decision:** Accepted for this release -- **Mitigation:** Symlinks within source directories are not a supported configuration in Roblox development. Root-level symlinks (project folder itself) still work because `canonicalize` is called on the root. - -## Deferred Refactors - -None identified beyond the small `strip_unc_prefix` extraction (included as Fix 4). - -## Test Plan - -### Rust Integration Tests (`tests/tests/`) - -- **Hidden directory survival in clean syncback** (Fix 1): Create temp project with `src/.hidden/keep.txt`, run clean-mode syncback, assert `.hidden/keep.txt` still exists after syncback. -- **Overlapping `$path` roots don't create duplicates** (Fix 2): Create project with overlapping `$path` entries (`"src"` and `"src/shared"`), run `snapshot_from_vfs` with prefetch cache, verify no duplicate children. - -### Rust Unit Tests - -- **Nested path detection correctness** (Fix 3): Test the ancestor-tracking algorithm with paths `["a/b", "a/b/c", "a/b/d", "x/y", "x/y/z"]`, verify only `"a/b"` and `"x/y"` are emitted as top-level. - -## Test Rules - -- Every bug fix MUST have a test that would have FAILED before the fix and PASSES after. -- Fix 4 (refactor) does not need new tests -- existing test coverage is sufficient. - -## Final Step: Run CI - -After ALL fixes and tests are implemented, run the full CI pipeline (`cargo test --locked`, `cargo clippy`, `cargo fmt --check`). Every fix must pass CI before the plan is considered complete. \ No newline at end of file diff --git a/.cursor/plans/port_mcp_studio_tools_5135a181.plan.md b/.cursor/plans/port_mcp_studio_tools_5135a181.plan.md deleted file mode 100644 index 4442c502..00000000 --- a/.cursor/plans/port_mcp_studio_tools_5135a181.plan.md +++ /dev/null @@ -1,458 +0,0 @@ ---- -name: Port MCP Studio Tools -overview: Port 6 MCP tools from studio-rust-mcp-server into Atlas's existing MCP infrastructure, add agent/command logging, and migrate all tool descriptions to .md files with comprehensive documentation. -todos: - - id: mcp-docs - content: Create src/web/mcp_docs/ with .md files for all 8 tools (atlas_sync, get_script, run_code, insert_model, get_console_output, get_studio_mode, start_stop_play, run_script_in_play_mode). Include comprehensive workflow guidance in atlas_sync.md and get_script.md. - status: completed - - id: rust-dispatch - content: Add PluginToolResult struct and dispatch_to_plugin() generic helper in mcp.rs. Update handle_tools_list to use include_str! for all tool descriptions. Add 6 new tools to handle_tools_call routing via dispatch_to_plugin. - status: completed - - id: rust-api-passthrough - content: Add passthrough else-clause in api.rs handle_mcp_stream_connection command routing for non-sync/non-getScript commands. - status: completed - - id: rust-logging - content: Add log::info for agent initialize, tool call (name + compact JSON args), and tool result (name + compact summary). One line per entry. - status: completed - - id: plugin-mcptools - content: Create plugin/src/McpTools/ with init.luau dispatcher, 6 tool handler files (ported from studio-rust-mcp-server), and Utils/ (ConsoleOutput, StudioModeState, GameStopUtil, DeepCopy). - status: completed - - id: plugin-mcpstream - content: Add onToolCommand callback to McpStream.lua, with tools_set lookup and generic dispatch pattern matching existing sync/getScript handlers. - status: completed - - id: plugin-lifecycle - content: Wire onToolCommand in App/init.lua McpStream constructor. Start ConsoleOutput listener on plugin init. Start GameStop monitor in Server DataModel (init.server.lua). - status: completed - - id: tests - content: "Rust: PluginToolResult serde, dispatch_to_plugin guards (command_in_progress, plugin_stream_connected), tool routing. Plugin: tool dispatch, ConsoleOutput accumulation/reset, StudioModeState tracking." - status: completed -isProject: false ---- - -# Port MCP Studio Tools, Add Logging, Migrate to .md Docs - -## Scope (from TODO lines 344-354) - -1. Port 6 tools from local `D:\UserGenerated\studio-rust-mcp-server`: `run_code`, `insert_model`, `get_console_output`, `get_studio_mode`, `start_stop_play`, `run_script_in_play_mode` -2. Skip multi-studio tools (`list_studios`, `set_studio`, `get_studio`) -- not needed, Atlas has a single plugin connection -3. Add MCP logging (agent connect/disconnect, command JSON, result JSON -- compact, one line) -4. Migrate ALL tool descriptions (new + existing) to `.md` files with comprehensive workflow documentation - -## Architecture - -All 6 new tools are "passthrough" -- Rust forwards a JSON command to the plugin, plugin executes locally, returns a text result. No tree resolution or fsPath enrichment needed (unlike `atlas_sync` and `get_script`). - -```mermaid -sequenceDiagram - participant Agent - participant mcpRs as mcp.rs - participant apiRs as api.rs MCP stream - participant Plugin as Plugin McpStream - participant Handler as McpTools handler - - Agent->>mcpRs: tools/call run_code {command: "..."} - Note over mcpRs: Guards: command_in_progress, plugin_stream_connected - Note over mcpRs: Log: tool call + compact args - mcpRs->>apiRs: command_tx {type: "runCode", ...} - Note over apiRs: Passthrough (no enrichment needed) - apiRs->>Plugin: WebSocket JSON - Plugin->>Handler: dispatch(type, args) - Handler->>Plugin: {requestId, status, response} - Plugin->>apiRs: WebSocket JSON - apiRs->>mcpRs: result_tx - Note over mcpRs: Log: tool result compact - mcpRs->>Agent: Tool response -``` - - - -## 1. Rust: Generic Passthrough Dispatch (`src/web/mcp.rs`) - -Create `dispatch_to_plugin()` helper to avoid repeating the guard/send/receive/format boilerplate for each tool. Existing `handle_atlas_sync` and `handle_get_script` have tool-specific logic and stay as-is. - -```rust -async fn dispatch_to_plugin( - id: Option, - tool_type: &str, - arguments: Value, - mcp_state: Arc, -) -> Response> { - // 1. command_in_progress CAS - // 2. plugin_stream_connected check - // 3. NO active_api_connections guard (passthrough tools are safe during live sync) - // 4. Build { type, requestId, args: arguments }, send via command_tx - // 5. Wait on result_rx - // 6. Parse PluginToolResult { request_id, status, response } - // 7. tool_response(id, status != "success", response) -} -``` - -Add `PluginToolResult` struct: - -```rust -#[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct PluginToolResult { - pub request_id: String, - pub status: String, - #[serde(default)] - pub response: Option, -} -``` - -### Tool Registration (`handle_tools_list`) - -Add 6 tool entries. Each tool's `description` is loaded via `include_str!("mcp_docs/.md")`. Input schemas from the studio-rust-mcp-server structs: - - -| Tool | inputSchema properties | -| ------------------------- | ------------------------------------------------------------------------------------------------------------- | -| `run_code` | `command: string` (required) | -| `insert_model` | `query: string` (required) | -| `get_console_output` | none | -| `get_studio_mode` | none | -| `start_stop_play` | `mode: enum["start_play", "run_server", "stop"]` (required) | -| `run_script_in_play_mode` | `code: string` (required), `timeout: integer` (optional), `mode: enum["start_play", "run_server"]` (required) | - - -### Tool Routing (`handle_tools_call`) - -```rust -match tool_name { - "atlas_sync" => handle_atlas_sync(...).await, - "get_script" => handle_get_script(...).await, - "run_code" | "insert_model" | "get_console_output" | "get_studio_mode" - | "start_stop_play" | "run_script_in_play_mode" => { - dispatch_to_plugin(id, tool_name, arguments, mcp_state).await - } - _ => { /* unknown tool error */ } -} -``` - -The `tool_name` is sent as `type` in the command JSON so the plugin knows which handler to dispatch to. - -## 2. Rust: API-Side Passthrough (`src/web/api.rs`) - -In `handle_mcp_stream_connection`, the command routing loop currently handles `sync` and `getScript` specially. All other command types become passthrough: - -```rust -if cmd_type == "sync" && active_api_connections.load(...) > 0 { - // existing: return already_connected -} else if cmd_type == "getScript" { - // existing: resolve fsPath -> id, forward -} else { - // NEW: passthrough -- forward command directly to plugin - let json_cmd = serde_json::to_string(&cmd_value)?; - websocket.send(Message::Text(json_cmd.into())).await...; -} -``` - -Response side: already works. When no `pending_get_script_context` exists and no `changes` array is present, the result passes through to `result_tx` unmodified. - -## 3. Rust: .md Documentation Files - -Create `src/web/mcp_docs/` directory with 8 `.md` files. - -### `atlas_sync.md` - -Comprehensive description covering: - -- What it does (sync filesystem changes to Studio) -- Mode descriptions (standard/manual/fastfail/dryrun) -- Override system (id, direction, studioHash, expectedProperties) -- Sync workflow guidance: - 1. Basic: `atlas_sync()` -- auto-accepts if all git-resolved, else shows Studio UI - 2. Exploration: `atlas_sync(mode: "dryrun")` -- see changes without applying - 3. Fast: `atlas_sync(mode: "fastfail")` -- get changes, fail immediately if unresolved - 4. Conflict resolution: fastfail -> get_script -> merge -> sync with overrides -- Response format: human-readable summary + `` block with structured data -- Change entry fields: path, id, direction, patchType, className, studioHash, defaultSelection, fsPath, properties - -### `get_script.md` - -Already has good content in the current inline description. Extract and expand: - -- Purpose: read script source from Studio for conflict resolution -- Dryrun-first pattern: if no prior sync, call `atlas_sync(mode: "dryrun")` first -- Full conflict resolution workflow (numbered steps) -- Parameters: id vs fsPath, fromDraft -- Response: source, studioHash, className, instancePath -- studioHash format: SHA1 of git blob (`blob \0`) - -### `run_code.md` through `run_script_in_play_mode.md` - -Pull from the studio-rust-mcp-server `.md` files (already read above). These are concise (2-6 lines each). Adapt to Atlas context. - -**Key addition to `run_code.md`**: Note that this runs in the Studio command bar context. Output from `print()`, `warn()`, `error()` is captured. Return values are included. Code has full Studio API access. - -**Key addition to `start_stop_play.md`**: Note that starting play mode will temporarily disconnect the Atlas plugin connection. The plugin will reconnect automatically when play mode stops. - -**Key addition to `run_script_in_play_mode.md`**: Note that this automatically starts play, runs the script, then stops play. Returns structured JSON result with success, value, error, logs, errors, duration, isTimeout. - -### Use in `handle_tools_list` - -Replace inline description strings with `include_str!("mcp_docs/atlas_sync.md")` etc. - -## 4. Rust: MCP Logging - -Add structured logging at key points in [src/web/mcp.rs](src/web/mcp.rs): - -```rust -// In the top-level `call()` function, after parsing the JSON-RPC request: -// 1. Log initialize (agent connect) -if method == "initialize" { - log::info!("MCP agent connected"); -} - -// 2. Log tool calls (compact JSON, one line) -// In handle_tools_call, before dispatching: -log::info!("MCP call: {} {}", tool_name, serde_json::to_string(&arguments).unwrap_or_default()); - -// 3. Log tool results (compact, one line) -// In each handler, after receiving result: -log::info!("MCP result: {} {}", tool_name, /* compact result summary */); -``` - -For results, keep it concise: - -- `atlas_sync`: log status + change count -- `get_script`: log status + className -- Passthrough tools: log status + first ~200 chars of response - -Also upgrade existing plugin stream logs: - -- `"Plugin MCP stream connected"` -> keep at `info` (already there) -- `"Plugin MCP stream disconnected"` -> keep at `info` (already there) -- Add `log::info!("MCP agent disconnected")` -- but MCP is HTTP (stateless), so this maps to: no persistent connection to track. The `initialize` log suffices for connect; we don't have a reliable disconnect event. Note: if we wanted disconnect tracking, we'd need session tracking, which is out of scope. - -## 5. Plugin: McpTools Module - -Create `plugin/src/McpTools/` directory: - -``` -plugin/src/McpTools/ - init.luau -- Dispatcher: maps tool type -> handler function - RunCode.luau -- Ported from studio-rust-mcp-server (with fixes) - InsertModel.luau -- Ported - GetConsoleOutput.luau -- Ported - GetStudioMode.luau -- Ported - StartStopPlay.luau -- Ported - RunScriptInPlayMode.luau -- Ported - Utils/ - ConsoleOutput.luau -- Ported (log accumulator) - StudioModeState.luau -- Ported (play/stop state tracking) - GameStopUtil.luau -- Ported (cross-DataModel stop via plugin settings) - DeepCopy.luau -- Ported (for run_code output serialization) -``` - -### Dispatcher (`McpTools/init.luau`) - -```lua -local tools = { - runCode = require(script.RunCode), - insertModel = require(script.InsertModel), - getConsoleOutput = require(script.GetConsoleOutput), - getStudioMode = require(script.GetStudioMode), - startStopPlay = require(script.StartStopPlay), - runScriptInPlayMode = require(script.RunScriptInPlayMode), -} - -function McpTools.dispatch(toolType, args) - local handler = tools[toolType] - if not handler then - error("Unknown MCP tool: " .. tostring(toolType)) - end - return handler(args) -end -``` - -### Tool Handler Adaptations - -Each handler is ported from the studio-rust-mcp-server with these changes: - -- Replace `require("../Utils/X")` with `require(script.Parent.Utils.X)` (Roblox instance paths) -- Remove msgpack encoding (Atlas uses JSON over WebSocket) -- `run_code.luau`: uses `loadstring`/`getfenv` (necessary for command bar emulation, add selene exception) -- `insert_model.luau`: uses `InsertService:GetFreeModels` and `game:GetObjects` (deprecated but functional) -- `GameStopUtil.luau`: needs `plugin` reference. In Atlas, pass via module-level setter or require from App context. - -### GameStopUtil Plugin Reference - -The studio-rust-mcp-server uses `PluginUtils.plugin = plugin` at startup. Atlas needs the same. Two approaches: - -**Option A (simpler)**: In `init.server.lua`, after plugin is available, set it on the McpTools utility: - -```lua -local McpToolsGameStop = require(script.McpTools.Utils.GameStopUtil) -McpToolsGameStop.setPlugin(plugin) -``` - -**Option B**: Pass plugin as argument to handlers that need it. - -Option A is simpler and matches the studio-rust-mcp-server pattern. - -## 6. Plugin: McpStream Integration - -In [plugin/src/McpStream.lua](plugin/src/McpStream.lua), add a generic tool handler callback: - -### Constructor change - -```lua -self._onToolCommand = options.onToolCommand -``` - -### MessageReceived handler addition - -After the existing `getScript` handler (line ~129), add: - -```lua -elseif data.requestId and tools_set[data.type] then - Log.info("MCP stream: received {} command (requestId={})", data.type, data.requestId) - local resultPromise = self._onToolCommand(data.requestId, data.type, data.args or {}) - resultPromise - :andThen(function(result) - if self._wsClient then - local json = HttpService:JSONEncode(result) - pcall(function() self._wsClient:Send(json) end) - end - end) - :catch(function(err) - -- send error result - end) -``` - -Where `tools_set` is a set of known passthrough tool names: - -```lua -local tools_set = { - runCode = true, insertModel = true, getConsoleOutput = true, - getStudioMode = true, startStopPlay = true, runScriptInPlayMode = true, -} -``` - -## 7. Plugin: Lifecycle Integration (`init.server.lua` + `App/init.lua`) - -### ConsoleOutput Listener - -In [plugin/src/init.server.lua](plugin/src/init.server.lua) (or `App/init.lua`), start the ConsoleOutput listener on plugin init: - -```lua -local ConsoleOutput = require(script.McpTools.Utils.ConsoleOutput) -local connConsoleOutput = ConsoleOutput.startListener() -plugin.Unloading:Connect(function() - connConsoleOutput:Disconnect() -end) -``` - -### GameStop Monitor - -In `init.server.lua`, if running in Server DataModel (play mode), start the stop monitor: - -```lua -local RunService = game:GetService("RunService") -if RunService:IsRunning() and RunService:IsServer() then - local GameStopUtil = require(script.McpTools.Utils.GameStopUtil) - task.spawn(GameStopUtil.monitorForStopPlay) -end -``` - -### App/init.lua: Wire onToolCommand - -In the McpStream constructor call, add: - -```lua -onToolCommand = function(requestId, toolType, args) - return Promise.new(function(resolve, reject) - local McpTools = require(script.McpTools) - local ok, result = pcall(McpTools.dispatch, toolType, args) - if ok then - resolve({ requestId = requestId, status = "success", response = result or "" }) - else - resolve({ requestId = requestId, status = "error", response = tostring(result) }) - end - end) -end, -``` - -## 8. PlaceId Filtering - -Already handled on the MCP stream WebSocket connection (`api.rs` lines 3737-3790). Since all tool commands flow through the same stream, placeId filtering applies to all tools automatically. No additional work needed. - -## Key Design Decisions - -1. **Passthrough pattern**: New tools don't need tree resolution or fsPath enrichment. They bypass `active_api_connections` guard (safe during live sync). -2. **No `active_api_connections` guard**: Unlike `atlas_sync`, the passthrough tools don't interfere with live WebSocket sync sessions. `get_script` already established this precedent. -3. `**command_in_progress` serialization**: All MCP commands (including new tools) are serialized -- only one at a time. This is a channel limitation (single command_tx + oneshot result_tx). Acceptable since MCP calls are agent-initiated and inherently sequential. -4. **Play mode timing for `start_stop_play`**: `StudioTestService:ExecutePlayModeAsync({})` returns quickly (before play fully activates). The response is sent back before the MCP stream disconnects due to plugin reload. If it was already in play mode, the call returns even faster. The 0.1s timeout detection pattern from studio-rust-mcp-server handles this correctly. -5. `**run_code` uses `loadstring`/`getfenv**`: These are technically deprecated but necessary for command bar context emulation. This is a known and accepted pattern copied from Roblox's own MCP server. Add `--!nolint DeprecatedApi` to the file. -6. **ConsoleOutput resets**: Console output accumulates between `run_code` / `run_script_in_play_mode` calls. Each call clears prior output. The `get_console_output` tool reads whatever has accumulated since the last reset. - -## Files Changed - -### New files - -- `src/web/mcp_docs/atlas_sync.md` -- `src/web/mcp_docs/get_script.md` -- `src/web/mcp_docs/run_code.md` -- `src/web/mcp_docs/insert_model.md` -- `src/web/mcp_docs/get_console_output.md` -- `src/web/mcp_docs/get_studio_mode.md` -- `src/web/mcp_docs/start_stop_play.md` -- `src/web/mcp_docs/run_script_in_play_mode.md` -- `plugin/src/McpTools/init.luau` -- `plugin/src/McpTools/RunCode.luau` -- `plugin/src/McpTools/InsertModel.luau` -- `plugin/src/McpTools/GetConsoleOutput.luau` -- `plugin/src/McpTools/GetStudioMode.luau` -- `plugin/src/McpTools/StartStopPlay.luau` -- `plugin/src/McpTools/RunScriptInPlayMode.luau` -- `plugin/src/McpTools/Utils/ConsoleOutput.luau` -- `plugin/src/McpTools/Utils/StudioModeState.luau` -- `plugin/src/McpTools/Utils/GameStopUtil.luau` -- `plugin/src/McpTools/Utils/DeepCopy.luau` - -### Modified files - -- `src/web/mcp.rs` -- `dispatch_to_plugin`, `PluginToolResult`, 6 new tools in list/call, logging, `include_str!` for all docs -- `src/web/api.rs` -- passthrough else-clause in MCP stream command routing -- `plugin/src/McpStream.lua` -- `onToolCommand` callback, generic tool dispatch -- `plugin/src/App/init.lua` -- wire `onToolCommand`, ConsoleOutput listener, GameStopUtil setup -- `plugin/src/init.server.lua` -- GameStop monitor in Server DataModel, ConsoleOutput listener - -## Audit Notes - -### Against original TODO (lines 344-354) - -- Port all basic endpoints: 6 tools ported (run_code, insert_model, get_console_output, get_studio_mode, start_stop_play, run_script_in_play_mode). Multi-studio tools excluded per "we don't need that whole studio selection system." -- Integrate into Atlas MCP: Uses same JSON-RPC/MCP stream architecture. No rmcp dependency. -- PlaceId filtering: Handled at stream level, covers all tools. No additional work. -- Pull fixed versions: Porting from local `D:\UserGenerated\studio-rust-mcp-server` which contains WebSocket, msgpack, and typed codec fixes. -- .md doc setup: All 8 tools get .md files with `include_str!`. -- Logging: Agent initialize logged, every tool call logged with compact JSON args, every result logged compact. One line per entry. -- Documentation quality: Comprehensive .md files covering workflows, parameters, response formats. -- Sync flow with get_script merging: Documented in atlas_sync.md and get_script.md. -- Dryrun for get_script: Documented in get_script.md ("call atlas_sync(mode: 'dryrun') first"). - -### Against atlas.mdc - -- Round-trip identity: Not affected. These tools don't touch filesystem sync. -- Code quality: `dispatch_to_plugin` helper prevents code duplication. Plugin dispatcher follows DRY pattern. -- CLI syncback parity: Not affected. -- Two-way sync: New tools bypass `active_api_connections` guard (safe during live sync), same as `get_script`. - -### Against first principles - -- Single responsibility: Each tool handler does one thing. Generic dispatch helper handles common plumbing. -- Error handling: Guards for command_in_progress, plugin_stream_connected. pcall wraps all plugin-side execution. -- Concurrency: Serialized via `command_in_progress` atomic. No concurrent command support needed (HTTP is request-response). -- Security: PlaceId filtering inherited from stream connection. -- Separation of concerns: Rust side only routes. Plugin side executes. No cross-cutting. - -### Whole-system soundness - -- **MCP stream lifecycle**: Tools work only when plugin is connected (Edit mode). During play mode, stream disconnects and tools return "no plugin connected." This is correct behavior. -- **ConsoleOutput accumulation**: Starts on plugin init, persists across tool calls, reset by run_code/run_script_in_play_mode. Same lifecycle as studio-rust-mcp-server. -- **GameStop cross-DataModel**: Uses plugin settings (the only reliable cross-DataModel communication in Studio). The Server DataModel copy polls every 1s. Matches the proven studio-rust-mcp-server pattern. -- **Play mode transition**: `ExecutePlayModeAsync` returns before play activates. Response gets back to agent before stream disconnects. Agent sees "Started play" then loses plugin connection. On stop, plugin reconnects automatically. -- **No channel conflicts**: All tools use the same command_tx/result_tx channel. The `command_in_progress` lock ensures only one in-flight at a time. No deadlock risk since the lock is released on every exit path (including errors and plugin disconnection). - diff --git a/.cursor/plans/pull_removed_scripts_feature_dd790311.plan.md b/.cursor/plans/pull_removed_scripts_feature_dd790311.plan.md deleted file mode 100644 index 52d65ad3..00000000 --- a/.cursor/plans/pull_removed_scripts_feature_dd790311.plan.md +++ /dev/null @@ -1,365 +0,0 @@ ---- -name: Pull Instances to Rojo Feature -overview: Enable "Pull" for ALL instance types that exist in Studio but not in Rojo's filesystem, creating appropriate files during sync confirmation. -todos: - - id: update-write-request - content: Update WriteRequest struct to include full instance data for added items - status: completed - - id: implement-syncback-write - content: Implement syncback logic in handle_api_write for added instances - status: completed - - id: plugin-pull-removed - content: Handle 'pull' for removed items in ServeSession.lua - status: completed - - id: encode-instance - content: Create encodeInstance.lua to serialize Studio instances for transmission - status: completed - - id: rename-commit-button - content: Rename "Commit" button to "Accept" in confirmation UI - status: completed - - id: forced-review - content: Implement forced review - default unselected, popup to confirm accepting partial selections - status: completed - - id: dynamic-dialogue - content: Allow changes to flow into dialogue, unselect items that change after selection - status: completed - - id: pause-changebatcher - content: Pause ChangeBatcher during confirmation to prevent change accumulation - status: completed - - id: defense-in-depth - content: Add explicit checks to block patch application during confirmation - status: completed -isProject: false ---- - -# Pull Instances to Rojo Filesystem - -## Problem - -When an instance exists in Roblox Studio but not in Rojo's filesystem (appears as "to be deleted" in the sync diff): - -- **Push** = Delete from Studio (works correctly) -- **Pull** = Should create file in Rojo (currently does nothing) -- **Skip** = Do nothing (works correctly) - -The "Pull" option for removed items is currently ignored in [plugin/src/ServeSession.lua](plugin/src/ServeSession.lua) (lines 663-674). - -## Scope: ALL Instance Types - -This feature supports pulling **all instance types** from Studio to Rojo, not just scripts: - - -| Instance Type | No Children | With Children | -| ------------------ | -------------------- | ------------------------------------------- | -| ModuleScript | `.luau` | dir + `init.luau` + `init.meta.json5`* | -| Script† | `.{suffix}.luau` | dir + `init.{suffix}.luau` + `init.meta.json5`* | -| LocalScript | `.client.luau` | dir + `init.client.luau` + `init.meta.json5`* | -| Folder | dir + `.gitkeep` | dir + `init.meta.json5`* | -| Configuration | dir + `.gitkeep` | dir + `init.meta.json5`* | -| Tool | dir + `.gitkeep` | dir + `init.meta.json5`* | -| ScreenGui | dir + `.gitkeep` | dir + `init.meta.json5`* | -| SurfaceGui | dir + `.gitkeep` | dir + `init.meta.json5`* | -| BillboardGui | dir + `.gitkeep` | dir + `init.meta.json5`* | -| AdGui | dir + `.gitkeep` | dir + `init.meta.json5`* | -| StringValue | `.txt` | dir + `init.meta.json5` | -| LocalizationTable | `.csv` | dir + `init.csv` | -| All other classes | `.model.json5` | dir + `init.meta.json5` | - -\* `init.meta.json5` only created if instance has properties (Attributes, etc.) -\* Empty directories get `.gitkeep` file (matching dedicated syncback behavior) - -† **Script RunContext determines file suffix:** -- `RunContext: Client` → `.client.luau` -- `RunContext: Server` → `.server.luau` -- `RunContext: Legacy` → `.server.luau` -- `RunContext: Plugin` → `.plugin.luau` -- No RunContext → `.server.luau` (default) - -This ensures proper round-tripping regardless of `emitLegacyScripts` mode in the project configuration. - -**Important:** -- We do NOT use `.rbxm` binary files as that would be a regression for version control. -- This matches the dedicated syncback system's middleware selection logic in `src/syncback/mod.rs`. - -## Solution Overview - -```mermaid -sequenceDiagram - participant Studio as Roblox Studio - participant Plugin as Rojo Plugin - participant Server as Rojo Server - participant FS as Filesystem - - Note over Studio,Plugin: Instance exists in Studio, not in Rojo - Plugin->>Plugin: Show in diff as "Remove" - Plugin->>Plugin: User selects "Pull" - Plugin->>Plugin: Encode instance with properties - Plugin->>Server: POST /api/write with added instance - Server->>Server: Determine file path from parent - Server->>FS: Create appropriate file based on class - Server->>Plugin: Success response -``` - - - -## Changes Required - -### 1. Server: Update WriteRequest Structure - -**File:** [src/web/interface.rs](src/web/interface.rs) - -Change `added` from `HashMap` to include instance data: - -```rust -pub struct AddedInstance { - pub parent: Ref, - pub name: String, - pub class_name: String, - pub properties: UstrMap, -} - -pub struct WriteRequest { - // ... existing fields ... - pub added: HashMap, // Changed from HashMap -} -``` - -### 2. Server: Implement Syncback in Write Handler - -**File:** [src/web/api.rs](src/web/api.rs) - -In `handle_api_write`, process `added` instances: - -- Determine the filesystem path based on parent instance's path -- Use syncback middleware to create the appropriate file (`.luau` for scripts) -- Trigger a re-snapshot so Rojo picks up the new file - -### 3. Plugin: Encode and Send Added Instances - -**File:** [plugin/src/ServeSession.lua](plugin/src/ServeSession.lua) - -In `__confirmAndApplyInitialPatch`, handle "pull" for removed items: - -```lua -elseif selection == "pull" and self.__twoWaySync then - local instance = - if instance and isScriptClass(instance.ClassName) then - local encoded = encodeInstance(instance, parentId) - pullPatch.added[] = encoded - end -end -``` - -### 4. Plugin: Create Instance Encoder - -**New file:** `plugin/src/ChangeBatcher/encodeInstance.lua` - -Encode a Studio instance for transmission to the server: - -- Serialize Name, ClassName, Parent ref -- Encode Source property for scripts -- Handle other relevant properties - -## Key Considerations - -1. **Parent Resolution:** The server needs to know where to create the file. The parent instance must already exist in Rojo's tree to determine the filesystem path. -2. **All Instance Types Supported:** Scripts use `.luau`, Folders become directories, all other instances use `.model.json` (human-readable, version-control friendly). -3. **No Binary Files:** We explicitly avoid `.rbxm` files as they are not version-control friendly. -4. **Two-Way Sync Required:** This feature only activates when `twoWaySync` is enabled (already checked in the code). -5. **File Naming:** Instance Name + appropriate extension based on class type. -6. **Universal Children Support:** ANY instance can have children in Roblox. When an instance has children, it MUST become a directory: - - Scripts with children → directory + `init.luau`/`init.server.luau`/`init.client.luau` + `init.meta.json5` if has non-Source properties - - Directory classes (Folder, etc.) → directory + `init.meta.json5` if has properties - - StringValue with children → directory + `init.meta.json5` (not .txt) - - LocalizationTable with children → directory + `init.csv` - - All other classes with children → directory + `init.meta.json5` -7. **Attributes on All Types:** All instances (including Folders) can have Attributes. These are encoded and saved in `init.meta.json5`. -8. **Script Properties:** Scripts with children also get `init.meta.json5` for non-Source properties (like Attributes). -9. **Empty Directories:** Empty directories with no metadata get `.gitkeep` file (matching dedicated syncback behavior). -10. **Attributes Filtering:** Internal Roblox attributes (prefixed with `RBX`) are filtered out (matching dedicated syncback). -11. **Property Filtering:** `Ref` and `UniqueId` properties are not serialized to JSON (matching dedicated syncback). -12. **Sorted JSON:** Meta files use sorted JSON5 format with keys in alphabetical order (matching dedicated syncback). -13. **RunContext-Based Script Suffix:** For `Script` class, the file suffix is determined by `RunContext` property: - - `RunContext: Client` → `.client.luau` - - `RunContext: Server` → `.server.luau` - - `RunContext: Legacy` → `.server.luau` - - `RunContext: Plugin` → `.plugin.luau` - - This ensures proper round-tripping regardless of `emitLegacyScripts` mode. -14. **Adjacent Meta Files:** Scripts WITHOUT children create adjacent meta files (`{name}.meta.json5`) next to the script file, preserving non-Source properties like `RunContext`. Scripts WITH children use `init.meta.json5` inside their directory. - -## Confirmation Dialogue Hardening - -The dialogue must be the single source of truth - nothing changes without explicit user approval. - -### 7. Pause ChangeBatcher During Confirmation - -**File:** [plugin/src/ChangeBatcher/init.lua](plugin/src/ChangeBatcher/init.lua) - -Add pause/resume functionality to prevent change accumulation during confirmation: - -- Add `__paused` flag -- Skip `__cycle` when paused -- Pause when confirmation opens, resume after - -### 8. Defense-in-Depth: Block Patch Application During Confirmation - -**File:** [plugin/src/ServeSession.lua](plugin/src/ServeSession.lua) - -Add explicit check in `__applyPatch` to prevent application during confirmation in one-shot mode: - -```lua -if Settings:get("oneShotSync") and self.__confirmingPatch ~= nil then - error("Cannot apply patch during confirmation in one-shot mode") -end -``` - -### 9. Add Confirmation State Flag - -**File:** [plugin/src/ServeSession.lua](plugin/src/ServeSession.lua) - -Add `__isConfirming` flag for explicit state tracking: - -- Set `true` when confirmation dialogue opens -- Set `false` when confirmation completes -- Verify state before any patch application - -### 5. UI: Rename "Commit" to "Accept" - -**File:** [plugin/src/App/StatusPages/Confirming.lua](plugin/src/App/StatusPages/Confirming.lua) - -Rename the button from "Commit" to "Accept" since the action now covers both directions (pushing to Studio AND pulling to Rojo). - -```lua --- Line 168-169, change: -Commit = e(TextButton, { - text = "Commit", --- To: -Accept = e(TextButton, { - text = "Accept", -``` - -### 6. UI: Forced Review System - -**Files:** - -- [plugin/src/PatchTree.lua](plugin/src/PatchTree.lua) -- [plugin/src/App/StatusPages/Confirming.lua](plugin/src/App/StatusPages/Confirming.lua) -- [plugin/src/App/Components/PatchVisualizer/DomLabel.lua](plugin/src/App/Components/PatchVisualizer/DomLabel.lua) - -Implement forced review where every item must be explicitly selected: - -**A. Default to unselected (no radio button checked):** - -```lua --- Lines 325, 378, 456 - change: -defaultSelection = "push", --- To: -defaultSelection = nil, -- No selection -``` - -**B. Accept button behavior based on selection state:** - -- **All items selected:** Accept works immediately, no popup -- **Some items unselected:** Show confirmation popup: - - "X items have not been reviewed. Accept selected changes and skip the rest?" - - Options: "Accept and Skip Rest" / "Cancel" (go back to review) -- This allows users to select only the changes they want without manually skipping hundreds of items - -**C. Visual indicator for unselected items:** - -- No radio button checked (all three Push/Pull/Skip unchecked) -- Possibly highlight row to indicate needs review - -### 6b. Dynamic Dialogue Updates - -**File:** [plugin/src/ServeSession.lua](plugin/src/ServeSession.lua) - -Allow new changes to flow into the confirmation dialogue: - -**A. Merge incoming changes into `__confirmingPatch`:** - -- When new WebSocket messages arrive during confirmation, merge them into the current patch -- Update the UI to show new items - -**B. Unselect changed items:** - -- If an item that was already selected (Push/Pull/Skip) is updated by a new change, reset its selection to unselected -- User must re-review the updated item - -**C. Block all background syncing:** - -- While dialogue is open, no changes apply automatically -- Everything goes through the dialogue - -## Files to Modify - -- [src/web/interface.rs](src/web/interface.rs) - Update `WriteRequest.added` type -- [src/web/api.rs](src/web/api.rs) - Implement syncback in `handle_api_write` -- [plugin/src/ServeSession.lua](plugin/src/ServeSession.lua) - Handle "pull" for removed items, dynamic dialogue updates, confirmation state, defense-in-depth -- [plugin/src/ChangeBatcher/encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua) - New file to encode instances -- [plugin/src/ChangeBatcher/init.lua](plugin/src/ChangeBatcher/init.lua) - Add pause/resume functionality -- [plugin/src/App/StatusPages/Confirming.lua](plugin/src/App/StatusPages/Confirming.lua) - Rename "Commit" to "Accept", disable until all reviewed, show unreviewed count -- [plugin/src/PatchTree.lua](plugin/src/PatchTree.lua) - Default to unselected, track selection completeness -- [plugin/src/App/Components/PatchVisualizer/DomLabel.lua](plugin/src/App/Components/PatchVisualizer/DomLabel.lua) - Support unselected state visually - -## Testing - -### Server-side Tests (Rust) - -**File:** [src/web/api.rs](src/web/api.rs) - `#[cfg(test)]` module - -Tests for `variant_to_json`: -- String, Bool, Int32, Int64, Float32, Float64 -- Vector2, Vector3, Color3 -- UDim, UDim2 -- Enum, NumberRange, Rect -- Unsupported types return None - -Tests for syncback file naming: -- ModuleScript → `.luau` -- Script → `.server.luau` -- LocalScript → `.client.luau` -- Folder → directory (no file) -- Other instances → `.model.json` - -Tests for model.json structure: -- Basic structure (className, properties) -- With properties - -### Plugin Tests (Lua - TestEZ) - -**File:** [plugin/src/ChangeBatcher/init.spec.lua](plugin/src/ChangeBatcher/init.spec.lua) -- `pause/resume` tests: - - Start unpaused by default - - Pausable - - Resumable after pause - - No flush when paused - - Flush after resume - -**File:** [plugin/src/ChangeBatcher/encodeInstance.spec.lua](plugin/src/ChangeBatcher/encodeInstance.spec.lua) -- Script encoding (ModuleScript, Script, LocalScript) -- Folder encoding -- Other instance encoding (Part, StringValue, Configuration) -- Parent ID handling -- Edge cases (special characters, empty name) - -**File:** [plugin/src/PatchTree.spec.lua](plugin/src/PatchTree.spec.lua) -- `buildInitialSelections` - verifies nil defaultSelection behavior -- `countUnselected` - counts nodes without selections -- `allNodesSelected` - checks all/some/none selected -- `getSelectableNodeIds` - returns selectable node IDs - -### Integration Tests - -**Test fixture:** [rojo-test/serve-tests/syncback_write/](rojo-test/serve-tests/syncback_write/) - -### Running Tests - -```bash -# Rust tests -cargo test - -# Plugin tests (in Roblox Studio) -# Run plugin/src/runTests.lua -``` - diff --git a/.cursor/plans/reconciler_robustness_overhaul_2f440e06.plan.md b/.cursor/plans/reconciler_robustness_overhaul_2f440e06.plan.md deleted file mode 100644 index 789fa159..00000000 --- a/.cursor/plans/reconciler_robustness_overhaul_2f440e06.plan.md +++ /dev/null @@ -1,286 +0,0 @@ ---- -name: Reconciler robustness overhaul -overview: Fix the Atlas plugin Reconciler to handle MeshPart creation via AssetService, MeshId swapping, and CSG reconstruction -- modeled after the proven rbxsync Sync.luau / CSGHandler.luau implementation. -todos: - - id: tags-attrs-verify - content: Verify Tags/Attributes work through existing RbxDom customProperties.lua path (read-only audit, no code changes) - status: pending - - id: meshpart-create - content: Add MeshPart creation via AssetService:CreateMeshPartAsync in reify.lua, skip MeshId in property loop - status: pending - - id: meshid-swap - content: "Add MeshId change detection in applyPatch.lua: recreate MeshPart, copy children/properties, swap in instanceMap" - status: pending - - id: csg-handler - content: Port CSGHandler from rbxsync to Atlas plugin (Plugin:Separate for decomposition, UnionAsync/SubtractAsync for reconstruction) - status: pending - - id: csg-twoway-decompose - content: "Add CSG decomposition to ChangeBatcher/encodeInstance: when encoding a CSG part, call Plugin:Separate and send component parts to server" - status: pending - - id: csg-server-store - content: "Server-side: store decomposed CSG component parts on disk and send them back to plugin during forward sync" - status: pending - - id: csg-reify-reconstruct - content: "Plugin-side: detect CSG component data in patches, reconstruct via CSGHandler in reify.lua" - status: pending - - id: csg-warning - content: Add warning for .rbxm-sourced CSG parts that have never been decomposed (appear as empty shells until first two-way sync) - status: pending -isProject: false ---- - -# Reconciler Robustness Overhaul - -## Tags/Attributes: Already Working (Verification Only) - -Tags and Attributes ARE correctly handled through the RbxDom `customProperties.lua` system ([plugin/rbx_dom_lua/customProperties.lua](plugin/rbx_dom_lua/customProperties.lua) lines 51-120): - -- **Tags** (lines 97-120): Uses `CollectionService:GetTags()` for read, `CollectionService:AddTag()/RemoveTag()` for write. Properly diffs existing tags against new tags. -- **Attributes** (lines 51-96): Uses `instance:GetAttributes()` for read, `instance:SetAttribute()` for write. Clears removed attributes. Skips reserved `RBX` prefixed names. - -They arrive in the `Properties` map from the server (e.g. `Properties.Tags`, `Properties.Attributes`) and flow through `setProperty` -> RbxDom `PropertyDescriptor:write` -> custom handler. The property application order within a single instance doesn't matter per user confirmation. - -No code changes needed -- just verify during implementation that this path is exercised. - ---- - -## Problem 1: MeshPart Creation Fails Silently - -**File:** [plugin/src/Reconciler/reify.lua](plugin/src/Reconciler/reify.lua) line 63 - -```lua -local createSuccess, instance = pcall(Instance.new, virtualInstance.ClassName) -``` - -`Instance.new("MeshPart")` creates an instance with empty MeshId. **MeshId is read-only** after creation in plugins. The server sends MeshId in Properties, but `setProperty` fails silently (property added to `unappliedProperties`). Result: every MeshPart synced from server has no mesh geometry. - -**rbxsync reference:** [Sync.luau](d:\UserGenerated\rbxsync\plugin\src\Sync.luau) lines 624-681 use `AssetService:CreateMeshPartAsync(meshId)`, then apply remaining properties with MeshId excluded. - -**Fix in reify.lua:** Before `Instance.new`, check for MeshPart and use `AssetService:CreateMeshPartAsync`: - -```lua -local instance -local meshIdAlreadySet = false - -if virtualInstance.ClassName == "MeshPart" then - local meshIdValue = virtualInstance.Properties.MeshId - if meshIdValue then - local decodeSuccess, meshId = decodeValue(meshIdValue, instanceMap) - if decodeSuccess and type(meshId) == "string" and meshId ~= "" then - local AssetService = game:GetService("AssetService") - local ok, meshPart = pcall(function() - return AssetService:CreateMeshPartAsync(meshId) - end) - if ok and meshPart then - instance = meshPart - meshIdAlreadySet = true - end - end - end -end - -if instance == nil then - local createSuccess - createSuccess, instance = pcall(Instance.new, virtualInstance.ClassName) - if not createSuccess then - addAllToPatch(unappliedPatch, virtualInstances, id) - return - end -end -``` - -Then in the property loop, skip MeshId if already set: - -```lua -if meshIdAlreadySet and propertyName == "MeshId" then - continue -end -``` - ---- - -## Problem 2: MeshId Swap on Existing MeshPart - -**File:** [plugin/src/Reconciler/applyPatch.lua](plugin/src/Reconciler/applyPatch.lua) lines 250-277 - -When an update changes MeshId on an existing MeshPart, `setProperty` fails (read-only). The property ends up in `unappliedUpdate` -- the MeshPart keeps the old mesh. - -**rbxsync reference:** [Sync.luau](d:\UserGenerated\rbxsync\plugin\src\Sync.luau) lines 852-941 detect MeshId change, recreate via `CreateMeshPartAsync`, copy properties/children, destroy old. - -**Fix in applyPatch.lua:** Add a MeshPart recreation block before the normal update logic: - -```lua --- Before the normal property update loop: -if instance:IsA("MeshPart") and update.changedProperties - and update.changedProperties.MeshId then - - local decodeSuccess, newMeshId = decodeValue(update.changedProperties.MeshId, instanceMap) - - if decodeSuccess and type(newMeshId) == "string" and newMeshId ~= "" then - local AssetService = game:GetService("AssetService") - local ok, newMeshPart = pcall(function() - return AssetService:CreateMeshPartAsync(newMeshId) - end) - - if ok and newMeshPart then - -- Apply name - newMeshPart.Name = update.changedName or instance.Name - - -- Apply changed properties (excluding MeshId) - for propName, propValue in pairs(update.changedProperties) do - if propName ~= "MeshId" then - local ds, dv = decodeValue(propValue, instanceMap) - if ds then setProperty(newMeshPart, propName, dv) end - end - end - - -- Move children - for _, child in ipairs(instance:GetChildren()) do - child.Parent = newMeshPart - end - - -- Swap in instanceMap - local parent = instance.Parent - newMeshPart.Parent = parent - instanceMap:insert(update.id, newMeshPart) - instance.Parent = nil -- Not Destroy(), allows undo - - continue -- Skip normal update path - end - end -end -``` - ---- - -## Problem 3: CSG Parts Created as Empty Shells - -### Root Cause - -The server filters out CSG geometry data before sending to the plugin: - -- `**MeshData**` (BinaryString) -- can't be serialized to JSON/MessagePack ([src/web/api.rs](src/web/api.rs) line 3606-3608) -- `**PhysicalConfigData**` (SharedString) -- explicitly filtered ([src/web/interface.rs](src/web/interface.rs) lines 147-153) - -Even if these bytes reached the plugin, they're **not scriptable** -- no Roblox API exists to set `MeshData` or `PhysicalConfigData` on instances from Lua. No plugin API exists to load raw .rbxm bytes into instances either. - -**The only way to create CSG geometry in Studio is `BasePart:UnionAsync()` / `BasePart:SubtractAsync()` from component parts.** This is exactly what rbxsync does. - -### CSG Data Flow - -``` -┌─────────────────────────────────────────────────────────────────────┐ -│ TWO-WAY SYNC (Studio → Server → Studio) │ -│ │ -│ 1. User edits CSG in Studio │ -│ 2. Plugin detects change via ChangeBatcher │ -│ 3. Plugin calls Plugin:Separate() to decompose → component parts │ -│ 4. Plugin encodes component parts + CSG metadata │ -│ 5. Server stores component data alongside instance │ -│ 6. On next forward sync: server sends component data │ -│ 7. Plugin reconstructs via UnionAsync/SubtractAsync │ -│ │ -│ LIMITATION: .rbxm-sourced CSG that was NEVER synced from Studio │ -│ will appear as empty shells until first two-way sync. │ -│ A warning is logged for these cases. │ -└─────────────────────────────────────────────────────────────────────┘ -``` - -### Implementation: 4 parts - -#### Part A: Port CSGHandler module - -Create [plugin/src/CSGHandler.lua](plugin/src/CSGHandler.lua), ported from [rbxsync CSGHandler.luau](d:\UserGenerated\rbxsync\plugin\src\CSGHandler.luau). - -Key functions: - -- `CSGHandler.isCSGOperation(instance)` -- check if UnionOperation/IntersectOperation/NegateOperation -- `CSGHandler.separate(pluginInstance, union)` -- decompose via `Plugin:Separate()`, returns `{addParts, subtractParts}` -- `CSGHandler.reconstruct(basePart, additionalParts, subtractParts)` -- rebuild via `UnionAsync/SubtractAsync` - -#### Part B: CSG decomposition in two-way sync (Plugin → Server) - -**File:** [plugin/src/ChangeBatcher/encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua) - -When encoding a CSG instance for syncback, decompose it: - -1. Call `CSGHandler.separate(plugin, instance)` to get component parts -2. Encode each component part as a child instance under a special `_csg` key -3. Include CSG metadata (operation types: add vs subtract) -4. Send to server as part of the normal write patch - -The server write handler ([src/web/api.rs](src/web/api.rs)) needs to recognize the `_csg` data and store it. - -#### Part C: Server-side CSG storage and retrieval - -**File:** [src/web/api.rs](src/web/api.rs) and [src/change_processor.rs](src/change_processor.rs) - -When the server receives CSG component data via `/api/write`: - -1. Store component part snapshots alongside the CSG instance (e.g., as metadata or in a `_csg/` subdirectory in the snapshot tree) -2. During forward sync, when sending a CSG instance to the plugin, include the component data in the instance's properties/metadata - -This needs a new mechanism -- CSG component data is not a normal property. Options: - -- Add a `csgComponents` field to the `Instance` struct in [src/web/interface.rs](src/web/interface.rs) -- Or encode as a special metadata entry in `InstanceMetadata` - -#### Part D: CSG reconstruction in reify.lua - -**File:** [plugin/src/Reconciler/reify.lua](plugin/src/Reconciler/reify.lua) and [plugin/src/Reconciler/applyPatch.lua](plugin/src/Reconciler/applyPatch.lua) - -When reifying a CSG instance that has component data: - -1. Instead of `Instance.new("UnionOperation")`, queue it for deferred CSG reconstruction -2. Create the component parts first (as normal instances, unparented) -3. After all instances are created, reconstruct CSG via `CSGHandler.reconstruct()` -4. Apply properties (skip CFrame -- geometry defines position, per rbxsync line 1499-1509) -5. Parent the reconstructed union - -For CSG instances WITHOUT component data (from .rbxm, never two-way synced): - -- Create the empty shell via `Instance.new()` as today -- Log a warning: "CSG instance 'X' has no component data -- appears as empty shell" - ---- - -## Implementation Order - -The changes are independent enough to implement incrementally: - -1. **MeshPart creation** (reify.lua) -- immediate high-value fix, no server changes -2. **MeshId swap** (applyPatch.lua) -- immediate high-value fix, no server changes -3. **CSGHandler module** (new file) -- pure plugin code, self-contained -4. **CSG warning** (reify.lua) -- trivial addition -5. **CSG decomposition** (encodeInstance.lua + server) -- requires server changes -6. **CSG server storage** (api.rs + interface.rs) -- requires protocol thinking -7. **CSG reconstruction** (reify.lua) -- requires steps 5+6 - -Steps 1-4 can ship as one PR. Steps 5-7 require more design and could be a separate PR. - ---- - -## Files Modified - - -| File | Changes | -| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | -| [plugin/src/Reconciler/reify.lua](plugin/src/Reconciler/reify.lua) | MeshPart creation, CSG warning, CSG deferred reconstruction | -| [plugin/src/Reconciler/applyPatch.lua](plugin/src/Reconciler/applyPatch.lua) | MeshId swap detection + recreation | -| [plugin/src/CSGHandler.lua](plugin/src/CSGHandler.lua) | **NEW** -- ported from rbxsync | -| [plugin/src/ChangeBatcher/encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua) | CSG decomposition during two-way sync | -| [src/web/interface.rs](src/web/interface.rs) | CSG component data in Instance struct | -| [src/web/api.rs](src/web/api.rs) | CSG storage on write, CSG data on read | - - -## Files Verified (no changes) - - -| File | Status | -| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------ | -| [plugin/rbx_dom_lua/customProperties.lua](plugin/rbx_dom_lua/customProperties.lua) | Tags (lines 97-120) and Attributes (lines 51-96) correctly handled | -| [plugin/src/Reconciler/setProperty.lua](plugin/src/Reconciler/setProperty.lua) | Routes to RbxDom descriptors, including custom handlers | -| [plugin/src/Reconciler/decodeValue.lua](plugin/src/Reconciler/decodeValue.lua) | Decodes all property types via RbxDom | -| [plugin/src/Reconciler/diff.lua](plugin/src/Reconciler/diff.lua) | Compares Tags/Attributes via Properties map | - - diff --git a/.cursor/plans/ref_audit_round_4_test_coverage.plan.md b/.cursor/plans/ref_audit_round_4_test_coverage.plan.md deleted file mode 100644 index 789de614..00000000 --- a/.cursor/plans/ref_audit_round_4_test_coverage.plan.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -name: "" -overview: "" -todos: [] -isProject: false ---- - -# Fix Ref Two-Way Sync Audit Round 4: Test Coverage Gaps - -> This plan was generated by `/audit` from an Agent-mode session. -> Refer to `.cursor/rules/atlas.mdc` for full project standards. - -## Standards - -These standards govern every fix in this plan. An implementer MUST read `.cursor/rules/atlas.mdc` before starting. - -### Round-Trip Identity (from `atlas.mdc` Quality Standard) - -Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a **bit-identical instance tree** -- same names, same classes, same properties, same hierarchy, same ref targets. Any deviation is a bug. - -### CLI Syncback Parity (from `atlas.mdc` Two-Way Sync Strategy) - -Plugin-based sync must produce **exactly the same filesystem output** that `atlas syncback` would give for the same input. Byte-for-byte identical files, identical directory structures, identical naming. Any divergence is a bug until proven otherwise. - -### Code Quality (from `atlas.mdc` Code Quality Standard) - -DRY code that is easy to reason about and hard to get wrong. Small refactors (2-3 call sites) are included as fixes. Major rewrites (10+ call sites) are deferred. - -## Context - -Fourth audit of the two-way sync Ref property feature (branch `refs` vs `origin/master`). Previous audits found and fixed: ServeSession missing instanceMap, stale paths after rename, slash escaping, priority conflict, encodeInstance leak, filter_properties_for_meta, slugified name fallback, immediate ID assignment, RefPathIndex with startup population, precise removal, and slugified path remapping. - -**This audit found NO critical issues and NO correctness bugs.** The implementation correctly handles all round-trip identity requirements across all code paths. All 3 previous audit rounds' findings have been properly addressed. - -Two minor test coverage gaps were identified: the script-adjacent meta format and the non-script standalone file format (branches 2 and 4 of `syncback_updated_properties`) lack explicit integration tests for Ref properties. - -## Fixes - -### Fix 1: Integration Test for Ref on Standalone Script (Adjacent Meta Format) - -- **Status:** Approved -- **Finding:** Step 11a: The 4 File Format Branches -- branch 2 (standalone script with adjacent `ScriptName.meta.json5`) is not explicitly tested for Ref properties. -- **Files:** `tests/tests/two_way_sync.rs` -- **Problem:** The `syncback_updated_properties` code for standalone scripts strips `.server`/`.client`/`.plugin`/`.local`/`.legacy` suffixes from the file stem to compute the adjacent meta path. For example, `TestScript.server.luau` produces `TestScript.meta.json5`. A regression in suffix stripping would write the Rojo_Ref_* attribute to the wrong file (e.g., `TestScript.server.meta.json5`), causing forward-sync to not find it. -- **Solution:** Add an integration test `ref_on_standalone_script` that: - 1. Uses the existing `ref_two_way_sync` fixture (which already has `TestScript.server.luau`) - 2. Finds the `TestScript` instance via the API - 3. Sends a Ref property update (any Ref, e.g., PrimaryPart pointing to Part1 -- scripts can have arbitrary Ref properties via Rojo_Ref_* attributes even if the class doesn't define them) - 4. Verifies `TestScript.meta.json5` contains the Rojo_Ref_* attribute (NOT `TestScript.server.meta.json5`) - The `ref_test_setup` helper already finds Part1 and other instances. The test just needs to also find the `TestScript` instance. Update `ref_test_setup` to return `script_id` as well, or find it inline. - ```rust - #[test] - fn ref_on_standalone_script() { - run_serve_test("ref_two_way_sync", |session, _| { - let (session_id, _, _, part1_id, _, _) = ref_test_setup(&session); - - // Find TestScript - let info = session.get_api_rojo().unwrap(); - let root_read = session.get_api_read(info.root_instance_id).unwrap(); - let (workspace_id, _) = find_by_name(&root_read.instances, "Workspace"); - let ws_read = session.get_api_read(workspace_id).unwrap(); - let (script_id, _) = find_by_name(&ws_read.instances, "TestScript"); - - let mut props = UstrMap::default(); - props.insert(ustr("PrimaryPart"), Some(Variant::Ref(part1_id))); - send_update( - &session, - &session_id, - InstanceUpdate { - id: script_id, - changed_name: None, - changed_class_name: None, - changed_properties: props, - changed_metadata: None, - }, - ); - - // Adjacent meta should be ScriptName.meta.json5 (NOT ScriptName.server.meta.json5) - let meta_path = session - .path() - .join("src/Workspace/TestScript.meta.json5"); - poll_meta_has_ref_attr( - &meta_path, - "Rojo_Ref_PrimaryPart", - "Workspace/TestModel/Part1", - ); - - // Verify the wrong path does NOT have the attribute - let wrong_meta = session - .path() - .join("src/Workspace/TestScript.server.meta.json5"); - assert!( - !wrong_meta.exists(), - "TestScript.server.meta.json5 should NOT be created" - ); - }); - } - ``` -- **Risk:** None -- test-only addition. -- **Verify round-trip:** The test itself verifies the correct meta file path. Forward-sync would read `TestScript.meta.json5` alongside `TestScript.server.luau`, which is the existing behavior for adjacent meta. -- **Verify syncback parity:** N/A -- this tests the two-way sync write path only. -- **Tests required:** - - The fix IS the test. - ---- - -### Fix 2: Integration Test for Ref on Non-Script Standalone File (Adjacent Meta Format) - -- **Status:** Approved -- **Finding:** Step 11a: The 4 File Format Branches -- branch 4 (non-script standalone file like `.txt` with adjacent `FileName.meta.json5`) is not explicitly tested for Ref properties. -- **Files:** `tests/tests/two_way_sync.rs`, `rojo-test/serve-tests/ref_two_way_sync/src/Workspace/TestString.txt` -- **Problem:** The `syncback_updated_properties` code for non-script standalone files computes the adjacent meta path as `file_stem + .meta.json5`. This is the simplest branch (no suffix stripping), but it's the only branch with zero test coverage for Ref properties. -- **Solution:** - 1. Add a fixture file `rojo-test/serve-tests/ref_two_way_sync/src/Workspace/TestString.txt` containing any text (e.g., `"hello"`). This creates a `StringValue` instance named `TestString`. - 2. Add an integration test `ref_on_txt_file_instance` that: - - Finds the `TestString` instance via the API - - Sends a Ref property update - - Verifies `TestString.meta.json5` contains the Rojo_Ref_* attribute - ```rust - #[test] - fn ref_on_txt_file_instance() { - run_serve_test("ref_two_way_sync", |session, _| { - let (session_id, _, _, part1_id, _, _) = ref_test_setup(&session); - - let info = session.get_api_rojo().unwrap(); - let root_read = session.get_api_read(info.root_instance_id).unwrap(); - let (workspace_id, _) = find_by_name(&root_read.instances, "Workspace"); - let ws_read = session.get_api_read(workspace_id).unwrap(); - let (string_id, _) = find_by_name(&ws_read.instances, "TestString"); - - let mut props = UstrMap::default(); - props.insert(ustr("PrimaryPart"), Some(Variant::Ref(part1_id))); - send_update( - &session, - &session_id, - InstanceUpdate { - id: string_id, - changed_name: None, - changed_class_name: None, - changed_properties: props, - changed_metadata: None, - }, - ); - - // Adjacent meta for .txt is FileName.meta.json5 - let meta_path = session - .path() - .join("src/Workspace/TestString.meta.json5"); - poll_meta_has_ref_attr( - &meta_path, - "Rojo_Ref_PrimaryPart", - "Workspace/TestModel/Part1", - ); - }); - } - ``` -- **Risk:** None -- test-only addition plus one tiny fixture file. -- **Verify round-trip:** The test verifies the correct meta file path. Forward-sync reads `TestString.meta.json5` alongside `TestString.txt`, which is existing behavior. -- **Verify syncback parity:** N/A -- **Tests required:** - - The fix IS the test, plus the fixture file. - ---- - -## Skipped Fixes - -None. All findings were approved. - -## Accepted Limitations - -- **Ambiguous paths (duplicate-named siblings):** Properly warned via `is_ref_path_unique`. Ref is written but may resolve to wrong sibling on rebuild. Accepted in all four audits. Warning is logged, no silent corruption beyond documented scope. -- **Transient stale path window during rename:** Between directory rename on disk and meta file rewrite by `update_ref_paths_after_rename`, there is a millisecond-wide window where the meta file contains a stale Rojo_Ref_* path. A server crash in this window would leave the path stale until next server startup (which runs `reconcile_tree` to self-correct). Inherent to non-atomic multi-file operations. Accepted after evaluating practical alternatives (self-healing on startup, reverse operation order, full journaling -- all either insufficient or disproportionately complex). - -## Deferred Refactors - -- **ChangeProcessor::start parameter count (8/7):** Clippy warns about too many parameters. Consider grouping into a config struct. Pre-existing issue worsened by adding `ref_path_index`. Flagged in audit round 3. - -## Test Plan - -Tests are not optional. Every approved fix must have test coverage. A fix is not complete until its tests pass. - -### Rust Integration Tests (`tests/tests/two_way_sync.rs`) - -- `**ref_on_standalone_script**` (Fix 1): Set Ref on script instance, verify `TestScript.meta.json5` (not `TestScript.server.meta.json5`) gets the Rojo_Ref_* attribute. -- `**ref_on_txt_file_instance**` (Fix 2): Set Ref on StringValue (.txt) instance, verify `TestString.meta.json5` gets the Rojo_Ref_* attribute. - -### Fixture Files - -- `**rojo-test/serve-tests/ref_two_way_sync/src/Workspace/TestString.txt**` (Fix 2): New fixture file containing `"hello"` to create a StringValue instance. - -### No New Tests Required For - -- Fix 1: Uses existing `TestScript.server.luau` fixture. - -## Test Rules - -The implementer MUST follow these rules when writing tests for this plan: - -### For missing coverage identified - -For each "missing test coverage" gap: - -1. Write the test -2. Verify it passes against the current implementation -3. If it fails, investigate -- it may have found another bug - -### Scope: test every affected layer - -For each finding, determine which test layers are affected and write tests in ALL of them: - -- Does the bug manifest at the server level? -> Rust integration test with `/api/write` + filesystem verification -- Could it regress from a different code path? -> Test that code path too - -## Final Step: Run CI - -After ALL fixes and tests are implemented, run the `/ci` command (see `.cursor/commands/ci.md`) to execute the full CI pipeline. Every fix must pass CI before the plan is considered complete. Do not skip this step. \ No newline at end of file diff --git a/.cursor/plans/ref_path_and_dedup_integration_81a47dfe.plan.md b/.cursor/plans/ref_path_and_dedup_integration_81a47dfe.plan.md deleted file mode 100644 index ace63727..00000000 --- a/.cursor/plans/ref_path_and_dedup_integration_81a47dfe.plan.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -name: Ref path and dedup integration -overview: "Two deferred items from the ambiguous path handling feature: (1) migrate collect_referents() to build filesystem-name-compatible paths so ref round-trips work for slugified/dedup'd instances, and (2) integrate dedup_suffix.rs cleanup rules into the change_processor deletion handler.\"" -todos: - - id: ref-path-tentative-fs - content: Create tentative_fs_path() function and replace inst_path() calls in collect_referents/collect_all_paths - status: completed - - id: dedup-cleanup-change-processor - content: Integrate dedup_suffix cleanup rules into change_processor handle_tree_event removal handling - status: completed -isProject: false ---- - -# Syncback Ref Path Migration and Dedup Cleanup Integration - -## Problem 1: Ref paths break for slugified/dedup'd instance names - -### Root cause - -`collect_referents()` in [src/syncback/ref_properties.rs](src/syncback/ref_properties.rs) calls `inst_path()` which delegates to the legacy `ref_target_path()`. This produces escaped instance-name paths like `"Workspace/Hey\/Bro"`. But `get_instance_by_path()` in [src/snapshot/tree.rs](src/snapshot/tree.rs) now uses simple `path.split('/')` without escape handling. An instance named `"Hey/Bro"` gets path `"Workspace/Hey\/Bro"`, which splits into `["Workspace", "Hey\\/Bro"]` -- the escaped slash is NOT unescaped, so resolution fails. - -The fallback in `get_instance_by_path()` tries case-insensitive instance name matching, but the segment `"Hey\\/Bro"` does not match instance name `"Hey/Bro"`. - -### Fix: Build filesystem-compatible paths in collect_referents - -Create a `tentative_fs_path()` function that builds paths compatible with the new `get_instance_by_path()`: - -- Walk ancestors from target to root (same as `ref_target_path`) -- For each instance, compute a **tentative filesystem name**: `slugify(name)` + extension based on class/children -- Join with `/` (no escaping needed since slugified names can't contain `/`) - -The extension mapping uses the same class-to-middleware logic as `get_best_middleware()`: - -- `Script` -> check RunContext: `.server.luau` / `.client.luau` / `.plugin.luau` / `.legacy.luau` / `.local.luau`; if has children, directory (no ext) -- `LocalScript` -> `.local.luau` or directory -- `ModuleScript` -> `.luau` or directory -- `Folder`, `Configuration`, `Tool`, GUI classes -> directory (no ext) -- `StringValue` -> `.txt` -- `LocalizationTable` -> `.csv` -- Everything else -> `.model.json5` or directory if has children - -**Files to change:** - -- [src/syncback/ref_properties.rs](src/syncback/ref_properties.rs): Replace `inst_path()` calls with new `tentative_fs_path()`. Update `collect_all_paths()` similarly. -- [src/syncback/snapshot.rs](src/syncback/snapshot.rs): Update `inst_path()` to use the new path builder (or deprecate it for ref contexts). - -### How resolution works after this fix - -A ref path like `"Workspace/Hey_Bro.server.luau"`: - -1. Primary lookup: `filesystem_name_for()` returns `"Hey_Bro.server.luau"` (from instigating_source) -- **match** -2. If no instigating_source: fallback matches instance name `"Hey/Bro"` against segment `"Hey_Bro.server.luau"` -- no match, but this is expected for file-backed instances - -For directory instances like services: `"Workspace"` matches both filesystem name and instance name -- works as before. - ---- - -## Problem 2: Dedup cleanup not triggered on deletion in change_processor - -### Current state - -[src/syncback/dedup_suffix.rs](src/syncback/dedup_suffix.rs) provides `compute_cleanup_action()` with gap-tolerant, base-name-promotion, and group-to-1 rules. But `handle_tree_event()` in [src/change_processor.rs](src/change_processor.rs) (line 1043) only logs removals -- it doesn't check if a deletion leaves a dedup group needing suffix cleanup. - -### Fix: Add dedup cleanup after removals - -In `handle_tree_event()`, after the removal loop (line ~1070), for each removed instance: - -1. Find the parent instance (before the removal is applied to the tree) -2. Enumerate the parent's remaining children (excluding the removed one) -3. Group remaining children by dedup base name (parse `~N` suffixes from filesystem names via `parse_dedup_suffix()`) -4. For each dedup group affected by the removal, call `compute_cleanup_action()` -5. If the action is `RemoveSuffix` or `PromoteLowest`: - a. Call `suppress_path()` for both old and new paths - b. Rename the file on disk - c. Update meta file `name` field if needed - d. Update `RefPathIndex` via `update_ref_paths_after_rename()` - -**Files to change:** - -- [src/change_processor.rs](src/change_processor.rs): Add dedup cleanup logic after the removal loop in `handle_tree_event()`. Import `dedup_suffix::{parse_dedup_suffix, compute_cleanup_action}`. - -### Edge cases - -- The removed instance's parent must still exist in the tree when we enumerate siblings -- ProjectNode instances are excluded (already guarded) -- The cleanup rename must happen BEFORE `apply_patch_set()` removes the instance from the tree (since we need the parent relationship) -- VFS suppression must cover both the old path (being renamed from) and the new path (being renamed to) - diff --git a/.cursor/plans/remove_plugin_animations_f4a43647.plan.md b/.cursor/plans/remove_plugin_animations_f4a43647.plan.md deleted file mode 100644 index f42eb850..00000000 --- a/.cursor/plans/remove_plugin_animations_f4a43647.plan.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -name: Remove Plugin Animations -overview: Replace every `Flipper.Spring.new(...)` with `Flipper.Instant.new(...)` across all plugin components to make all UI transitions instant, and remove the 0.3s double-click delay in DomLabel expand/collapse. -todos: - - id: domlabel - content: "DomLabel.lua: Replace 2 Spring goals with Instant, remove task.delay(0.3) wrapper from expand logic" - status: completed - - id: page - content: "Page.lua: Replace Spring goal with Instant" - status: completed - - id: touchripple - content: "TouchRipple.lua: Replace 3 Spring goals with Instant, remove EXPAND_SPRING constant" - status: completed - - id: textbutton - content: "TextButton.lua: Replace 3 Spring goals with Instant, remove SPRING_PROPS constant" - status: completed - - id: textinput - content: "TextInput.lua: Replace 3 Spring goals with Instant, remove SPRING_PROPS constant" - status: completed - - id: notification - content: "Notification.lua: Replace 2 Spring goals with Instant" - status: completed - - id: dropdown - content: "Dropdown.lua: Replace Spring goal with Instant" - status: completed - - id: iconbutton - content: "IconButton.lua: Replace 2 Spring goals with Instant, remove HOVER_SPRING_PROPS constant" - status: completed - - id: checkbox - content: "Checkbox.lua: Replace Spring goal with Instant" - status: completed -isProject: false ---- - -# Remove All Animations From Plugin - -## Strategy - -Every animation in the plugin uses Flipper motors with `Flipper.Spring.new(value, { frequency, dampingRatio })` goals. The Flipper library already has `Flipper.Instant.new(value)` which sets the motor value immediately with no interpolation. The fix is a mechanical replacement of every `Flipper.Spring.new(...)` with `Flipper.Instant.new(...)`. - -This preserves the binding/motor infrastructure (no structural refactoring needed) while making every transition instant. - -Additionally, the DomLabel expand/collapse has a `task.delay(0.3)` that waits to distinguish single-click from double-click before expanding. This delay should be removed so expansion is immediate on click. - -## Files to Change (10 files, ~20 replacements) - -### 1. [DomLabel.lua](plugin/src/App/Components/PatchVisualizer/DomLabel.lua) -- Expand/collapse - -- Line 436: `Flipper.Spring.new(24, {...})` -> `Flipper.Instant.new(24)` -- Line 602: `Flipper.Spring.new(goalHeight, {...})` -> `Flipper.Instant.new(goalHeight)` -- Lines 545-608: Remove the `task.delay(0.3)` wrapper so expansion logic runs immediately on single click (keep double-click detection, just don't delay the expand) - -### 2. [Page.lua](plugin/src/App/Page.lua) -- Page transitions - -- Line 65: `Flipper.Spring.new(...)` -> `Flipper.Instant.new(...)` - -### 3. [TouchRipple.lua](plugin/src/App/Components/TouchRipple.lua) -- Click ripple effect - -- Line 84: `Flipper.Spring.new(1, EXPAND_SPRING)` -> `Flipper.Instant.new(1)` -- Line 85: `Flipper.Spring.new(1, EXPAND_SPRING)` -> `Flipper.Instant.new(1)` -- Line 93: `Flipper.Spring.new(0, {...})` -> `Flipper.Instant.new(0)` -- Remove unused `EXPAND_SPRING` constant - -### 4. [TextButton.lua](plugin/src/App/Components/TextButton.lua) -- Hover/enabled - -- Line 36: `Flipper.Spring.new(...)` -> `Flipper.Instant.new(...)` -- Line 64: `Flipper.Spring.new(1, SPRING_PROPS)` -> `Flipper.Instant.new(1)` -- Line 70: `Flipper.Spring.new(0, SPRING_PROPS)` -> `Flipper.Instant.new(0)` -- Remove unused `SPRING_PROPS` constant - -### 5. [TextInput.lua](plugin/src/App/Components/TextInput.lua) -- Hover/enabled - -- Line 34: `Flipper.Spring.new(...)` -> `Flipper.Instant.new(...)` -- Line 101: `Flipper.Spring.new(1, SPRING_PROPS)` -> `Flipper.Instant.new(1)` -- Line 107: `Flipper.Spring.new(0, SPRING_PROPS)` -> `Flipper.Instant.new(0)` -- Remove unused `SPRING_PROPS` constant - -### 6. [Notification.lua](plugin/src/App/Components/Notifications/Notification.lua) -- Appear/dismiss - -- Line 43: `Flipper.Spring.new(0, {...})` -> `Flipper.Instant.new(0)` -- Line 50: `Flipper.Spring.new(1, {...})` -> `Flipper.Instant.new(1)` - -### 7. [Dropdown.lua](plugin/src/App/Components/Dropdown.lua) -- Open/close - -- Line 39: `Flipper.Spring.new(...)` -> `Flipper.Instant.new(...)` - -### 8. [IconButton.lua](plugin/src/App/Components/IconButton.lua) -- Hover circle - -- Line 41: `Flipper.Spring.new(1, HOVER_SPRING_PROPS)` -> `Flipper.Instant.new(1)` -- Line 45: `Flipper.Spring.new(0, HOVER_SPRING_PROPS)` -> `Flipper.Instant.new(0)` -- Remove unused `HOVER_SPRING_PROPS` constant - -### 9. [Checkbox.lua](plugin/src/App/Components/Checkbox.lua) -- Active state - -- Line 26: `Flipper.Spring.new(...)` -> `Flipper.Instant.new(...)` - -## Not Touched - -- **Spinner.lua** -- Uses `RenderStepped` rotation, not Flipper springs. This is a loading indicator, not a decorative animation. Keeping it. -- **bindingUtil.lua** -- `mapLerp`, `blendAlpha`, `fromMotor` are utility functions still needed by the instant-value bindings. No changes needed. -- **Flipper package** -- Vendored, not modified. diff --git a/.cursor/plans/rewrite_matching_algorithm_df45bbe1.plan.md b/.cursor/plans/rewrite_matching_algorithm_df45bbe1.plan.md deleted file mode 100644 index 403f9dd3..00000000 --- a/.cursor/plans/rewrite_matching_algorithm_df45bbe1.plan.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -name: Rewrite matching algorithm -overview: "Replace the multi-pass matching algorithm in all 3 implementations with a recursive change-count scoring function and greedy assignment. Sort key is a tuple: (change_count, child_index_A, child_index_B). Fast-paths for Ref pins and (Name, ClassName) grouping." -todos: - - id: rewrite-lua-matching - content: "Rewrite Lua matching.lua: recursive computeChangeCount + greedy assign with Ref pin and (Name, ClassName) fast-paths" - status: completed - - id: rewrite-rust-forward - content: "Rewrite Rust forward sync matching.rs: recursive count_changes + greedy assign using variant_eq" - status: completed - - id: rewrite-rust-syncback - content: "Rewrite Rust syncback matching.rs: recursive count_changes + greedy assign with hash fast-path" - status: completed - - id: verify-tests - content: Run cargo test to verify all 714 tests still pass - status: completed -isProject: false ---- - -# Rewrite Matching Algorithm - -Replace all 3 matching implementations with one recursive scoring function and greedy assignment. - -## matchChildren (entry point, called per parent) - -``` -matchChildren(sideA, sideB, parentA, parentB) -> (matched, unmatchedA, unmatchedB): - - // Fast-path 1: Ref pin (confirmed identity, highest priority) - // Scan parentA and parentB for Ref properties (PrimaryPart, Value, etc.) - // that point to children. If parentA.PrimaryPart = childX on sideA and - // parentB.PrimaryPart = childY on sideB, pin (X, Y) as matched. - // Remove pinned children from sideA/sideB. - for each Ref property name shared by parentA and parentB: - targetA = parentA[refProp] - targetB = parentB[refProp] - if targetA in sideA and targetB in sideB: - match (targetA, targetB) - remove both from sideA/sideB - - // Fast-path 2: Group remaining by (Name, ClassName) - // 1:1 groups get instant-matched with zero scoring. - groups = group sideA and sideB by (Name, ClassName) - for each group: - if exactly 1 on each side: instant match, remove both - - // Ambiguous groups: score + greedy assign - for each group with multiple on at least one side: - pairs = [] - bestSoFar = infinity - for each (A, B) in cross-product of group: // iteration order = child order - cost = computeChangeCount(A, B, bestSoFar) // RECURSIVE, early-exits - pairs.append((cost, A, B)) - if cost < bestSoFar: bestSoFar = cost - - stable sort pairs by cost ascending - // Stable sort preserves insertion order on ties = original child order - greedy assign: pick first unmatched, remove both, repeat - - // Leftovers = new/deleted -``` - -The two fast-paths resolve the vast majority of children with zero scoring. Only truly ambiguous groups (same Name, same ClassName, multiple candidates) ever call `computeChangeCount`. - -## computeChangeCount (recursive scoring function) - -One function. Returns the total number of changes the reconciler would need to make to turn A into B, **including the entire subtree**. - -``` -computeChangeCount(A, B, bestSoFar) -> number: - // Cheap: all own diffs in one shot (flat loops, no branching) - cost = countOwnDiffs(A, B) // properties + tags + attributes - if cost >= bestSoFar: return cost - - // Expensive: recursive children matching - childResult = matchChildren(A.children, B.children, A, B) // RECURSE - for each (childA, childB) in childResult.matched: - cost += computeChangeCount(childA, childB, bestSoFar - cost) - if cost >= bestSoFar: return cost - cost += count(childResult.unmatched) * UNMATCHED_PENALTY - - return cost - -countOwnDiffs(A, B) -> number: - cost = 0 - for each property key in union(A.properties, B.properties): - if values differ or key missing on one side: cost += 1 - for each tag in symmetricDifference(A.Tags, B.Tags): cost += 1 - for each attr key in union(A.Attributes, B.Attributes): - if missing or value differs: cost += 1 - return cost -``` - -`computeChangeCount` and `matchChildren` are **mutually recursive**. Base case: leaf nodes (no children). - -Name and ClassName are NOT in the change count -- the (Name, ClassName) grouping in `matchChildren` already guarantees they match for any pair that reaches `computeChangeCount`. - -## Unmatched Child Penalty - -Each unmatched child (create or delete an entire instance) adds a **large constant** (`UNMATCHED_PENALTY`) to the parent pair's cost. No need to recursively calculate the subtree -- creating/deleting an instance is categorically more expensive than tweaking properties, so a flat constant correctly prioritizes pairings that avoid creates/deletes. - -`UNMATCHED_PENALTY` should be large enough that any number of property diffs on matched children is still cheaper than one unmatched child. A value like `10,000` works (no real instance has 10K properties). - -## Sort Key and Stability - -Sort key is `change_count`, ascending. On ties, original child order is preserved. - -- **Rust:** `slice::sort_by` is stable natively. No extra work needed. -- **Lua:** `table.sort` is NOT stable (Luau uses non-stable quicksort). Use a simple ad-hoc stable sort: pairs are built with their insertion index, and the Lua sort comparator breaks ties by index. Something like `if a.cost == b.cost then return a.idx < b.idx end; return a.cost < b.cost`. - -## Known Limitation: Greedy vs Optimal - -The greedy algorithm (pick lowest-cost pair first) is NOT globally optimal. Edge cases exist where a locally-best pick forces a globally-worse assignment. The Hungarian algorithm (O(N^3)) would give optimal results, but ambiguous groups are typically small (2-10 instances) and the greedy works correctly for the common case. Flagged for revisiting if real-world games hit this edge case. - -## What Counts as a Change (+1 each) - -- **Each differing property:** iterate union of property keys on both sides. Each key where values differ or one side missing = +1. Includes CFrame, Size, Color3, Source, Material, Ref properties (PrimaryPart, Value), everything. Tags and Attributes are excluded from this loop (counted separately below). -- **Tags:** count individual tag operations. Each tag that needs to be added or removed = +1. If A has `{"Foo", "Bar"}` and B has `{"Bar", "Baz"}`, cost = 2 (remove "Foo", add "Baz"). -- **Attributes:** count individual attribute operations. Each attribute that needs to be added, removed, or changed = +1. If A has `{X=1, Y=2}` and B has `{Y=3, Z=4}`, cost = 3 (remove X, change Y, add Z). -- **Recursive children cost:** total from `matchChildren` (matched pair costs + unmatched subtree costs). - -Things NOT in the change count: - -- Name -- grouping guarantees match. -- ClassName -- grouping guarantees match. -- Parent -- structural. - -## Files to Rewrite - -### 1. Lua -- `[plugin/src/Reconciler/matching.lua](plugin/src/Reconciler/matching.lua)` - -Complete rewrite. Three functions: `matchChildren`, `computeChangeCount`, `costOfEntireInstance`. Property comparison via pcall reads from Studio instances vs virtual `.Properties`. Ref pin scans parent's Ref properties. (Name, ClassName) grouping as fast-path. - -### 2. Rust forward sync -- `[src/snapshot/matching.rs](src/snapshot/matching.rs)` - -Complete rewrite. Same three functions. Property comparison using `variant_eq()` from `[src/variant_eq.rs](src/variant_eq.rs)`. Operates on `InstanceSnapshot` vs `RojoTree` instances. - -### 3. Rust syncback -- `[src/syncback/matching.rs](src/syncback/matching.rs)` - -Complete rewrite. Same three functions. Hash-match fast-path: if `new_hash == old_hash`, return 0 without checking properties. Otherwise `variant_eq()` per property. Operates on `WeakDom` instances. - -## What Gets Deleted - -- All multi-pass infrastructure (Pass 1/2/3, `_pass1NameAndClass`, `_pass3Similarity`, etc.) -- `compute_similarity` / `compute_forward_similarity` / `_computeSimilarity` -- `collect_ref_property_targets`, `pass2_ref_discriminators` -- Replaced by: `matchChildren`, `computeChangeCount`, `costOfEntireInstance` - -## Correctness - -- Ref-pinned pairs are pulled out first -- confirmed identity, never wrong -- (Name, ClassName) grouping prevents cross-class or cross-name pairing -- Within ambiguous groups, recursive change counting picks the pair requiring fewest total reconciler operations across the entire subtree -- Child order tiebreaker ensures determinism on equal scores -- Unmatched subtree cost correctly penalizes pairings that cause cascading creates/deletes - diff --git a/.cursor/plans/rojo_syncback_architecture_fix_bc0c13ab.plan.md b/.cursor/plans/rojo_syncback_architecture_fix_bc0c13ab.plan.md deleted file mode 100644 index 0ec1b936..00000000 --- a/.cursor/plans/rojo_syncback_architecture_fix_bc0c13ab.plan.md +++ /dev/null @@ -1,441 +0,0 @@ ---- -name: Rojo Syncback Architecture Fix -overview: Document Rojo's two-way sync architecture and fix the plugin API syncback to properly consult the tree/VFS instead of relying solely on plugin data, preventing duplicate file creation and format mismatches. -todos: - - id: tree-lookup - content: Add tree-based instance lookup in syncback_added_instance() to find existing instances by name+parent before deciding file format - status: completed - - id: use-instigating-source - content: When existing instance found in tree, write to its instigating_source.path instead of creating new file - status: completed - - id: verify-plugin-children-tracking - content: Verify plugin encodeInstance correctly includes/excludes children and test children deletion scenarios - status: completed - - id: test-plugin-cli-parity - content: Create test verifying plugin syncback produces same result as CLI syncback for identical Studio state - status: completed -isProject: false ---- - -# Rojo Syncback Architecture Fix - -## Goal - -Enable perfect two-way synchronization between Roblox Studio and the filesystem via the Rojo plugin, without requiring constant `rojo serve` restarts and manual `rojo syncback` operations. The plugin should accurately keep the project up to date as if running `rojo syncback` from scratch. - -This builds on the [Pull Instances to Rojo Feature](../.cursor/plans/pull_removed_scripts_feature_dd790311.plan.md) which added support for pulling ALL instance types from Studio to Rojo. - ---- - -## Background: How Two-Way Sync Works - -### Original Design (commit a398338) - -The original two-way sync only handled **property updates**: - -``` -Plugin ──[WriteRequest.updated]──> API Server - │ - ▼ - tree_mutation_sender - │ - ▼ - ChangeProcessor.handle_tree_event() - │ - ▼ (for each update) - fs::write(instigating_source.path, new_value) - │ - ▼ - VFS detects file change - │ - ▼ - Tree updated from VFS snapshot -``` - -Key insight: **The tree knows the correct file path via `instigating_source**`. Updates write to that path, preserving the existing file structure. - -The original `/api/write` only handled `updated` instances (property changes). It did NOT handle `added` or `removed` instances - those were delegated to CLI syncback. - -### Extended Design (Pull Instances Feature) - -We extended `/api/write` to handle three types of operations: - - -| Operation | Plugin sends | Server action | -| ---------------------- | ------------------------ | ------------------------------------------------------ | -| **Update** | `WriteRequest.updated[]` | Write to `instigating_source.path` via ChangeProcessor | -| **Pull (create file)** | `WriteRequest.added{}` | Create new files via `syncback_added_instance()` | -| **Pull (delete file)** | `WriteRequest.removed[]` | Delete files via `syncback_removed_instance()` | - - ---- - -## How the Plugin Encodes Instances - -### encodeInstance.lua - -When the plugin sends an instance via "Pull", it uses `encodeInstance()` which: - -1. **Recursively includes ALL children** (lines 247-268) -2. **Filters duplicate-named siblings** (can't reliably sync) -3. **Encodes all properties** (Attributes, Tags, etc.) - -```lua --- From plugin/src/ChangeBatcher/encodeInstance.lua -return { - parent = parentId, - name = instance.Name, - className = instance.ClassName, - properties = properties, - children = children, -- ALL children recursively encoded -} -``` - -### When Plugin Sends Data - - -| Scenario | Plugin action | Data sent | -| -------------------------- | ---------------- | ------------------------------------------- | -| Property edit (Source) | `createPatchSet` | `updated[]` with changed properties only | -| User "Pulls" removed item | `encodeInstance` | `added{}` with FULL instance + all children | -| Instance deleted in Studio | `createPatchSet` | `removed[]` with instance ID | - - ---- - -## The Core Problems - -### Problem 1: Server ignores existing tree state for "added" instances - -When plugin sends an "added" instance, the server decides file format based on `has_children` from the plugin data, NOT the tree state: - -``` -Existing tree: EventService -> instigating_source: "EventService/init.luau" - -Plugin sends: AddedInstance { name: "EventService", children: [...] } - (user pulled it because it appeared as "to delete") - -Current behavior: Creates NEW files at EventService/init.luau - (even though files already exist!) -``` - -### Problem 2: Why items appear as "to delete" when files exist - -If duplicate files exist (e.g., `BombardilloEvent.luau` AND `BombardilloEvent/`): - -1. Rojo can't determine which representation is correct -2. Skips loading these instances ("duplicate-named siblings") -3. Instance exists in Studio but NOT in Rojo tree -4. Appears as "to be deleted" in sync diff -5. User pulls it, creating MORE files -6. Cycle continues - -### Problem 3: Format transitions (children added/removed) - - -| Situation | Expected file format | Current plugin behavior | -| ----------------------------- | -------------------- | ------------------------------------------ | -| ModuleScript with children | `Name/init.luau` | encodeInstance includes children correctly | -| ModuleScript children deleted | `Name.luau` | encodeInstance sends with `children: []` | -| User edits Source only | Keep existing format | Sent as UPDATE, not ADD - works correctly | - - -The UPDATE path (via ChangeProcessor) is correct. The ADD path needs to check tree state first. - ---- - -## The Duplicate Creation Chain - -``` -1. Initial state: EventService/init.luau exists, works fine - -2. Bug triggers: Something creates EventService.luau (duplicate) - - Could be: plugin syncback bug, manual creation, etc. - -3. Rojo startup: Sees duplicate, can't load either - - Warning: "Skipped 2 location(s) with duplicate-named siblings" - -4. Sync diff: EventService appears as "to be deleted" - - (Exists in Studio, not in Rojo tree due to duplicate skip) - -5. User pulls: Plugin sends encodeInstance(EventService) - - Server creates MORE files at EventService/... - -6. Result: Even more duplicates, cycle continues -``` - ---- - -## Architectural Principle: Tree is Source of Truth - -For plugin syncback, the **tree/VFS** should be the source of truth for existing file structure, not: - -- The raw filesystem (our current fix checks this, but it's indirect) -- The plugin data (incomplete/partial) - -### Correct Flow for "Added" Instances - -``` -Plugin sends AddedInstance for "EventService" - │ - ▼ - Does instance already exist in tree at this path? - │ - ┌───────┴───────┐ - ▼ ▼ - YES NO - │ │ - ▼ ▼ - Use tree's Use has_children - instigating_ to decide format - source.path (truly new instance) - │ │ - ▼ ▼ - UPDATE existing CREATE new files - file in place with format based - on children -``` - ---- - -## Files and Their Roles - -### Server-Side (Rust) - - -| File | Role | Status | -| -------------------------------------------------- | ------------------------------- | ----------------------------- | -| [src/web/api.rs](src/web/api.rs) | Plugin API `/api/write` handler | NEEDS FIX: tree lookup | -| [src/change_processor.rs](src/change_processor.rs) | Two-way sync UPDATE handler | OK: uses `instigating_source` | -| [src/syncback/mod.rs](src/syncback/mod.rs) | CLI syncback clean mode | FIXED: filesystem scan | - - -### Plugin-Side (Lua) - - -| File | Role | Status | -| ------------------------------------------------------------------------------------------ | ---------------------------- | ------------------------- | -| [plugin/src/ServeSession.lua](plugin/src/ServeSession.lua) | Orchestrates sync operations | OK: correct flow | -| [plugin/src/ChangeBatcher/encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua) | Encodes instances for pull | OK: includes children | -| [plugin/src/ChangeBatcher/createPatchSet.lua](plugin/src/ChangeBatcher/createPatchSet.lua) | Creates patches for updates | OK: property changes only | - - ---- - -## Detailed Implementation - -### 1. [src/web/api.rs](src/web/api.rs) - Tree Lookup for Added Instances - -**Current approach**: `detect_existing_script_format()` checks raw filesystem - -**Better approach**: Check the tree FIRST - -```rust -fn syncback_added_instance( - &self, - added: &AddedInstance, - tree: &RojoTree, - // ... -) -> anyhow::Result<()> { - let parent_ref = added.parent.context("must have parent")?; - - // NEW: Check if instance already exists in tree - if let Some(existing_ref) = find_child_by_name(tree, parent_ref, &added.name) { - if let Some(existing) = tree.get_instance(existing_ref) { - if let Some(source) = &existing.metadata().instigating_source { - // Instance exists - update in place instead of creating new - return self.syncback_update_existing(added, source.path()); - } - } - } - - // Instance doesn't exist - create new (existing code) - self.syncback_instance_to_path_with_stats(added, &parent_dir, stats) -} - -fn find_child_by_name(tree: &RojoTree, parent: Ref, name: &str) -> Option { - let parent_inst = tree.get_instance(parent)?; - parent_inst.children().iter() - .find(|&&child_ref| { - tree.get_instance(child_ref) - .map(|c| c.name() == name) - .unwrap_or(false) - }) - .copied() -} -``` - -### 2. [src/syncback/mod.rs](src/syncback/mod.rs) - Already Fixed - -The clean mode fix (scanning actual filesystem for `existing_paths`) is correct: - -```rust -// In clean mode, scan the actual filesystem to find ALL existing files -let existing_paths: HashSet = if !incremental { - let mut paths = HashSet::new(); - // Recursively scan source directories - scan_directory(dir, &mut paths, &ignore_patterns, project_path); - paths -} else { - HashSet::new() -}; -``` - -### 3. [src/change_processor.rs](src/change_processor.rs) - No Changes Needed - -The UPDATE path correctly uses `instigating_source`: - -```rust -for (key, changed_value) in &update.changed_properties { - if key == "Source" { - if let Some(InstigatingSource::Path(path)) = &instance.metadata().instigating_source { - fs::write(path, value)?; // Writes to correct existing file - } - } -} -``` - ---- - -## Implementation Tasks - -### Task 1: Tree-Based Instance Lookup (Priority: HIGH) - -**File**: [src/web/api.rs](src/web/api.rs) - -In `syncback_added_instance()`, add tree lookup BEFORE format detection: - -```rust -// Add helper function -fn find_child_by_name(tree: &RojoTree, parent_ref: Ref, name: &str) -> Option { - let parent = tree.get_instance(parent_ref)?; - parent.children().iter() - .find(|&&child_ref| { - tree.get_instance(child_ref) - .map(|c| c.name() == name) - .unwrap_or(false) - }) - .copied() -} - -// In syncback_added_instance(), before filesystem operations: -if let Some(existing_ref) = find_child_by_name(tree, parent_ref, &added.name) { - if let Some(existing) = tree.get_instance(existing_ref) { - if let Some(source) = &existing.metadata().instigating_source { - // Found existing instance - write to its path, don't create new - log::info!("Syncback: Updating existing instance at {}", source.path().display()); - return self.syncback_update_existing_instance(added, existing, source.path()); - } - } -} -// Not found - continue with current new-instance creation logic -``` - -### Task 2: Handle Format Transitions (Priority: MEDIUM) - -When instance has children in tree but plugin sends with empty children: - -**Option A (Conservative - Recommended)**: Preserve existing format - -- If tree has `Name/init.luau`, always update `Name/init.luau` -- User must use CLI syncback for format transitions - -**Option B (Future)**: Add explicit flag - -```rust -pub struct AddedInstance { - // ... existing fields ... - #[serde(default)] - pub force_format_change: bool, // If true, allow format transition -} -``` - -### Task 3: Verify Plugin Children Tracking (Priority: HIGH) - -**File**: [plugin/src/ChangeBatcher/encodeInstance.lua](plugin/src/ChangeBatcher/encodeInstance.lua) - -Create test scenarios: - -1. **ModuleScript with children** - verify `children` array populated -2. **ModuleScript with children deleted** - verify `children: []` -3. **Nested children** - verify recursive encoding -4. **Duplicate siblings** - verify correctly skipped with warning - -Add test file: `plugin/src/ChangeBatcher/encodeInstance.spec.lua` - -### Task 4: Integration Test (Priority: MEDIUM) - -Create end-to-end test: - -``` -1. Setup: - - Create EventService/init.luau with children - - Start rojo serve - -2. Simulate plugin syncback: - - Send AddedInstance for EventService with children - -3. Verify: - - No duplicate files created - - EventService/init.luau updated (not EventService.luau created) - -4. Compare: - - Plugin syncback result == CLI syncback result -``` - ---- - -## Summary of Changes - -### Already Fixed - - -| Issue | Fix | File | -| ----------------------------- | -------------------------------------- | -------------------------------------------------------- | -| reify.lua crash | Gracefully handle missing children IDs | `plugin/src/Reconciler/reify.lua` | -| CLI clean mode misses orphans | Scan actual filesystem | `src/syncback/mod.rs` | -| Plugin creates wrong format | Check filesystem for existing format | `src/web/api.rs` | -| Hidden services marked delete | Expose ignoreHiddenServices to plugin | `src/web/interface.rs`, `plugin/src/Reconciler/diff.lua` | - - -### Still Needed - - -| Issue | Fix | File | -| ------------------------ | -------------------------------------- | ---------------- | -| Ignores tree state | Add tree lookup before format decision | `src/web/api.rs` | -| Duplicate creation cycle | Update existing instead of create new | `src/web/api.rs` | -| Test coverage | Add integration tests | `tests/` | - - ---- - -## Design Principles - -1. **Tree is source of truth** for existing file structure -2. **instigating_source.path** is THE path for an instance's file -3. **New instances** use `has_children` to decide format -4. **Existing instances** always update in place, never create duplicates -5. **Format transitions** only via CLI syncback (safe, explicit) -6. **Clean mode** scans filesystem to remove orphans tree doesn't know about - ---- - -## File Format Reference - -This applies to BOTH plugin syncback AND CLI syncback: - - -| Instance Type | No Children | With Children | -| ----------------- | ------------------ | ----------------------- | -| ModuleScript | `Name.luau` | `Name/init.luau` | -| Script (Server) | `Name.server.luau` | `Name/init.server.luau` | -| Script (Client) | `Name.client.luau` | `Name/init.client.luau` | -| LocalScript | `Name.client.luau` | `Name/init.client.luau` | -| Folder | directory | directory | -| StringValue | `Name.txt` | `Name/init.meta.json5` | -| LocalizationTable | `Name.csv` | `Name/init.csv` | -| Other | `Name.model.json5` | `Name/init.meta.json5` | - - -**Note**: `init.meta.json5` only created if instance has properties (Attributes, etc.) \ No newline at end of file diff --git a/.cursor/plans/rokit_install_audit_fixes_e465275a.plan.md b/.cursor/plans/rokit_install_audit_fixes_e465275a.plan.md deleted file mode 100644 index e02ce9cf..00000000 --- a/.cursor/plans/rokit_install_audit_fixes_e465275a.plan.md +++ /dev/null @@ -1,390 +0,0 @@ ---- -name: Rokit Install Audit Fixes -overview: Fix the EPERM crash when deleting a globally installed atlas.exe, and harden the entire rokit installation pipeline in the VS Code extension for reliability across Windows, macOS, and Linux. -todos: - - id: bug1-elevated-delete - content: Add elevatedDelete() helper and fix the 'Switch to Rokit' flow in openMenu.ts to handle EPERM/EACCES/EBUSY with platform-specific elevation - status: completed - - id: bug2-progress - content: Wrap installRojo() in vscode.window.withProgress() with stage reporting - status: completed - - id: bug3-github-api - content: Replace eryn.io proxy URL with official GitHub API URL in installRojo.ts - status: completed - - id: bug4-temp-cleanup - content: Delete temp rokit binary after successful self-install - status: completed - - id: bug5-path-dedup - content: Deduplicate PATH entry and verify rokit accessibility before rokit add - status: completed - - id: bug6-stream - content: Replace manual stream piping with stream.promises.pipeline() - status: completed - - id: bug7-rokit-add-existing - content: Use 'rokit add --global --force' + 'rokit trust' + verify atlas --version + non-fatal plugin install - status: completed - - id: feat-check-updates - content: Add 'Check for Updates' menu item in openMenu.ts for rokit-managed installs, handle project-level + global rokit update, reinstall Studio plugin after update - status: completed - - id: feat-auto-update-check - content: Add background update check on activation using rokit update --check (once per day, project + global), prompt user with Update button that triggers rokit update + plugin reinstall - status: completed -isProject: false ---- - -# Rokit Installation Audit and Fixes - -## Audit Findings - -### How Rokit Installation Works (No Elevation Needed) - -Rokit installs entirely to `~/.rokit/` (user-level directory). `rokit self-install` modifies user-level PATH environment variables (HKCU on Windows, shell rc files on Unix). **Neither rokit installation nor `rokit add` requires elevation.** - -The only scenario requiring elevation is the "Switch to Rokit" migration flow, which tries to delete an existing globally installed `atlas.exe` from a protected directory like `C:\Program Files\Atlas` (written by [install.ps1](install.ps1)) or `/usr/local/bin/atlas` (written by [install.sh](install.sh)). - -### Issues Found (by severity) - ---- - -**BUG 1 -- CRITICAL: `fs.unlink` fails without elevation, crashes the entire flow** - -In [vscode-rojo/src/commands/openMenu.ts](vscode-rojo/src/commands/openMenu.ts) line 133: - -```typescript -return fs.unlink(install.resolvedPath) -``` - -When atlas.exe is in `C:\Program Files\Atlas` or `/usr/local/bin/`, this throws EPERM/EACCES. The `.then()` error handler on line 139 catches it but just shows a generic message and the flow dies. Additionally, on Windows the exe may be **locked by a running process** (atlas serve), causing EBUSY even with elevation. - -**Fix:** Add an `elevatedDelete()` helper that: - -1. Tries `fs.unlink()` first -2. On EPERM/EACCES, uses platform-specific elevated delete: - - **Windows:** `powershell -Command "Start-Process powershell -ArgumentList '-Command Remove-Item \"path\"' -Verb RunAs -Wait"` (triggers UAC prompt) - - **macOS:** `osascript -e 'do shell script "rm path" with administrator privileges'` (triggers password dialog) - - **Linux:** `pkexec rm path` (triggers PolicyKit dialog) -3. On EBUSY (Windows exe locked), shows a specific error message telling the user to stop atlas serve first - ---- - -**BUG 2 -- HIGH: No progress indicator during installation** - -In [vscode-rojo/src/installRojo.ts](vscode-rojo/src/installRojo.ts) `installRojo()`: - -The entire flow (download rokit zip ~3.5MB, extract, self-install, `rokit add` atlas) runs silently. Users see zero feedback and may think the extension froze. - -**Fix:** Wrap the body of `installRojo()` in `vscode.window.withProgress()` with `ProgressLocation.Notification` and `cancellable: false`. Report progress at each stage: - -- "Downloading Rokit..." -- "Installing Rokit..." -- "Installing Atlas via Rokit..." - ---- - -**BUG 3 -- HIGH: Third-party release URL is a single point of failure** - -In [vscode-rojo/src/installRojo.ts](vscode-rojo/src/installRojo.ts) line 113: - -```typescript -const latestReleaseResponse = await fetch( - "https://latest-github-release.eryn.io/rojo-rbx/rokit", -) -``` - -This third-party proxy (`eryn.io`) is not under our control. If it goes down, installation breaks. The official rokit install scripts use the GitHub API directly. - -**Fix:** Replace with the official GitHub API URL: `https://api.github.com/repos/rojo-rbx/rokit/releases/latest`. Verified: response schema is identical, both return the same `GitHubRelease` shape. Add an `Accept: application/vnd.github+json` header per GitHub API best practice. - ---- - -**BUG 4 -- MEDIUM: Temp files never cleaned up** - -In [vscode-rojo/src/installRojo.ts](vscode-rojo/src/installRojo.ts) line 143-170: - -The rokit binary is downloaded to `os.tmpdir()` but never deleted after `rokit self-install` succeeds. - -**Fix:** Add `fs.promises.unlink(tempPath).catch(() => {})` after the `exec(self-install)` call succeeds. - ---- - -**BUG 5 -- MEDIUM: PATH update is fragile** - -In [vscode-rojo/src/installRojo.ts](vscode-rojo/src/installRojo.ts) lines 177-181: - -```typescript -if ("PATH" in process.env) { - const envPath = process.env.PATH!.split(path.delimiter) - envPath.push(path.join(os.homedir(), ".rokit", "bin")) - process.env.PATH = envPath.join(path.delimiter) -} -``` - -This only updates the extension's own process environment. But the subsequent `rokit add --global` on line 184 runs via `exec()` which inherits this env, so it should work. The concern is: - -- It doesn't check if the path is already present (could add duplicates on repeated attempts) -- The rokit binary path might differ on some systems - -**Fix:** Check for duplicates before appending. Also verify the rokit binary is actually accessible after the PATH update by doing a quick `which("rokit")` check before proceeding to `rokit add`. - ---- - -**BUG 6 -- LOW: Stream error handling is fragile** - -In [vscode-rojo/src/installRojo.ts](vscode-rojo/src/installRojo.ts) lines 51-60, 149-163: - -`promisifyStream` resolves on whichever of "close"/"finish"/"end" fires first. The pipeline/pipe chain has multiple potential failure modes that aren't properly propagated. - -**Fix:** Use `stream.promises.pipeline()` (available in Node 15+, which VS Code ships with) instead of manually piping and tracking events. This gives proper error propagation and backpressure handling. Alternatively, simplify to `await promisify(stream.pipeline)(download.body!, unzipper.ParseOne(), fs.createWriteStream(tempPath))`. - ---- - -**BUG 7 -- HIGH: `rokit add --global` crashes if atlas is already configured** - -In [vscode-rojo/src/installRojo.ts](vscode-rojo/src/installRojo.ts) line 184: - -```typescript -await exec("rokit add --global UserGeneratedLLC/rojo atlas") -``` - -This is the **only** action after rokit is confirmed installed. It fails if atlas is already in the project's `rokit.toml` or already added globally. The scenario: - -1. Project has `rokit.toml` with atlas listed but `rokit install` hasn't been run yet -2. `which("atlas")` finds the rokit shim at `~/.rokit/bin/atlas` -3. `atlas --version` fails (rokit says tool not installed), stderr contains "rokit" -> `getRojoInstall` returns null -4. User sees "Install Atlas now", clicks it -5. `isRokitInstalled()` returns true (skips rokit download) -6. `rokit add --global` fails because atlas is already configured -> **onboarding dies** - -**Fix:** Use `--force` to handle "already exists", trust the tool, then verify and install the plugin: - -```typescript -await exec("rokit add --global --force UserGeneratedLLC/rojo atlas") -await exec("rokit trust UserGeneratedLLC/rojo") -await exec("atlas --version") - -// Install the Studio plugin (non-fatal -- don't crash onboarding if Studio isn't installed) -try { - await exec("atlas plugin install") -} catch (e: any) { - vscode.window.showWarningMessage( - `Atlas installed successfully, but the Studio plugin could not be installed: ${e.stderr || e}. ` + - `You can install it later from the Atlas menu or by running "atlas plugin install".` - ) -} -``` - -- `--force` on `rokit add` handles the "already exists" case cleanly -- no try/catch needed, it re-adds/updates regardless -- `rokit trust` marks `UserGeneratedLLC/rojo` as trusted so rokit won't prompt the user for confirmation when running atlas (without trust, `rokit install` and first-run shims can block waiting for user input) -- `atlas --version` verifies the tool is actually usable after add -- `atlas plugin install` writes the embedded Studio plugin to disk (non-fatal if Studio isn't installed yet) - ---- - ---- - -**FEATURE: "Check for Updates" menu item for Rokit-managed installs** - -In [vscode-rojo/src/commands/openMenu.ts](vscode-rojo/src/commands/openMenu.ts), the `generateProjectMenu()` return array (line 315) has action items like Studio, Syncback, Sourcemap, Install Plugin. There is no way to update Atlas from the extension. - -`generateProjectMenu()` already tracks `installType` (line 168) and whether it's `InstallType.rokit`. We use this to conditionally show the item. - -**Implementation:** - -1. Add a menu item in `generateProjectMenu()` return array, conditionally included when `installType === InstallType.rokit`: - -```typescript -...(installType === InstallType.rokit - ? [ - { - label: "$(sync) Check for Updates", - description: `Atlas v${allRojoVersions[0]}`, - action: "checkUpdates", - projectFile: projectFiles[0], - }, - ] - : []), -``` - -1. Add `"checkUpdates"` case in the `onDidAccept` handler (after the `"install"` case). The handler needs to support both project-level `rokit.toml` and global installations: - -```typescript -case "checkUpdates": { - if (!selectedItem.projectFile) return - const updateFolder = path.dirname(selectedItem.projectFile.path.fsPath) - - input.hide() - - await vscode.window.withProgress( - { location: vscode.ProgressLocation.Notification, title: "Checking for Atlas updates..." }, - async (progress) => { - // Try project-level update first, fall back to global - let updateOutput: string - try { - const result = await exec("rokit update atlas", { cwd: updateFolder }) - updateOutput = result.stdout || result.stderr - } catch { - try { - const result = await exec("rokit update --global atlas") - updateOutput = result.stdout || result.stderr - } catch (e: any) { - vscode.window.showErrorMessage(`Could not update Atlas: ${e.stderr || e}`) - return - } - } - - // Re-install the Studio plugin so it matches the new binary. - // The plugin is embedded in the atlas binary at compile time - // (include_bytes! in src/cli/plugin.rs), so updating the binary - // without re-installing leaves a stale AtlasManagedPlugin.rbxm - // in Studio's plugins folder. Mismatched versions break live sync - // due to protocol version enforcement. - progress.report({ message: "Reinstalling Studio plugin..." }) - try { - await exec("atlas plugin install") - } catch (e: any) { - vscode.window.showWarningMessage( - `Atlas updated, but plugin reinstall failed: ${e.stderr || e}. ` + - `Run "atlas plugin install" manually to avoid version mismatch.` - ) - } - - vscode.window.showInformationMessage(updateOutput.trim() || "Atlas is up to date.") - }, - ) - break -} -``` - -The strategy: try `rokit update atlas` in the project directory first. If atlas isn't in the project's `rokit.toml`, this fails and we fall back to `rokit update --global atlas`. Rokit's output tells the user whether an update was applied or they're already current. - -After a successful update, immediately runs `atlas plugin install` to overwrite the stale `AtlasManagedPlugin.rbxm` in Studio's plugins folder. The plugin is baked into the atlas binary via `include_bytes!` at compile time (`src/cli/plugin.rs:12`), so the `.rbxm` in Studio never auto-updates -- it must be explicitly reinstalled. If the plugin reinstall fails (e.g. Studio not installed), a warning is shown with manual instructions rather than failing the whole update. - ---- - -**FEATURE: Background update check on extension activation** - -In [vscode-rojo/src/extension.ts](vscode-rojo/src/extension.ts) `activate()`: - -Rokit has `rokit update atlas --check` which checks for updates without installing. Supports both project-level (`rokit update atlas --check` in the project dir, reads `rokit.toml`) and global (`rokit update --global atlas --check`). - -**Implementation:** Add a new file `vscode-rojo/src/checkForUpdates.ts` with a `checkForAtlasUpdates(context)` function, called fire-and-forget from `activate()`: - -```typescript -export async function checkForAtlasUpdates(context: vscode.ExtensionContext) { - // Throttle: once per day - const lastCheck = context.globalState.get("atlas::lastUpdateCheck") - const ONE_DAY = 24 * 60 * 60 * 1000 - if (lastCheck && Date.now() - lastCheck < ONE_DAY) return - - // Check if rokit is available - const rokitPath = await which("rokit").catch(() => null) - if (!rokitPath) return - - const workspaceFolder = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath - - // rokit update --check prints update info if available, or "up to date" if current. - // Check both project-level and global. - let checkOutput: string | null = null - let updateScope: "project" | "global" = "global" - - // Try project-level first (if workspace is open) - if (workspaceFolder) { - try { - const result = await exec("rokit update atlas --check", { cwd: workspaceFolder }) - const output = (result.stdout + result.stderr).trim() - if (output && !output.toLowerCase().includes("up to date")) { - checkOutput = output - updateScope = "project" - } - } catch { - // atlas not in project rokit.toml -- fall through - } - } - - // Try global if no project-level update found - if (!checkOutput) { - try { - const result = await exec("rokit update --global atlas --check") - const output = (result.stdout + result.stderr).trim() - if (output && !output.toLowerCase().includes("up to date")) { - checkOutput = output - updateScope = "global" - } - } catch { - // atlas not installed globally via rokit - } - } - - context.globalState.update("atlas::lastUpdateCheck", Date.now()) - - if (!checkOutput) return - - const choice = await vscode.window.showInformationMessage( - `An Atlas update is available. ${checkOutput}`, - "Update", - "Dismiss", - ) - - if (choice !== "Update") return - - await vscode.window.withProgress( - { location: vscode.ProgressLocation.Notification, title: "Updating Atlas..." }, - async (progress) => { - try { - if (updateScope === "project" && workspaceFolder) { - await exec("rokit update atlas", { cwd: workspaceFolder }) - } else { - await exec("rokit update --global atlas") - } - } catch (e: any) { - vscode.window.showErrorMessage(`Could not update Atlas: ${e.stderr || e}`) - return - } - - progress.report({ message: "Reinstalling Studio plugin..." }) - try { - await exec("atlas plugin install") - } catch { - vscode.window.showWarningMessage( - "Atlas updated, but Studio plugin reinstall failed. Run 'atlas plugin install' manually.", - ) - } - - vscode.window.showInformationMessage("Atlas updated successfully.") - }, - ) -} -``` - -Called from `activate()` as fire-and-forget (no `await`) so it never blocks extension startup: - -```typescript -// In activate(), after all synchronous setup is done: -checkForAtlasUpdates(context).catch(() => {}) -``` - -Key design decisions: - -- **Uses `rokit update --check`**: Lets rokit handle version resolution natively -- no GitHub API calls, no manual semver parsing -- **Project-level first, then global**: Checks the project's `rokit.toml` first (if workspace is open), falls back to global. When updating, uses the same scope that found the update -- **Throttle**: Once per day via `globalState`, so frequent restarts don't spam the user -- **Silent failures**: Every step is wrapped in try/catch that returns early. Missing rokit, no atlas configured, network errors -- all silently ignored -- **Non-blocking**: Called without `await` so extension activation is never delayed - ---- - -### Summary of What's Working Correctly - -- Asset name regex (`-(?\w+)-(?\w+)\.zip$`) correctly matches all 6 rokit 1.2.0 release assets (linux/macos/windows x x86_64/aarch64, all `.zip`) -- Platform/arch mapping covers all common Node.js platforms (win32, darwin, linux) and architectures (x64, arm64) -- `rokit self-install` correctly sets up `~/.rokit/bin` in user PATH on all platforms -- `chmod 0o755` is correctly applied on Unix after extraction -- `getRojoInstall` correctly detects rokit-managed vs globally installed atlas - -## Files to Change - -- [vscode-rojo/src/installRojo.ts](vscode-rojo/src/installRojo.ts) -- Bugs 2, 3, 4, 5, 6, 7 -- [vscode-rojo/src/commands/openMenu.ts](vscode-rojo/src/commands/openMenu.ts) -- Bug 1, Check for Updates menu item -- [vscode-rojo/src/checkForUpdates.ts](vscode-rojo/src/checkForUpdates.ts) -- NEW: background update check logic -- [vscode-rojo/src/extension.ts](vscode-rojo/src/extension.ts) -- Call checkForAtlasUpdates() on activation - diff --git a/.cursor/plans/schema_struct_refactor_6dddb54b.plan.md b/.cursor/plans/schema_struct_refactor_6dddb54b.plan.md deleted file mode 100644 index 0233f1f2..00000000 --- a/.cursor/plans/schema_struct_refactor_6dddb54b.plan.md +++ /dev/null @@ -1,277 +0,0 @@ ---- -name: Schema struct refactor -overview: Replace the ~150-line hand-written JSON Schema blob in `handle_tools_list` with `schemars::JsonSchema`-derived arg structs and a `tool_def()` helper, matching the studio-rust-mcp-server pattern. -todos: - - id: add-schemars - content: Add schemars = "1" to Cargo.toml dependencies - status: completed - - id: define-arg-structs - content: Define JsonSchema arg structs/enums for all 8 tools in mcp.rs, add JsonSchema to SyncOverride - status: completed - - id: tool-def-helper - content: "Create tool_def() helper function" - status: completed - - id: replace-tools-list - content: Replace handle_tools_list JSON blob with tool_def calls - status: completed - - id: update-tests - content: Update tool_schema_tests and handler_tests for schemars-generated schemas - status: completed -isProject: false ---- - -# Refactor `handle_tools_list` to Use `schemars` Struct-Derived Schemas - -## Problem - -`handle_tools_list` in [src/web/mcp.rs](src/web/mcp.rs) (lines 297-448) is a ~150-line hand-written `serde_json::json!` blob with manually maintained `inputSchema` objects for all 8 tools. Adding or modifying tool parameters requires editing nested JSON, which is error-prone and hard to review. - -The studio-rust-mcp-server solves this with `#[derive(schemars::JsonSchema)]` on arg structs -- the struct definition IS the schema. That's what we want here. - -## Approach - -Add `schemars` (v1, matching studio-rust-mcp-server) and define arg structs per tool. A `tool_def()` helper generates the full tool entry from (name, description, schema). The existing `SyncOverride` struct gets `JsonSchema` added to its derives. - -### Before (current) - -```rust -fn handle_tools_list(id: Option) -> Response> { - let result = serde_json::json!({ - "tools": [ - { - "name": "run_code", - "description": include_str!("mcp_docs/run_code.md"), - "inputSchema": { - "type": "object", - "properties": { - "command": { - "type": "string", - "description": "Luau code to execute..." - } - }, - "required": ["command"] - } - }, - // ... 7 more tools, ~20 lines each ... - ] - }); -} -``` - -### After (target) - -```rust -#[derive(JsonSchema)] -struct RunCodeArgs { - /// Luau code to execute in Roblox Studio. - command: String, -} - -fn handle_tools_list(id: Option) -> Response> { - let tools = vec![ - tool_def::("run_code", include_str!("mcp_docs/run_code.md")), - // ... 7 more, one line each ... - ]; - // ... -} -``` - -## Changes - -### 1. Add `schemars` dependency - -In [Cargo.toml](Cargo.toml), add after the `serde_json` line (line 93): - -```toml -schemars = "1" -``` - -### 2. Define arg structs and enums - -In [src/web/mcp.rs](src/web/mcp.rs), add after the existing `PluginToolResult` struct. These are schema-only structs -- they define the shape of each tool's arguments. `schemars` reads `#[doc = "..."]` comments as JSON Schema `description` fields. - -```rust -use schemars::JsonSchema; - -#[derive(JsonSchema)] -#[schemars(rename_all = "camelCase")] -struct AtlasSyncArgs { - /// Sync mode. 'standard' (default): auto-accept if all changes are - /// git-resolved, otherwise show Studio UI. 'manual': always show - /// Studio UI. 'fastfail': fail immediately if any changes are - /// unresolved. 'dryrun': return what would change without applying. - mode: Option, - /// Auto-accept directives for specific instance changes, matched - /// by id from a previous sync response. - overrides: Option>, -} - -#[derive(JsonSchema)] -#[schemars(rename_all = "snake_case")] -enum SyncMode { - Standard, - Manual, - Fastfail, - Dryrun, -} - -#[derive(JsonSchema)] -#[schemars(rename_all = "camelCase")] -struct GetScriptArgs { - /// Server Ref (32-char hex) from a previous atlas_sync response. - /// Preferred over fsPath. - id: Option, - /// Atlas filesystem path relative to project root - /// (e.g. 'src/server/MyScript.server.luau'). Resolved server-side - /// to an instance id. - fs_path: Option, - /// If true, read unsaved editor content instead of the saved Source - /// property. Default: false. - from_draft: Option, -} - -#[derive(JsonSchema)] -struct RunCodeArgs { - /// Luau code to execute in Roblox Studio. - command: String, -} - -#[derive(JsonSchema)] -struct InsertModelArgs { - /// Search query for the model on the Roblox Creator Store. - query: String, -} - -#[derive(JsonSchema)] -struct NoArgs {} - -#[derive(JsonSchema)] -#[schemars(rename_all = "snake_case")] -enum StartStopPlayMode { - StartPlay, - RunServer, - Stop, -} - -#[derive(JsonSchema)] -struct StartStopPlayArgs { - /// Play mode action. - mode: StartStopPlayMode, -} - -#[derive(JsonSchema)] -#[schemars(rename_all = "snake_case")] -enum PlayTestMode { - StartPlay, - RunServer, -} - -#[derive(JsonSchema)] -struct RunScriptInPlayModeArgs { - /// Luau code to run inside a play session. - code: String, - /// Timeout in seconds. Defaults to 100. - timeout: Option, - /// Play mode to start. - mode: PlayTestMode, -} -``` - -Also add `JsonSchema` to the existing `SyncOverride` struct (line ~29). It already has `Serialize, Deserialize` with `#[serde(rename_all = "camelCase")]` which schemars will pick up: - -```rust -#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)] -#[serde(rename_all = "camelCase")] -pub struct SyncOverride { ... } -``` - -### 3. Create `tool_def` helper - -```rust -fn tool_def(name: &str, description: &str) -> Value { - let schema = schemars::schema_for!(T); - let mut schema_value = serde_json::to_value(schema).unwrap_or_default(); - if let Some(obj) = schema_value.as_object_mut() { - obj.remove("$schema"); - obj.remove("title"); - } - serde_json::json!({ - "name": name, - "description": description, - "inputSchema": schema_value, - }) -} -``` - -Note: `schema_for!` is a macro so it works with concrete types. We call `tool_def::(...)` etc. If schemars 1.x doesn't support `schema_for!` in this context, use `SchemaGenerator::default().into_root_schema_for::()` instead. - -### 4. Replace `handle_tools_list` body - -The 150-line JSON blob becomes: - -```rust -fn handle_tools_list(id: Option) -> Response> { - let tools = vec![ - tool_def::("atlas_sync", include_str!("mcp_docs/atlas_sync.md")), - tool_def::("get_script", include_str!("mcp_docs/get_script.md")), - tool_def::("run_code", include_str!("mcp_docs/run_code.md")), - tool_def::("insert_model", include_str!("mcp_docs/insert_model.md")), - tool_def::("get_console_output", include_str!("mcp_docs/get_console_output.md")), - tool_def::("get_studio_mode", include_str!("mcp_docs/get_studio_mode.md")), - tool_def::("start_stop_play", include_str!("mcp_docs/start_stop_play.md")), - tool_def::("run_script_in_play_mode", include_str!("mcp_docs/run_script_in_play_mode.md")), - ]; - - let result = serde_json::json!({ "tools": tools }); - let resp = JsonRpcResponse::success(id, result); - json_response(&resp, StatusCode::OK) -} -``` - -### 5. Update tests - -The `tool_schema_tests` module tests check for specific schema structures (e.g. `["inputSchema"]["required"]`, `["inputSchema"]["properties"]["mode"]["enum"]`). The schemars-generated schemas should produce the same logical structure: - -- Required fields (non-`Option`) -> appears in `required` array -- `Option` fields -> absent from `required` -- Enums with `rename_all = "snake_case"` -> `{"enum": ["start_play", ...]}` -- String fields -> `{"type": "string"}` -- `u32` -> `{"type": "integer"}` (or `{"type": "integer", "minimum": 0}`) - -The tests may need minor adjustments depending on exact schemars output: - -- schemars may add `"format": "uint32"` to the `timeout` field -- schemars may produce `"required"` as absent (not `null`) for empty-args tools -- current test checks `is_null()`, may need to check `is_null() || required.is_empty()` -- Enum schemas might be nested under `$defs` with `$ref` -- if so, configure `schemars` to inline subschemas - -The `handler_tests::tools_list_returns_all_tools` and `get_script_tests::tools_list_includes_get_script` tests check tool count and presence -- those should pass unchanged. - -## What stays the same - -### `.md` tool descriptions (our improvement) - -The studio-rust-mcp-server uses inline `#[doc = include_str!("run_code.md")]` on the tool method. We use `include_str!("mcp_docs/.md")` in the `tool_def` call. Same `include_str!` pattern, but our `.md` files are more comprehensive (workflow guidance, response formats, conflict resolution steps). This is our improvement over their version and stays as-is. - -### Error handling (already equivalent) - -Our error handling already mirrors the studio-rust-mcp-server's rmcp pattern: - - -| Our pattern | Their rmcp equivalent | When used | -| ----------------------------------------- | ---------------------------------------------------- | -------------------------------------------------------- | -| `tool_response(id, false, text)` | `CallToolResult::success(vec![Content::text(text)])` | Tool completed successfully | -| `tool_response(id, true, msg)` | `CallToolResult::error(vec![Content::text(msg)])` | Recoverable tool error (tells the agent what went wrong) | -| `JsonRpcResponse::error(id, -32602, msg)` | `ErrorData::invalid_params(msg, None)` | Protocol-level error (bad params, unknown tool) | - - -No changes needed here. Their `error.rs` is a `color_eyre`/axum wrapper that doesn't apply to our hyper-based architecture. - -### No file separation - -All tool definitions, arg structs, and the `tool_def` helper stay in [src/web/mcp.rs](src/web/mcp.rs). We do not split into one-file-per-tool like the studio-rust-mcp-server does -- we only have 8 tools and the overhead of separate files isn't justified. - -## Files changed - -- [Cargo.toml](Cargo.toml) -- add `schemars = "1"` -- [src/web/mcp.rs](src/web/mcp.rs) -- add `JsonSchema` import, arg structs, `tool_def` helper, replace `handle_tools_list` body, add `JsonSchema` derive to `SyncOverride`, update tests - diff --git a/.cursor/plans/script_index_pruning_999b5d04.plan.md b/.cursor/plans/script_index_pruning_999b5d04.plan.md deleted file mode 100644 index 51b099cb..00000000 --- a/.cursor/plans/script_index_pruning_999b5d04.plan.md +++ /dev/null @@ -1,371 +0,0 @@ ---- -name: Script index pruning -overview: "Scripts-only mode: add script index to RojoTree for fast server-side pruning, send syncScriptsOnly to plugin so it skips non-script two-way sync work, and add server-side defense filtering on write. Comprehensive test fixtures for all paths." -todos: - - id: script-index - content: "Add `script_refs: HashSet` to `RojoTree` and maintain it in `insert_instance()`, `remove()`, `new()`" - status: completed - - id: class-change - content: Handle ClassName changes in `apply_update_child()` with `update_script_tracking()` - status: completed - - id: optimize-read - content: Rewrite `handle_api_read` scripts-only path to use script index + ancestor walk - status: completed - - id: server-info - content: Add `syncScriptsOnly` to ServerInfoResponse and populate from project config - status: completed - - id: ws-inject-ancestors - content: Fix filter_subscribe_message_for_scripts to inject missing ancestor instances when a new script appears in a previously-pruned subtree - status: completed - - id: plugin-filter - content: "Plugin: skip non-script instances in ChangeBatcher when syncScriptsOnly is true" - status: completed - - id: plugin-descendant-added - content: "Plugin: connect DescendantAdded on synced services to detect new scripts created in Studio outside the mapped tree" - status: completed - - id: server-write-filter - content: "Server: filter non-script updates in handle_api_write when scripts-only mode" - status: completed - - id: tests - content: "Add test fixtures: read-API pruning, WebSocket ancestor injection, write-API filtering, new-script-in-pruned-subtree" - status: completed - - id: cleanup - content: Remove now-unused `collect_scripts_and_ancestors` helper, share `is_script_class` - status: completed -isProject: false ---- - -# Scripts-Only Mode: Full Pruning (Server + Plugin) - -## Problem - -When `syncScriptsOnly` is enabled: - -1. **Server read path**: `handle_api_read` walks the entire descendant tree (O(n)) just to find scripts -- wasteful for large places with 100K+ non-script instances. -2. **Plugin two-way sync**: Plugin has no knowledge of scripts-only mode. It batches and sends property changes for non-script ancestor containers back to the server, which processes them unnecessarily. -3. **Server write path**: `handle_api_write` processes all incoming updates regardless of scripts-only mode -- no defense-in-depth filtering. - -## Solution - -Three-pronged approach: - -- **Server**: Script index on `RojoTree` for O(scripts * depth) reads, filter writes -- **Plugin**: Receive `syncScriptsOnly` flag, skip non-script instances in `ChangeBatcher` -- **Tests**: Fixtures verifying pruning in read, WebSocket, write, and plugin paths - ---- - -## Part 1: Server-Side Script Index - -### 1a. Add script index to `RojoTree` ([src/snapshot/tree.rs](src/snapshot/tree.rs)) - -- Add `script_refs: HashSet` field to `RojoTree` (alongside `path_to_ids`, `specified_id_to_refs`) -- Initialize in `RojoTree::new()` -- `**insert_instance()`**: after inserting, if `is_script_class(class_name)` then `self.script_refs.insert(referent)` (recursive children handled by the recursive call) -- `**remove()`**: `self.script_refs.remove(&id)` in the existing descendant cleanup loop -- Add `pub fn script_refs(&self) -> &HashSet` accessor -- Add `pub(crate) fn update_script_tracking(&mut self, id: Ref, old_class: &str, new_class: &str)` for ClassName changes -- Add `pub(crate) fn is_script_class(class_name: &str) -> bool` free function (shared by `tree.rs` and `api.rs`) - -### 1b. Handle ClassName changes ([src/snapshot/patch_apply.rs](src/snapshot/patch_apply.rs)) - -In `apply_update_child()` (line 270), when `changed_class_name` is present: - -- Capture old class name before the mutable borrow begins -- After mutable borrow is dropped, call `tree.update_script_tracking(id, &old_class, new_class.as_str())` - -### 1c. Optimize `handle_api_read` ([src/web/api.rs](src/web/api.rs) lines 3103-3138) - -Replace the two-pass full-tree walk with script-index-based ancestor walk: - -```rust -let all_scripts = tree.script_refs(); -let mut included_ids: HashSet = HashSet::new(); -let requested_set: HashSet = requested_ids.iter().copied().collect(); - -for &script_id in all_scripts { - let mut chain = Vec::new(); - let mut current = script_id; - let mut is_descendant = false; - - while let Some(inst) = tree.get_instance(current) { - if included_ids.contains(¤t) { - is_descendant = true; - break; - } - if requested_set.contains(¤t) { - is_descendant = true; - chain.push(current); - break; - } - chain.push(current); - let parent = inst.parent(); - if parent.is_none() { break; } - current = parent; - } - - if is_descendant { - included_ids.extend(chain); - } -} - -for &id in &included_ids { - if let Some(instance) = tree.get_instance(id) { - instances.insert(id, instance_for_scripts_only(instance, &included_ids)); - } -} -``` - -### 1d. Fix WebSocket ancestor injection ([src/web/api.rs](src/web/api.rs) `filter_subscribe_message_for_scripts`) - -**Bug**: When a new script appears on disk inside a previously-pruned subtree, the WebSocket patch contains only the new script in `msg.added`. The function walks up the parent chain and adds ancestors to `included_ids`, but line 3574 only **retains** from `msg.added`. Ancestors that already exist in the tree (but are NOT in the plugin's InstanceMap because they were pruned) are never sent. The plugin receives an orphaned script with an unknown parent. - -**Fix**: After building `included_ids`, inject missing ancestors from the tree into `msg.added`: - -```rust -// After: msg.added.retain(|id, _| included_ids.contains(id)); - -// Inject ancestors that the plugin may not have (they exist in the tree -// but weren't part of this patch). Without this, a new script in a -// previously-pruned subtree arrives with an unknown parent. -for &id in &included_ids { - if !msg.added.contains_key(&id) { - if let Some(tree_inst) = tree.get_instance(id) { - let inst = instance_for_scripts_only(tree_inst, &included_ids); - msg.added.insert(id, inst); - } - } -} -``` - -The Reconciler handles redundant ancestors gracefully (matches them to existing Studio instances via the matching algorithm), so injecting an ancestor the plugin already has is harmless. - -### 1e. Filter writes in `handle_api_write` ([src/web/api.rs](src/web/api.rs) line 447) - -When `sync_scripts_only()` is true, filter incoming `WriteRequest`: - -- `**updated**`: Retain only updates where `tree.get_instance(id)` is a script class -- `**added**`: Allow all (scripts + children of scripts are valid additions) -- `**removed**`: Allow all (plugin should only send script removals, but let server handle gracefully) - -Defense-in-depth -- the plugin should already filter, but the server shouldn't blindly trust client data. - ---- - -## Part 2: Server-to-Plugin Communication - -### 2a. Add `syncScriptsOnly` to ServerInfoResponse ([src/web/interface.rs](src/web/interface.rs) line 260) - -Add new field after `sync_source_only`: - -```rust -#[serde(default)] -pub sync_scripts_only: bool, -``` - -### 2b. Populate from project config ([src/web/api.rs](src/web/api.rs) line 395) - -In `handle_api_rojo()`, add: - -```rust -sync_scripts_only: self.serve_session.sync_scripts_only(), -``` - -The accessor already exists at `serve_session.rs` line 501. - ---- - -## Part 3: Plugin-Side Filtering - -### 3a. Store flag in ServeSession ([plugin/src/ServeSession.lua](plugin/src/ServeSession.lua)) - -In `__computeInitialPatch` where `serverInfo` is received (line 619): - -```lua -self.__syncScriptsOnly = serverInfo.syncScriptsOnly or false -self.__changeBatcher:setSyncScriptsOnly(self.__syncScriptsOnly) -``` - -### 3b. Filter in ChangeBatcher ([plugin/src/ChangeBatcher/init.lua](plugin/src/ChangeBatcher/init.lua)) - -Add `__syncScriptsOnly` field. In `add()` (line 120), early return for non-script instances: - -```lua -function ChangeBatcher:add(instance, propertyName) - if self.__syncScriptsOnly and not instance:IsA("LuaSourceContainer") then - return - end - -- ... existing code ... -end -``` - -Using `IsA("LuaSourceContainer")` is the idiomatic Roblox way to check Script/LocalScript/ModuleScript (it catches all three and any future subclasses). - -Add `setSyncScriptsOnly()` method: - -```lua -function ChangeBatcher:setSyncScriptsOnly(value) - self.__syncScriptsOnly = value -end -``` - -### 3c. Detect new scripts created in Studio ([plugin/src/ServeSession.lua](plugin/src/ServeSession.lua)) - -**Problem**: The plugin only connects `Changed` signals on instances in its InstanceMap. If a user creates a new Script inside a container that was pruned (no scripts), the plugin has zero signals on that container and the new script goes undetected. The plugin doesn't use `DescendantAdded` anywhere today. - -**Fix**: When `syncScriptsOnly` is true, connect `DescendantAdded` on each synced service root. When a new `LuaSourceContainer` appears outside the mapped tree, encode it and its unmapped ancestor chain as additions and send via the write API. - -**Key insight**: `syncback_added_instance` ([src/web/api.rs](src/web/api.rs) line 1097) already has **upsert logic** -- it checks `find_child_by_name` and updates in place if the instance already exists in the tree (returns `Ok(true)` to skip PatchAdd). This means the plugin can send intermediate containers as "additions" and the server won't create duplicates. - -**Plugin implementation** (in `ServeSession.lua`, after initial sync): - -```lua -if self.__syncScriptsOnly then - for id, instance in self.__instanceMap.fromIds do - if instance.Parent == game then - local conn = instance.DescendantAdded:Connect(function(descendant) - if not self.__twoWaySync then return end - if not descendant:IsA("LuaSourceContainer") then return end - if self.__instanceMap.fromInstances[descendant] then return end - - local chain = {} -- unmapped ancestors, ordered parent-first - local current = descendant.Parent - while current and current ~= game do - if self.__instanceMap.fromInstances[current] then - break - end - table.insert(chain, 1, current) - current = current.Parent - end - - local mappedParent = current - local mappedParentId = self.__instanceMap.fromInstances[mappedParent] - if not mappedParentId then return end - - local patch = PatchSet.newEmpty() - local prevParentId = mappedParentId - - -- Intermediate containers: skeleton only (className, name, parent). - -- No properties -- the server already has these instances on disk. - -- Sending properties would trigger syncback_update_existing_instance - -- which writes to disk, risking round-trip identity violations. - for _, intermediate in chain do - local tempId = HttpService:GenerateGUID() - patch.added[tempId] = { - parent = prevParentId, - name = intermediate.Name, - className = intermediate.ClassName, - properties = {}, - children = {}, - } - self.__instanceMap:insert(tempId, intermediate) - prevParentId = tempId - end - - -- The script itself gets full encoding (Source, etc.) - local scriptTempId = HttpService:GenerateGUID() - patch.added[scriptTempId] = encodeInstance(descendant, prevParentId) - self.__instanceMap:insert(scriptTempId, descendant) - - self.__apiContext:write(patch) - end) - table.insert(self.__connections, conn) - end - end -end -``` - -**Round-trip identity**: Intermediate containers are sent as skeletons (className + name only, empty properties). The server's upsert logic (`syncback_added_instance` line 1097) matches them by name to existing tree instances and returns `Ok(true)` to skip file creation. For non-script types with empty properties, the upsert at line 1370 (`if !added.properties.is_empty()`) skips the meta-file write entirely. This ensures the filesystem is NOT modified for containers that already exist. Only the new script file gets written. - -**Server-side handling**: No new server code needed. The existing upsert handles intermediate containers without creating duplicates or modifying existing files. The new script gets created as a new file. The VFS watcher picks up the new file, the tree updates, and subsequent WebSocket patches include the script normally. - -**After the write completes**: The server broadcasts a patch that includes the new script. The plugin receives it and the InstanceMap gets updated with the real server-assigned Ref (the temp ID was for the write request only -- the server's applied patch uses its own Refs). The plugin's InstanceMap may briefly have stale temp IDs, but the next patch from the server will replace them via hydration. - -**Note**: The server side already handles the reverse direction: when a script file is created on disk in a pruned subtree, the VFS watcher picks it up, adds it to the tree and `script_refs`, and the WebSocket path (with the 1d ancestor injection fix) correctly sends it to the plugin. - ---- - -## Part 4: Test Fixtures - -### 4a. New test fixture: `rojo-test/serve-tests/scripts_only_read_pruning/` - -Project with scripts at various depths mixed with non-script instances. Tests that `GET /api/read` only returns scripts and their ancestors -- verifies the script index produces correct results. - -``` -default.project.json5 (syncScriptsOnly: true) -src/ - TopScript.server.luau - DeepNest/ - Middle/ - DeepScript.luau - PureParts/ - PartA.model.json5 - PartB.model.json5 - MixedFolder/ - SomeScript.luau - SomeModel.model.json5 -``` - -**Test assertions:** - -- Read response includes `TopScript`, `DeepScript`, `SomeScript` and their ancestor containers -- Read response does NOT include `PartA`, `PartB`, `SomeModel`, or the `PureParts` folder -- All included non-script ancestors have `ignoreUnknownInstances: true` and empty properties -- Instance count matches expected (scripts + ancestors only) - -### 4b. New tests in `tests/tests/serve.rs` (or `syncback_format_transitions.rs`) - -- `**scripts_only_read_prunes_non_script_subtrees`**: Verify read response excludes entire `PureParts/` subtree -- `**scripts_only_read_includes_deep_ancestors`**: Verify deeply nested scripts pull in full ancestor chain -- `**scripts_only_websocket_injects_ancestors_for_new_script`**: Create a new script file on disk inside a previously-pruned subtree (`PureParts/NewScript.luau`), verify the WebSocket message includes both the new script AND the `PureParts` ancestor container -- `**scripts_only_websocket_prunes_non_script_patches`**: Add a non-script file on disk, verify WebSocket message filters it out -- `**scripts_only_write_rejects_non_script_updates`**: POST an update for a non-script instance, verify it's filtered/ignored -- `**scripts_only_serverinfo_flag**`: Verify `GET /api/rojo` includes `syncScriptsOnly: true` - -### 4c. Existing fixture enhancement - -The existing `rojo-test/serve-tests/syncback_scripts_only/` fixture already has `NonScriptModel.model.json5`. Existing tests focus on syncback write behavior. Add a new test using this fixture that verifies `NonScriptModel` is absent from the read response. - ---- - -## Mode Transitions (Stop Server -> Toggle syncScriptsOnly -> Restart) - -This works with zero plugin-side mode-switching logic. The transitions are inherently safe because: - -1. `App:endSession()` calls `serveSession:stop()` -> `instanceMap:stop()` which **removes ALL mappings** -2. `App:startSession()` creates a **brand new** `ServeSession` with a fresh `InstanceMap` and `ChangeBatcher` -3. The fresh session calls `start()` -> `GET /api/rojo` (receives `syncScriptsOnly` flag) -> `GET /api/read` (receives pruned or full tree depending on mode) -> `hydrate()` + `diff()` - -**Normal -> Scripts-only**: Server returns pruned tree. Fresh InstanceMap gets only scripts + ancestors. Studio's non-script instances are untouched (all nodes have `ignoreUnknownInstances: true`). ChangeBatcher receives `syncScriptsOnly = true` and filters non-script changes. - -**Scripts-only -> Normal**: Server returns full tree. Fresh InstanceMap gets everything. `hydrate()` matches server instances to existing Studio instances by Name+ClassName (Studio already has them -- they were never deleted). ChangeBatcher receives `syncScriptsOnly = false` and sends all changes. - -No special handling needed. The plugin doesn't need to know it was previously in a different mode. - -## What stays the same - -- `**instance_for_scripts_only`**: Still used to build filtered Instance objects. No logic change. -- `**InstanceMap.__connectSignals()`**: Signals still connected for all mapped instances. The ChangeBatcher filtering (3b) is upstream and simpler than skipping signal connections, which could miss edge cases with Parent change detection. - -## atlas.mdc Conformance - -**Round-trip identity**: Preserved. Scripts-only pruning only affects what is SENT over the wire, not what is stored on disk. The filesystem always contains the full tree. Building an rbxl from the filesystem produces the same result regardless of scripts-only mode. The skeleton encoding for intermediate containers (step 3c) ensures no filesystem writes for existing non-script instances. - -**Code quality / DRY**: `is_script_class()` is extracted as a shared `pub(crate)` free function in `tree.rs`, replacing the private duplicate in `api.rs`. The `collect_scripts_and_ancestors` helper is removed (replaced by the script index). No new duplication introduced. - -**Two-way sync parity with CLI syncback**: In scripts-only mode, two-way sync only handles script instances. This is a different operating mode, not a divergence from syncback behavior. When `syncScriptsOnly` is false, all paths are identical to before. - -**Error handling**: All new Rust code uses `anyhow::Context` and `?` propagation per atlas.mdc conventions. No `unwrap()` or `expect()` in library code. Plugin code guards against nil InstanceMap lookups and destroyed instances. - -**Protocol compatibility**: The new `syncScriptsOnly` field on `ServerInfoResponse` uses `#[serde(default)]`, making it backward-compatible. Old plugins ignore the field (defaults to `false`). No protocol version bump needed. - -**No unnecessary changes**: The plan does not modify globIgnorePaths handling (already correct at the snapshot layer), does not rename variables, and does not refactor unrelated code. - -## Complexity comparison - -- **Initial read** (100K instances, 200 scripts, depth 20): ~200K iterations (before) vs ~4,000 (after) -- **Two-way sync** (plugin): Non-script changes silently dropped in `ChangeBatcher.add()` instead of round-tripping to server -- **Server writes**: Non-script updates filtered before filesystem I/O -- **Tree mutation overhead**: O(1) per insert/remove (HashSet add/remove) -- **Memory**: O(scripts) HashSet entries (negligible) - diff --git a/.cursor/plans/script_naming_refactor_424e3277.plan.md b/.cursor/plans/script_naming_refactor_424e3277.plan.md deleted file mode 100644 index 4ac50ca8..00000000 --- a/.cursor/plans/script_naming_refactor_424e3277.plan.md +++ /dev/null @@ -1,272 +0,0 @@ ---- -name: Script Naming Refactor -overview: Remove the `emitLegacyScripts` option entirely and implement a new, deterministic script naming convention where each script type has exactly one file extension. Add period encoding to the Windows encoding system and default that setting to true. -todos: - - id: path-encoding - content: Add %DOT% to CHAR_ENCODINGS, add %% escape for literal %, default encoding to true - status: completed - - id: middleware-enum - content: Add LocalScript, LegacyScript, LocalScriptDir, LegacyScriptDir middleware variants - status: completed - - id: script-type - content: Simplify ScriptType enum and update snapshot_lua logic - status: completed - - id: sync-rules - content: Add .local.lua/.luau and .legacy.lua/.luau sync rules and init paths - status: completed - - id: remove-emit-legacy - content: Remove emitLegacyScripts from Project, InstanceContext, and all usages - status: completed - - id: syncback-runcontext - content: Update get_best_middleware to check RunContext for Script class - status: completed - - id: file-extensions - content: Update extension_for_middleware with new script types - status: completed - - id: meta-suffixes - content: Add .local and .legacy to meta file suffix stripping - status: completed - - id: web-api - content: Update web/api.rs for new script naming conventions - status: completed - - id: update-tests - content: Update snapshot files and test cases - status: completed -isProject: false ---- - -# Script Naming Convention Refactor - -## New File Extension Mapping - - -| Script Type | File Extension | -| -------------------------- | -------------- | -| Script (RunContext.Server) | `.server.luau` | -| Script (RunContext.Client) | `.client.luau` | -| Script (RunContext.Plugin) | `.plugin.luau` | -| Script (RunContext.Legacy) | `.legacy.luau` | -| LocalScript | `.local.luau` | -| ModuleScript | `.luau` | - - -## Key Changes - -### 1. Add Period Encoding, Percent Escaping, and Default to True - -Update `[src/path_encoding.rs](src/path_encoding.rs)`: - -1. Add `(".", "%DOT%")` to `CHAR_ENCODINGS` -2. Add `%%` as escape sequence for literal `%` (encode first, decode last) - -```rust -const CHAR_ENCODINGS: &[(&str, &str)] = &[ - (".", "%DOT%"), // NEW - ("<", "%LT%"), - // ... rest unchanged -]; - -pub fn encode_path_name(name: &str) -> String { - // ... handle leading/trailing spaces ... - - // FIRST: Escape existing % as %% (before adding new % signs) - let mut encoded_middle = middle.replace("%", "%%"); - - // THEN: Encode special characters (which add new % signs) - for (char, encoded) in CHAR_ENCODINGS { - encoded_middle = encoded_middle.replace(char, encoded); - } - // ... -} - -pub fn decode_path_name(name: &str) -> String { - // ... - // FIRST: Decode %NAME% patterns - for (char, encoded) in CHAR_ENCODINGS { - result = result.replace(encoded, char); - } - - // LAST: Unescape %% back to % - result = result.replace("%%", "%"); - // ... -} -``` - -This ensures round-tripping works correctly: - -- `My%DOT%Thing` encodes to `My%%DOT%%Thing`, decodes back to `My%DOT%Thing` -- `My.Thing` encodes to `My%DOT%Thing`, decodes back to `My.Thing` - -Change the default for `encode_windows_invalid_chars` to `true` in `[src/syncback/mod.rs](src/syncback/mod.rs)` `SyncbackRules::encode_windows_invalid_chars()`: - -```rust -pub fn encode_windows_invalid_chars(&self) -> bool { - self.encode_windows_invalid_chars.unwrap_or(true) // Changed from false to true -} -``` - -Also update the `decode_windows_invalid_chars` logic in `[src/serve_session.rs](src/serve_session.rs)` to default to `true`. - -### 2. Add New Middleware Variants - -In `[src/snapshot_middleware/mod.rs](src/snapshot_middleware/mod.rs)`, add new variants: - -- `LocalScript` - for `.local.lua/.luau` files (LocalScript class) -- `LegacyScript` - for `.legacy.lua/.luau` files (Script with RunContext.Legacy) -- `LocalScriptDir` - for `init.local.lua/.luau` directories -- `LegacyScriptDir` - for `init.legacy.lua/.luau` directories - -### 3. Update ScriptType Enum - -In `[src/snapshot_middleware/lua.rs](src/snapshot_middleware/lua.rs)`, simplify to: - -```rust -pub enum ScriptType { - Server, // Script + RunContext.Server - Client, // Script + RunContext.Client - Plugin, // Script + RunContext.Plugin - Legacy, // Script + RunContext.Legacy - Local, // LocalScript - Module, // ModuleScript -} -``` - -Remove `LegacyServer`, `LegacyClient`, `RunContextServer`, `RunContextClient` - these were for the dual-mode system. - -### 4. Update Default Sync Rules - -In `[src/snapshot_middleware/mod.rs](src/snapshot_middleware/mod.rs)` `default_sync_rules()`: - -```rust -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!("*.legacy.lua", LegacyScript, ".legacy.lua"), // NEW - sync_rule!("*.legacy.luau", LegacyScript, ".legacy.luau"), // NEW - sync_rule!("*.local.lua", LocalScript, ".local.lua"), // NEW - sync_rule!("*.local.luau", LocalScript, ".local.luau"), // NEW - sync_rule!("*.{lua,luau}", ModuleScript), // Unchanged - catches remaining - // ... rest unchanged -] -``` - -### 5. Update Init Path Handling - -In `[src/snapshot_middleware/mod.rs](src/snapshot_middleware/mod.rs)` `get_dir_middleware()`: - -```rust -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::LocalScriptDir, "init.local.luau"), // NEW - (Middleware::LocalScriptDir, "init.local.lua"), // NEW - (Middleware::LegacyScriptDir, "init.legacy.luau"), // NEW - (Middleware::LegacyScriptDir, "init.legacy.lua"), // NEW - (Middleware::CsvDir, "init.csv"), -] -``` - -### 6. Remove emitLegacyScripts Entirely - -Files to modify: - -- `[src/project.rs](src/project.rs)` - Remove `emit_legacy_scripts` field from `Project` -- `[src/snapshot/metadata.rs](src/snapshot/metadata.rs)` - Remove from `InstanceContext`, remove `with_emit_legacy_scripts()` -- `[src/snapshot_middleware/util.rs](src/snapshot_middleware/util.rs)` - Remove `emit_legacy_scripts_default()` -- `[src/snapshot_middleware/project.rs](src/snapshot_middleware/project.rs)` - Remove `set_emit_legacy_scripts()` call -- `[src/serve_session.rs](src/serve_session.rs)` - Remove emit_legacy_scripts usage - -### 7. Update Syncback Middleware Selection - -In `[src/syncback/mod.rs](src/syncback/mod.rs)` `get_best_middleware()`: - -```rust -middleware = match inst.class.as_str() { - "Script" => { - // Check RunContext to determine which middleware - match inst.properties.get(&ustr("RunContext")) { - Some(Variant::Enum(e)) => match e.to_u32() { - // Legacy = 0, Server = 1, Client = 2, Plugin = 3 - 0 => Middleware::LegacyScript, - 1 => Middleware::ServerScript, - 2 => Middleware::ClientScript, - 3 => Middleware::PluginScript, - _ => Middleware::ServerScript, // fallback - }, - _ => Middleware::LegacyScript, // No RunContext = Legacy behavior - } - } - "LocalScript" => Middleware::LocalScript, - "ModuleScript" => Middleware::ModuleScript, - // ... rest unchanged -} -``` - -### 8. Update File Name Extensions - -In `[src/syncback/file_names.rs](src/syncback/file_names.rs)` `extension_for_middleware()`: - -```rust -Middleware::ServerScript => "server.luau", -Middleware::ClientScript => "client.luau", -Middleware::PluginScript => "plugin.luau", -Middleware::LegacyScript => "legacy.luau", // NEW -Middleware::LocalScript => "local.luau", // NEW -Middleware::ModuleScript => "luau", -``` - -### 9. Update Meta File Suffix Stripping - -In `[src/snapshot_middleware/lua.rs](src/snapshot_middleware/lua.rs)` `syncback_lua()` and `[src/snapshot_middleware/meta_file.rs](src/snapshot_middleware/meta_file.rs)`: - -Add `.local` and `.legacy` to the suffix stripping logic. - -### 10. Update Web API (Two-Way Sync) - -In `[src/web/api.rs](src/web/api.rs)`: - -- Update script handling to use new naming conventions -- Remove all `emit_legacy_scripts` references and conditional logic - -### 11. Update Test Files - -- Delete test projects in `rojo-test/build-tests/nested_runcontext/` that test emitLegacyScripts -- Update all snapshot files (`.snap`) that contain `emit_legacy_scripts: true/false` -- Update test cases in `src/snapshot_middleware/lua.rs` to use the new single behavior - -### 12. Clean Up Comments - -Remove all legacy references and comments about the old dual-mode system throughout the codebase. - -## Files to Modify (Summary) - -Core changes: - -- `src/path_encoding.rs` - Add period encoding (`%DOT%`) and `%%` escape for literal `%` -- `src/syncback/mod.rs` - Default encode_windows_invalid_chars to true, update middleware selection -- `src/serve_session.rs` - Default decode_windows_invalid_chars to true -- `src/snapshot_middleware/mod.rs` - Add middleware variants, update sync rules -- `src/snapshot_middleware/lua.rs` - Simplify ScriptType, update logic -- `src/snapshot/metadata.rs` - Remove emit_legacy_scripts -- `src/project.rs` - Remove emit_legacy_scripts field -- `src/syncback/mod.rs` - Update middleware selection with RunContext check -- `src/syncback/file_names.rs` - Add new extensions -- `src/snapshot_middleware/util.rs` - Remove emit_legacy_scripts_default -- `src/snapshot_middleware/project.rs` - Remove emit_legacy_scripts propagation -- `src/serve_session.rs` - Remove emit_legacy_scripts usage -- `src/web/api.rs` - Update for new conventions -- `src/snapshot_middleware/meta_file.rs` - Add new suffix handling - -Test updates: - -- ~40 snapshot files need `emit_legacy_scripts` line removed and `decode_windows_invalid_chars` changed to `true` -- Test functions need updating to not pass emit_legacy_scripts parameter - diff --git a/.cursor/plans/stress_tests_two-way_sync_baeda112.plan.md b/.cursor/plans/stress_tests_two-way_sync_baeda112.plan.md deleted file mode 100644 index 15bc22ee..00000000 --- a/.cursor/plans/stress_tests_two-way_sync_baeda112.plan.md +++ /dev/null @@ -1,463 +0,0 @@ ---- -name: Stress Tests Two-Way Sync -overview: Nuclear-grade stress tests, randomized fuzzing, and file watcher stress tests. Deterministic tests at 10+ cycles. Randomized fuzzer generates hundreds of random operation sequences. File watcher tests hammer the VFS pipeline with direct filesystem operations, init file shenanigans, singular/directory format flips, and editor save pattern simulations. -todos: - - id: fixture - content: Create syncback_stress fixture (default.project.json5 + 5 .luau files) - status: completed - - id: helpers - content: Add timing helpers (send_update_fast, send_update_no_wait, wait_for_settle), lookup helpers (get_stress_instances), and filesystem polling helpers (poll_tree_source, poll_tree_has_instance, poll_tree_no_instance) - status: completed - - id: prng - content: Add XorShift64 PRNG, FuzzOp enum, FuzzState tracker, and verify_instance_file helper - status: completed - - id: rapid-source - content: "Tests 26-27: rapid_source_writes_10x, rapid_source_writes_no_wait_10x" - status: completed - - id: rapid-rename - content: "Tests 28-29: rapid_rename_chain_10x, rapid_rename_chain_directory_10x" - status: completed - - id: rapid-classname - content: "Tests 30-31: rapid_classname_cycle_10x, rapid_classname_cycle_directory_init_10x" - status: completed - - id: combined-blitz - content: "Tests 32-34: combined_rename_classname_source_blitz_10x, combined_rename_and_source_rapid_10x, combined_classname_and_source_rapid_10x" - status: completed - - id: multi-instance - content: "Tests 35-36: multi_instance_source_update_single_request, multi_instance_rename_single_request" - status: completed - - id: delete-recreate - content: "Tests 37-38: delete_and_recreate_via_filesystem_recovery, rapid_delete_recreate_cycle_5x" - status: completed - - id: echo-stress - content: "Tests 39-40: echo_suppression_rapid_adds_10x, echo_suppression_mixed_operations" - status: completed - - id: encoded-stress - content: "Test 41: encoded_name_rapid_rename_chain" - status: completed - - id: fuzz-source-rename - content: "Test 42: fuzz_source_and_rename_200_iterations" - status: completed - - id: fuzz-classname - content: "Test 43: fuzz_classname_cycling_200_iterations" - status: completed - - id: fuzz-combined - content: "Test 44: fuzz_combined_operations_200_iterations" - status: completed - - id: fuzz-multi-instance - content: "Test 45: fuzz_multi_instance_100_iterations" - status: completed - - id: fuzz-directory - content: "Test 46: fuzz_directory_format_operations_100_iterations" - status: completed - - id: watcher-rapid-edits - content: "Tests 47-48: watcher_rapid_source_edits_on_disk_10x, watcher_burst_writes_100x" - status: completed - - id: watcher-rename - content: "Tests 49-50: watcher_filesystem_rename_chain_10x, watcher_rename_with_content_change" - status: completed - - id: watcher-delete-recreate - content: "Tests 51-53: watcher_delete_recreate_immediate, watcher_delete_recreate_cycle_5x, watcher_delete_recreate_different_content" - status: completed - - id: watcher-init - content: "Tests 54-57: watcher_edit_init_file, watcher_init_type_cycling_10x, watcher_delete_init_file, watcher_replace_init_file_type" - status: completed - - id: watcher-format-flip - content: "Tests 58-60: watcher_standalone_to_directory_conversion, watcher_directory_to_standalone_conversion, watcher_format_flip_flop_5x" - status: completed - - id: watcher-editor-patterns - content: "Tests 61-62: watcher_atomic_save_pattern, watcher_backup_rename_write_pattern" - status: completed - - id: watcher-parent-dir - content: "Tests 63-64: watcher_parent_directory_rename, watcher_parent_directory_delete_all" - status: completed - - id: watcher-concurrent - content: "Tests 65-66: watcher_filesystem_and_api_concurrent, watcher_multi_file_simultaneous_edits" - status: completed -isProject: false ---- - -# Nuclear-Grade Stress Tests + Fuzzing + File Watcher Stress - -## Context - -16 commits ahead of origin. Major changes to: - -- [src/change_processor.rs](src/change_processor.rs) -- event suppression (canonical+raw matching), pending recovery, rename/ClassName/Source handling, `overridden_source_path`, canonicalize retry, init file detection -- [src/web/api.rs](src/web/api.rs) -- syncback deletion (two-phase, `actually_removed` tracking), `suppress_path` (single canonical entry), standalone-to-directory conversion, encoded name handling -- [crates/memofs/src/lib.rs](crates/memofs/src/lib.rs) -- watches NOT removed on delete (for rapid recreate) - -Existing tests: 25 in `two_way_sync.rs` (API-driven), ~10 in `serve.rs` (filesystem-driven). No tests exercise: - -- Rapid multi-cycle operations -- Recovery mechanism under stress -- Init file type cycling on disk -- Singular/directory format conversion via filesystem -- Editor save patterns (atomic write, backup-rename-write) -- Concurrent filesystem + API operations - -## Files Changed - -- [tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs) -- ALL new tests go here -- [rojo-test/serve-tests/syncback_stress/](rojo-test/serve-tests/syncback_stress/) -- new fixture (5 ModuleScripts) - -## New Fixture - -`**rojo-test/serve-tests/syncback_stress/**` - -- `default.project.json5` (DataModel with ReplicatedStorage -> `src/`) -- `src/Alpha.luau`, `src/Bravo.luau`, `src/Charlie.luau`, `src/Delta.luau`, `src/Echo.luau` - -Each file: `-- {Name} module\nreturn {}` - ---- - -## New Infrastructure - -### Timing Helpers - -```rust -fn send_update_fast(session, session_id, update) // 50ms sleep -fn send_update_no_wait(session, session_id, update) // 0ms sleep -fn send_removal_fast(session, session_id, ids) // 50ms sleep -fn wait_for_settle() // 800ms sleep -``` - -### Tree Polling Helpers (for file-watcher tests) - -```rust -/// Poll tree until an instance with `name` under `parent_id` has Source containing `expected`. -/// Panics after `timeout_ms` if not found. -fn poll_tree_source( - session: &TestServeSession, - parent_id: Ref, - instance_name: &str, - expected_content: &str, - timeout_ms: u64, -) - -/// Poll tree until an instance with `name` exists under `parent_id`. -fn poll_tree_has_instance( - session: &TestServeSession, - parent_id: Ref, - instance_name: &str, - timeout_ms: u64, -) -> Ref - -/// Poll tree until NO instance with `name` exists under `parent_id`. -fn poll_tree_no_instance( - session: &TestServeSession, - parent_id: Ref, - instance_name: &str, - timeout_ms: u64, -) - -/// Poll tree until instance `name` has the expected ClassName. -fn poll_tree_class( - session: &TestServeSession, - parent_id: Ref, - instance_name: &str, - expected_class: &str, - timeout_ms: u64, -) -``` - -These all use a 50ms polling interval with `get_api_read()`. The typical timeout for file watcher propagation is 2000ms (50ms debounce + processing time + safety margin). - -### Deterministic PRNG - -```rust -struct XorShift64(u64); -impl XorShift64 { - fn new(seed: u64) -> Self { ... } - fn next(&mut self) -> u64 { ... } - fn range(&mut self, min: u64, max: u64) -> u64 { ... } - fn choose<'a, T>(&mut self, items: &'a [T]) -> &'a T { ... } -} -``` - -### FuzzOp / FuzzState / verify_instance_file - -(Same as previous plan revision -- FuzzOp enum with 7 variants, FuzzState tracking current_name/class/source, verify_instance_file checking file existence + extension + content + no stale files) - ---- - -## PART 1: API-Driven Stress Tests (Tests 26-41) - -All tests use `send_update_fast` (50ms) or `send_update_no_wait` (0ms) and verify final state. - -### A. Rapid Source (26-27) - -- **26: `rapid_source_writes_10x**` -- 10 Source writes at 50ms gaps. Fixture: `syncback_write` -- **27: `rapid_source_writes_no_wait_10x**` -- 10 Source writes with 0ms gaps. Fixture: `syncback_write` - -### B. Rapid Rename (28-29) - -- **28: `rapid_rename_chain_10x**` -- 10 sequential renames (re-read tree each time). Fixture: `syncback_write` -- **29: `rapid_rename_chain_directory_10x**` -- 10 renames of directory-format script, verify children intact. Fixture: `syncback_format_transitions` - -### C. Rapid ClassName (30-31) - -- **30: `rapid_classname_cycle_10x**` -- 10 class transitions (Module->Script->Local->...). Fixture: `syncback_write` -- **31: `rapid_classname_cycle_directory_init_10x**` -- 10 class transitions on directory init, verify children survive. Fixture: `syncback_format_transitions` - -### D. Combined Blitz (32-34) - -- **32: `combined_rename_classname_source_blitz_10x**` -- All 3 in one update, 10 rounds cycling classes. Fixture: `syncback_write` -- **33: `combined_rename_and_source_rapid_10x**` -- Rename + Source, 10 rounds. Fixture: `syncback_write` -- **34: `combined_classname_and_source_rapid_10x**` -- ClassName + Source, 10 rounds. Fixture: `syncback_write` - -### E. Multi-Instance (35-36) - -- **35: `multi_instance_source_update_single_request**` -- Single WriteRequest updating 5 instances. Fixture: `syncback_stress` -- **36: `multi_instance_rename_single_request**` -- Single WriteRequest renaming 5 instances. Fixture: `syncback_stress` - -### F. Delete + Recreate Race (37-38) - -- **37: `delete_and_recreate_via_filesystem_recovery**` -- API delete, then `fs::write` file back, wait for recovery. Fixture: `syncback_write` -- **38: `rapid_delete_recreate_cycle_5x**` -- 5 cycles of API delete + filesystem recreate. Fixture: `syncback_write` - -### G. Echo Suppression (39-40) - -- **39: `echo_suppression_rapid_adds_10x**` -- 10 rapid instance additions, verify cursor doesn't explode. Fixture: `syncback_write` -- **40: `echo_suppression_mixed_operations**` -- 2 adds + 2 updates + 1 removal in one request. Fixture: `syncback_stress` - -### H. Encoded Names (41) - -- **41: `encoded_name_rapid_rename_chain**` -- Rename `What?Module` through 5 special-char names. Fixture: `syncback_encoded_names` - ---- - -## PART 2: Randomized Fuzzing (Tests 42-46) - -Seeded `XorShift64` PRNG. On failure, prints seed + iteration for exact replay. - -- **42: `fuzz_source_and_rename_200_iterations**` -- Random Source writes and renames, 3-8 ops per iteration. Fixture: `syncback_write` -- **43: `fuzz_classname_cycling_200_iterations**` -- Random ClassName transitions, 3-8 ops per iteration. Fixture: `syncback_write` -- **44: `fuzz_combined_operations_200_iterations**` -- ALL 7 FuzzOp variants random, 3-8 ops per iteration. Fixture: `syncback_write` -- **45: `fuzz_multi_instance_100_iterations**` -- Random ops across 1-5 instances per WriteRequest. Fixture: `syncback_stress` -- **46: `fuzz_directory_format_operations_100_iterations**` -- Random rename/class on directory-format script. Fixture: `syncback_format_transitions` - ---- - -## PART 3: File Watcher Stress Tests (Tests 47-66) - -These exercise the **filesystem -> VFS -> ChangeProcessor -> Tree** pipeline by directly manipulating files with `fs::write`, `fs::rename`, `fs::remove_file`, `fs::create_dir`, etc. Verification uses the `poll_tree_*` helpers to wait for the tree to update via `get_api_read()`. - -Pattern for all watcher tests: - -1. Get the ReplicatedStorage ID via API -2. Directly manipulate files in `session.path().join("src")` -3. Poll the tree until it reflects the change (2000ms timeout) -4. Assert final state - -### I. Rapid Source Edits on Disk (47-48) - -**Test 47: `watcher_rapid_source_edits_on_disk_10x**` - -- Write `existing.luau` directly 10 times via `fs::write` with 30ms gaps -- Each write has distinct content: `"-- disk v1"` through `"-- disk v10"` -- Poll tree until Source contains `"-- disk v10"` -- Exercises: debouncer coalescing, snapshot regeneration, no lost updates -- Fixture: `syncback_write` - -**Test 48: `watcher_burst_writes_100x**` - -- Write `existing.luau` 100 times with ZERO delay (as fast as possible) -- Final content: `"-- burst final"` -- Poll tree until Source contains `"-- burst final"` -- Exercises: debouncer under extreme load, final state correctness -- Fixture: `syncback_write` - -### J. Filesystem Rename (49-50) - -**Test 49: `watcher_filesystem_rename_chain_10x**` - -- Rename `existing.luau` on disk through 10 names: `R1.luau` -> `R2.luau` -> ... -> `R10.luau` -- 30ms between renames -- Poll tree until instance named `R10` exists -- Verify: no instances with intermediate names, content preserved -- Exercises: VFS Remove+Create events from renames, tree path tracking -- Fixture: `syncback_write` - -**Test 50: `watcher_rename_with_content_change**` - -- Write new content to a temp file, then `fs::rename` temp -> `existing.luau` (atomic overwrite) -- Poll tree until Source reflects new content -- Exercises: editor-style atomic writes via rename -- Fixture: `syncback_write` - -### K. Delete + Recreate via Filesystem (51-53) - -**Test 51: `watcher_delete_recreate_immediate**` - -- `fs::remove_file("existing.luau")`, immediately `fs::write("existing.luau", new_content)` -- Poll tree until Source contains new content -- Exercises: `pending_recovery` mechanism -- VFS Remove may arrive but file already exists on disk -- Fixture: `syncback_write` - -**Test 52: `watcher_delete_recreate_cycle_5x**` - -- 5 cycles of: `fs::remove_file` -> 50ms delay -> `fs::write` with new content -- Each cycle uses distinct content -- After each cycle, poll tree for the new content -- Exercises: repeated recovery under stress (the recovery delay is 200ms, sweep is 500ms) -- Fixture: `syncback_write` - -**Test 53: `watcher_delete_recreate_different_content**` - -- Delete `existing.luau`, wait 300ms (let removal propagate), recreate with completely different content -- Poll tree until Source matches the new content AND instance still exists -- Exercises: instance removal + recreation via recovery mechanism -- Fixture: `syncback_write` - -### L. Init File Shenanigans (54-57) - -All use `syncback_format_transitions` fixture which has `DirModuleWithChildren/init.luau` + `ChildA.luau` + `ChildB.luau`. - -**Test 54: `watcher_edit_init_file**` - -- `fs::write("DirModuleWithChildren/init.luau", "-- edited init")` -- Poll tree until `DirModuleWithChildren` instance Source contains `"-- edited init"` -- Verify children still exist -- Exercises: init file instigating_source -> parent directory snapshot - -**Test 55: `watcher_init_type_cycling_10x**` - -- 10 cycles of renaming the init file: `init.luau` -> `init.server.luau` -> `init.local.luau` -> `init.luau` -> ... -- After each rename, poll tree until ClassName matches expected (ModuleScript/Script/LocalScript) -- Verify children (ChildA, ChildB) survive all 10 transitions -- Exercises: init file detection (`find_init_file`), snapshot_path resolution, tree ClassName updates - -**Test 56: `watcher_delete_init_file**` - -- Delete `DirModuleWithChildren/init.luau` -- Poll tree until `DirModuleWithChildren` ClassName changes (no longer a ModuleScript since init file is gone -- becomes a Folder) -- Verify children still exist (directory still exists on disk) -- Exercises: init file removal edge case - -**Test 57: `watcher_replace_init_file_type**` - -- Delete `init.luau`, immediately create `init.server.luau` with same content -- Poll tree until ClassName is "Script" -- Verify children unaffected -- Exercises: atomic init file type swap - -### M. Singular <-> Directory Format Conversion (58-60) - -**Test 58: `watcher_standalone_to_directory_conversion**` - -- Start with `StandaloneModule.luau` (standalone ModuleScript) -- On disk: `fs::remove_file("StandaloneModule.luau")`, `fs::create_dir("StandaloneModule")`, `fs::write("StandaloneModule/init.luau", original_content)`, `fs::write("StandaloneModule/ChildNew.luau", child_content)` -- Poll tree until `StandaloneModule` instance has a child named `ChildNew` -- Verify `StandaloneModule` Source matches original content -- Exercises: complete format transition via filesystem, VFS picks up directory + init + children -- Fixture: `syncback_format_transitions` - -**Test 59: `watcher_directory_to_standalone_conversion**` - -- Start with `DirModuleWithChildren/` (directory with init.luau + children) -- Read original init.luau content -- On disk: `fs::remove_dir_all("DirModuleWithChildren")`, `fs::write("DirModuleWithChildren.luau", original_content)` -- Poll tree until `DirModuleWithChildren` has NO children (standalone script) -- Verify Source matches -- Exercises: directory removal + standalone file creation detected by watcher -- Fixture: `syncback_format_transitions` - -**Test 60: `watcher_format_flip_flop_5x**` - -- 5 cycles of: standalone -> directory -> standalone -> directory -> standalone -- Start with `StandaloneModule.luau` -- Each "to directory" step: remove file, create dir + init.luau + child -- Each "to standalone" step: remove dir, create .luau file -- Verify final state correct after all 5 cycles -- Exercises: the ultimate format conversion stress test -- Fixture: `syncback_format_transitions` - -### N. Editor Save Patterns (61-62) - -**Test 61: `watcher_atomic_save_pattern**` - -- Simulate VSCode/Vim atomic save: write to `existing.luau.tmp`, then `fs::rename("existing.luau.tmp", "existing.luau")` -- Poll tree until Source reflects new content -- Do this 5 times with different content -- Exercises: the most common real-world save pattern -- Fixture: `syncback_write` - -**Test 62: `watcher_backup_rename_write_pattern**` - -- Simulate editor backup-rename-write: `fs::rename("existing.luau", "existing.luau.bak")`, then `fs::write("existing.luau", new_content)` -- Poll tree until Source reflects new content -- Clean up .bak file -- Exercises: rename-away + create-new pattern (generates Remove + Create events) -- Fixture: `syncback_write` - -### O. Parent Directory Operations (63-64) - -**Test 63: `watcher_parent_directory_rename**` - -- Rename `DirModuleWithChildren` directory to `RenamedDir` on disk -- Poll tree until instance `RenamedDir` appears with children intact -- Verify `DirModuleWithChildren` instance is gone -- Exercises: directory rename generates Remove(old/init.luau) + Create(new/init.luau), tree rebuilt -- Fixture: `syncback_format_transitions` - -**Test 64: `watcher_parent_directory_delete_all**` - -- `fs::remove_dir_all("DirModuleWithChildren")` -- Poll tree until `DirModuleWithChildren` instance is gone -- Verify no orphaned children remain -- Exercises: recursive delete generates Remove events for all children + init file -- Fixture: `syncback_format_transitions` - -### P. Concurrent Filesystem + API (65-66) - -**Test 65: `watcher_filesystem_and_api_concurrent**` - -- Simultaneously: `fs::write` to `StandaloneModule.luau` on disk AND send API Source update to `StandaloneScript` -- Both operations target different instances to avoid data races -- Poll tree until BOTH instances reflect their respective changes -- Exercises: VFS events and tree mutation channel both active at same time -- Fixture: `syncback_format_transitions` - -**Test 66: `watcher_multi_file_simultaneous_edits**` - -- Write to 5 different files on disk simultaneously (Alpha through Echo) with distinct content -- Poll tree until ALL 5 instances reflect new Source -- Exercises: multiple VFS events in quick succession, all processed correctly -- Fixture: `syncback_stress` - ---- - -## Implementation Details - -### Polling Timeout Strategy - -File watcher tests use 2000ms timeout (generous for: 50ms debounce + processing + recovery + Windows slowness). Polling interval is 50ms. - -### Test Isolation - -Each test uses `run_serve_test` which copies the fixture to a temp directory and spawns a fresh `rojo serve` process. Tests can freely mutate files without affecting other tests. - -### PRNG Reproducibility - -Fuzz tests print `"Fuzz test failed at seed {seed}. Replay with this seed to reproduce."` on failure. - -### State Reset Between Fuzz Iterations - -After each fuzz iteration: rename instance back to original name, restore original class, write original source, wait 300ms. Avoids restarting the serve session (which would be slow). - -### File Watcher Test Timing - -- After `fs::write`: poll immediately (debouncer needs ~50-100ms) -- After `fs::rename`: poll immediately (rename events come fast) -- After `fs::remove_file` + `fs::write` (delete+recreate): poll with 800ms initial wait (recovery delay 200ms + sweep 500ms) -- After directory operations: poll with extra buffer (multiple events to process) - -### Total Test Count - -- Part 1 (API stress): 16 tests (26-41) -- Part 2 (Fuzzing): 5 tests (42-46) with 900 total iterations -- Part 3 (File watcher): 20 tests (47-66) -- **Total: 41 new tests** - diff --git a/.cursor/plans/strip_dedup_suffix_automatically_3d35c847.plan.md b/.cursor/plans/strip_dedup_suffix_automatically_3d35c847.plan.md deleted file mode 100644 index 2deafdfa..00000000 --- a/.cursor/plans/strip_dedup_suffix_automatically_3d35c847.plan.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -name: Strip dedup suffix automatically -overview: Eliminate unnecessary `.meta.json5` files for dedup'd instances by having forward sync automatically strip `~N` dedup suffixes from filenames when deriving instance names, and having syncback skip writing meta `name` fields for dedup-only cases. -todos: - - id: strip-fn - content: Add `strip_dedup_suffix()` to `dedup_suffix.rs` and ensure it is importable from snapshot code - status: completed - - id: forward-files - content: Modify `file_name_for_path()` in `metadata.rs` to strip `~N` dedup suffixes - status: completed - - id: forward-dirs - content: Modify `get_dir_middleware()` in `snapshot_middleware/mod.rs` to strip `~N` from directory names - status: completed - - id: syncback-meta - content: Change `name_for_inst()` needs_meta condition to `needs_slugify` only (remove dedup check) - status: completed - - id: change-processor - content: Update file rename handler in `change_processor.rs` to use `slugified_new_name` for meta name conditions - status: completed - - id: update-tests - content: Update existing tests and fixtures for new dedup-only behavior (no meta name) - status: completed - - id: new-tests - content: "Add new tests: forward sync stripping, edge cases, syncback dedup-only, roundtrip without meta" - status: completed -isProject: false ---- - -# Auto-Strip Dedup Suffixes to Eliminate Redundant Meta Files - -## Problem - -When syncback encounters duplicate instance names (e.g., two instances named "LocalScript"), it creates: - -- `LocalScript.local.luau` (first) -- `LocalScript~2.local.luau` (second, with dedup suffix) -- `LocalScript~2.meta.json5` with `name: "LocalScript"` (meta file to recover real name) - -The meta file is redundant because `~N` is a well-defined system convention -- the `~` character is forbidden in instance names (always slugified to `_`), so `~N` can only come from the dedup system. Forward sync can strip it automatically. - -## Safety Argument - -- The `~` character is in `SLUGIFY_CHARS` (`[file_names.rs](src/syncback/file_names.rs)`), so any instance literally named `Foo~2` would be slugified to `Foo_2` during syncback. Natural tilde names cannot produce the `~N` pattern. -- Existing projects with meta files still work: meta `name` field takes priority over filename-derived name (`[meta_file.rs](src/snapshot_middleware/meta_file.rs)` `apply_name`). -- Non-dedup patterns like `~0`, `~abc`, `~` are NOT stripped (only `~N` where N > 0). - -## Changes - -### 1. Add `strip_dedup_suffix()` utility - -Add to `[src/syncback/dedup_suffix.rs](src/syncback/dedup_suffix.rs)` alongside `parse_dedup_suffix`: - -```rust -pub fn strip_dedup_suffix(name: &str) -> &str { - parse_dedup_suffix(name).map_or(name, |(base, _)| base) -} -``` - -### 2. Forward sync: strip dedup from file names - -In `[src/snapshot/metadata.rs](src/snapshot/metadata.rs)`, `SyncRule::file_name_for_path()` (line 330) -- after stripping the middleware extension, also strip `~N`: - -```rust -pub fn file_name_for_path<'a>(&self, path: &'a Path) -> anyhow::Result<&'a str> { - let name = /* existing logic to strip middleware extension */; - Ok(strip_dedup_suffix(name)) -} -``` - -The return type stays `&'a str` because stripping `~N` returns a sub-slice of the same string. - -### 3. Forward sync: strip dedup from directory names - -In `[src/snapshot_middleware/mod.rs](src/snapshot_middleware/mod.rs)`, `get_dir_middleware()` (line 116) -- strip `~N` from `dir_name` before returning: - -```rust -let dir_name = strip_dedup_suffix(dir_name); -``` - -Return type stays `&'path str` (sub-slice of the original path). - -### 4. Syncback: don't require meta name for dedup-only - -In `[src/syncback/file_names.rs](src/syncback/file_names.rs)`, `name_for_inst()` line 79 -- change: - -```rust -// Before: -let needs_meta = needs_slugify || deduped_slug != base; -// After: -let needs_meta = needs_slugify; -``` - -When only dedup happened (no slugification), forward sync will recover the correct name by stripping `~N`. - -### 5. Two-way sync: update meta name conditions in change_processor - -In `[src/change_processor.rs](src/change_processor.rs)`, the file rename handler (lines 1569, 1581) currently uses `deduped_new_name != *new_name` to decide whether meta name is needed. Change both to `slugified_new_name != *new_name`, matching the directory handler (line 1401) which already does this correctly. - -### 6. Module visibility - -Ensure `strip_dedup_suffix` is importable from snapshot code. May need to adjust `pub` visibility on the `syncback::dedup_suffix` module, or alternatively place the function in a shared location if cross-module import is problematic. - -### 7. Update existing tests and fixtures - -- `**src/syncback/file_names.rs` tests:** Update tests like `name_for_inst_dedup_collision` (line 826) and `nfi_clean_name_dedup_still_needs_meta_dir` (line 1175) -- these should now assert `needs_meta = false` for dedup-only cases. -- `**rojo-test/build-tests/dedup_suffix_with_meta/`:** Update fixture to remove now-unnecessary meta files for dedup-only cases. -- `**tests/tests/syncback_roundtrip.rs`:** The `dedup_suffix_with_meta` roundtrip test (line 299) and idempotency test (line 362) may need updated expected output. - -### 8. Add new tests - -- **Forward sync unit test:** File `Foo~2.luau` without meta -> instance name is `"Foo"` -- **Forward sync unit test:** Directory `Foo~2/` without meta -> instance name is `"Foo"` -- **Forward sync edge cases:** `Foo~0.luau` -> `"Foo~0"`, `Foo~abc.luau` -> `"Foo~abc"` (not valid dedup, kept as-is) -- **Syncback test:** Dedup-only case produces no meta `name` field -- **Syncback test:** Slugify + dedup still produces meta `name` field (e.g., `"Hey/Bro"` -> `Hey_Bro~2.luau` with meta name `"Hey/Bro"`) -- **Roundtrip test:** Dedup'd names without meta files survive build -> syncback -> rebuild - diff --git a/.cursor/plans/sync_vscode-rojo_schemas_6f3a7b26.plan.md b/.cursor/plans/sync_vscode-rojo_schemas_6f3a7b26.plan.md deleted file mode 100644 index 99ccf7f8..00000000 --- a/.cursor/plans/sync_vscode-rojo_schemas_6f3a7b26.plan.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -name: Sync vscode-rojo schemas -overview: Update the vscode-rojo extension's schemas, file associations, TypeScript code, and branding to match this Rojo fork -- rebrand as "Atlas", add JSON5 support, new project fields, new file schemas, new middleware types, and syncback rules. -todos: - - id: update-project-schema - content: "Overhaul project.template.schema.json: make name optional, add all new fields with descriptions from Rust doc comments. Every field gets a concise description for VS Code tooltip intellisense." - status: completed - - id: create-meta-schema - content: Create meta.template.schema.json with documented fields. Descriptions sourced from meta_file.rs doc comments. - status: completed - - id: create-model-schema - content: Create model.template.schema.json with documented fields. Descriptions sourced from json_model.rs doc comments. - status: completed - - id: update-package-json - content: Rebrand package.json to Atlas (name, displayName, publisher, commands, config keys, activation events), add json5 file associations, new schema entries for meta/model, update GitHub URL - status: completed - - id: update-generate-plugin - content: Update GenerateSchemaPlugin.js to also generate meta.schema.json and model.schema.json, inject class names into model schema - status: completed - - id: rebrand-typescript - content: Rebrand all user-facing strings from 'Rojo' to 'Atlas' in TS files, update command IDs from vscode-rojo.* to vscode-atlas.*, update GitHub/docs links, add .project.json5 support to findProjectFiles and openMenu - status: completed - - id: update-readme - content: Rebrand README.md from Rojo to Atlas, update GitHub links, mention json5 support - status: completed -isProject: false ---- - -# Sync vscode-rojo Extension with Rojo Fork + Atlas Rebrand - -## Three Concerns - -1. **Schema sync** -- bring schemas up to date with all Rojo fork changes -2. **Schema documentation** -- every field gets a concise `description` from the Rust doc comments, so VS Code shows useful tooltips -3. **Atlas rebrand** -- rename all user-facing text, VS Code registration IDs, and links - -**NOT in scope:** Renaming actual file paths, folders, TypeScript variable/type names, or dependencies. Only front-end text, VS Code command/config IDs, and links change. - ---- - -## Schema Changes - -### 1. Update `project.template.schema.json` -- Major overhaul - -Source of truth: [src/project.rs](src/project.rs) lines 61-149 (Project), 372-435 (ProjectNode) - -**Top-level changes:** - -- `name` -- change from **required** to **optional** -- Add `$schema` (string), `blockedPlaceIds` (integer[]), `syncbackRules` (object), `syncRules` (SyncRule[]), `syncScriptsOnly` (boolean), `ignoreHiddenServices` (boolean) -- Fix `servePlaceIds` items to `integer` -- Remove `"required": ["name", "tree"]` -- only `tree` required - -**Tree node additions:** `$id` (string), `$attributes` (object) - -**SyncbackRules sub-schema** (from [src/syncback/mod.rs](src/syncback/mod.rs) lines 959-1015): - -- `ignoreTrees`, `ignorePaths`, `ignoreClasses`: string[] -- `ignoreProperties`: { [className]: string[] } -- `syncCurrentCamera`, `syncUnscriptable`, `ignoreReferents`, `createIgnoreDirPaths`, `encodeWindowsInvalidChars`, `ignoreHiddenServices`, `warnDuplicateNames`: boolean - -**SyncRule sub-schema** ([src/snapshot/metadata.rs](src/snapshot/metadata.rs) lines 294-313): - -- `pattern` (string), `exclude` (string, optional), `use` (Middleware enum), `suffix` (string, optional) - -**Middleware enum** (camelCase): `csv`, `jsonModel`, `json`, `serverScript`, `clientScript`, `moduleScript`, `pluginScript`, `localScript`, `legacyScript`, `project`, `rbxm`, `rbxmx`, `toml`, `text`, `yaml`, `ignore` - -### 2. Create `schemas/meta.template.schema.json` - -Source: [src/snapshot_middleware/meta_file.rs](src/snapshot_middleware/meta_file.rs). Combined schema for `*.meta.json5` and `init.meta.json5`. - -All fields optional: `$schema`, `id`, `ignoreUnknownInstances`, `properties`, `attributes`, `className` - -### 3. Create `schemas/model.template.schema.json` - -Source: [src/snapshot_middleware/json_model.rs](src/snapshot_middleware/json_model.rs) lines 171-202. - -`className` required. Optional: `$schema`, `name`, `id`, `children` (recursive), `properties`, `attributes` - -### 4. Update `GenerateSchemaPlugin.js` - -- Also read and process `meta.template.schema.json` and `model.template.schema.json` -- Inject class names enum into model schema's `className` field -- Write all three to `dist/` - ---- - -## Atlas Rebrand - -### 5. `package.json` changes - - -| Field | Old | New | -| ---------------- | ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| `name` | `vscode-rojo` | `vscode-atlas` | -| `displayName` | `Rojo - Roblox Studio Sync` | `Atlas - Roblox Studio Sync` | -| `description` | `Rojo for VS Code` | `Atlas for VS Code` | -| `repository` | `rojo-rbx/vscode-rojo` | `UserGeneratedLLC/vscode-rojo` | -| `publisher` | `evaera` | TBD (keep or change) | -| command ID | `vscode-rojo.openMenu` | `vscode-atlas.openMenu` | -| command category | `Rojo` | `Atlas` | -| config title | `Rojo` | `Atlas` | -| config keys | `rojo.*` | `atlas.*` | -| activation | `onCommand:vscode-rojo.openMenu` | `onCommand:vscode-atlas.openMenu` | -| activation | `workspaceContains:*.project.json` | also add `*.project.json5` | -| jsonValidation | only `*.project.json/jsonc` | Replace with 3 `.json` entries only: `*.project.json`, `*.meta.json`, `*.model.json` (drop stale `.jsonc`; `.json5` handled by `json5.schemas`) | - - -**JSON5 schema registration via Better JSON5.** VS Code's built-in `jsonValidation` only works for `json`/`jsonc` language modes. Since we target the [Better JSON5](https://github.com/BlueGlassBlock/better-json5) extension (which has its own `json5.schemas` setting with full IntelliSense/validation), we register `.json5` schemas via `configurationDefaults` instead: - -```json -"configurationDefaults": { - "json5.schemas": [ - { "fileMatch": ["*.project.json5"], "url": "./dist/project.schema.json" }, - { "fileMatch": ["*.meta.json5"], "url": "./dist/meta.schema.json" }, - { "fileMatch": ["*.model.json5"], "url": "./dist/model.schema.json" } - ] -} -``` - -The `jsonValidation` entries only cover the `.json` variants (which use VS Code's native JSON language service). No `jsonc` file association overrides needed. - -**Bundle Better JSON5.** Add `extensionPack` to `package.json` so it installs alongside Atlas (users can disable independently): - -```json -"extensionPack": [ - "BlueGlassBlock.better-json5", - "JohnnyMorganz.luau-lsp", - "JohnnyMorganz.stylua" -] -``` - -**Conflict check with original Rojo extension.** VS Code has no manifest-level incompatibility flag, so add a runtime check in `extension.ts` on activation: if `vscode.extensions.getExtension("evaera.vscode-rojo")` returns non-null, show a warning message asking the user to disable it (both extensions register the same commands/schemas and will conflict). - -### 6. TypeScript string replacements (user-facing text only, not variable names) - -**Command IDs** (in all TS files): `"vscode-rojo.*"` -> `"vscode-atlas.*"` - -Affected files: - -- `extension.ts` -- button command, console log, status messages -- `updateButton.ts` -- button commands -- `commands/openMenu.ts` -- registerCommand, executeCommand -- `commands/serveRecent.ts` -- registerCommand, executeCommand -- `commands/stopAll.ts` -- registerCommand -- `configuration.ts` -- config section name `"rojo"` -> `"atlas"` - -**User-facing "Rojo" -> "Atlas"** in string literals: - -- `extension.ts`: button text, info messages -- `openMenu.ts`: menu labels, error messages, info messages -- `serveProject.ts`: terminal title -- `buildProject.ts`: error/info messages -- `installPlugin.ts`: error/info messages -- `installRojo.ts`: success/error messages (note: the actual `rojo` CLI binary name stays the same -- only display text changes) - -**Links:** - -- `rojo.space/docs/v7/` -> keep as-is (still valid Rojo docs) OR update if there's a new docs URL -- `discord.gg/wH5ncNS` -> keep as-is (same community) -- `extension/evaera.vscode-rojo` -> update extension ID reference - -`**default.project.json**` references -> `default.project.json5` (openMenu.ts lines 401-404) - -`**findProjectFiles.ts**` line 77: also match `.project.json5` - -### 7. README.md - -Rebrand all "Rojo" display text to "Atlas", update GitHub link to `UserGeneratedLLC/vscode-rojo`, mention `.project.json5` support. \ No newline at end of file diff --git a/.cursor/plans/syncback_auto-downloader_0508b4bb.plan.md b/.cursor/plans/syncback_auto-downloader_0508b4bb.plan.md deleted file mode 100644 index aa264741..00000000 --- a/.cursor/plans/syncback_auto-downloader_0508b4bb.plan.md +++ /dev/null @@ -1,276 +0,0 @@ ---- -name: Syncback Auto-Downloader -overview: Add an auto-download feature to the syncback command that fetches the .rbxl file from Roblox's asset delivery API, with sensible defaults to make `rojo syncback` work with zero arguments. -todos: - - id: update-cargo - content: Add gzip/brotli/deflate features to reqwest, move tempfile to dependencies - status: completed - - id: download-function - content: Implement download_place() function with no-cache headers and cookie auth - status: completed - - id: update-args - content: "Update SyncbackCommand args: --download, new defaults, --interactive flip" - status: completed - - id: input-resolution - content: Implement input file resolution logic (download vs existing file) - status: completed - - id: sourcemap-gen - content: Add automatic sourcemap.json generation after syncback - status: completed - - id: git-refresh - content: Add git update-index --refresh for git repos - status: completed - - id: testing - content: Test the complete flow with various argument combinations - status: completed -isProject: false ---- - -# Syncback Auto-Downloader Feature - -## Overview - -Enhance the `rojo syncback` command to automatically download place files from Roblox's asset delivery API, generate sourcemaps after completion, and refresh the git index. The goal is to make `rojo syncback` work with zero arguments. - -## Key Files to Modify - -- `[src/cli/syncback.rs](src/cli/syncback.rs)` - Main syncback command implementation -- `[Cargo.toml](Cargo.toml)` - Add compression features to reqwest, move tempfile to dependencies - -## Implementation Details - -### 1. Update Dependencies in `Cargo.toml` - -```toml -# Add compression features to reqwest -reqwest = { version = "0.11.27", default-features = false, features = [ - "blocking", - "json", - "rustls-tls", - "gzip", - "brotli", - "deflate", -] } - -# Move tempfile from dev-dependencies to dependencies -tempfile = "3.24.0" -``` - -### 2. Add Download Arguments to `SyncbackCommand` - -In `src/cli/syncback.rs`, modify the struct: - -```rust -pub struct SyncbackCommand { - /// Path to the project to sync back to. - #[clap(default_value = "default.project.json5")] - pub project: PathBuf, - - /// Path to the Roblox file to pull Instances from. - #[clap(long, short, default_value = "Project.rbxl")] - pub input: PathBuf, - - /// Download the place file from Roblox. If no place ID is provided, - /// uses the first ID from servePlaceIds in the project file. - #[clap(long, short = 'd')] - pub download: Option>, - - /// Interactive mode - prompts before writing. Disabled by default. - #[clap(long, short = 'i')] - pub interactive: bool, - - // ... rest of existing fields -} -``` - -Note: Flip `--non-interactive` to `--interactive` (new default is non-interactive). - -### 3. Download Function Implementation - -Create the download logic with these characteristics: - -- **URL**: `https://assetdelivery.roblox.com/v1/asset/?id={PLACEID}` -- **Auth**: `ROBLOSECURITY` cookie from environment variable -- **No-cache headers**: - - `Cache-Control: no-cache, no-store, must-revalidate` - - `Pragma: no-cache` - - `Expires: 0` -- **Compression**: Request `Accept-Encoding: gzip, deflate, br` (reqwest handles decompression) -- **Temp file**: Use `tempfile::NamedTempFile` with `.rbxl` extension, keep it alive during processing - -```rust -fn download_place(place_id: u64) -> anyhow::Result { - let cookie = std::env::var("ROBLOSECURITY") - .context("ROBLOSECURITY environment variable not set")?; - - let url = format!("https://assetdelivery.roblox.com/v1/asset/?id={}", place_id); - - let client = reqwest::blocking::Client::builder() - .gzip(true) - .brotli(true) - .deflate(true) - .no_proxy() // Avoid proxy caching - .build()?; - - let response = client - .get(&url) - .header(COOKIE, format!(".ROBLOSECURITY={}", cookie)) - .header(CACHE_CONTROL, "no-cache, no-store, must-revalidate") - .header(PRAGMA, "no-cache") - .header("Expires", "0") - .header(USER_AGENT, "Rojo") - .send()?; - - // Create temp file with .rbxl extension - let mut temp_file = tempfile::Builder::new() - .suffix(".rbxl") - .tempfile()?; - - // Stream response to file - let bytes = response.bytes()?; - std::io::copy(&mut bytes.as_ref(), &mut temp_file)?; - - Ok(temp_file) -} -``` - -### 4. Resolve Place ID Logic - -When `--download` is provided without a value: - -1. Load the project file first -2. Extract `serve_place_ids` from the project -3. Take the first place ID from the set (convert HashSet to Vec, sort for determinism, take first) -4. Error if `servePlaceIds` is empty or not set - -### 5. Input File Resolution Logic - -In the `run()` method: - -```rust -// Determine the actual input path -let input_path = if let Some(download_opt) = &self.download { - // --download was specified - if !self.input_exists() || download_opt.is_some() { - // Download needed: either file doesn't exist or explicit place ID - let place_id = match download_opt { - Some(id) => *id, - None => { - // Load project to get servePlaceIds - let project = Project::load_fuzzy(&path_old)?; - project.serve_place_ids - .as_ref() - .and_then(|ids| ids.iter().min().copied()) - .context("No servePlaceIds in project and no place ID provided")? - } - }; - - eprintln!("Downloading place {}...", place_id); - let temp_file = download_place(place_id)?; - // Keep temp_file alive during processing - DownloadedInput::Temp(temp_file) - } else { - DownloadedInput::Existing(resolve_path(&self.input).into_owned()) - } -} else if self.input.exists() { - DownloadedInput::Existing(resolve_path(&self.input).into_owned()) -} else { - anyhow::bail!("Input file {} not found. Use --download to fetch from Roblox.", self.input.display()) -}; -``` - -### 6. Sourcemap Generation After Syncback - -After successful syncback, generate `sourcemap.json` in the project root: - -```rust -// After snapshot.write_to_vfs() -let sourcemap_path = session_old.root_project().folder_location().join("sourcemap.json"); -write_sourcemap(&session_old, Some(&sourcemap_path), filter_nothing, false)?; -eprintln!("Generated sourcemap at {}", sourcemap_path.display()); -``` - -This requires extracting or sharing the `write_sourcemap` function from `sourcemap.rs` (likely needs to be made `pub(crate)`). - -### 7. Git Index Refresh - -After syncback completes, check if in a git repo and refresh the index: - -```rust -fn refresh_git_index(project_dir: &Path) { - // Check if .git exists in project dir or any parent - let mut check_dir = Some(project_dir); - let mut is_git_repo = false; - while let Some(dir) = check_dir { - if dir.join(".git").exists() { - is_git_repo = true; - break; - } - check_dir = dir.parent(); - } - - if is_git_repo { - let result = std::process::Command::new("git") - .arg("update-index") - .arg("--refresh") - .current_dir(project_dir) - .stdout(std::process::Stdio::null()) - .stderr(std::process::Stdio::null()) - .status(); - - if let Err(e) = result { - log::warn!("Failed to refresh git index: {}", e); - } - } -} -``` - -### 8. Summary of Default Changes - - -| Argument | Old Default | New Default | -| ------------------- | ------------------ | ----------------------------------------------------------------- | -| `project` | `""` (current dir) | `default.project.json5` | -| `--input` | Required | `Project.rbxl` | -| `--non-interactive` | `false` | Removed, replaced with `--interactive` (default: non-interactive) | - - -## Flow Diagram - -```mermaid -flowchart TD - Start[rojo syncback] --> CheckDownload{--download flag?} - CheckDownload -->|No| CheckInput{Input file exists?} - CheckDownload -->|Yes| CheckPlaceId{Place ID provided?} - - CheckPlaceId -->|Yes| Download[Download from Roblox] - CheckPlaceId -->|No| LoadProject[Load project.json5] - LoadProject --> GetPlaceId[Get first servePlaceIds] - GetPlaceId --> Download - - Download --> TempFile[Save to temp file] - TempFile --> ProcessDom[Process DOM] - - CheckInput -->|Yes| UseExisting[Use existing file] - CheckInput -->|No| Error[Error: file not found] - - UseExisting --> ProcessDom - ProcessDom --> Syncback[Run syncback] - Syncback --> WriteFiles[Write to filesystem] - WriteFiles --> GenSourcemap[Generate sourcemap.json] - GenSourcemap --> GitRefresh[git update-index --refresh] - GitRefresh --> Cleanup[Cleanup temp file] - Cleanup --> End[Done] -``` - - - -## Edge Cases - -- If `--input` file exists and `--download` not specified: use existing file (no download) -- If `--input` file exists but `--download ` explicitly given: download anyway (override) -- If `--download` with no arg and no `servePlaceIds` in project: error with helpful message -- If `ROBLOSECURITY` not in environment: error with helpful message -- If download fails: error with status code and helpful message -- If not a git repo: silently skip git refresh - diff --git a/.cursor/plans/syncback_roundtrip_tests_f980a65b.plan.md b/.cursor/plans/syncback_roundtrip_tests_f980a65b.plan.md deleted file mode 100644 index 763da167..00000000 --- a/.cursor/plans/syncback_roundtrip_tests_f980a65b.plan.md +++ /dev/null @@ -1,747 +0,0 @@ ---- -name: Syncback Roundtrip Tests -overview: Add comprehensive build-syncback roundtrip tests and mutation stress tests to validate clean mode produces consistent results, complementing the existing 100+ syncback tests. -todos: - - id: roundtrip-utils - content: "Create `tests/rojo_test/roundtrip_util.rs` with helpers: `run_rojo_build`, `assert_dirs_equal`, `Mutation` enum and `apply_mutation`" - status: completed - - id: roundtrip-tests - content: Create `tests/tests/syncback_roundtrip.rs` with build -> syncback -> rebuild roundtrip tests using existing build-test projects - status: completed - - id: clean-stress-tests - content: Create `tests/tests/clean_mode_stress.rs` with clean-equals-fresh tests covering 12+ mutation scenarios - status: completed - - id: wire-modules - content: Update `tests/rojo_test/mod.rs` and `tests/tests/mod.rs` to include new test modules - status: in_progress -isProject: false ---- - -# Syncback Roundtrip and Clean Mode Stress Tests - -## Vision and Philosophy - -**Goal**: Make syncback bulletproof for complex games. No filesystem inconsistencies. The filesystem must be the source of truth. - -**What Clean Mode Represents**: - -Clean mode is conceptually equivalent to: - -1. Deleting the entire project `src/` directory -2. Keeping only `default.project.json5` -3. Letting syncback rebuild everything from scratch based on the rbxm/rbxl - -This gives a **truthful representation** of the project as it exists in Studio. Clean mode is the **preferred mechanism** for syncback because it produces the most accurate filesystem state. - -**Why Clean Mode Exists**: - -Previously, users had to use a shell script that literally deleted the src folder and let syncback rebuild. This approach: - -- Was very slow -- Caused many unnecessary git/filesystem changes -- Left "bad residues" behind - -Clean mode is an **optimized version** of that same approach - it achieves the same truthful result without the overhead of deleting and recreating everything. - -**Testing Philosophy**: - -- Tests exist to EXPOSE limitations, not just pass -- Tests that break the system are GOOD - they're the forcing function for quality -- Do NOT back down when tests fail - fix the underlying issue -- **CRITICAL**: Before modifying code to fix a test, ensure you KNOW FOR A FACT the expected output is correct for the given input. Don't assume a failing test means the code is wrong. - -**Code Quality Concerns**: - -- The syncback code has been iterated by AI agents and may have accumulated "fix on fix" complexity -- If a subsystem needs repeated patches, step back and consider a ground-up redesign -- Example: the orphan file detection algorithm may need rethinking rather than more patches -- Use good judgment - don't rewrite everything, but don't just pile on fixes either - ---- - -## Current Status: Bugs Found by Stress Tests - -### Bug 1: Nested Orphan Files Not Removed (FIXED) - -**Symptom**: Orphan files at the top level (`src/orphan.txt`) were removed, but nested orphan files (`src/level-1/orphan.luau`) were NOT removed. - -**Root cause**: The orphan removal logic had a flawed check: - -```rust -if added_paths.iter().any(|added| old_path_norm.starts_with(added)) { continue; } -``` - -This skipped ANY file whose parent directory was in `added_paths`, but adding a directory doesn't mean all files inside should be preserved. - -**Fix applied**: Changed the logic to only skip DIRECTORIES that are ancestors of added paths, not files. - -### Bug 2: Missing $path Directories in Scan (FIXED) - -**Symptom**: `dirs_to_scan` only contained the project file, not the `$path` source directories. - -**Root cause**: The code relied on `instigating_source` metadata which points to the project file for root nodes, not the actual source directory defined by `$path`. - -**Fix applied**: Added `collect_paths_from_project()` to recursively extract `$path` entries from the project tree. - -### Bug 3: Duplicate File Removal Crash (FIXED) - -**Symptom**: `failed to remove file: The system cannot find the file specified` - -**Root cause**: Same file could be added to `removed_files` with both absolute and relative paths, causing double removal attempts. - -**Fix applied**: In `fs_snapshot.rs`, gracefully handle "file not found" errors during removal. - -### Bug 4: Directory Double-Removal Crash (FIXED) - -**Symptom**: Syncback fails when a directory is marked for removal by both the syncback `removed_children` phase and the orphan removal phase. - -**Root cause**: `remove_dir_all` returns an error when the directory doesn't exist, and the same directory could be added twice. - -**Fix applied**: Handle "not found" errors gracefully in `fs_snapshot.rs` for directory removal. - -### Limitation 1: Class Change Not Supported (FUNDAMENTAL) - -**Symptom**: Deleting `init.luau` changes folder from ModuleScript to Folder. Syncback fails silently. - -**Root cause**: Syncback cannot change the class of instances defined in the project file. This is by design in `src/snapshot_middleware/project.rs`. - -**Affected tests**: `clean_restores_deleted_files`, `clean_restores_deleted_nested_files`, `clean_restores_dir_from_file` - -### Limitation 2: Ambiguous File Names Not Supported (FUNDAMENTAL) - -**Symptom**: Adding duplicate files with different extensions (e.g., `foo.luau` and `foo.lua`) causes syncback to fail. - -**Root cause**: Rojo can't handle ambiguous file names during project loading. - -**Affected tests**: `clean_removes_duplicate_extensions`, `clean_removes_multiple_duplicates` - -### Bug 5: File Paths Added to Directory Scan (FIXED) - -**Symptom**: Projects with `$path` pointing to single files (not directories) were failing syncback. - -**Root cause**: The `collect_paths_from_project` function was adding all `$path` entries to the scan list, but only directories should be scanned for orphans. - -**Fix applied**: Changed to only add `$path` entries that are directories (`resolved.is_dir()`). - ---- - -## Test Results Summary (Final) - -**Full test suite: 179 passed, 16 failed** - -**Clean Mode Stress Tests: 15 passed, 11 failed** - -- Passing: All orphan removal tests, basic clean mode behavior -- Failing: Class change scenarios (3), ambiguous files (2), meta/extension issues (3), combination tests (3) - -**Pre-existing Failures (not from this work): 5 tests** - -- `syncback_roundtrip::infer_service_name` -- `syncback_roundtrip::init_meta_class_name` -- `syncback_roundtrip::init_meta_properties` -- `syncback_roundtrip::rbxmx_ref` -- `syncback::ignore_trees_removing` - -These were failing before the current changes and are separate issues. - ---- - -## Context: The Syncback Work Done - -This testing plan builds on significant syncback improvements: - -### 1. Destructive/Clean Mode (Default) - -From [destructive_syncback_mode plan](destructive_syncback_mode_acb8cb54.plan.md): - -- Clean mode ignores existing file structure (`old = None`) -- Scans filesystem for ALL existing paths before syncback -- Removes orphaned files after syncback completes -- `--incremental` flag to opt into legacy structure-preserving behavior - -Key implementation in `src/syncback/mod.rs`: - -- Collects existing paths from filesystem (not just tree) -- Sets `old_ref = None` in clean mode so all children treated as new -- Removes orphaned paths after computing new structure - -### 2. Plugin API Architecture Fix - -From [architecture fix plan](rojo_syncback_architecture_fix_bc0c13ab.plan.md): - -- Tree-based instance lookup before format decisions -- `detect_existing_script_format()` checks filesystem state -- Format preservation to prevent duplicate file creation -- Prevents the "duplicate creation cycle" bug - -Key implementation in `src/web/api.rs`: - -- `ExistingFileFormat` enum (None, Standalone, Directory) -- Checks if `Name/init.luau` or `Name.luau` exists before deciding format -- Plugin syncback respects existing file structure - ---- - -## Current Test Coverage - - -| Test File | Count | Purpose | -| -------------------------------- | ----- | ---------------------------------------------------------------------- | -| `syncback.rs` | 25 | CLI syncback with pre-built rbxl/rbxm files (18 clean + 7 incremental) | -| `syncback_format_transitions.rs` | 47 | Plugin API format preservation via `/api/write` | -| `clean_mode.rs` | 6 | Clean vs incremental basic behavior | -| `serve.rs` | 22 | General serve tests including write API | - - -**Total: ~100 syncback-related tests** - -Test projects in `rojo-test/syncback-tests/` cover: - -- Reference properties (6 tests) -- Ignore rules (5 tests) -- Nested projects (2 tests) -- File format/middleware (5 tests) -- Edge cases/conflicts (4 tests) - ---- - -## Key Gaps - -1. **No dynamic build-syncback roundtrip**: All tests use static pre-built `.rbxl`/`.rbxm` files, not dynamically built ones -2. **No mutation stress tests**: No tests that dirty the filesystem and verify clean mode fixes it -3. **No "clean == fresh" equivalence proof**: No tests proving clean mode on dirty dir equals fresh syncback - ---- - -## Implementation Plan - -### 1. Helper Utilities: `tests/rojo_test/roundtrip_util.rs` - -```rust -use std::path::{Path, PathBuf}; -use std::process::Command; -use tempfile::TempDir; - -use super::io_util::ROJO_PATH; - -/// Run `rojo build` and return (temp_dir_handle, output_path) -pub fn run_rojo_build(project_path: &Path, output_name: &str) -> (TempDir, PathBuf) { - let output_dir = tempfile::tempdir().expect("Failed to create temp dir"); - let output_path = output_dir.path().join(output_name); - - let output = Command::new(ROJO_PATH) - .args(["build", project_path.to_str().unwrap(), "-o", output_path.to_str().unwrap()]) - .output() - .expect("Failed to run rojo build"); - - if !output.status.success() { - panic!( - "rojo build failed:\nstdout: {}\nstderr: {}", - String::from_utf8_lossy(&output.stdout), - String::from_utf8_lossy(&output.stderr) - ); - } - - (output_dir, output_path) -} - -/// Run `rojo syncback` in clean mode (default) -pub fn run_rojo_syncback_clean(project_path: &Path, input_path: &Path) -> bool { - Command::new(ROJO_PATH) - .args([ - "syncback", - project_path.to_str().unwrap(), - "--input", - input_path.to_str().unwrap(), - ]) - .status() - .map(|s| s.success()) - .unwrap_or(false) -} - -/// Compare two directories recursively, asserting they have identical content -pub fn assert_dirs_equal(dir_a: &Path, dir_b: &Path) { - let files_a = collect_files(dir_a); - let files_b = collect_files(dir_b); - - // Compare file sets - let set_a: HashSet<_> = files_a.keys().collect(); - let set_b: HashSet<_> = files_b.keys().collect(); - - let only_in_a: Vec<_> = set_a.difference(&set_b).collect(); - let only_in_b: Vec<_> = set_b.difference(&set_a).collect(); - - assert!( - only_in_a.is_empty() && only_in_b.is_empty(), - "Directory contents differ:\n Only in A: {:?}\n Only in B: {:?}", - only_in_a, only_in_b - ); - - // Compare file contents - for (rel_path, content_a) in &files_a { - let content_b = &files_b[rel_path]; - assert_eq!( - content_a, content_b, - "File contents differ for {:?}", rel_path - ); - } -} - -fn collect_files(dir: &Path) -> HashMap> { - let mut result = HashMap::new(); - collect_files_recursive(dir, dir, &mut result); - result -} - -fn collect_files_recursive(base: &Path, current: &Path, result: &mut HashMap>) { - for entry in fs::read_dir(current).unwrap() { - let entry = entry.unwrap(); - let path = entry.path(); - let rel_path = path.strip_prefix(base).unwrap().to_path_buf(); - - if path.is_dir() { - collect_files_recursive(base, &path, result); - } else { - let content = fs::read(&path).unwrap(); - result.insert(rel_path, content); - } - } -} - -/// Mutation types for stress testing clean mode -pub enum Mutation { - /// Add an orphan file that doesn't exist in the rbxl - AddOrphanFile { relative_path: &'static str, content: &'static str }, - /// Delete a file that exists in the rbxl - DeleteFile { relative_path: &'static str }, - /// Rename a file (creates orphan + missing file) - RenameFile { from: &'static str, to: &'static str }, - /// Change file extension (e.g., .luau -> .modulescript) - ChangeExtension { from: &'static str, to: &'static str }, - /// Add an orphan directory with content - AddOrphanDirectory { relative_path: &'static str }, - /// Delete an entire directory - DeleteDirectory { relative_path: &'static str }, - /// Convert directory format to standalone file - ConvertDirToFile { dir: &'static str, file_content: &'static str }, - /// Convert standalone file to directory format - ConvertFileToDir { file: &'static str }, - /// Corrupt a .meta.json5 file - CorruptMetaFile { relative_path: &'static str }, - /// Modify file content to be wrong - ModifyFileContent { relative_path: &'static str, new_content: &'static str }, - /// Add a spurious .project.json5 file - AddNestedProjectFile { relative_path: &'static str }, - /// Create duplicate with different extension - DuplicateWithDifferentExtension { original: &'static str, duplicate_ext: &'static str }, -} - -pub fn apply_mutation(dir: &Path, mutation: &Mutation) { - match mutation { - Mutation::AddOrphanFile { relative_path, content } => { - let path = dir.join(relative_path); - if let Some(parent) = path.parent() { - fs::create_dir_all(parent).ok(); - } - fs::write(&path, content).expect("Failed to write orphan file"); - } - Mutation::DeleteFile { relative_path } => { - let path = dir.join(relative_path); - fs::remove_file(&path).expect("Failed to delete file"); - } - Mutation::RenameFile { from, to } => { - let from_path = dir.join(from); - let to_path = dir.join(to); - fs::rename(&from_path, &to_path).expect("Failed to rename file"); - } - Mutation::ChangeExtension { from, to } => { - let from_path = dir.join(from); - let to_path = dir.join(to); - fs::rename(&from_path, &to_path).expect("Failed to change extension"); - } - Mutation::AddOrphanDirectory { relative_path } => { - let path = dir.join(relative_path); - fs::create_dir_all(&path).expect("Failed to create orphan directory"); - // Add a file so the directory isn't empty - fs::write(path.join("orphan_child.luau"), "-- orphan").ok(); - } - Mutation::DeleteDirectory { relative_path } => { - let path = dir.join(relative_path); - fs::remove_dir_all(&path).expect("Failed to delete directory"); - } - Mutation::ConvertDirToFile { dir: dir_path, file_content } => { - let path = dir.join(dir_path); - fs::remove_dir_all(&path).expect("Failed to remove directory"); - // Create standalone file with same base name - let file_path = path.with_extension("luau"); - fs::write(&file_path, file_content).expect("Failed to write file"); - } - Mutation::ConvertFileToDir { file } => { - let file_path = dir.join(file); - let content = fs::read_to_string(&file_path).unwrap_or_default(); - fs::remove_file(&file_path).expect("Failed to remove file"); - // Create directory with init file - let dir_path = file_path.with_extension(""); - fs::create_dir_all(&dir_path).expect("Failed to create directory"); - fs::write(dir_path.join("init.luau"), content).expect("Failed to write init"); - } - Mutation::CorruptMetaFile { relative_path } => { - let path = dir.join(relative_path); - fs::write(&path, "{ this is not valid json5 {{{{").expect("Failed to corrupt meta"); - } - Mutation::ModifyFileContent { relative_path, new_content } => { - let path = dir.join(relative_path); - fs::write(&path, new_content).expect("Failed to modify content"); - } - Mutation::AddNestedProjectFile { relative_path } => { - let path = dir.join(relative_path); - if let Some(parent) = path.parent() { - fs::create_dir_all(parent).ok(); - } - fs::write(&path, r#"{ "name": "SpuriousProject", "tree": { "$className": "Folder" } }"#) - .expect("Failed to add nested project"); - } - Mutation::DuplicateWithDifferentExtension { original, duplicate_ext } => { - let orig_path = dir.join(original); - let content = fs::read(&orig_path).unwrap_or_default(); - let dup_path = orig_path.with_extension(duplicate_ext); - fs::write(&dup_path, content).expect("Failed to create duplicate"); - } - } -} -``` - -### 2. Roundtrip Tests: `tests/tests/syncback_roundtrip.rs` - -```rust -//! Build -> Syncback -> Rebuild roundtrip tests. -//! -//! These tests verify that: -//! 1. Building a project to rbxl -//! 2. Syncing back to a fresh directory -//! 3. Rebuilding from the syncback result -//! Produces semantically identical output. - -use std::path::Path; -use tempfile::tempdir; - -use crate::rojo_test::io_util::{copy_recursive, BUILD_TESTS_PATH}; -use crate::rojo_test::roundtrip_util::{run_rojo_build, run_rojo_syncback_clean}; - -macro_rules! roundtrip_tests { - ($($test_name:ident),* $(,)?) => {$( - #[test] - fn $test_name() { - run_roundtrip_test(stringify!($test_name)); - } - )*}; -} - -fn run_roundtrip_test(build_test_name: &str) { - let _ = env_logger::try_init(); - - let project_path = Path::new(BUILD_TESTS_PATH).join(build_test_name); - - // 1. Build original project -> rbxl - let (_tmp1, original_rbxl) = run_rojo_build(&project_path, "original.rbxl"); - - // 2. Create fresh syncback target with just project file - let syncback_dir = tempdir().expect("Failed to create temp dir"); - copy_project_file(&project_path, syncback_dir.path()); - - // 3. Syncback from rbxl to fresh directory - assert!( - run_rojo_syncback_clean(syncback_dir.path(), &original_rbxl), - "Syncback should succeed" - ); - - // 4. Build from syncback result -> rbxl - let (_tmp2, roundtrip_rbxl) = run_rojo_build(syncback_dir.path(), "roundtrip.rbxl"); - - // 5. Compare both rbxl files (semantic comparison) - assert_rbx_equal(&original_rbxl, &roundtrip_rbxl); -} - -fn copy_project_file(src: &Path, dst: &Path) { - // Copy just the project file (default.project.json5) - for name in ["default.project.json5", "default.project.json"] { - let src_file = src.join(name); - if src_file.exists() { - fs::copy(&src_file, dst.join(name)).unwrap(); - return; - } - } - panic!("No project file found in {:?}", src); -} - -fn assert_rbx_equal(file_a: &Path, file_b: &Path) { - // Load both rbxl files and compare instance trees - let dom_a = rbx_binary::from_reader(fs::File::open(file_a).unwrap()).unwrap(); - let dom_b = rbx_binary::from_reader(fs::File::open(file_b).unwrap()).unwrap(); - - // Compare root children (skip DataModel itself) - compare_instances(&dom_a, dom_a.root_ref(), &dom_b, dom_b.root_ref()); -} - -// Test ALL build-test projects that should roundtrip cleanly -roundtrip_tests! { - attributes, - client_in_folder, - client_init, - deep_nesting, - init_meta_class_name, - init_meta_properties, - init_with_children, - json_model_in_folder, - json_model_legacy_name, - module_in_folder, - module_init, - project_composed_default, - project_composed_file, - project_root_name, - rbxm_in_folder, - rbxmx_in_folder, - server_in_folder, - server_init, - txt, - txt_in_folder, - sync_rule_alone, - sync_rule_complex, -} -``` - -### 3. Clean Mode Stress Tests: `tests/tests/clean_mode_stress.rs` - -```rust -//! Stress tests proving clean mode produces consistent results. -//! -//! Core invariant: syncing back to a DIRTY directory with clean mode -//! should produce IDENTICAL results to syncing back to an EMPTY directory. -//! -//! Tests apply various "mutations" to dirty up the filesystem, then verify -//! clean mode fixes everything. - -use std::path::Path; -use tempfile::tempdir; - -use crate::rojo_test::io_util::{copy_recursive, BUILD_TESTS_PATH}; -use crate::rojo_test::roundtrip_util::{ - apply_mutation, assert_dirs_equal, run_rojo_build, run_rojo_syncback_clean, Mutation, -}; - -/// Core test: dirty syncback should equal fresh syncback -fn clean_equals_fresh(test_name: &str, mutations: &[Mutation]) { - let _ = env_logger::try_init(); - - let project_path = Path::new(BUILD_TESTS_PATH).join(test_name); - - // 1. Build rbxl from original project - let (_tmp_rbxl, rbxl_path) = run_rojo_build(&project_path, "test.rbxl"); - - // 2. Syncback to DIR_A (fresh start) - let dir_a = tempdir().expect("Failed to create dir_a"); - copy_project_file(&project_path, dir_a.path()); - assert!(run_rojo_syncback_clean(dir_a.path(), &rbxl_path), "Initial syncback failed"); - - // 3. Apply mutations to DIR_A (dirty it up) - for mutation in mutations { - apply_mutation(dir_a.path(), mutation); - } - - // 4. Run clean syncback again on dirty DIR_A - assert!(run_rojo_syncback_clean(dir_a.path(), &rbxl_path), "Clean syncback on dirty dir failed"); - - // 5. Syncback to DIR_B (completely fresh) - let dir_b = tempdir().expect("Failed to create dir_b"); - copy_project_file(&project_path, dir_b.path()); - assert!(run_rojo_syncback_clean(dir_b.path(), &rbxl_path), "Fresh syncback failed"); - - // 6. CRITICAL ASSERTION: cleaned DIR_A == fresh DIR_B - assert_dirs_equal(dir_a.path(), dir_b.path()); -} - -// ========================================================================== -// MUTATION SCENARIO TESTS -// ========================================================================== - -#[test] -fn clean_removes_orphan_luau_files() { - clean_equals_fresh("deep_nesting", &[ - Mutation::AddOrphanFile { - relative_path: "src/orphan_script.luau", - content: "-- I shouldn't exist" - }, - Mutation::AddOrphanFile { - relative_path: "src/inner/another_orphan.luau", - content: "return nil" - }, - ]); -} - -#[test] -fn clean_removes_orphan_directories() { - clean_equals_fresh("deep_nesting", &[ - Mutation::AddOrphanDirectory { - relative_path: "src/fake_service" - }, - ]); -} - -#[test] -fn clean_restores_deleted_files() { - clean_equals_fresh("module_init", &[ - Mutation::DeleteFile { relative_path: "folder/init.luau" }, - ]); -} - -#[test] -fn clean_fixes_renamed_files() { - clean_equals_fresh("module_in_folder", &[ - Mutation::RenameFile { - from: "folder/aModule.luau", - to: "folder/wrongName.luau" - }, - ]); -} - -#[test] -fn clean_fixes_wrong_extensions() { - clean_equals_fresh("server_in_folder", &[ - Mutation::ChangeExtension { - from: "folder/serverScript.server.luau", - to: "folder/serverScript.modulescript" - }, - ]); -} - -#[test] -fn clean_restores_dir_from_file() { - clean_equals_fresh("init_with_children", &[ - Mutation::ConvertDirToFile { - dir: "src", - file_content: "-- was a directory" - }, - ]); -} - -#[test] -fn clean_restores_file_from_dir() { - clean_equals_fresh("module_in_folder", &[ - Mutation::ConvertFileToDir { - file: "folder/aModule.luau" - }, - ]); -} - -#[test] -fn clean_fixes_corrupt_meta_files() { - clean_equals_fresh("init_meta_properties", &[ - Mutation::CorruptMetaFile { - relative_path: "Lighting/init.meta.json5" - }, - ]); -} - -#[test] -fn clean_restores_modified_content() { - clean_equals_fresh("module_init", &[ - Mutation::ModifyFileContent { - relative_path: "folder/init.luau", - new_content: "-- totally wrong content\nreturn 'hacked'" - }, - ]); -} - -#[test] -fn clean_removes_spurious_project_files() { - clean_equals_fresh("deep_nesting", &[ - Mutation::AddNestedProjectFile { - relative_path: "src/fake.project.json5" - }, - ]); -} - -#[test] -fn clean_removes_duplicate_extensions() { - clean_equals_fresh("module_in_folder", &[ - Mutation::DuplicateWithDifferentExtension { - original: "folder/aModule.luau", - duplicate_ext: "lua" - }, - ]); -} - -#[test] -fn clean_handles_multiple_crazy_mutations() { - clean_equals_fresh("deep_nesting", &[ - Mutation::AddOrphanFile { relative_path: "orphan1.luau", content: "x" }, - Mutation::AddOrphanFile { relative_path: "src/orphan2.txt", content: "y" }, - Mutation::AddOrphanDirectory { relative_path: "fake_dir" }, - Mutation::ModifyFileContent { - relative_path: "src/inner/init.luau", - new_content: "-- wrong!" - }, - Mutation::AddNestedProjectFile { relative_path: "src/bad.project.json5" }, - ]); -} -``` - -### 4. Wire Up Modules - -`**tests/rojo_test/mod.rs`:** - -```rust -pub mod roundtrip_util; -``` - -`**tests/tests/mod.rs`:** - -```rust -mod syncback_roundtrip; -mod clean_mode_stress; -``` - ---- - -## Test Matrix - - -| Mutation Type | Test Name | Verifies | -| -------------------- | ---------------------------------------- | ------------------------ | -| Orphan .luau files | `clean_removes_orphan_luau_files` | Orphan file removal | -| Orphan directories | `clean_removes_orphan_directories` | Orphan directory removal | -| Deleted files | `clean_restores_deleted_files` | File restoration | -| Renamed files | `clean_fixes_renamed_files` | Name correction | -| Wrong extensions | `clean_fixes_wrong_extensions` | Extension normalization | -| Dir to File | `clean_restores_dir_from_file` | Format restoration | -| File to Dir | `clean_restores_file_from_dir` | Format restoration | -| Corrupt meta | `clean_fixes_corrupt_meta_files` | Meta regeneration | -| Modified content | `clean_restores_modified_content` | Content restoration | -| Spurious projects | `clean_removes_spurious_project_files` | Nested project cleanup | -| Duplicate extensions | `clean_removes_duplicate_extensions` | Duplicate removal | -| Combined chaos | `clean_handles_multiple_crazy_mutations` | Stress test | - - ---- - -## Files to Create/Modify - - -| File | Action | -| ----------------------------------- | ------------------------------------ | -| `tests/rojo_test/roundtrip_util.rs` | Create - helper utilities | -| `tests/tests/syncback_roundtrip.rs` | Create - roundtrip tests | -| `tests/tests/clean_mode_stress.rs` | Create - mutation stress tests | -| `tests/rojo_test/mod.rs` | Modify - add `roundtrip_util` module | -| `tests/tests/mod.rs` | Modify - add new test modules | - - ---- - -## Success Criteria - -1. All 20+ build-test projects can roundtrip successfully (build -> syncback -> rebuild -> compare) -2. All 12 mutation scenarios pass (clean == fresh invariant holds) -3. Tests run in CI without flakiness -4. Total added test runtime < 60 seconds - diff --git a/.cursor/plans/syncback_via_rbxm_ad0231a7.plan.md b/.cursor/plans/syncback_via_rbxm_ad0231a7.plan.md deleted file mode 100644 index 8db42fca..00000000 --- a/.cursor/plans/syncback_via_rbxm_ad0231a7.plan.md +++ /dev/null @@ -1,394 +0,0 @@ ---- -name: Syncback via RBXM -overview: Add a "Syncback" button to the plugin that serializes the DataModel per-service via SerializationService, sends the rbxm chunks to a totally segregated server endpoint, which tears down the entire serve system, runs CLI-equivalent clean-mode syncback, and restarts serve -- all within the same process. -todos: - - id: server-exit-reason - content: Modify LiveServer::start() to return ServerExitReason via tokio select + shutdown channel (src/web/mod.rs) - status: completed - - id: api-types - content: Add SyncbackPayload/ServiceChunk types to src/web/interface.rs - status: completed - - id: api-endpoint - content: Add POST /api/syncback endpoint handler in src/web/api.rs (fully segregated, no session validation) - status: completed - - id: serve-loop - content: Wrap ServeCommand::run() in a loop that handles SyncbackRequested (src/cli/serve.rs) - status: completed - - id: reconstruct-dom - content: "Implement run_live_syncback: reconstruct WeakDom from service chunks, run syncback_loop (clean mode, all CLI defaults), write files" - status: completed - - id: plugin-button - content: Add Syncback button (Danger style, layoutOrder 2) to NotConnected.lua - status: completed - - id: plugin-confirm - content: Add confirmation dialog (StudioPluginGui, danger-themed) in App/init.lua - status: completed - - id: plugin-serialize - content: Implement DataModel serialization per SYNCBACK_SERVICES list using SerializationService - status: completed - - id: plugin-api - content: Add standalone syncback HTTP post function (no ApiContext/session needed) - status: completed - - id: plugin-flow - content: "Wire up full flow in App/init.lua: confirm -> serialize -> POST /api/syncback -> done (fire and forget)" - status: completed - - id: test-helpers - content: Add post_api_syncback, wait_to_come_back_online, make_service_chunk, make_rbxl_from_chunks, run_cli_syncback_on_chunks to serve_util.rs - status: completed - - id: test-fixtures - content: Create live_syncback, live_syncback_place_ids, and live_syncback_complex serve-test fixtures - status: completed - - id: test-parity - content: "CLI parity tests (byte-for-byte): scripts, models+properties, refs, special names, duplicates, deep hierarchy, mixed types, comprehensive properties, multi-service" - status: completed - - id: test-validation - content: "Rejection tests: bad protocol, bad version, blocked place, unlisted place, whitelisted place, unrestricted" - status: completed - - id: test-lifecycle - content: "Lifecycle tests: server comes back functional (WebSocket + file watch), syncback twice with different data, replaces all old files" - status: completed - - id: test-roundtrip - content: "Round-trip identity test: build -> decompose -> live syncback -> rebuild -> compare instance trees" - status: completed -isProject: false ---- - -# Syncback via RBXM - -## Architecture - -```mermaid -sequenceDiagram - participant User - participant Plugin - participant Server - participant Filesystem - - User->>Plugin: Click "Syncback" button - Plugin->>Plugin: Show danger confirmation dialog - User->>Plugin: Confirm - Plugin->>Plugin: SerializeInstancesAsync per service - Plugin->>Server: POST /api/syncback (msgpack, segregated endpoint) - Server->>Plugin: 200 OK - Note over Server: Store payload, signal shutdown - Note over Server: Full teardown: drop ServeSession, VFS watcher, ChangeProcessor, WebSocket connections - Note over Server: Reconstruct WeakDom from service chunks - Note over Server: Run syncback_loop (clean mode, all CLI defaults) - Server->>Filesystem: Write files - Note over Server: Create fresh ServeSession + LiveServer - Note over Server: Bind to same address:port - Plugin->>Plugin: Poll GET /api/rojo until server is back - Plugin->>Server: Normal connect flow -``` - - - -## Server Changes - -### 1. Make `LiveServer::start()` return instead of blocking forever - -`[src/web/mod.rs](src/web/mod.rs)`: Change `start()` to return a `ServerExitReason` enum. Add a shutdown mechanism via `Arc` (wrapping a `Mutex>` + `tokio::sync::Notify`). The accept loop uses `tokio::select!` to watch for the notify signal alongside `listener.accept()`. When signaled, it breaks and returns. - -```rust -pub enum ServerExitReason { - SyncbackRequested(SyncbackPayload), -} - -pub struct SyncbackSignal { - payload: Mutex>, - notify: tokio::sync::Notify, -} -``` - -The `SyncbackSignal` is shared between `LiveServer` (which watches it) and the API handler (which deposits data into it). When the accept loop exits, the Tokio runtime drops, all spawned tasks (including active WebSocket connections) are cancelled, and the `Arc` drops -- tearing down the ChangeProcessor thread, VFS watcher, and all in-memory state. - -### 2. New segregated API endpoint: `POST /api/syncback` - -`[src/web/api.rs](src/web/api.rs)`: Totally separate from the connect/sync flow. No session ID needed -- the plugin doesn't need to be "connected" to use this. But it does validate version and place ID. - -Request body is msgpack-encoded: - -```rust -pub struct SyncbackRequest { - pub protocol_version: u64, - pub server_version: String, - pub place_id: Option, - pub services: Vec, -} -pub struct ServiceChunk { - pub class_name: String, - pub data: Vec, // raw rbxm bytes -} -// Payload passed to the serve loop (version info stripped after validation) -pub struct SyncbackPayload { - pub services: Vec, -} -``` - -Types live in `[src/web/interface.rs](src/web/interface.rs)`. - -Handler flow: - -1. Deserialize msgpack body into `SyncbackRequest` -2. **Validate protocol version** -- reject with 400 if `request.protocol_version != PROTOCOL_VERSION` -3. **Validate server version** -- reject with 400 if major.minor doesn't match `SERVER_VERSION` -4. **Validate place ID** against the project's `servePlaceIds` (whitelist) and `blockedPlaceIds` (blocklist). Reject with 403 if not allowed. -5. Extract `SyncbackPayload` (just the services), store in `SyncbackSignal` -> notify -> return 200 `{"status": "syncback_initiated"}` - -The response is sent before any teardown begins (the API handler is a separate tokio task from the accept loop). - -### 3. Wrap `ServeCommand::run()` in a loop - -`[src/cli/serve.rs](src/cli/serve.rs)`: The `run()` method becomes a loop. Each iteration creates a fresh VFS, ServeSession, and LiveServer. When `start()` returns `SyncbackRequested`, the old session is fully dropped (VFS watcher stops, ChangeProcessor thread joins, tree is freed), syncback runs, and the loop continues to create everything fresh: - -```rust -loop { - let (vfs, errors) = Vfs::new_default_with_errors(); - let session = Arc::new(ServeSession::new(vfs, project_path.clone(), Some(errors))?); - let server = LiveServer::new(session); - - match server.start(addr) { - ServerExitReason::SyncbackRequested(payload) => { - log::info!("Live syncback requested, running..."); - run_live_syncback(&project_path, payload)?; - log::info!("Syncback complete, restarting serve..."); - continue; - } - } -} -``` - -IP and port are resolved once before the loop (they don't change). - -### 4. Reconstruct WeakDom + run syncback (CLI-equivalent) - -New function `run_live_syncback(project_path: &Path, payload: SyncbackPayload) -> anyhow::Result<()>` in `src/cli/serve.rs`: - -1. **Build WeakDom** -- Create `DataModel` root, for each `ServiceChunk` parse rbxm via `rbx_binary::from_reader`, create a service instance of the correct class, deep-clone all children from the parsed dom into the target dom. Maintain a `HashMap` ref-map to fix up Ref properties across chunks. -2. **Run syncback** -- Identical to what CLI `atlas syncback` does: - - Create oneshot VFS: `Vfs::new_oneshot()` - - Load old tree: `ServeSession::new_oneshot(vfs, project_path)` - - Call `syncback_loop(vfs, &mut old_tree, new_dom, project, incremental: false)` -- clean mode - - Write: `fs_snapshot.write_to_vfs_parallel(base_path, vfs)` - - `refresh_git_index(base_path)` - -Same code path as CLI syncback, same defaults, same clean mode. The only difference is the WeakDom source. - -## Plugin Changes - -### 5. Syncback button on NotConnected page - -`[plugin/src/App/StatusPages/NotConnected.lua](plugin/src/App/StatusPages/NotConnected.lua)`: Add "Syncback" button with `style = "Danger"` and `layoutOrder = 2`, shift "Sync" to `layoutOrder = 3`: - -``` -[Settings] [Syncback] [Sync] -``` - -Fires `self.props.onSyncback`. - -### 6. Confirmation dialog - -`[plugin/src/App/init.lua](plugin/src/App/init.lua)`: Floating `StudioPluginGui` dialog (same pattern as `AcceptConfirm` in Confirming.lua): - -- Title: "Full Syncback" -- Message: "This will overwrite your project files with the current Studio state. This cannot be undone." -- Buttons: "Cancel" (Bordered) | "Syncback" (Danger) -- State: `self.state.showingSyncbackConfirm` - -### 7. DataModel serialization - -After confirmation, serialize per-service. Hardcode the same `VISIBLE_SERVICES` list from the Rust side: - -```lua -local SYNCBACK_SERVICES = { - "Lighting", "MaterialService", "ReplicatedFirst", "ReplicatedStorage", - "ServerScriptService", "ServerStorage", "SoundService", "StarterGui", - "StarterPack", "StarterPlayer", "Teams", "TextChatService", - "VoiceChatService", "Workspace", -} - -local services = {} -for _, className in SYNCBACK_SERVICES do - local service = game:FindService(className) - if service and #service:GetChildren() > 0 then - local buf = SerializationService:SerializeInstancesAsync(service:GetChildren()) - table.insert(services, { - className = className, - data = buf, -- msgpack-luau natively encodes buffer as bin format (zero-copy) - }) - end -end -``` - -The msgpack-luau library handles `buffer` types natively -- when `type(data) == "buffer"`, it encodes as msgpack bin 8/16/32 using `buffer.copy` directly. No string conversion needed. On the Rust side, `rmp_serde` deserializes msgpack bin into `Vec` automatically. - -### 8. Direct HTTP post (no ApiContext needed) - -Since this endpoint is fully segregated and doesn't need a session, the plugin just needs host:port from the address entry fields. A standalone function posts directly: - -```lua -local function postSyncback(host, port, services) - local url = ("http://%s:%s/api/syncback"):format(host, port) - local body = Http.msgpackEncode({ - protocolVersion = Config.protocolVersion, - serverVersion = Config.expectedServerVersionString, - placeId = game.PlaceId, - services = services, - }) - return Http.post(url, body):andThen(rejectFailedRequests) -end -``` - -No `ApiContext` instance needed. This keeps it completely independent from the connect flow. - -### 9. Full flow in App - -`[plugin/src/App/init.lua](plugin/src/App/init.lua)`: The `onSyncback` handler: - -1. Show confirmation dialog -2. On confirm: serialize DataModel per-service -3. POST to `/api/syncback` with the chunks -4. On 200: show a notification ("Syncback data sent. Server is processing.") -5. Done. Stay on NotConnected page. User clicks "Sync" manually whenever they're ready. - -Fire and forget -- the plugin's job ends after the POST succeeds. No polling, no auto-reconnect, no special state. - -## Key Design Decisions - -- **Fully segregated endpoint**: `/api/syncback` has zero coupling to the session/connect system. No session ID, no auth. Plugin fires and forgets. -- **Complete teardown**: When the signal fires, the entire serve system is destroyed -- Tokio runtime drops, ServeSession drops (joining the ChangeProcessor thread, stopping VFS watcher), all WebSocket connections are cancelled. Nothing survives from the previous serve. -- **CLI-equivalent syncback**: Uses `syncback_loop` with `incremental: false` (clean mode), non-interactive. Identical behavior to `atlas syncback --input file.rbxl` with all defaults. -- **Same process, same port**: The `atlas serve` process never exits. After syncback completes, a fresh serve starts on the same address:port. The user sees log output in their terminal throughout. -- **Danger styling**: Uses existing `Danger` theme (`#E74C3C` red) defined in `[plugin/src/App/Theme.lua](plugin/src/App/Theme.lua)`. -- **Per-service serialization**: 14 visible services from `VISIBLE_SERVICES` constant, matching both Rust and Lua sides. Cross-service Ref properties are lost in transit but syncback's `Rojo_Ref_`* system resolves refs from filesystem structure. - -## Tests - -The core invariant: **live syncback must produce byte-identical filesystem output to CLI syncback given the same input data.** If it doesn't, something is broken in the serialize -> transmit -> reconstruct -> syncback pipeline. Every test that verifies data accuracy runs BOTH live syncback and CLI syncback on the same input, then compares output with `assert_dirs_equal` (byte-for-byte file comparison from `[tests/rojo_test/roundtrip_util.rs](tests/rojo_test/roundtrip_util.rs)`). - -Tests go in a dedicated `tests/tests/live_syncback.rs`. They use `run_serve_test` from `[tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs)` plus the round-trip utilities. - -### Test helpers (add to `serve_util.rs`) - -`**post_api_syncback_raw`** -- Sends a raw msgpack body to `POST /api/syncback`. Returns the full `reqwest::blocking::Response` so tests can assert on status codes and error bodies. - -`**post_api_syncback`** -- Convenience wrapper that fills in correct protocol version + server version. Takes `place_id: Option` and `services: Vec`. Panics if response is not 200. - -`**wait_to_come_back_online`** -- Polls `GET /api/rojo` with exponential backoff (longer timeout than initial startup since syncback runs between teardown and restart). Returns the new `ServerInfoResponse`. Panics if server doesn't come back. - -`**make_service_chunk`** -- Builds a `ServiceChunk` from `InstanceBuilder` children: - -```rust -fn make_service_chunk(class_name: &str, children: Vec) -> ServiceChunk { - let mut dom = WeakDom::new(InstanceBuilder::new("DataModel")); - let root = dom.root_ref(); - for child in children { - dom.insert(root, child); - } - let refs: Vec = dom.root().children().to_vec(); - let mut buf = Vec::new(); - rbx_binary::to_writer(&mut buf, &dom, &refs).unwrap(); - ServiceChunk { class_name: class_name.to_string(), data: buf } -} -``` - -`**make_rbxl_from_chunks**` -- Builds a complete rbxl file from the same service chunks, for CLI parity testing. Creates a WeakDom with DataModel root + properly-classed service instances + children, serializes to rbxl. This gives CLI syncback the exact same input data as live syncback received. - -`**run_cli_syncback_on_chunks**` -- End-to-end helper: copies a fixture to a fresh temp dir, calls `make_rbxl_from_chunks`, runs `run_rojo_syncback_clean`, returns the temp dir path. Used by every parity test as the CLI reference. - -### Fixtures - -`**rojo-test/serve-tests/live_syncback/**` -- Multi-service project: - -``` -default.project.json5 # RS -> src/shared, SSS -> src/server, Workspace -> src/workspace -src/shared/OldModule.luau -src/server/OldScript.server.luau -src/workspace/OldPart.model.json5 -``` - -`**rojo-test/serve-tests/live_syncback_place_ids/**` -- Same layout + `servePlaceIds: [123]`, `blockedPlaceIds: [999]`. - -`**rojo-test/serve-tests/live_syncback_complex/**` -- All 14 visible services mapped to separate `$path` dirs. Used for comprehensive parity tests. - -### CLI parity tests (data accuracy) - -Every parity test follows this pattern: - -```rust -fn assert_live_matches_cli( - fixture_name: &str, - chunks: Vec, - place_id: Option, -) { - run_serve_test(fixture_name, |session, _| { - // 1. Live syncback - session.post_api_syncback(place_id, chunks.clone()); - session.wait_to_come_back_online(); - - // 2. CLI syncback on fresh copy of same fixture with same data - let cli_dir = run_cli_syncback_on_chunks(fixture_name, &chunks); - - // 3. Byte-for-byte comparison of every file - assert_dirs_equal(session.path(), &cli_dir); - }); -} -``` - -`**parity_scripts**` -- ModuleScript (`return {}`), Script/Server (`print("server")`), Script/Client (`print("client")`), LocalScript. Verifies Source content preserved exactly, correct file extensions (`.luau`, `.server.luau`, `.client.luau`, `.local.luau`), RunContext encoded in extension. - -`**parity_models_with_properties**` -- Model containing Parts with: Anchored (Bool), Size (Vector3), Position (Vector3), Color (Color3), BrickColor, Shape (Enum), Transparency (Float64). Verifies every property value round-trips through rbxm -> reconstruct -> syncback -> meta/model files identically. - -`**parity_ref_properties**` -- Model with PrimaryPart -> child Part. ObjectValue with Value -> sibling Part. Verifies `Rojo_Ref_*` attribute paths in meta/model files match CLI output exactly. - -`**parity_special_names**` -- Instances named `"What?"`, `"Key:Value"`, `"A/B"`, `""`, `'He said "hi"'`. Verifies slugified filenames (`What_`, `Key_Value`, `A_B`, etc.) and meta `name` fields match CLI. - -`**parity_duplicate_names**` -- 3x Folder named `"Data"`, 2x Script named `"Handler"`. Verifies dedup suffixes (`Data/`, `Data~2/`, `Data~3/`, `Handler.server.luau`, `Handler~2.server.luau`) and meta files match CLI. - -`**parity_deep_hierarchy**` -- 6 levels: Folder > Folder > Folder > Folder > Model > Part. Verifies nested directory structure is identical. - -`**parity_mixed_file_types**` -- StringValue (-> `.txt`), LocalizationTable (-> `.csv`), JSON data module (-> `.json5`), binary model (-> `.rbxm`), Folder (-> directory). All under one service. Byte-for-byte match with CLI. - -`**parity_comprehensive_properties**` -- Single Part with every testable property type set to non-default values: Bool, Int32, Float32, Float64, String, Vector2, Vector3, Vector2int16, Vector3int16, UDim, UDim2, Color3, Color3uint8, BrickColor, NumberRange, Rect, Enum, Font, Tags, Attributes (with nested types). Verifies meta.json5 property serialization matches CLI exactly. - -`**parity_multi_service**` -- Data under all 14 visible services simultaneously. Each service gets a unique set of instances (scripts, models, folders). Verifies every service's `$path` directory matches CLI output. - -`**parity_empty_services_mixed**` -- Some services have children, some don't, some are absent from the payload entirely. Verifies populated services are correct and empty/absent services result in clean directories. - -### Validation / rejection tests - -`**rejects_bad_protocol**` -- Send `protocol_version: 999`. Expect non-200. GET /api/rojo still returns same session ID (server unaffected). - -`**rejects_bad_version**` -- Send `server_version: "0.0.0"`. Expect non-200. Server unaffected. - -`**rejects_blocked_place**` -- Fixture has `blockedPlaceIds: [999]`. Send `placeId: 999`. Expect 403. Server unaffected. - -`**rejects_unlisted_place**` -- Fixture has `servePlaceIds: [123]`. Send `placeId: 456`. Expect 403. Server unaffected. - -`**allows_whitelisted_place**` -- `servePlaceIds: [123]`, send `placeId: 123`. Expect 200. Syncback runs, server restarts. - -`**allows_any_place_when_unrestricted**` -- No servePlaceIds/blockedPlaceIds. Send `placeId: 99999`. Expect 200. - -### Lifecycle / edge case tests - -`**server_comes_back_functional**` -- After live syncback, verify the restarted server is fully operational: GET /api/rojo works, can read instances via /api/read, WebSocket connects and receives patches when a file is modified on disk. - -`**syncback_twice_different_data**` -- Run live syncback with data A. Wait for restart. Run live syncback AGAIN with data B. Wait for restart. Verify filesystem matches data B (not A). Verify server is functional. Tests the serve loop handles multiple iterations. - -`**syncback_replaces_all_old_files**` -- Pre-populate the fixture with files that should NOT survive clean mode (orphan scripts, old models). After live syncback, verify none of the old files remain. Only files from the new data exist. - -### Round-trip identity test - -The ultimate accuracy test: - -`**roundtrip_build_syncback_rebuild**` -- Using the `live_syncback_complex` fixture: - -1. `atlas build` -> rbxl_A -2. Decompose rbxl_A into per-service chunks (parse with `rbx_binary::from_reader`, extract children of each service, re-serialize as rbxm chunks) -3. POST chunks to live syncback, wait for restart -4. `atlas build` -> rbxl_B -5. Parse both rbxl_A and rbxl_B into WeakDoms -6. Walk both trees recursively: compare instance names, classes, property values (using the same fuzzy equality from `variant_eq` for floats/CFrames), and child counts -7. Any divergence = test failure with detailed diff - -This tests the full pipeline: build -> decompose into service chunks -> transmit -> reconstruct -> syncback -> build again. If the output matches, the live syncback system preserves 100% data fidelity. \ No newline at end of file diff --git a/.cursor/plans/two-way_sync_integration_tests_0e4e4dfc.plan.md b/.cursor/plans/two-way_sync_integration_tests_0e4e4dfc.plan.md deleted file mode 100644 index 648f2008..00000000 --- a/.cursor/plans/two-way_sync_integration_tests_0e4e4dfc.plan.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -name: Two-way sync integration tests -overview: "Add integration tests covering the critical untested two-way sync operations: instance rename, ClassName transitions, non-Source property persistence, removal with meta cleanup, and end-to-end bidirectional sync workflows. Tests validate that the plugin sync pipeline can eventually replace `rojo syncback` for keeping the filesystem in sync with Studio." -todos: - - id: create-test-file - content: Create tests/tests/two_way_sync.rs with test module structure, imports, and helper functions - status: completed - - id: register-module - content: Register two_way_sync module in tests/end_to_end.rs - status: completed - - id: basic-source-write - content: "Test: update_source_writes_to_disk — verify Source property write to disk via InstanceUpdate" - status: completed - - id: property-persistence - content: "Tests: update_non_source_property_creates_meta_file + update_properties_for_directory_script_writes_init_meta" - status: completed - - id: rename-tests - content: "Tests: rename_standalone_script + rename_preserves_adjacent_meta_file" - status: completed - - id: classname-tests - content: "Tests: classname_change_standalone_module_to_script + classname_change_directory_script_renames_init_file" - status: completed - - id: removal-tests - content: "Tests: remove_instance_deletes_file_and_meta + remove_directory_instance" - status: completed - - id: round-trip - content: "Test: round_trip_add_modify_rename_remove — end-to-end lifecycle" - status: completed - - id: edge-cases - content: "Tests: property_update_skips_project_node_instances + echo_suppression_prevents_redundant_patches" - status: completed - - id: ci-verify - content: Run /ci to verify all new tests pass alongside existing 606+397 tests - status: completed -isProject: false ---- - -# Two-Way Sync Integration Tests - -## Intent - -The plugin's two-way sync (`POST /api/write`) should eventually supersede the `rojo syncback` command entirely. The goal is continuous bidirectional sync: connect to Studio, accept changes, and work in an external IDE while others work in Studio. These tests validate the core primitives that make this possible. - -## Coverage Gaps Addressed - -The existing tests cover format transitions (standalone/directory) and stress testing but have **zero coverage** for: - -1. **Instance rename** (changed_name) — file/directory rename on disk, adjacent meta file rename -2. **ClassName transitions** (changed_class_name) — script type changes, init file detection in directories -3. **Non-Source property persistence** (changed_properties except Source) — writing to meta files -4. **Instance removal with meta file cleanup** — deleting files plus their adjacent `.meta.json5` -5. **End-to-end round-trip** — add instance, modify it, rename it, verify filesystem at each step - -## Test Fixture - -Use existing `syncback_write` fixture (`rojo-test/serve-tests/syncback_write/`). It has a minimal project: `ReplicatedStorage` mapped to `src/` with one existing `existing.luau` (ModuleScript). This is ideal for testing write operations without interference from complex file structures. - -For rename tests, we also use `syncback_format_transitions` which has directory-format scripts with init files. - -## New Test File - -Add tests to `tests/tests/two_way_sync.rs` (new file). Register it via `tests/end_to_end.rs`. - -All tests follow the established pattern: - -- `run_serve_test(fixture_name, |session, _redactions| { ... })` -- Find parent ID via `get_api_rojo()` + `get_api_read()` -- Construct `WriteRequest` with `added`, `updated`, or `removed` -- Call `session.post_api_write()` -- Assert filesystem state - -## Tests - -### 1. `update_source_writes_to_disk` — Verify the basic Source write path - -Send an `InstanceUpdate` with `changed_properties: { Source: "-- new content" }` for the existing `existing.luau`. Verify `fs::read_to_string` returns the new content. This is the most fundamental two-way sync operation. - -### 2. `update_non_source_property_creates_meta_file` — Issue 2 coverage - -Send an `InstanceUpdate` with a non-Source property (Attributes) for `existing.luau`. Verify: - -- `existing.meta.json5` is created adjacent to `existing.luau` -- The meta file contains the attribute value -- `existing.luau` itself is unchanged - -### 3. `update_properties_for_directory_script_writes_init_meta` — Issue 2 directory path - -Use `syncback_format_transitions` fixture. Send property update for a directory-format script (`DirModuleWithChildren`). Verify `init.meta.json5` is created inside the directory. - -### 4. `rename_standalone_script` — Issue 8 rename coverage - -Add a new ModuleScript `OldName` via `added`, wait for it to appear on disk. Then send an `InstanceUpdate` with `changed_name: Some("NewName")`. Verify: - -- `OldName.luau` is gone -- `NewName.luau` exists with same content - -### 5. `rename_preserves_adjacent_meta_file` — Issue 8 meta rename - -Add a ModuleScript, send a property update to create its meta file, then rename it. Verify both the `.luau` and `.meta.json5` files are renamed together. - -### 6. `classname_change_standalone_module_to_script` — Issue 8 ClassName coverage - -Add a ModuleScript `MyModule`, then send `changed_class_name: Some("Script")`. Verify: - -- `MyModule.luau` is gone -- `MyModule.server.luau` exists - -### 7. `classname_change_directory_script_renames_init_file` — Issue 8 directory ClassName - -Use `syncback_format_transitions`. Send `changed_class_name` for `DirModuleWithChildren` (ModuleScript -> Script). Verify: - -- Directory still exists -- `init.luau` is gone -- `init.server.luau` exists -- Children still exist - -### 8. `remove_instance_deletes_file_and_meta` — Issue 4 removal cleanup - -Add a ModuleScript, create its meta file via property update, then remove it via `removed`. Verify both the `.luau` file and `.meta.json5` are deleted. - -### 9. `remove_directory_instance` — Issue 4 directory removal - -Use `syncback_format_transitions`. Remove a directory-format instance. Verify the entire directory is deleted recursively. - -### 10. `round_trip_add_modify_rename_remove` — End-to-end workflow - -This test validates the complete lifecycle that makes two-way sync viable as a `syncback` replacement: - -1. **Add** a new Script `PlayerHandler` with children -2. Verify directory created on disk -3. **Modify** its Source property -4. Verify file content updated -5. **Rename** it to `GameHandler` -6. Verify directory renamed -7. **Remove** it -8. Verify directory deleted - -### 11. `property_update_skips_project_node_instances` — Post-fix coverage - -Send property update for a Service (ReplicatedStorage) which has `InstigatingSource::ProjectNode`. Verify it does NOT corrupt the project file. The project file content should be unchanged. - -### 12. `echo_suppression_prevents_redundant_patches` — Issue 7 coverage - -Add a new instance, then immediately read the message queue. Count the WebSocket messages — there should be exactly one patch notification, not two (which would indicate echo from the VFS picking up the file write). - -## Key Implementation Details - -- `InstanceUpdate` requires `UstrMap>` for `changed_properties`. Import `rbx_dom_weak::{ustr, UstrMap}`. -- Finding existing instance IDs: read tree via `get_api_read(root_id)`, traverse `instances` to find by class/name. -- After `post_api_write`, sleep 200-500ms for change processor to handle VFS events. -- Use `fs::read_to_string` to verify file content, `fs::metadata` to verify existence. -- For rename/ClassName tests, the instance ID in `InstanceUpdate` must match the ID the server assigned (found via `get_api_read` after the initial add). - -## File Registration - -Add `mod two_way_sync;` to `tests/tests/mod.rs` (or the test harness entry point `tests/end_to_end.rs`). \ No newline at end of file diff --git a/.cursor/plans/two-way_sync_refs_6e154eef.plan.md b/.cursor/plans/two-way_sync_refs_6e154eef.plan.md deleted file mode 100644 index 32ac6657..00000000 --- a/.cursor/plans/two-way_sync_refs_6e154eef.plan.md +++ /dev/null @@ -1,222 +0,0 @@ ---- -name: Two-way Sync Refs -overview: Add Ref property support to two-way sync, plus immediate ID assignment for newly added instances so they can be referenced by Refs right away. Plugin sends ephemeral server-side Ref IDs; server resolves them to Rojo_Ref_* path-based attributes on disk. No Rojo_Target_* or Rojo_Id used. -todos: - - id: plugin-filter - content: Remove `Ref` from UNENCODABLE_DATA_TYPES in propertyFilter.lua - status: completed - - id: plugin-encode - content: Add Ref encoding logic to encodePatchUpdate.lua using InstanceMap lookup, with deferred-ref support for unresolved targets - status: completed - - id: plugin-pass-map - content: Pass instanceMap from createPatchSet.lua to encodePatchUpdate(), return deferred properties for retry - status: completed - - id: plugin-defer - content: Update ChangeBatcher flush to re-queue deferred Ref properties for next batch - status: completed - - id: plugin-preinsert - content: Pre-insert new instances into InstanceMap with temp GUID during pull, so Ref encoding works immediately - status: cancelled - - id: shared-ref-helper - content: Extract shared helper for computing Rojo_Ref_* attribute from a Ref (path computation + attribute name formatting) into rojo_ref.rs or similar, usable by both ref_properties.rs and api.rs - status: completed - - id: server-ref-attrs - content: Handle Ref->Rojo_Ref_* attribute conversion in syncback_updated_properties() using the shared helper - status: completed - - id: server-merge-remove - content: Add attribute removal support to merge_or_build_meta() - status: completed - - id: server-honor-ids - content: Honor plugin-provided Ref IDs for added instances -- insert into RojoTree immediately with suppress - status: cancelled -isProject: false ---- - -# Two-Way Sync Ref Property Support - -## Current Problem - -Ref properties are blocked at two layers: - -1. **Plugin** -- `Ref` is in `UNENCODABLE_DATA_TYPES` ([propertyFilter.lua](plugin/src/ChangeBatcher/propertyFilter.lua)), so `encodePatchUpdate.lua` skips them entirely. -2. **Server** -- `filter_properties_for_meta()` in [api.rs](src/web/api.rs) line 2288-2291 skips `Variant::Ref(_)`. - -Additionally, newly added instances (via "pull") do not get stable IDs that the plugin can use for Ref encoding. The server ignores the plugin-generated temp GUID and lets the VFS watcher assign a different ID asynchronously. - -## Design Principles - -- **Plugin sends ephemeral IDs, server resolves to paths.** The plugin encodes Ref properties using server-side Ref IDs from the InstanceMap. The server maps these IDs to instance paths and writes `Rojo_Ref_*` attributes to disk. -- **Only `Rojo_Ref_*` on disk.** No `Rojo_Target_*` or `Rojo_Id` system. Path-based references only. -- **Immediate ID assignment for new instances.** When the plugin pulls a new instance, it gets a GUID that the server honors as the tree Ref ID. The plugin pre-inserts this into the InstanceMap so Ref encoding works without waiting for the VFS round-trip. - -## Existing Infrastructure to Leverage - -- [ref_properties.rs](src/syncback/ref_properties.rs) -- CLI syncback's path computation and `Rojo_Ref_*` attribute writing -- [patch_compute.rs](src/snapshot/patch_compute.rs) `compute_ref_properties()` -- reads `Rojo_Ref_*` attributes and resolves to `Variant::Ref` during forward-sync -- `WeakDom::full_path_of(ref, "/")` -- computes slash-separated instance path (root excluded) -- `RojoTree::get_instance_by_path()` in [tree.rs](src/snapshot/tree.rs) -- resolves path back to Ref -- [rojo_ref.rs](src/rojo_ref.rs) -- `REF_PATH_ATTRIBUTE_PREFIX = "Rojo_Ref_"` - -## Data Flow - -### Ref property change on existing instances - -```mermaid -sequenceDiagram - participant Studio - participant Plugin - participant Server - participant FS as Filesystem - - Studio->>Plugin: Instance.Changed fires for Ref property - Plugin->>Plugin: Read property value (Instance or nil) - Plugin->>Plugin: Look up target in InstanceMap -> server Ref ID - Plugin->>Server: POST /api/write with Variant::Ref(server_id) - Server->>Server: Compute target path via full_path_of() - Server->>FS: Write Rojo_Ref_PropName attribute to meta/model file - Server->>Server: Apply Ref to in-memory RojoTree - Note over Server,FS: suppress_path prevents VFS echo -``` - -### New instance addition with immediate ID - -```mermaid -sequenceDiagram - participant User - participant Plugin - participant Server - participant Tree as RojoTree - - User->>Plugin: Pulls new instance via confirmation dialog - Plugin->>Plugin: Generate GUID, pre-insert into InstanceMap - Plugin->>Server: POST /api/write, added["guid"] = instance data - Server->>Server: Write files to disk, suppress paths - Server->>Tree: Insert instance using plugin's GUID as Ref ID - Note over Plugin: Future Ref changes can reference this GUID immediately -``` - -## Changes - -### Part A: Ref Encoding for Existing Instances - -#### 1. Plugin: Remove Ref from filter - -**File:** [propertyFilter.lua](plugin/src/ChangeBatcher/propertyFilter.lua) - -Remove `Ref = true` from `UNENCODABLE_DATA_TYPES`. Only `UniqueId = true` remains. - -#### 2. Plugin: Encode Ref properties with InstanceMap - -**File:** [encodePatchUpdate.lua](plugin/src/ChangeBatcher/encodePatchUpdate.lua) - -- Accept `instanceMap` as a new parameter -- When `descriptor.dataType == "Ref"`: - - Read the property value from the Studio instance (returns a Roblox Instance or nil) - - If nil: encode as `{ Ref = "00000000000000000000000000000000" }` (null ref) - - If Instance: look up `instanceMap.fromInstances[value]` to get the server Ref ID string, encode as `{ Ref = serverIdHex }` - - If Instance not in InstanceMap: mark property as **deferred** (return it separately so the ChangeBatcher can retry next batch) -- For non-Ref properties: existing `encodeProperty()` path unchanged - -#### 3. Plugin: Pass InstanceMap and handle deferred Refs - -**File:** [createPatchSet.lua](plugin/src/ChangeBatcher/createPatchSet.lua) - -- Pass `instanceMap` to `encodePatchUpdate()` -- `encodePatchUpdate` returns both the update AND any deferred property names -- `createPatchSet` collects deferred properties and returns them alongside the patch - -**File:** [ChangeBatcher/init.lua](plugin/src/ChangeBatcher/init.lua) - -- In `__flush()`, receive deferred properties from `createPatchSet` -- Re-add deferred properties to `__pendingPropertyChanges` so they're retried in the next batch cycle -- This handles the case where a Ref target hasn't appeared in the InstanceMap yet (e.g., new instance not yet synced) - -### Part B: Immediate ID Assignment for New Instances - -#### 4. Plugin: Pre-insert new instances into InstanceMap - -**File:** [ServeSession.lua](plugin/src/ServeSession.lua) (around line 770-784) - -Currently the plugin generates a GUID for pulled instances but does NOT insert them into the InstanceMap: - -```lua -local guid = HttpService:GenerateGUID(false) -local tempRef = string.gsub(guid, "-", ""):lower() -pullPatch.added[tempRef] = encoded -``` - -The `GenerateGUID` approach is kept as-is (Option D) -- it already produces a valid 32-char hex `Ref` with no conversion cost and no server-side changes needed. Stability across multiple pulls is not required since these are ephemeral session-scoped IDs. - -**Change:** After generating the GUID, immediately insert the Studio instance into the InstanceMap: - -```lua -self.__instanceMap:insert(tempRef, instance) -``` - -This makes the GUID available for Ref encoding immediately. When the server later broadcasts the applied patch (with the same GUID as the instance ID), the reconciler will find the existing InstanceMap entry and reuse the Studio instance rather than creating a duplicate. - -#### 5. Server: Honor plugin-provided Ref IDs for additions - -**File:** [api.rs](src/web/api.rs) in `handle_api_write()` - -Currently the server ignores the `added` map keys (plugin-generated GUIDs) and sends an empty `added_instances` in the PatchSet: - -```rust -added_instances: Vec::new(), // line 647 -``` - -**Changes:** - -- After writing files via `syncback_added_instance`, also insert the instance into the RojoTree directly, using the plugin's GUID (the map key) as the Ref ID -- Build an `InstanceSnapshot` from the `AddedInstance` data (name, className, properties) -- Set `InstigatingSource::Path` to the written file path -- Suppress the file paths for the VFS watcher (prevents duplicate detection) -- Include the instance in the PatchSet's `added_instances` so it's applied to the tree and broadcast - -This ensures the GUID is the canonical ID for the instance in the tree, matching what the plugin pre-inserted into its InstanceMap. - -#### 6. Server: Process additions before updates - -**File:** [api.rs](src/web/api.rs) in `handle_api_write()` - -Ensure additions are fully processed (files written + tree insertion) **before** processing updates. This allows Ref properties in the `updated` list to reference instances from the `added` list within the same write request. - -### Part C: Server-Side Ref-to-Path Resolution - -#### 6.5. Shared helper: Ref-to-attribute conversion - -**File:** [rojo_ref.rs](src/rojo_ref.rs) or a new helper module - -Extract the core logic of "given a Ref target and a property name, produce the `Rojo_Ref_*` attribute name and path value" into a shared function. This avoids duplicating the pattern between [ref_properties.rs](src/syncback/ref_properties.rs) (CLI syncback bulk mode) and [api.rs](src/web/api.rs) (two-way sync per-instance mode). Both call sites compute `format!("{REF_PATH_ATTRIBUTE_PREFIX}{}", prop_name)` and resolve the target path -- this should live in one place. - -Also clean up the now-dead `Variant::Ref(_)` skip in `filter_properties_for_meta()` (line 2289) -- after this change, Ref properties are extracted before reaching that function, so the skip is unreachable in the two-way sync path. Remove it and add a comment explaining that Ref properties are handled upstream. - -#### 7. Server: Convert Ref properties to Rojo_Ref_* attributes - -**File:** [api.rs](src/web/api.rs) in `syncback_updated_properties()` (line 2490+) - -Before calling `filter_properties_for_meta`: - -- Extract `Variant::Ref` properties from the update's `changed_properties` -- For each Ref property, use the shared helper: - - If ref is null (`Ref::none()`): mark `Rojo_Ref_PropertyName` for removal from the meta file - - If ref is valid: compute target path via `tree.inner().full_path_of(target_ref, "/")`, add `Rojo_Ref_PropertyName = path` to the attributes map - - If target not found in tree: log warning and skip (still apply Ref to in-memory tree so session works) -- Remove the Ref entries from the props map before passing to `filter_properties_for_meta` -- Merge the computed `Rojo_Ref_*` entries into the `attributes` map returned by `filter_properties_for_meta` - -#### 8. Server: Support attribute removal in merge_or_build_meta - -**File:** [api.rs](src/web/api.rs) in `merge_or_build_meta()` (line 2659) - -Add a `remove_attributes: &[String]` parameter. When merging into an existing file, remove any attributes whose keys are in this list from the `attributes` object. This handles nil Ref cleanup (removing a stale `Rojo_Ref_PrimaryPart` when PrimaryPart is set to nil). - -## Edge Cases - -- **Target not in tree:** Skip with warning. The deferred-ref mechanism on the plugin side will retry. -- **Target is nil:** Remove the `Rojo_Ref_*` attribute from the meta file via `remove_attributes`. -- **Ambiguous paths (duplicate-named siblings):** For this initial implementation, path-based refs are written as-is. If the path is ambiguous (duplicate-named siblings at any ancestor level), the Ref will still be written to the in-memory tree (so the current session works correctly), but the filesystem representation may resolve to the wrong sibling on rebuild. A follow-up will add proper disambiguation support. Log a warning when an ambiguous path is detected so it's visible. -- **VFS echo prevention:** `suppress_path()` prevents the VFS watcher from re-triggering on files we just wrote. -- **Reconciler receiving already-known instances:** When the applied patch includes an instance the plugin pre-inserted, `InstanceMap:insert()` calls `removeId`/`removeInstance` first, cleanly replacing the entry. The reconciler should detect the existing Studio instance and reuse it rather than creating a duplicate. -- **ProjectNode instances:** Already handled -- `syncback_updated_properties` returns early for `InstigatingSource::ProjectNode` (line 2523-2531). - diff --git a/.cursor/plans/update_audit_and_rules_0625423a.plan.md b/.cursor/plans/update_audit_and_rules_0625423a.plan.md deleted file mode 100644 index 7549ab2f..00000000 --- a/.cursor/plans/update_audit_and_rules_0625423a.plan.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -name: Update audit and rules -overview: Update `.cursor/commands/audit.md` to cover the live syncback pipeline, new files (encodeHelpers, encodeService, new test suites), and refactored encoding architecture. Fix discrepancies in rule MDC files where they don't reflect recent code changes. -todos: - - id: audit-live-syncback - content: Add Live Syncback Pipeline section to audit.md with full file tree covering plugin encoding, transport, server handling, and serve loop restart - status: completed - - id: audit-encode-helpers - content: Add encodeHelpers.lua and encodeService.lua entries to the Plugin->Server ChangeBatcher section in audit.md - status: completed - - id: audit-new-tests - content: Add live_syncback.rs, git_sync_defaults.rs, matching_fixtures.rs to the Shared Infrastructure test section in audit.md - status: completed - - id: audit-11n-live-syncback - content: Add section 11n (Live Syncback Parity) audit checklist to audit.md - status: completed - - id: fix-atlas-api-mdc - content: Add encodeHelpers.lua to atlas-api.mdc ChangeBatcher table and update encodeInstance.lua description - status: completed - - id: fix-atlas-plugin-mdc - content: Add encodeHelpers.lua to atlas-plugin.mdc ChangeBatcher listing and fix SyncbackConfirm placement - status: completed - - id: fix-atlas-dedup-mdc - content: Add encodeHelpers.lua to atlas-dedup.mdc Key Files Map table - status: completed -isProject: false ---- - -# Update Audit Command and Rule Files - -## Summary of Discrepancies Found - -After comparing all 8 rule MDC files and the audit command against the actual source code and recent git history (40+ commits including live syncback, matching session caching, encodeHelpers refactor, float precision, git sync defaults), here are the issues: - -### audit.md - Major Gaps - -1. **No live syncback pipeline** -- The audit command describes only two pipelines (CLI syncback, two-way sync). The live syncback pipeline (`POST /api/syncback`) is a third distinct flow involving `encodeService.lua`, `SyncbackConfirm` UI, `handle_api_syncback`, `build_dom_from_chunks`, and `run_live_syncback`. Not covered at all. -2. **Missing `encodeHelpers.lua`** -- New shared helper module (`plugin/src/ChangeBatcher/encodeHelpers.lua`) that consolidates `encodeAttributes`, `encodeTags`, and `forEachEncodableProperty`. Both `encodeInstance.lua` and `encodeService.lua` import from it. Not mentioned anywhere in audit.md. -3. **Missing `encodeService.lua`** -- New file (`plugin/src/ChangeBatcher/encodeService.lua`) for service-level property encoding during live syncback. Not mentioned. -4. **Missing 3 new test suites** -- `tests/tests/live_syncback.rs`, `tests/tests/git_sync_defaults.rs`, `tests/tests/matching_fixtures.rs` are not referenced in the audit's test infrastructure section. -5. **Missing `SyncbackConfirm` UI** -- The floating confirmation dialog for live syncback (rendered in `App/init.lua`) is not mentioned in the plugin UI or data flow sections. -6. **Missing live syncback audit checklist** -- No equivalent of sections 11a-11m for live syncback-specific concerns (service property encoding, ObjectValue carrier lifecycle, rbxm blob reconstruction, clean-mode-only semantics, server restart behavior). - -### atlas-api.mdc - Issues - -1. **Missing `encodeHelpers.lua`** in the ChangeBatcher file table (section "ChangeBatcher"). The table lists `init.lua`, `createPatchSet.lua`, `encodePatchUpdate.lua`, `encodeInstance.lua`, `encodeService.lua`, `encodeProperty.lua`, `propertyFilter.lua` -- but `encodeHelpers.lua` is missing. -2. `**encodeInstance.lua` description** says "includes duplicate detection helpers" but doesn't note that property iteration was refactored to use `encodeHelpers.forEachEncodableProperty()`. - -### atlas-plugin.mdc - Issues - -1. **Missing `encodeHelpers.lua`** from the file listing under "4. ChangeBatcher" section. The `encodeHelpers.lua` file exports `encodeAttributes`, `encodeTags`, `forEachEncodableProperty`. -2. `**SyncbackConfirm**` is listed under StatusPages (`SyncbackConfirm` - "Floating dialog for live syncback confirmation (rendered by `App/init.lua`)") which is slightly misleading. It's NOT a StatusPage file -- it's rendered inline in `App/init.lua` as a `StudioPluginGui` with `isEphemeral = true`. The parenthetical note is correct but the placement under StatusPages implies a separate file. - -### atlas-dedup.mdc - Issues - -1. **Missing `encodeHelpers.lua`** from the Key Files Map table. This file is relevant because it contains the shared property filtering logic (`forEachEncodableProperty`) used during instance encoding for both two-way sync additions and live syncback. - -## Changes - -### Changes to `audit.md` - -**Section "Sync System Layout" -- add Live Syncback Pipeline** after the Two-Way Sync section: - -Add a third pipeline section covering: - -- Plugin-side: `SYNCBACK_SERVICES` in `App/init.lua`, `encodeService.lua`, `performSyncback()`, `SyncbackConfirm` dialog -- Transport: `POST /api/syncback` (MessagePack) -- Server-side: `handle_api_syncback` in `api.rs`, `SyncbackSignal`/`LiveServer` in `mod.rs`, `build_dom_from_chunks`/`run_live_syncback` in `serve.rs` -- Wire types: `SyncbackRequest`, `ServiceChunk`, `SyncbackPayload` in `interface.rs` - -**Section "Plugin --> Server" -- add `encodeHelpers.lua`** to the Change Batching subsection: - -- Add entry for `plugin/src/ChangeBatcher/encodeHelpers.lua` describing `encodeAttributes`, `encodeTags`, `forEachEncodableProperty` -- Add entry for `plugin/src/ChangeBatcher/encodeService.lua` describing service-level encoding for live syncback - -**Section "Shared Infrastructure" -- add new test files:** - -- `tests/tests/live_syncback.rs` -- Live syncback parity, validation, lifecycle, edge cases -- `tests/tests/git_sync_defaults.rs` -- Git-based sync default selection tests -- `tests/tests/matching_fixtures.rs` -- Matching algorithm fixture tests - -**Add new audit section 11n: Live Syncback Parity** covering: - -- Service property encoding completeness (`encodeService.lua` vs `filter_properties`) -- ObjectValue carrier lifecycle (created, serialized, destroyed) -- rbxm blob reconstruction (`build_dom_from_chunks` child distribution) -- Clean mode semantics (always `incremental=false`) -- Server restart behavior (session invalidation, reconnection) -- `SYNCBACK_SERVICES` list consistency with `VISIBLE_SERVICES` in Rust -- Protocol/version/placeId validation -- Round-trip: live syncback output must match CLI syncback output - -**Update Audit Reading Order** (step 9 area) to include live syncback flow. - -### Changes to Rule MDC Files - -`**atlas-api.mdc`:** - -- Add `encodeHelpers.lua` row to ChangeBatcher file table with description: "Shared encoding helpers: `encodeAttributes`, `encodeTags`, `forEachEncodableProperty`. Used by `encodeInstance.lua` and `encodeService.lua`." -- Update `encodeInstance.lua` row to note it uses `encodeHelpers.forEachEncodableProperty()` for property iteration - -`**atlas-plugin.mdc`:** - -- Add `encodeHelpers.lua` to the "4. ChangeBatcher" file listing with description: "Shared property encoding helpers (`encodeAttributes`, `encodeTags`, `forEachEncodableProperty`)" -- Move `SyncbackConfirm` from the StatusPages list to its own note under the App section, clarifying it's rendered inline in `App/init.lua` as a floating `StudioPluginGui`, not a separate StatusPage file - -`**atlas-dedup.mdc`:** - -- Add `plugin/src/ChangeBatcher/encodeHelpers.lua` to the Key Files Map table with subsystem "Encoding" and purpose "Shared property filtering/encoding helpers used by `encodeInstance.lua` and `encodeService.lua`" - diff --git a/.cursor/plans/vfs_staleness_test_fixtures_dcde048f.plan.md b/.cursor/plans/vfs_staleness_test_fixtures_dcde048f.plan.md deleted file mode 100644 index 6dd2bddc..00000000 --- a/.cursor/plans/vfs_staleness_test_fixtures_dcde048f.plan.md +++ /dev/null @@ -1,275 +0,0 @@ ---- -name: VFS staleness test fixtures -overview: Create test fixtures that replicate VFS tree staleness, add a tree-freshness assertion helper, tighten lenient existing tests, and expose a test-only API for tree validation -- all to surface the root causes of missed VFS events so they can be fixed properly. -todos: - - id: api-endpoint - content: Add GET /api/validate-tree endpoint that re-snapshots and returns drift counts without correcting the tree - status: completed - - id: session-method - content: Extract check_tree_freshness() in ServeSession (no age gate, no apply, returns counts) and set VALIDATE_TREE_ON_CONNECT = false - status: completed - - id: test-helper - content: Add assert_tree_fresh() helper and ValidateTreeResponse type to tests/rojo_test/serve_util.rs - status: completed - - id: fixture - content: Create rojo-test/serve-tests/stale_tree/ fixture with project file and multiple scripts - status: completed - - id: staleness-tests - content: "Write 4 new staleness tests: bulk changes, post-API external edit, rapid delete/recreate, directory restructure" - status: completed - - id: append-freshness - content: Append assert_tree_fresh() to all watcher_* and echo_suppression_* tests in two_way_sync.rs - status: completed - - id: tighten-echo - content: Tighten echo suppression cursor_delta assertion from < 10 to <= 3 - status: completed - - id: chaos-fuzzer - content: Write chaos fuzzer test that slams the filesystem with random operations for 10 seconds, then asserts tree freshness - status: completed -isProject: false ---- - -# VFS Staleness Test Fixtures and Test Tightening - -## Context - -The `validate_tree` bandaid is being disabled. We need test fixtures that REPRODUCE VFS staleness so we can fix the underlying issues. We also need to tighten existing tests that are too lenient per the quality standard: "Any deviation is a bug." - -## Leniency Issues Found in Existing Tests - -### 1. Echo suppression uses `cursor_delta < 10` (critical) - -In `[tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs)` line 725: - -```rust -assert!(cursor_delta < 10, ...); -``` - -Allowing up to 9 extra messages is absurdly lenient. For a single add operation, the expected delta is 0-2 (the suppressed echo plus maybe one metadata update). This means echo suppression could be 80% broken and tests would still pass. - -### 2. No tree-vs-filesystem validation (critical) - -No test ever asserts that the in-memory `RojoTree` matches what a fresh snapshot from disk would produce. Tests only check individual instances/properties. A watcher test could pass while the tree has phantom instances, missing children, or stale properties on unrelated instances. - -### 3. `send_update` uses fixed sleep instead of event verification - -In `[tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs)` line 107: - -```rust -thread::sleep(Duration::from_millis(300)); -``` - -This is a guess, not a guarantee. If the ChangeProcessor is slow (CI load), the tree may not be updated yet. If the operation is fast, we're wasting 300ms per test. - -### 4. No completeness checks after operations - -Watcher tests (e.g., `watcher_multi_file_simultaneous_edits`) verify that expected changes arrived but never verify that ONLY expected changes arrived and that no unrelated instances were corrupted. - -## Plan - -### Step 1: Add `GET /api/validate-tree` test-only endpoint - -Add a new API endpoint to `[src/web/api.rs](src/web/api.rs)` that calls `validate_tree` logic WITHOUT the 5-second age gate (the age gate exists to avoid racing with the VFS in production, but tests need immediate validation). Returns a structured response: - -```rust -#[derive(Serialize)] -struct ValidateTreeResponse { - is_fresh: bool, // true if tree matches filesystem - added: usize, // instances that should exist but don't - removed: usize, // instances in tree but not on disk - updated: usize, // instances with different properties - elapsed_ms: f64, // how long the validation took -} -``` - -Route: `GET /api/validate-tree` in the match block around line 127 of `[src/web/api.rs](src/web/api.rs)`. - -The handler re-snapshots from VFS, diffs, and returns the result WITHOUT applying corrections (read-only check). This way the test sees the drift but the tree isn't silently fixed. - -### Step 2: Add `assert_tree_fresh()` helper to test infrastructure - -In `[tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs)`, add: - -```rust -impl TestServeSession { - /// Assert the in-memory tree exactly matches the filesystem. - /// Panics with a descriptive message if there is any drift. - pub fn assert_tree_fresh(&self) { - let url = format!("http://localhost:{}/api/validate-tree", self.port); - let body = reqwest::blocking::get(url).unwrap().bytes().unwrap(); - let response: ValidateTreeResponse = deserialize_msgpack(&body).unwrap(); - - assert!( - response.is_fresh, - "Tree does not match filesystem: {} added, {} removed, {} updated \ - (validated in {:.1}ms)", - response.added, response.removed, response.updated, response.elapsed_ms - ); - } -} -``` - -### Step 3: Create VFS staleness test fixture and tests - -New fixture: `rojo-test/serve-tests/stale_tree/` with a simple project containing multiple scripts under `src/` (enough files to stress the watcher). - -**Test A: `stale_tree_bulk_filesystem_changes**` -Simulates a git checkout -- change 20+ files simultaneously. Verifies every single change is reflected in the tree: - -1. Start serve, wait for stability (1s) -2. Write 20 files simultaneously in a loop (no sleep between writes) -3. Wait for tree to settle (poll a canary file) -4. Call `assert_tree_fresh()` -- MUST pass - -**Test B: `stale_tree_after_api_write_then_external_edit**` -Tests that echo suppression does NOT eat external edits: - -1. Start serve -2. API write creates a file (triggers suppression) -3. Immediately overwrite the same file from the filesystem with different content -4. Wait for tree to settle -5. Verify tree has the EXTERNAL content (not the API-written content) -6. Call `assert_tree_fresh()` - -**Test C: `stale_tree_rapid_delete_recreate_different_names**` -Tests the debouncer coalescing edge case: - -1. Start serve with 5 files -2. Delete all 5, immediately create 5 new files with different names -3. Wait for tree to settle -4. Verify old names are gone, new names exist -5. Call `assert_tree_fresh()` - -**Test D: `stale_tree_directory_restructure**` -Tests bulk restructuring (the git checkout pattern): - -1. Start serve with a directory structure: `src/a.luau`, `src/b.luau`, `src/sub/c.luau` -2. Delete `src/sub/`, rename `src/a.luau` to `src/x.luau`, change content of `src/b.luau` -3. Wait for tree to settle -4. `assert_tree_fresh()` - -### Step 4: Chaos fuzzer -- `fuzz_filesystem_chaos` - -A single long-running test that slams the filesystem with random operations for 10 seconds straight, then waits for the tree to settle and asserts freshness. The goal is to reproduce the exact conditions that cause VFS drift. If this test ever fails, the failure message tells us exactly what the tree got wrong. - -**Operations the fuzzer randomly picks from each iteration:** - -- Create a new `.luau` file with random content -- Delete an existing file -- Overwrite an existing file with new content -- Rename a file to a new name -- Create a subdirectory and add a file inside it -- Delete a subdirectory (recursive) -- Rename a directory -- Rapid delete+recreate of the same file (the known edge case) -- Write to a file, then immediately overwrite it again (double-write) - -**Structure:** - -```rust -#[test] -fn fuzz_filesystem_chaos() { - run_serve_test("stale_tree", |session, _redactions| { - let src = session.path().join("src"); - let mut rng = rand::thread_rng(); - - let start = Instant::now(); - let duration = Duration::from_secs(10); - let mut op_count = 0u64; - - // Track what files/dirs we've created so we can pick valid targets - let mut known_files: Vec = vec![/* initial fixture files */]; - let mut known_dirs: Vec = vec![src.clone()]; - - while start.elapsed() < duration { - match rng.gen_range(0..9) { - 0 => { /* create new file */ } - 1 => { /* delete random existing file */ } - 2 => { /* overwrite random existing file */ } - 3 => { /* rename random file */ } - 4 => { /* create subdirectory + file */ } - 5 => { /* delete random subdirectory */ } - 6 => { /* rename random directory */ } - 7 => { /* rapid delete+recreate same file */ } - 8 => { /* double-write same file */ } - _ => unreachable!(), - } - op_count += 1; - - // Tiny random delay between ops (0-10ms) to vary timing - thread::sleep(Duration::from_millis(rng.gen_range(0..10))); - } - - eprintln!("Chaos fuzzer completed {} operations in {:?}", op_count, start.elapsed()); - - // Wait for VFS watcher + ChangeProcessor to fully settle - // Use a generous timeout since the watcher may be processing a backlog - thread::sleep(Duration::from_secs(3)); - - // THE CRITICAL ASSERTION: tree must match filesystem after all that chaos - session.assert_tree_fresh(); - }); -} -``` - -**Key design decisions:** - -- Uses `rand` crate (add as a dev-dependency) -- Tracks its own inventory of created files/dirs so it picks valid targets for delete/rename/overwrite -- Handles errors gracefully (file might already be deleted by a previous op) -- just skips and continues -- Tiny random delay (0-10ms) between ops to vary the timing pressure on the debouncer -- 3-second cooldown after the chaos period to let the watcher fully drain -- Single `assert_tree_fresh()` at the end -- if it fails, the drift counts tell us exactly what went wrong -- Logs total operation count for debugging - -**Why this catches the bug:** The original issue was a developer making filesystem changes and then finding the tree stale on reconnect. The fuzzer recreates this by doing hundreds of rapid operations with varied timing, which is exactly the kind of workload that overwhelms the notify debouncer and triggers `RescanRequired` events. If the tree stays fresh after 10 seconds of abuse, the watcher is solid. If it drifts, we have a reproduction. - -### Step 5: Add `assert_tree_fresh()` to existing watcher tests (unchanged from above) - -Append `assert_tree_fresh()` at the end of every `watcher_*` test in `[tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs)`. This is the key force multiplier -- every existing watcher test becomes a staleness detector. If any of the ~25 watcher tests produce tree drift that the VFS watcher didn't resolve, it will now fail. - -The following tests get the assertion appended (after their existing verifications, before the closure ends): - -- All `watcher_*` tests (25+ tests) -- All `echo_suppression_*` tests (3 tests) -- `delete_and_recreate_via_filesystem_recovery` - -### Step 6: Tighten echo suppression assertion - -In `[tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs)`, replace the lenient `cursor_delta < 10` with a tighter bound. For a single add with proper suppression, the expected delta is 0-2. Use: - -```rust -assert!( - cursor_delta <= 3, - "Echo suppression failure: cursor advanced by {} (expected <= 3). \ - VFS echo events are leaking through suppression.", - cursor_delta -); -``` - -### Step 7: Disable `VALIDATE_TREE_ON_CONNECT` - -In `[src/serve_session.rs](src/serve_session.rs)`, set the constant to `false`: - -```rust -const VALIDATE_TREE_ON_CONNECT: bool = false; -``` - -This removes the bandaid so the real tests surface real failures. - -## Expected outcomes - -- If VFS watcher events are reliably delivered: all tests pass with no drift detected -- If VFS events are missed: `assert_tree_fresh()` fails with exact counts of added/removed/updated drift, giving us a precise reproduction to debug -- The echo suppression tightening will reveal if suppression is leaky -- The bulk-change tests will reveal if the notify debouncer's `RescanRequired` causes tree drift - -## Files to modify - -- `[src/web/api.rs](src/web/api.rs)` -- new `GET /api/validate-tree` endpoint -- `[src/serve_session.rs](src/serve_session.rs)` -- extract snapshot+diff logic into a reusable `check_tree_freshness()` method, set constant to false -- `[tests/rojo_test/serve_util.rs](tests/rojo_test/serve_util.rs)` -- `assert_tree_fresh()` helper and response type -- `[tests/tests/two_way_sync.rs](tests/tests/two_way_sync.rs)` -- append `assert_tree_fresh()` to watcher tests, tighten echo suppression, add chaos fuzzer -- `rojo-test/serve-tests/stale_tree/` -- new test fixture (project file + src scripts) -- `Cargo.toml` -- add `rand` as a dev-dependency for the fuzzer - diff --git a/.cursor/prompts/Ambiguous Path Handling.txt b/.cursor/prompts/Ambiguous Path Handling.txt deleted file mode 100644 index 5b43c6bc..00000000 --- a/.cursor/prompts/Ambiguous Path Handling.txt +++ /dev/null @@ -1,350 +0,0 @@ -Ambiguous Path Handling - -We're looking to finally add support for Ambiguous Paths. - -Naming -* Duplicate file names are saved as ~1, ~2 etc - an expansion of the slugify system. - - ~1, ~2 suffixes: the existing deduplicate_name() in file_names.rs already does this. But currently it's only used for slug collisions (e.g., What?Script and What_Script both slugify to What_Script). I'm proposing to extend it to true duplicate names. The meta name field then stores the real name. - - Note: `~` is in SLUGIFY_CHARS, so instance names naturally containing `~` get it replaced with `_` BEFORE dedup runs. "Foo~1" (natural name) slugifies to "Foo_1", which is always distinct from the dedup suffix "Foo~1". This invariant is already tested in file_names.rs. -* Name field will be populated in the meta/model definitions -* IMPORTANT: Matching groups and dedup groups are DIFFERENT concepts with different grouping criteria: - - Matching groups (for pairing instances during sync): built by true Instance.Name. Two siblings with the same Name are in the same matching group regardless of ClassName. Used by the matching algorithm in all three locations. - - Dedup groups (for filesystem ~N suffixes): built by the FILESYSTEM SLUG that the middleware would produce. Only apply ~N suffixes when the filesystem representation would actually collide. A Folder "Foo" (becomes Foo/) and a Script "Foo" (becomes Foo.server.luau) do NOT collide on disk and do NOT need dedup suffixes. Two Folders both named "Foo" DO collide (both become Foo/) and need dedup. The dedup key is the lowercased final filesystem path component (slug + extension or directory name) that the middleware assigns. - - Init-style collisions: when a directory-style instance (Folder) and an init-style instance (Script with children) both want the same directory name, they DO collide -- apply dedup suffixes to the directories (Foo/ and Foo~1/). The middleware must compute whether each instance would be a directory or file BEFORE dedup grouping runs. - - In short: compute what each instance's filesystem name WOULD be (via middleware rules), group by lowercased collision on that name, then apply ~N suffixes within each collision group. -* Suffix cleanup is GAP-TOLERANT: when a dedup'd sibling is deleted, do NOT renumber remaining suffixes to fill gaps. If you have Attachment, Attachment~1, Attachment~2 and delete ~1, keep Attachment and Attachment~2 as-is. Gaps are harmless and avoiding renumbering prevents cascading file renames + mass ref path updates. - - The ONE exception: when the dedup group shrinks to exactly 1 remaining instance, remove its suffix entirely (rename to clean name). This keeps the filesystem clean for the common case. The ref path update system must handle this single rename. - - If the base-name holder (no suffix) is deleted and multiple remain, the lowest-numbered suffix (~1, or ~2 if ~1 is already gone) is promoted to base name. This is the only rename that occurs on deletion besides the group→1 cleanup. -* Base-name assignment: the matching algorithm should preserve existing filesystem assignments. Whichever instance currently holds the base name (no suffix) on disk keeps it when updating. New instances get the next available ~N suffix. In clean syncback (no existing files), Roblox child order determines base-name assignment (first child in the DOM children list gets the base name). -* Tiebreaker ordering: when the matching algorithm has tied candidates (identical similarity scores), Roblox child order (Instance:GetChildren() index on plugin side, DOM child order on Rust side) is the canonical tiebreaker for deterministic results. -* VFS event handling: when change_processor renames files for dedup suffix cleanup (e.g., Attachment~1 → Attachment after base-name holder deleted), tag these as self-initiated renames. compute_patch_set should recognize and ignore self-initiated VFS events to prevent feedback loops. - -Refs -* PREREQUISITE: Ref resolution must happen BEFORE the matching algorithm runs. Ref resolution is cheap on the Rust side (pointer lookups). On the Lua plugin side, reading Ref properties from Studio instances requires pcall (some instances have restricted access) -- still fast but add error handling. Missing or invalid Refs should log a warning and default to nil -- don't error, don't block matching. -* FILE FORMAT: Keep the Rojo_Ref_* attribute prefix with slug paths. Ref paths are stored as attributes: `Rojo_Ref_PrimaryPart: "Workspace/Model.model.json5/Attachment~1"`. Each path segment is the FULL FILESYSTEM NAME of the instance (slug + dedup suffix + extension for files, directory name + dedup suffix for directories). Examples: - - Folder "Foo" (directory) → segment `"Foo"` - - ModuleScript "Foo" → segment `"Foo.luau"` - - Script "Foo" (server) → segment `"Foo.server.luau"` - - Script "Foo" with children (init-style directory) → segment `"Foo"` - - Dedup'd ModuleScript "Foo" → segment `"Foo~1.luau"` - This guarantees ref path segments are always unique among siblings (because filesystem names are unique). The tradeoff: ref paths are coupled to middleware/extension choices, so script type transitions (ModuleScript→Script changes .luau→.server.luau) and file-to-folder transitions ALSO require ref path updates for all refs passing through that instance. This is additional maintenance but eliminates the ambiguity that extension-free paths would create for same-name siblings with different classes. - The path starts from the DataModel's children (DataModel excluded, so `game.Workspace.Model.Part` becomes `"Workspace/Model.model.json5/Part"`). This keeps the existing prefix-based detection (scan for keys starting with `Rojo_Ref_`) which is simple and doesn't require reflection data. -* NOTE: The Rojo_Ref_* system did NOT exist on origin/master -- it was added on the rbxm-ambiguous branch. So this is effectively a new addition, not a modification. The original Rojo $id / Rojo_Target_* / Rojo_Id system stays for backward compatibility with existing projects. When the slug-path system is available, prefer it. Fall back to the $id system for instances without filesystem backing (see below). -* The ref path is always unambiguous because each segment is the full filesystem name, which is unique among siblings by definition (filesystem can't have two files/dirs with the same name). Two Folders named "Attachment" become "Attachment" and "Attachment~1" on disk, producing distinct segments. A Folder "Foo" and Script "Foo" produce segments "Foo" and "Foo.server.luau" -- distinct without dedup. -* Ref path resolution: - - Syncback (ref_properties.rs): When writing Rojo_Ref_* attributes, build the ref path from the full filesystem names assigned during syncback (the same names used for files/directories on disk, INCLUDING extensions). - - Forward sync (patch_apply.rs): When resolving Rojo_Ref_* paths, walk the tree matching each segment against the full filesystem name of each child (derived from instigating_source filename/dirname). get_instance_by_path() in tree.rs currently resolves using instance names -- it needs a filesystem-name resolver instead. For instances without instigating_source (e.g., inside user .rbxm files, newly added during session), fall back to computing what the filesystem name WOULD be (slugify name + middleware extension). - - Forward sync Ref pre-resolution for matching (patch_compute.rs): When pre-resolving Refs before the matching algorithm, try the old RojoTree FIRST (most refs target existing instances). If the path can't be resolved in the old tree (target is a new instance), fall back to walking the snapshot tree. The snapshot is only a subtree (the re-snapshotted directory), so this fallback only works for refs within the same subtree. Refs to new instances outside the current snapshot remain unresolved and are skipped during matching (treated as nil). - - Two-way sync (change_processor.rs, api.rs): When the plugin sends a Ref property change, the server receives a UID. The server must compute the slug path for the target to write it to disk. For file-backed instances, derive the slug from instigating_source. For instances without filesystem backing (inside .rbxm files, newly added instances before VFS catches up), fall back to the $id / Rojo_Target_* system instead of slug paths. -* Cleanup: Remove the escape_ref_path_segment() / split_ref_path() infrastructure in rojo_ref.rs. With filesystem-name-based paths, `/` in instance names is already slugified to `_` by slugify_name(). The `\/` escaping system was needed because the old system used raw instance names -- filesystem-name paths don't need it. -* IMPORTANT: Any time an instance is moved, renamed, or has its dedup suffix reassigned, ALL Rojo_Ref_* paths across ALL meta/model files that reference that instance (or any of its descendants) must be updated. This includes: - - Renames: instance name changes -> slug changes -> all refs to it and its children update - - Dedup reassignment: matching algorithm reassigns ~1 to ~2, or suffix removed entirely -> all refs update - - Reparenting: instance moves to a different parent -> entire ancestor path changes -> all refs update - - Suffix cleanup: dedup suffix removed because sibling was deleted -> all refs update - - Script type transitions: ClassName change (e.g., ModuleScript→Script) changes extension (.luau→.server.luau), which changes the ref segment -> all refs through this instance update - - File-to-folder transitions: instance gains/loses children, flipping between file (Foo.server.luau) and directory (Foo/) representation -> ref segment changes -> all refs update - - The existing RefPathIndex infrastructure tracks which files contain refs to which targets. Extend it to handle all cases above. - - Batch ref path writes: when dedup reassignment causes mass ref path updates (many siblings renamed, each referenced by multiple files), collect ALL affected ref updates first, then write all affected files in one batch. This avoids redundant I/O when multiple refs in the same file need updating. - -Matching System -* We need to create a Rust and Lua matching algorithm that produces the same pairing given equivalent instance data. The data shapes differ (Rust: UstrMap, Lua: Studio property access via pcall) but the algorithm logic and output must be equivalent. -* The matching algorithm attempts to assign a list of child instances to the current corresponding state, whether that is the actual Instances in the tree in Roblox Studio or the files on the file system (the dom). -* It tries it's BEST to find what will effectively requires the fewest number of changes of each child, when duplicates are encountered. Things which are 1:1 can be considered an instant match. -* You need to consider literally everything about the instance. Name, ClassName, Properties, Attributes, Tags, ITS children, etc. To avoid combinatorial explosion, use a bottom-up subtree hash computed once and cached. The hash infrastructure already exists in syncback/hash/. - - Rust side: blake3 (existing infrastructure). Full subtree hash of name+class+sorted property hashes+children hashes. - - Lua plugin side: use XXH32 (impl attached at bottom of this file) for the STRUCTURAL subtree fingerprint only (child count + sorted child name+class pairs). Do NOT hash full property values (especially Source) -- the serialize-to-buffer cost dominates. For actual property comparison in Pass 3 similarity scoring, compare properties directly with early-exit ordering: ClassName → Tags → Attributes → scalar properties (numbers, bools, enums) → Source last (most expensive, least likely needed after cheaper signals differentiate). - - Hashes are a fast-path signal, NOT a definitive equality proof. If hashes differ → definitely different. If hashes match → very likely identical, score as max similarity. The matching algorithm must not rely solely on hash equality for correctness -- other discriminators (Refs, ClassName, Tags) always participate. This makes 32-bit collision risk irrelevant in practice (ambiguous groups are small, typically 2-10 instances). - - Lua-side caching: compute structural fingerprints LAZILY -- only for instances that actually enter Pass 3 (ambiguous groups not resolved by Refs). Cache fingerprints for the duration of the matching call (not across calls). On the Rust side, hash_tree() precomputes all hashes bottom-up in one pass before matching begins -- this is cheap with blake3. -* Ambiguous groups are built by the TRUE Instance.Name (as finally resolved for each instance). Two siblings with the same true Name are in the same ambiguous group regardless of ClassName. On the plugin/Rust-tree side, Instance.Name / instance.name() is readily available. On the filesystem side, resolving the true Name is non-trivial: it may come from the `name` field in .meta.json5 (if present, overrides filename), the `name` field in .model.json5, or the filename stem after stripping extensions and script suffixes (if no meta override). The matching algorithm must resolve all true Names before it can build groups. -* The matching algorithm should work in passes (Refs must be pre-resolved before any pass runs -- see Refs section above): - - Pass 1: Match all instances that have a unique true Name among their siblings (no ambiguity, O(n)). Within a same-Name group, ClassName is a fast first discriminator for narrowing candidates. - - Pass 2: For remaining unmatched instances (same-Name groups), use the pre-resolved Refs as discriminators. Refs are the strongest signal because they carry structural identity -- if instance A has a Ref property pointing to UID-7, and UID-7 was already matched in Pass 1, then we know instance A's Ref "means" something specific. If only one candidate on the other side also has a Ref resolving to that same matched target, that's a near-certain match. On the Rust side, Refs are already resolved to specific Refs in the tree. On the Lua side, Refs sent from the server are literal UIDs that map to specific Studio instances via the instanceMap. Also consider incoming Refs TO these instances (other instances pointing at them) -- if instance X is the only candidate that other already-matched instances reference, that's equally strong signal. - - Unmatched Ref targets: if a Ref target is itself in an unmatched ambiguous group (not resolved in Pass 1), treat it as a weaker signal -- compare target names/classes without requiring a confirmed match. Do NOT recursively match the target's group (adds complexity for an extremely rare edge case). If the weaker signal is insufficient, the instance falls through to Pass 3 naturally. - - Pass 3: For still-unmatched same-Name groups, use ClassName as a fast discriminator to narrow candidates, then compute pairwise similarity scores (using precomputed subtree hashes on Rust side, direct comparison on Lua side) and greedily assign best-match-first (pick highest score, remove both from pool, repeat). -* Instances which were extra from the incoming changes are considered NEW and then extra from the existing are considered DELETED -* The server assigns every instance a unique Ref (UID) in the RojoTree. When the plugin connects, the matching algorithm pairs server UIDs to Studio instances and caches this mapping in the instanceMap. Once matched, that pairing is stable for the duration of the sync session -- the matching algorithm should not reshuffle existing matched pairs unnecessarily. This cache allows subsequent operations (property changes, renames) to be fast lookups rather than re-running the full matching algorithm. -* We don't need a "UUID" system saved as attributes on instances because of this matching system, even though that would allow this algorithm to work as-is but faster, it's not desired as it adds a lot of bloat. -* Performance of this is really important. Precompute hashes and resolve Refs once before entering the matching loop. Avoid recomputing anything per-pair in Pass 3 -- all signals should be cached before pairwise comparison begins. -* FAST PATH: if Pass 1 matches ALL children (no ambiguous groups exist among siblings), skip Passes 2 and 3 entirely. This is the common case -- most parents have uniquely-named children. The fast path makes forward sync (called on every VFS event) effectively free for non-ambiguous subtrees, degrading to the same cost as the current name+class matching. -* Matching priority within an ambiguous group (same true Name): Refs (pre-resolved -- strongest signal), ClassName, Tags, Attributes, Properties (non-Ref), Children hash. -* The matching needs to handle partial matches -- instance exists in both but has property changes. In this case, just pick the best of each. If candidates are completely equal (identical similarity scores), use Roblox child order as the deterministic tiebreaker (first in DOM children list / Instance:GetChildren() index wins). -* Matching should be run in 3 locations. These are 3 SEPARATE IMPLEMENTATIONS of the same algorithm pattern (2 Rust, 1 Lua), NOT shared code. The data shapes are too different to share implementation. Equivalence is guaranteed by shared test vectors (see Testing section), not by code reuse. - - hydrate.lua -- plugin connects, matches server virtual instances (encoded properties, UIDs for Refs) to Studio instances (read via pcall, direct Instance Ref pointers). Lua implementation. - - compute_patch_set in patch_compute.rs -- VFS event triggers re-snapshot, matches snapshot children (InstanceSnapshot with Rojo_Ref_* as string paths) to tree children (RojoTree instances with Refs as UIDs). Rust implementation #1. - - syncback_dir_no_meta in dir.rs -- syncback matches new instance children (WeakDom from Roblox file) to existing filesystem children (WeakDom from old tree). Rust implementation #2. -* IDEA: We can build a cache progressively by assigning children to specific UIDs. This can help on running time of the algorithm. We need to ensure things don't become stale in this LUT cache. The cache can be built up during actual application. The cache invalidates per-parent when a child is added, removed, or renamed under that parent. During two-way sync, each /api/write mutation should invalidate the affected parent's cache entry. The cache maps parent_ref -> (children_list, match_assignments) and is cheap to rebuild for a single parent. - -Syncback: -* ARCHITECTURAL CHANGE: the current syncback flow processes children one-at-a-time via with_joined_path(). Collision-based dedup requires knowing ALL children's filesystem names before assigning suffixes. This requires restructuring to TWO PASSES: - 1. First pass: iterate all children, select middleware for each (get_best_middleware), compute tentative filesystem name (slug + extension or directory name). - 2. Second pass: group by lowercased collision on tentative name, assign ~N suffixes within each collision group, then actually process each child with its final dedup'd name. - The current with_joined_path() does middleware selection + filename generation + dedup in one call per child. This must be split so dedup grouping has the full picture before any suffix is assigned. -* Needs to be able to output the duplicate files with ~N dedup suffixes -* The matching algorithm runs FIRST to pair incoming instances to existing filesystem children. Then files are written/updated based on the pairing: - - Matched pairs: update the existing file/directory in place (overwrite content, update meta). The matching algorithm should preserve existing base-name assignments -- whoever held the base name on disk keeps it. - - Unmatched incoming instances: create new files (with dedup suffixes if Name collides) - - Unmatched existing files: delete them (instance was removed) -* When a dedup suffix changes (base-name holder deleted → lowest suffix promoted, or group shrinks to 1 → suffix removed), rename the file on disk and update all ref paths that referenced the old slug. Gaps in suffix numbers are left as-is (no renumbering). -* Clean syncback rebuilds everything from scratch -- matching is only needed in incremental mode to preserve existing file paths where possible. In clean mode, base-name assignment for duplicate names uses Roblox child order (first child in DOM children list gets the base name, second gets ~1, etc.). -* It should not just keep "adding" more files each time a syncback happens, it needs to CORRECT/UPDATE them, utilizing the matching algorithm -* When a third duplicate is added (e.g., existing "Attachment" and "Attachment~1", now a third "Attachment" appears), the matching algorithm pairs the two existing ones, and the new one gets "Attachment~2". Existing suffixes are never renumbered. - -Forward Sync: -* When a user edits Attachment~1/init.meta.json5 on disk, the server re-snapshots. The snapshot produces two children both named "Attachment" (from their meta name fields). compute_patch_set must use the matching algorithm to pair them correctly against the tree's existing Attachment instances, rather than greedy first-match which may cross-pair them. - -API -* Leverage the UID we are sending it from the rust side, and vice-versa for newly created instances - make sure those are session persistant and utilized. We need to utilize this to keep things straight when we send data back to the rust side so it knows where to place things. -* The UID I'm speaking of is the Ref that the server assigns to each instance in the RojoTree. These are sent to the plugin via the API when connecting, and the plugin sends them back for newly created instances. This is the existing system -- no new UID mechanism is needed. -* Processing order in /api/write: use a two-pass approach. First pass: apply ALL mutations (renames, property changes, adds, removes) to the tree. Second pass: recompute all affected ref slug paths based on the final tree state. This ensures refs always use the newest slugs, even when a rename and a ref update targeting the renamed instance arrive in the same request. - -Notes -* Case-insensitive instances need to be differentiated on the filesystem to properly support all operating systems. On Linux (case-sensitive FS), "Script" and "script" can coexist as separate files, but for cross-platform compatibility they must still be deduped with ~N suffixes. The matching algorithm handles these trivially since the true Names are different. -* This system needs to work for all sync directions/systems - syncback, two-way sync, forward sync, one-shot, rbxl construction from project, etc. -* Project file instances: project keys are unique by JSON definition (duplicate keys in JSON/JSON5 are not valid), so project-sourced instances do NOT participate in the dedup system. They always have unique names within their sibling group. -* Performance target: system must handle large games (10K+ instances) with <100ms latency per operation. Optimization can be deferred but the architecture must not have O(n^2) bottlenecks on the full tree. The matching algorithm should only run on the affected subtree when possible. -* We need to literally remove the ENTIRE system responsible for blacklisting duplicately named paths on the plugin and in the rust code, it is no longer relevant. - -rbxm-ambiguous -* Additionally, you should review the changes done in the branch rbxm-ambiguous. I'm abandoning that branch, but these two problems are closely related. I don't really ever want projects to have rbxm files being outputted for syncback or two-way sync anymore, but I still want to fully support loading them, but they should also get removed/replaced properly when you do a syncback on clean mode. -* Best to do a full diff from origin/master -* We specifically mention / probably want to take these features which were mentioned specifically in this plan: - - The plugin relaxations (diff.lua, encodeInstance.lua duplicate-skip removal) -- these are needed regardless of approach - - The has_duplicate_children helper and case-insensitive detection - - The project.rs case-insensitive duplicate detection. Note: with the dedup-suffix approach, ProjectNode children with duplicate names CAN now be written as individual files with ~N suffixes -- the warn-and-skip guard from the rbxm branch may no longer be needed. The implementer should evaluate whether to remove it or keep it as a safety net. - - The roundtrip test improvements (compare_children Vec-based, Tags check) - - The macOS ref_properties test ignore - - The DuplicateChildrenError typed error pattern (or equivalent) -* Don't take: ambiguous_container metadata, find_rbxm_container, reserialize_rbxm_container, rbxm fallback block, all ambiguous test fixtures. We are specifically trying to avoid rbxm-ing things. -* No special transition logic needed for old .rbxm files. Syncback rewrites the filesystem from scratch (clean) or matches instances to existing files (incremental) -- either way, the rbxm just doesn't get recreated. User-intentional .rbxm files that users placed manually in their project still load fine via snapshot_rbxm during forward sync -- that's unchanged. - -Sync System Invariants (from audit.md -- these apply to EVERY change in this feature) - -* ROUND-TRIP IDENTITY: Syncback (or two-way sync) writes a directory tree. Building an rbxl from that directory tree and forward-syncing it back must produce a bit-identical instance tree -- same names, same classes, same properties, same hierarchy, same ref targets. The dedup system, matching algorithm, and ref path system must ALL preserve this invariant. Any deviation is a bug. - -* CLI SYNCBACK PARITY: Plugin-based two-way sync must produce EXACTLY the same filesystem output that `atlas syncback` would give for the same input. Byte-for-byte identical files, identical directory structures, identical naming, identical dedup suffixes. This means the dedup logic, matching algorithm, and ref path computation must be shared or equivalent between the two paths. Any divergence is a bug. - -* 4 FILE FORMAT BRANCHES: syncback_updated_properties() in api.rs has 4 branches for writing property changes. The dedup/naming system must work correctly in ALL 4: - 1. Directory format: init.meta.json5 inside the instance's directory - 2. Standalone script: adjacent ScriptName.meta.json5 (strips .server/.client/.plugin/.local/.legacy suffix from stem) - 3. Model file: inline in .model.json5 (writes directly into the file, NOT adjacent meta) - 4. Other file types (.txt, .csv, .toml): adjacent FileName.meta.json5 - Each branch must: compute the correct dedup'd filename, write the correct meta name field, and produce ref paths consistent with the dedup assignment. - -* INSTIGATING SOURCE CONSISTENCY: every instance in the RojoTree tracks where it came from via InstigatingSource. When creating files with dedup suffixes, the InstigatingSource path must reflect the dedup'd path (including ~N suffix). Pre-seed taken_names from existing tree children via their instigating_source paths (using strip_middleware_extension), NOT from instance names. This prevents slug collisions with existing files on disk. - -* FILE-TO-FOLDER TRANSITIONS: instances can flip between file representation (Foo.server.luau) and directory representation (Foo/init.server.luau + children). This transition changes the dedup group key (file stem vs directory name) and must update: - - The dedup suffix (may change or be added/removed) - - The meta file location (adjacent → init.meta.json5 inside directory, or vice versa) - - All Rojo_Ref_* paths that pass through this instance (slug changes) - - The InstigatingSource path - Round-trip: adding a child to a file instance then removing it must produce identical filesystem state to the original. Treat any code touching these transitions as high-risk. - -* SCRIPT TYPE TRANSITIONS: ClassName changes (ModuleScript → Script) cause file extension changes (.luau → .server.luau). This changes the dedup group key since the filesystem representation changes. A ModuleScript "Foo" (.luau) and Script "Foo" (.server.luau) don't collide -- but if the ModuleScript becomes a Script, it now collides with the existing Script. The dedup system must handle this mid-session during two-way sync. - -* DUAL WRITE PATH CONSISTENCY: handle_api_write in api.rs does TWO things: (1) writes files to disk, and (2) sends a PatchSet to the ChangeProcessor to update the in-memory tree. These MUST stay consistent. If the file write uses dedup suffix ~1 but the PatchSet doesn't reflect that, the tree and filesystem diverge silently. - -* MULTIPLE PLUGIN ENTRY POINTS: property changes flow through the plugin via TWO separate paths: - 1. ChangeBatcher flow (live two-way sync): Instance.Changed → InstanceMap → ChangeBatcher → encodePatchUpdate → ApiContext:write() - 2. Confirmation dialog flow (initial sync pull): ServeSession.__confirmAndApplyInitialPatch → encodePatchUpdate → ApiContext:write() - Both paths must handle duplicate-named instances correctly. A function modified in path 1 may not have been updated in path 2. - -* REVIEW DIALOGUE INVARIANT: No two-way sync change may bypass the review dialogue in Always and Initial sync modes. Dedup suffix renames, ref path updates, and meta file changes triggered by the matching algorithm must all be cataloged in the confirmation UI. No silent application. - -* VFS ECHO PREVENTION: the existing suppress_path() system uses per-path counters. For dedup operations: suppress_path() MUST be called before any file write/rename during dedup suffix changes. New instance additions must NOT suppress (VFS watcher needs to pick up new files). The VFS event tagging mentioned in the Naming section should integrate with this existing mechanism. - -* ATOMICITY: dedup suffix cleanup involves multiple filesystem operations (rename file, update meta, update ref paths). There is a window where the VFS watcher could fire between operations and snapshot an inconsistent intermediate state. Minimize race windows by ordering operations carefully and using suppress_path() to cover all intermediate states. - -* DETERMINISM: given the same instance tree, the dedup system must ALWAYS produce the same filesystem output. Child ordering must be stable (sorted/deterministic), dedup suffix assignment must be deterministic, and generated identifiers must be reproducible. Non-determinism = different builds from same source = git churn = invariant violation. - -* COMPOUND FILE EXTENSIONS: .server.luau, .client.luau, .model.json5, .meta.json5, .project.json5 are multi-part extensions. Dedup suffixes are applied to the STEM before the compound extension: Foo~1.server.luau (correct), NOT Foo.server~1.luau. Meta pairing: Foo~1.server.luau pairs with Foo~1.meta.json5 (strip script suffix from stem, then add .meta.json5). The suffix list in change_processor.rs must include all compound parts for rename operations. - -Testing -* This system is extremely critical -- subtle bugs here silently corrupt user projects. Test the hell out of it at every layer: e2e, plugin, api, syncback, forward sync, two-way sync, build, roundtrip. -* Ensure we try all combinations, folder/meta swaps, etc. Try to make the system conflict with the existing slugify system. -* Define shared test vectors as structured data (e.g., two lists of instance descriptions -> expected match pairing) that both the Rust and Lua implementations must produce identical results for. This is the strongest guarantee that the two implementations don't diverge. -* The scenarios below are MINIMUM REQUIRED tests, not exhaustive. The implementer should add additional edge cases they discover during implementation. Think adversarially -- what combinations of operations could break invariants? -* Specific scenarios to test: - - Two identical Folders with same Name (simplest dedup case) - - Two Folders same Name, different children (matching must pair correctly by content) - - Two Folders same Name, identical content (tiebreaker: Roblox child order wins -- first in DOM children list gets base name) - - Folder "Foo" next to Script "Foo" (same Name, different ClassName -- NO dedup suffix because Foo/ and Foo.server.luau don't collide on disk. Both keep clean names.) - - Folder "Foo" next to Script "Foo" where Script has children (init-style: Foo/ vs Foo/init.server.luau -- these DO collide, dedup suffix applied) - - Instance naturally named "Foo~1" next to two "Foo" instances -- "Foo~1" slugifies to "Foo_1" (tilde replaced with underscore), which is distinct from the dedup suffix "Foo~1". Verify filesystem has Foo/, Foo~1/, Foo_1/ (or Foo_1.server.luau etc.) - - Third duplicate added to existing dedup group (no renumbering of existing suffixes) - - Dedup suffix cleanup (group→1): only two instances "Foo" and "Foo~1", base deleted, ~1 renamed to clean "Foo" (group shrank to 1) - - Gap tolerance: three instances Foo, Foo~1, Foo~2 -- delete ~1 -- verify Foo and Foo~2 remain unchanged (no renumbering) - - Base-name promotion: three instances Foo, Foo~1, Foo~2 -- delete Foo (base) -- lowest suffix ~1 promoted to base name, ~2 stays as ~2 - - Gap tolerance with refs: Foo~2 has refs pointing to it, ~1 deleted, verify Foo~2's refs are untouched (no path changes since no rename occurred) - - Idempotency: syncback twice produces identical filesystem output - - Roundtrip: syncback -> build -> compare trees -* Ref path integrity tests (CRITICAL -- refs becoming stale/broken is the highest-risk failure mode): - - Basic ref survives syncback: Model.PrimaryPart points to a Part, syncback writes the ref path, build resolves it back to the same Part. Roundtrip identity preserved. - - Ref to a dedup'd instance: PrimaryPart points to "Attachment~1". Syncback writes the slug path. Build resolves it correctly (not to the other Attachment). - - Ref survives gap-tolerant deletion: Three "Attachment" instances (Attachment, Attachment~1, Attachment~2). Delete the middle one (~1). Attachment and Attachment~2 remain unchanged -- NO ref path updates needed. Verify all Rojo_Ref_* paths still resolve correctly. - - Ref survives base-name promotion: Three "Attachment" instances. Delete the base (Attachment). Attachment~1 is promoted to base name "Attachment". ALL Rojo_Ref_* paths that pointed to the old "Attachment~1" must now say "Attachment". Attachment~2 is unchanged. Verify by building. - - Ref survives group→1 cleanup: Two "Attachment" instances (Attachment, Attachment~1). Delete Attachment. Attachment~1 renamed to Attachment (group shrank to 1). ALL Rojo_Ref_* paths must update. Verify. - - Ref survives rename: Instance "Foo" is renamed to "Bar". All ref paths containing "Foo" segment must update to "Bar". Verify across meta files, model files, and project files. - - Ref survives reparent: Instance moves from Parent_A to Parent_B. The entire ancestor path changes. All ref paths must update. Verify. - - Ref to deeply nested instance through multiple dedup layers: A/B~1/C/D~2 where both B and D have dedup suffixes. Ref resolves correctly through the full chain. - - Cross-file ref update: File_A.meta.json5 has a ref to an instance whose slug changes. File_B.model.json5 also has a ref to the same instance. BOTH files must be updated. Verify by reading both files after the operation. - - Ref to instance that gets deleted: Ref path points to an instance that no longer exists after syncback. Should resolve to nil, not crash, not point to wrong instance. - - Ref path with instance whose natural name contains tilde: Instance named "Foo~1" (real name). Slug is "Foo_1" (tilde slugified). If there are also two "Foo" instances, filesystem has Foo/, Foo~1/ (dedup), Foo_1/ (slugified). Ref to the "Foo~1" instance uses slug path "Parent/Foo_1". Verify the resolver finds the correct instance. - - Two-way sync ref update: Plugin sends a property change that triggers a dedup suffix reassignment on the server. Server must update all Rojo_Ref_* paths in affected files AND the patch sent back to the plugin must reflect the correct ref targets. - - Concurrent ref + rename in same batch: In a single /api/write request, one instance is renamed (changing its slug) and another instance has a Ref property update pointing to the renamed instance. The ref path must use the NEW slug, not the old one. - - Forward sync ref resolution after manual edit: User manually edits a ref path in a meta file on disk (changes "Part/Attachment~1" to "Part/Attachment~2"). Server re-snapshots and resolves the ref. Verify it points to the correct instance or logs a warning if invalid. - - Fallback to $id system: Instance inside a user .rbxm file has no instigating_source. Ref to this instance should use the $id/Rojo_Target_* system, not a slug path. Verify the ref resolves correctly after build. - - Mass ref update stress test: 50+ instances all referencing the same target. Target gets renamed. All 50 Rojo_Ref_* paths must update. Verify none are missed. -* Matching algorithm tests (CRITICAL -- wrong pairing silently corrupts projects): - - Matching with ClassName discriminator: two "Part" instances, one is Part and one is MeshPart. Match by ClassName in Pass 1 (unique within same-Name group per class). - - Matching with Ref discriminator: two identical Folders "Data", one has a Ref from an ObjectValue pointing to it. Match via Ref in Pass 2. - - Matching with property similarity: two Scripts "Handler" with different Source. Match the one with closer Source in Pass 3. - - Matching stability: run matching on same input twice, verify identical pairing both times. - - Matching preserves existing pairings: during two-way sync, matched pairs should not reshuffle when a new sibling is added. - - Fast path verification: parent with all uniquely-named children skips Passes 2-3 entirely (verify via timing or instrumentation). -* Dedup group collision tests: - - Folder "Foo" + ModuleScript "Foo" → no collision (Foo/ vs Foo.luau), no dedup suffix - - Folder "Foo" + Folder "Foo" → collision (both Foo/), dedup applied - - Script "Foo" (server) + Script "Foo" (client) → no collision (Foo.server.luau vs Foo.client.luau), no dedup suffix - - Script "Foo" (server) + Script "Foo" (server) → collision (both Foo.server.luau), dedup applied - - ModuleScript "Foo" + ModuleScript "Foo" → collision (both Foo.luau), dedup applied - - Instance "Foo?" + Instance "Foo*" → both slugify to "Foo_", filesystem collision, dedup applied. Different matching groups (different true names) but same dedup group (same slug). - - Instance "Foo" + Instance "foo" → case-insensitive collision on Windows/macOS, dedup applied for cross-platform safety. -* Cross-system integration tests: - - Full roundtrip with duplicates: create place with duplicate-named instances → syncback → build → compare trees bit-for-bit - - Incremental syncback after rename: syncback, rename one duplicate in Studio, syncback again -- verify correct file is updated (not the wrong sibling) - - Two-way sync add duplicate: during live sync, add a third instance with same name -- verify correct ~N suffix assigned and refs intact - - Two-way sync delete from middle: during live sync, delete an instance from a dedup group -- verify gap tolerance (no renumbering) - - Forward sync edit dedup'd file: edit Attachment~1/init.meta.json5 on disk -- verify compute_patch_set pairs it to the correct tree instance - - Slugify + dedup interaction: instance named "What?Script" alongside "What_Script" alongside another "What?Script" -- first two slugify to same thing, third is a true duplicate of the first. Verify all three get correct unique filesystem names and refs resolve. - - Project file + filesystem duplicates: project defines child "Foo" via $path, filesystem sibling also named "Foo" -- project key wins (unique by definition), filesystem child coexists without dedup. -* Sync invariant tests (from audit.md concepts): - - CLI syncback parity: run CLI syncback on a place with duplicates, then run two-way sync on the same place -- verify byte-identical filesystem output. Any divergence is a bug. - - 4 file format branches: verify dedup works for (1) directory with init.meta.json5, (2) standalone script with adjacent .meta.json5, (3) model file with inline name, (4) .txt/.csv with adjacent .meta.json5. Each must produce correct dedup'd names and meta name fields. - - Compound extension dedup: Script~1.server.luau pairs with Script~1.meta.json5 (not Script.server~1.luau or Script~1.server.meta.json5). Verify meta pairing is correct. - - InstigatingSource after dedup: verify that instances written with ~N suffixes have InstigatingSource::Path pointing to the dedup'd path (e.g., src/Foo~1.server.luau, not src/Foo.server.luau). - - File-to-folder transition with dedup: Script "Foo" (flat, Foo.server.luau) gets a child added → becomes Foo/init.server.luau. If another "Foo" folder already exists, dedup suffix must be applied to the new directory. All ref paths must update. - - Script type transition in dedup group: ModuleScript "Foo" and Script "Foo" don't collide (Foo.luau vs Foo.server.luau). Change ModuleScript to Script → now both are .server.luau → dedup collision created mid-session. Verify dedup suffix added and refs updated. - - Dual write path consistency: during /api/write, verify the file written to disk uses the same dedup suffix as the PatchSet sent to ChangeProcessor. Kill the server mid-sync and verify build from filesystem matches the in-memory tree state. - - Review dialogue with dedup: in Always sync mode, adding a duplicate-named instance shows the dedup assignment in the confirmation UI before applying. - - Atomicity: rename Attachment~1 to Attachment (suffix cleanup) while VFS watcher is active. Verify no intermediate state is snapshotted where both Attachment and Attachment~1 exist or neither exists. - - Determinism: build the same project 3 times from scratch -- verify all 3 outputs are bit-identical. No non-deterministic suffix assignment or child ordering. - - Idempotency: syncback twice on same input with no changes in between -- verify zero filesystem modifications on second run. - - Pre-seeded dedup: add a new instance "Foo" to a parent that already has Foo.server.luau on disk. Verify taken_names is seeded from instigating_source paths and the new instance gets ~1 (not overwriting the existing file). - -This is a large refactor, and I may be missing some critical details in this - ask many questions to make sure there is no ambiguity. - - - -XXH32.luau: - ---!strict ---!optimize 2 ---!native - -local function XXH32(Message: buffer, Seed: number?): number - local PRIME_1, PRIME_1_HIGH, PRIME_1_LOW = 0x9e3779B1, 40503, 31153 - local PRIME_2, PRIME_2_HIGH, PRIME_2_LOW = 0x85ebca77, 34283, 51831 - local PRIME_3_HIGH, PRIME_3_LOW = 49842, 44605 - local PRIME_4_HIGH, PRIME_4_LOW = 10196, 60207 - local PRIME_5, PRIME_5_HIGH, PRIME_5_LOW = 0x165667b1, 5718, 26545 - - local UsedSeed = Seed or 0 - local MessageLength = buffer.len(Message) - local Digest: number - local CurrentOffset = 0 - - if MessageLength >= 16 then - local Accumulator1 = UsedSeed + PRIME_1 + PRIME_2 - local Accumulator2 = UsedSeed + PRIME_2 - local Accumulator3 = UsedSeed - local Accumulator4 = UsedSeed - PRIME_1 - - while CurrentOffset <= MessageLength - 16 do - local Word1 = buffer.readu32(Message, CurrentOffset) - local Word2 = buffer.readu32(Message, CurrentOffset + 4) - local Word3 = buffer.readu32(Message, CurrentOffset + 8) - local Word4 = buffer.readu32(Message, CurrentOffset + 12) - - local AHigh1, ALow1 = bit32.rshift(Word1, 16), bit32.band(Word1, 65535) - local Mult1 = bit32.lshift((AHigh1 * PRIME_2_LOW) + (ALow1 * PRIME_2_HIGH), 16) + (ALow1 * PRIME_2_LOW) - - local Temp1 = bit32.lrotate(Accumulator1 + Mult1, 13) - local AHigh1_2, ALow1_2 = bit32.rshift(Temp1, 16), bit32.band(Temp1, 65535) - Accumulator1 = bit32.lshift((AHigh1_2 * PRIME_1_LOW) + (ALow1_2 * PRIME_1_HIGH), 16) + (ALow1_2 * PRIME_1_LOW) - - local AHigh2, ALow2 = bit32.rshift(Word2, 16), bit32.band(Word2, 65535) - local Mult2 = bit32.lshift((AHigh2 * PRIME_2_LOW) + (ALow2 * PRIME_2_HIGH), 16) + (ALow2 * PRIME_2_LOW) - - local Temp2 = bit32.lrotate(Accumulator2 + Mult2, 13) - local AHigh2_2, ALow2_2 = bit32.rshift(Temp2, 16), bit32.band(Temp2, 65535) - Accumulator2 = bit32.lshift((AHigh2_2 * PRIME_1_LOW) + (ALow2_2 * PRIME_1_HIGH), 16) + (ALow2_2 * PRIME_1_LOW) - - local AHigh3, ALow3 = bit32.rshift(Word3, 16), bit32.band(Word3, 65535) - local Mult3 = bit32.lshift((AHigh3 * PRIME_2_LOW) + (ALow3 * PRIME_2_HIGH), 16) + (ALow3 * PRIME_2_LOW) - - local Temp3 = bit32.lrotate(Accumulator3 + Mult3, 13) - local AHigh3_2, ALow3_2 = bit32.rshift(Temp3, 16), bit32.band(Temp3, 65535) - Accumulator3 = bit32.lshift((AHigh3_2 * PRIME_1_LOW) + (ALow3_2 * PRIME_1_HIGH), 16) + (ALow3_2 * PRIME_1_LOW) - - local AHigh4, ALow4 = bit32.rshift(Word4, 16), bit32.band(Word4, 65535) - local Mult4 = bit32.lshift((AHigh4 * PRIME_2_LOW) + (ALow4 * PRIME_2_HIGH), 16) + (ALow4 * PRIME_2_LOW) - - local Temp4 = bit32.lrotate(Accumulator4 + Mult4, 13) - local AHigh4_2, ALow4_2 = bit32.rshift(Temp4, 16), bit32.band(Temp4, 65535) - Accumulator4 = bit32.lshift((AHigh4_2 * PRIME_1_LOW) + (ALow4_2 * PRIME_1_HIGH), 16) + (ALow4_2 * PRIME_1_LOW) - - CurrentOffset += 16 - end - - Digest = bit32.lrotate(Accumulator1, 1) + bit32.lrotate(Accumulator2, 7) + bit32.lrotate(Accumulator3, 12) + bit32.lrotate(Accumulator4, 18) - else - Digest = UsedSeed + PRIME_5 - end - - Digest += MessageLength - - while CurrentOffset <= MessageLength - 4 do - if CurrentOffset + 4 <= buffer.len(Message) then - local Word = buffer.readu32(Message, CurrentOffset) - - local AHigh_w, ALow_w = bit32.rshift(Word, 16), bit32.band(Word, 65535) - local Mult_w = bit32.lshift((AHigh_w * PRIME_3_LOW) + (ALow_w * PRIME_3_HIGH), 16) + (ALow_w * PRIME_3_LOW) - - Digest += Mult_w - - local Rotated = bit32.lrotate(Digest, 17) - local AHigh_r, ALow_r = bit32.rshift(Rotated, 16), bit32.band(Rotated, 65535) - Digest = bit32.lshift((AHigh_r * PRIME_4_LOW) + (ALow_r * PRIME_4_HIGH), 16) + (ALow_r * PRIME_4_LOW) - end - CurrentOffset += 4 - end - - while CurrentOffset < MessageLength do - if CurrentOffset < buffer.len(Message) then - local ByteValue = buffer.readu8(Message, CurrentOffset) - - local AHigh_b, ALow_b = bit32.rshift(ByteValue, 16), bit32.band(ByteValue, 65535) - local Mult_b = bit32.lshift((AHigh_b * PRIME_5_LOW) + (ALow_b * PRIME_5_HIGH), 16) + (ALow_b * PRIME_5_LOW) - - Digest += Mult_b - - local Rotated_b = bit32.lrotate(Digest, 11) - local AHigh_rb, ALow_rb = bit32.rshift(Rotated_b, 16), bit32.band(Rotated_b, 65535) - Digest = bit32.lshift((AHigh_rb * PRIME_1_LOW) + (ALow_rb * PRIME_1_HIGH), 16) + (ALow_rb * PRIME_1_LOW) - end - CurrentOffset += 1 - end - - local XorResult1 = bit32.bxor(Digest, bit32.rshift(Digest, 15)) - local AHigh_f1, ALow_f1 = bit32.rshift(XorResult1, 16), bit32.band(XorResult1, 65535) - Digest = bit32.lshift((AHigh_f1 * PRIME_2_LOW) + (ALow_f1 * PRIME_2_HIGH), 16) + (ALow_f1 * PRIME_2_LOW) - - local XorResult2 = bit32.bxor(Digest, bit32.rshift(Digest, 13)) - local AHigh_f2, ALow_f2 = bit32.rshift(XorResult2, 16), bit32.band(XorResult2, 65535) - Digest = bit32.lshift((AHigh_f2 * PRIME_3_LOW) + (ALow_f2 * PRIME_3_HIGH), 16) + (ALow_f2 * PRIME_3_LOW) - - return bit32.bxor(Digest, bit32.rshift(Digest, 16)) -end - -return XXH32 \ No newline at end of file diff --git a/.cursor/rules/luau-rfcs/CNAME b/.cursor/rules/luau-rfcs/CNAME deleted file mode 100644 index 5a887701..00000000 --- a/.cursor/rules/luau-rfcs/CNAME +++ /dev/null @@ -1 +0,0 @@ -rfcs.luau.org \ No newline at end of file diff --git a/.cursor/rules/luau-rfcs/_config.yml b/.cursor/rules/luau-rfcs/_config.yml deleted file mode 100644 index 19138cfd..00000000 --- a/.cursor/rules/luau-rfcs/_config.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: Luau RFCs -url: https://rfcs.luau-lang.org -markdown: kramdown -kramdown: - input: GFM diff --git a/.cursor/rules/luau-rfcs/abstract-module-paths-and-init-dot-luau.md b/.cursor/rules/luau-rfcs/abstract-module-paths-and-init-dot-luau.md deleted file mode 100644 index 31bcb368..00000000 --- a/.cursor/rules/luau-rfcs/abstract-module-paths-and-init-dot-luau.md +++ /dev/null @@ -1,144 +0,0 @@ -# Abstract module paths and `init.luau` - -**Status**: Implemented - -## Summary - -We will redefine `foo/init.luau` to be the contents of the module named foo for -the purpose of resolving relative `require()` calls within its body. - -We will do this because a significant portion of our users today rely on the -idiom that `init.luau` represents the module's contents, especially when using -Rojo to build for Roblox. - -## Motivation - -First, consider an example filesystem: - -``` -./foo.luau -./package -./package/init.luau -./package/foo.luau -./package/dependency.luau -``` - -Luau maps this filesystem into a module tree. Module paths largely correspond -to filesystem paths, but they are distinct ideas. Given the filesystem above, -Luau considers the following module paths to be valid: - -``` -foo -package -package/init -package/foo -package/dependency -``` - -When Luau is running on a conventional filesystem, we presently offer some -special behaviour to afford the ability for modules to both contain other -modules, and for them to themselves export values and types: The module path -`package` is treated as an alias to `package/init`. - -Library authors can use this feature to afford a package hierarchy with a root -package that exports all of the most important, basic functionality, plus -submodules that either contain implementation details or additional public APIs. - -This feature works well, but it's incompatible with the idiom that Rojo, a -popular tool in our ecosystem today, employs when building artifacts for Roblox. - -This incompatibility stems from how requires are resolved within the body of -`init.luau`. - -Because we consider `package/init` to be an ordinary Luau module, it is -considered to be rooted at `package`. Therefore, a relative -`require('./foo')` call will resolve to `./package/foo.luau` rather than -`./foo.luau`. - -Rojo, by contrast, considers `./package/init.luau` to belong to the containing -directory. A developer using Rojo must instead write -`require('./package/foo')`. This is only necessary when the script is named -`init.luau`. - -Because of this incompatibility, scripts with require-by-string uses in Rojo -projects will not work outside of Roblox places and vice versa. Since -cross-runtime compatibility is an important goal of the require-by-string -project, we would like to rectify this. - -## Design - -First, we introduce a new abstraction: a _module path_. Module paths refer -either to _modules_ or _directories_. - -For the purposes of navigation, both modules and directories are functionally -identical: modules and directories can both have children, which could -themselves be modules or directories, and both types can have at most one -parent, which could also be either a module or a directory. - -The thing that separates a module from a directory is precisely that modules -represent source code that can be imported via the `require()` function. -Directories, by contrast, are merely organizational units. - -The central feature of this RFC is about how module paths correspond to -filesystem paths: A module path refers to a module if it corresponds either to a -`.luau` file or to a directory that contains a file named `init.luau`. A module -path refers to a directory if it refers to a filesystem directory that lacks an -`init.luau` file. - -More concretely, Luau will no longer consider relative requires from a package -`init.luau` file to resolve relative to the script itself. It will instead -resolve relative to the location of the abstract module it represents, i.e. the -location of its parent folder in a filesystem context. - -Secondly, we recognize an unfortunate side effect of this change: code within -`package/init.luau` is forced to write `require('./package/dependency')` when it -specifically wants to carry out the ordinary task of importing a subordinate -module. - -We propose to alleviate this with a special import alias `@self` that resolves -to the path to the current module. - -```lua --- package/init.luau - -local foo = require('./foo') -- This pulls in the outer foo! -local foo = require('@self/foo') -- import package/foo -``` - -## Drawbacks - -On a filesystem, Rojo's behaviour is frankly very weird! A reader must know the -name of the current source file in order to know what `require('./foo')` will -do, and if a developer renames a file to or from `init.luau`, they will be -forced to rewrite every `require()`. - -We could someday mitigate this with a new lint: If a module is the parent of other -modules, it is poor style for it to directly import sibling or parent modules. -Files named `init.luau` should never issue a require that resolves to a sibling -module. In our example, we would warn if `package/init.luau` were to -`require('./foo')` because that reaches outside of its folder. - -Further, as require-by-string has been live on Roblox for a little while, there -is some risk that changing things now will break existing code. Roblox will use -live telemetry to assess the impact of this change before we move forward. - -## Alternatives - -### Patching Rojo - -Adjusting Rojo to match what Luau does today without breaking any existing -application code is tricky and most likely requires something far weirder than -the change outlined in this RFC. - -Crucially, most code written using Rojo predates string-based requires. All of -this code must continue to run exactly as-is. - -This puts us in quite a bind: - -* If we map `foo/init.luau` to an actual `ModuleScript` at `foo/init` in the - Roblox data model, then instance-based requires break. This rules out clever - solutions like aliasing modules and compatibility shims. -* If we don't, then we need some other magic Roblox rule that changes the - require resolution rules - 1. Only for scripts that, on the Rojo side, are named `init.luau`, and - 2. Only for string-based requires diff --git a/.cursor/rules/luau-rfcs/amended-require-resolution.md b/.cursor/rules/luau-rfcs/amended-require-resolution.md deleted file mode 100644 index 05689c3e..00000000 --- a/.cursor/rules/luau-rfcs/amended-require-resolution.md +++ /dev/null @@ -1,243 +0,0 @@ -# Amended Require Syntax and Resolution Semantics - -**Status**: Implemented - -## Summary - -We need to finalize a syntax for aliases in require expressions and determine intuitive resolution semantics as we prepare to build a package management system. - -## Motivation - -In an [old RFC for require-by-string](https://github.com/luau-lang/luau/pull/969), we removed the `@` prefix from aliases altogether and opted for the following design: -the path `require("my/module")` is resolved by first checking if `my` is an alias defined in a `.luaurc` file. -If so, we perform a string substitution on `my`. -If not, we try to resolve `my/module` relative to the requiring file. -This is identical to approach (3a) below. - -This design changed in the next few months and became what we now have in [require-by-string-aliases.md](require-by-string-aliases.md): -when requiring an alias, it must be prepended with the `@` prefix. -Otherwise, we will assume the given string does not contain an alias and will resolve it relative to the requiring file. -This is identical to approach (1a) below. - -As we prepare to build an official Luau package management system, we need unambiguous alias functionality. -This RFC documents the final design decision made after discussion. - -Note: The numbered labels below are preserved from an earlier version of this document. -Discussion in the [PR](https://github.com/luau-lang/rfcs/pull/56) refers to these approaches by their labels, so they have been left as-is in this document. - -## Design - -### Context - -Assume that the following `.luaurc` file is defined: -```json -{ - "aliases": { - "libs": "/My/Libraries/Directory" - } -} -``` -Additionally, assume that we have a file named `dependency.luau` located in these two locations: -1. `./libs/dependency.luau` -2. `/My/Libraries/Directory/dependency.luau` - -### (1) Make explicit prefixes necessary - -#### (1c) All explicit prefixes necessary - -We will always require prefixes for disambiguation. -In other words, any unprefixed path will _always_ result in an error. -```luau --- Error: must have either "@", "./", or "../" prefix -require("libs/dependency") - --- Requires ./libs/dependency.luau -require("./libs/dependency") - --- Requires /My/Libraries/Directory/dependency.luau -require("@libs/dependency") -``` - -A benefit of this approach is that the role of autocomplete becomes fairly well-defined. -When `require("` is typed, autocomplete has only three options to display: the `@`, `./`, and `../` prefixes. -After a prefix has been typed, autocomplete will either display defined aliases or local modules, depending on the prefix. -Approaches (1a) and (1b) would be less clear about this, as `require("` could be followed by a string component or one of the three prefixes. - -An additional benefit of this approach is that it is forwards-compatible with both (1a) and (1b), which are now in Alternatives. -We effectively reserve unprefixed paths with this approach and can support either (1a) or (1b) further down the road. -After a package manager has been implemented, we will likely have a better sense for which option makes the most sense: mapping unprefixed paths to local modules, to aliased modules, or to nothing (keeping unprefixed paths unsupported). - -### Removing `paths` - -As part of the push to make require expressions more explicit, we will remove `paths`, as aliases defined in `aliases` serve a similar purpose and are more explicit. - -### Throw an error if multiple files matched - -Currently, we allow `require` to resolve to both `.luau` and `.lua` files, implicitly preferring `.luau` if both are present. -In line with this proposal's move toward explicit resolution semantics, this behavior will be revised. -We will continue to support `.luau` and `.lua` files, but we will throw an error if both are present. - -We also currently support requiring a directory if it contains an `init.luau` or `init.lua` file. -If the name of a file matches the name of a sibling directory, we will now also throw an error to avoid ambiguity. - -For example, calling `require("./module")` from `requirer.luau` would throw an error in each of these cases (non-exhaustive). - -Conflict between `module.lua` and `module.luau`: -``` -. -├── module.lua -├── module.luau -└── requirer.luau -``` - -Conflict between `module` directory and `module.luau`: -``` -. -├── module -│ └── init.luau -├── module.luau -└── requirer.luau -``` - -## Drawbacks - -The main drawback of this approach is that it is quite strict and not backwards-compatible with any existing code that uses unprefixed require expressions. -However, because of its forwards compatibility with approaches (1a) and (1b), it is possible for us to relax these restrictions in the future. - -From an aesthetic point of view, this approach is slightly more cluttered than other approaches, as every path must begin with a prefix. - -The removal of `paths` and changes to the implicit resolution order for different file types may also create concerns for backwards compatibility. - -## Alternatives - -### (1) Make explicit prefixes necessary - -Although (1a) and (1b) are both explicit approaches, they take opposite stances on whether writing relative-path requires or aliased-path requires should be optimized for the developer. -Currently, relative-path requires are far more common, which fits well with approach (1a). -In the context of a package management system, however, we would expect aliased paths to be used more frequently, which fits better with approach (1b). - -These approaches have been moved to Alternatives since they are both backwards-compatible with approach (1c). -Rather than making an arbitrary decision now, it makes more sense for us to choose (1c) now and reevaluate once package management is a reality. - -#### (1a) Make aliases explicit with `@` prefix - -We make usage of the `@` prefix necessary in aliased require expressions. -This means that any unprefixed string is always treated as an unaliased path. -```luau --- Requires ./libs/dependency.luau -require("libs/dependency") - --- Requires ./libs/dependency.luau -require("./libs/dependency") - --- Requires /My/Libraries/Directory/dependency.luau -require("@libs/dependency") -``` - -The main drawback of this approach is that projects with many _external_ dependencies will have many `@` symbols appearing within require expressions. - -This is similar to [Lune's approach](https://lune-org.github.io/docs/getting-started/2-introduction/8-modules#file-require-statements) and is identical to the approach currently described in [require-by-string-aliases.md](require-by-string-aliases.md). - -#### (1b) Make relative paths explicit with `./` prefix - -We make usage of the `./` prefix necessary in relative require expressions. -This means that any unprefixed string is always treated as an aliased path. -```luau --- Requires /My/Libraries/Directory/dependency.luau -require("libs/dependency") - --- Requires ./libs/dependency.luau -require("./libs/dependency") - --- Requires /My/Libraries/Directory/dependency.luau -require("@libs/dependency") -``` - -The main drawback of this approach is that projects with many _internal_ dependencies will have many `./` symbols appearing within require expressions. - -This is similar to [darklua's approach](https://darklua.com/docs/path-require-mode/). - -### (2) Strongly recommend explicit prefixes - -We don't make the `@` or `./` prefixes necessary like in approach (1c), but we strongly recommend them. - -This can be accomplished by allowing unprefixed paths but throwing an error if they resolve to multiple files. -There is a performance cost to this: currently, if we successfully match a given path to a file, we stop searching for other matches. -If this approach were implemented, we would need to search for at most two matching files in case we need to throw an error. -In the case of multiple nested directories with their own `.luaurc` files and `paths` arrays, this search could take linear time with respect to the total number of paths defined, in the worst case. - -Of course, developers could use the `@` or `./` prefixes to explicitly specify a search type and eliminate this performance cost. -```luau --- Error: ./libs/dependency.luau exists and .luaurc defines a distinct "libs" alias --- Would require ./libs/dependency.luau if "libs" alias did not exist --- Would require /My/Libraries/Directory/dependency.luau if ./libs/dependency.luau did not exist -require("libs/dependency") - --- Requires ./libs/dependency.luau -require("./libs/dependency") - --- Requires /My/Libraries/Directory/dependency.luau -require("@libs/dependency") -``` - -This is a compromise between approaches (1a) and (1b) that sacrifices performance for compatibility and readability. -Unfortunately, this approach could lead to unexpected behavior if users have globally defined `.luaurc` files that conflict with scripts that expect certain aliases to not be defined. - -### (3) Use implicit resolution ordering to avoid `@` prefix - -If we choose to remove the `@` prefix, we must define an implicit resolution ordering. -In essence, aliases must either represent overrides or fallbacks for relative path resolution. -These approaches are not being considered since implicit resolution ordering can be confusing, and people may disagree on which ordering is best. - -#### (3a) Aliases as overrides - -If aliases were overrides, we would have the following behavior. -This is identical to the [old RFC](https://github.com/luau-lang/luau/pull/969)'s behavior. -```luau --- Requires /My/Libraries/Directory/dependency.luau -require("libs/dependency") - --- Requires ./libs/dependency.luau -require("./libs/dependency") - --- Error: there is no "@libs" alias in .luaurc -require("@libs/dependency") -``` - -If the `libs` alias did not exist, however, we would have the following: -```luau --- Requires ./libs/dependency.luau -require("libs/dependency") - --- Requires ./libs/dependency.luau -require("./libs/dependency") - --- Error: there is no "@libs" alias in .luaurc -require("@libs/dependency") -``` - -#### (3b) Aliases as fallbacks - -If aliases were fallbacks, we would have the following behavior. -```luau --- Requires ./libs/dependency.luau -require("libs/dependency") - --- Requires ./libs/dependency.luau -require("./libs/dependency") - --- Error: there is no "@libs" alias in .luaurc -require("@libs/dependency") -``` - -If `./libs/dependency.luau` did not exist, however, we would have the following: -```luau --- Requires /My/Libraries/Directory/dependency.luau -require("libs/dependency") - --- Error: does not exist -require("./libs/dependency") - --- Error: there is no "@libs" alias in .luaurc -require("@libs/dependency") -``` \ No newline at end of file diff --git a/.cursor/rules/luau-rfcs/behavior-eq-metamethod.md b/.cursor/rules/luau-rfcs/behavior-eq-metamethod.md deleted file mode 100644 index c17e9a7c..00000000 --- a/.cursor/rules/luau-rfcs/behavior-eq-metamethod.md +++ /dev/null @@ -1,59 +0,0 @@ -# Always call `__eq` when comparing for equality - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -`__eq` metamethod will always be called during `==`/`~=` comparison, even for objects that are rawequal. - -## Motivation - -Lua 5.x has the following algorithm it uses for comparing userdatas and tables: - -- If two objects are not of the same type (userdata vs number), they aren't equal -- If two objects are referentially equal, they are equal (!) -- If no object has a metatable with `__eq` metamethod, they are equal iff they are referentially equal -- Otherwise, pick one of the `__eq` metamethods, call it with both objects as arguments and return the result. - -In mid-2019, we've released Luau which implements a fast path for userdata comparison. This fast path accidentally omitted step 2 for userdatas with C `__eq` implementations (!), and thus comparing a userdata object vs itself would actually run `__eq` metamethod. This is significant as it allowed users to use `v == v` as a NaN check for vectors, coordinate frames, and other objects that have floating point contents. - -Since this was a bug, we're in a rather inconsistent state: - -- `==` and `~=` in the code always call `__eq` for userdata with C `__eq` -- `==` and `~=` don't call `__eq` for tables and custom newproxy-like userdatas with Lua `__eq` when objects are ref. equal -- `table.find` *doesn't* call `__eq` when objects are ref. equal - -## Design - -Since developers started relying on `==` behavior for NaN checks in the last two years since Luau release, the bug has become a feature. Additionally, it's sort of a good feature since it allows to implement NaN semantics for custom types - userdatas, tables, etc. - -Thus the proposal suggests changing the rules so that when `__eq` metamethod is present, `__eq` is always called even when comparing the object to itself. - -This would effectively make the current ruleset for userdata objects official, and change the behavior for `table.find` (which is probably not significant) and, more significantly, start calling user-provided `__eq` even when the object is the same. It's expected that any reasonable `__eq` implementation can handle comparing the object to itself so this is not expected to result in breakage. - -## Drawbacks - -This represents a difference in a rather core behavior from all upstream versions of Lua. - -## Alternatives - -We could instead equalize (ha!) the behavior between Luau and Lua. In fact, this is what we tried to do initially as the userdata behavior was considered a bug, but encountered the issue with games already depending on the new behavior. - -We could work with developers to change their games to stop relying on this. However, this is more complicated to deploy and - upon reflection - makes `==` less intuitive than the main proposal when comparing objects with NaN, since e.g. it means that these two functions have a different behavior: - -```luau -function compare1(a: Vector3, b: Vector3) - return a == b -end - -function compare2(a: Vector3, b: Vector3) - return a.X == b.X and a.Y == b.Y and a.Z == b.Z -end -``` - -## References - -https://devforum.roblox.com/t/call-eq-even-when-tables-are-rawequal/1088886 -https://devforum.roblox.com/t/nan-vector3-comparison-broken-cframe-too/1130778 diff --git a/.cursor/rules/luau-rfcs/behavior-stricter-utf8-library.md b/.cursor/rules/luau-rfcs/behavior-stricter-utf8-library.md deleted file mode 100644 index 0fa1c4f2..00000000 --- a/.cursor/rules/luau-rfcs/behavior-stricter-utf8-library.md +++ /dev/null @@ -1,48 +0,0 @@ -# Stricter utf8 library validation - -**Status**: Implemented - -## Summary - -`utf8.len` and other functions in UTF-8 library will do more rigorous validation of UTF-8 input, rejecting UTF-16 surrogates encoded into UTF-8. - -## Motivation - -We use the UTF-8 library `utf8` from Lua 5.3. The implementation of this library mostly correctly validates UTF-8 input and either throws errors (e.g. from `utf8.codes`) or returns `nil` (for `utf8.len`) for invalid input. - -However, certain invalid UTF-8 sequences are treated as valid. This specifically includes surrogate characters encoded in UTF-8; for example, the string `"\237\160\128"` represents an attempt to encode the surrogate `0xD800` into UTF-8. -This is impossible to do in UTF-8; Lua 5.3 accepts this (`utf8.len` returns 1), and so does Luau. - -This creates issues for any other API that correctly validates UTF-8. For example, Roblox extends Luau with a few extra functions, like `utf8.nfcnormalize`, that perform UTF-8 validation correctly and reject the aforementioned string. -As a result, due to Roblox extensions, the `utf8` library exposed in Roblox is inconsistent (this is also a problem in other Roblox-specific APIs like DataStores that reject invalid UTF-8 inputs that `utf8.len` accepts). -We would also expect that in other environments, extra functions that handle UTF-8 inputs and validate them do the validation properly. - -Lua 5.4 fixes this by changing the default behavior of `utf8.len` and other UTF-8 functions to error when surrogates are present. It also fixes an issue in `utf8.codes` that failed to properly reject overlong UTF-8 sequences in certain cases; Luau already contains a fix to this issue. - -## Design - -All functions from Luau `utf8` library will correctly validate UTF-8 and reject inputs that have surrogates. The functions will use their existing error handling strategy: `utf8.len` will return `nil` followed by the byte offset, `utf8.codepoint` and `utf8.codes` will error. - -Any code using these functions should already be prepared for handling errors: `utf8` functions will already do a validation of UTF-8 input, the validation was just not fully comprehensive. It is expected that this will not cause any significant compatibility risk, because many other functions already reject surrogates and the use of `utf8.` function family in general is rare. - -Notably, this is a *partial* implementation of Lua 5.4 behavior. In addition to making the default behavior stricter, Lua 5.4 *relaxes* `utf8.char` (allowing it to produce "codepoints" that exceed 0x10FFFF and are invalid per Unicode standard) unconditionally, and also provides an optional argument `lax` to a few functions like `utf8.len` that allows to accept both surrogates and out-of-range (larger than `0x10FFFF`) codepoints. - -We do not propose to adopt the full Lua 5.4 behavior or introduce the new `lax` argument for the following reasons: - -- Based on the analysis of all packages published to `luarocks`, we conclude that `lax` argument is never used outside of Lua's own tests. As such, it's questionable whether we *need* to give a way to relax the checks. -- The behavior changes regardless due to the parameter defaults (`lax` defaults to `false`). We agree with this choice but conclude that the compatibility risk, however small, exists regardless of the argument's presence. -- Because full 5.4 semantics include both making behavior stricter by default, and also significantly relaxing behavior by allowing out-of-range characters (unconditionally for `utf8.char`, and conditionally on `lax` for other `utf8` functions), they allow easier production of invalid UTF-8 sequences. - -It is likely that 5.4 semantics change is motivated by only having two types of behavior: "strict" (proposed here) and "lax" (supporting a variant of UTF-8 that allows encoding any codepoint value). Because it is always possible to add the "lax" behavior later, and we do not want to establish the precedent and require this addition to all other functions (for example, what should `nfcnormalize` do for surrogates?), we only specify the "strict" behavior here. The "lax" behavior could be added by a separate RFC if there's significant demand for it; that would be fully backwards compatible. - -> After this change, in Roblox strings that are correctly validated by `utf8.len` should also work properly with `utf8.nfcnormalize`, `utf8.graphemes`, DataStore APIs and other functions that validate UTF-8 input. - -## Drawbacks - -Because this technically changes behavior, due to Hyrum's law we might break some code that *really* wants to encode surrogates in UTF-8 despite the fact that only a couple functions support this. - -Because this doesn't fully align behavior with Lua 5.4, it is possible that we will get programs in the future that want the full Lua 5.4 treatment (allowing `lax`). It is likely that this will happen because of larger codepoints for some odd custom encoding reasons though, not for surrogates specifically, and if it does we can add it later. - -## Alternatives - -Other than doing nothing, we could implement full Lua 5.4 behavior (with `lax` argument and relaxed range checks in some existing functions). This leaves the question as to what the behavior of Roblox-specific utf8 extensions like `nfcnormalize` or `graphemes` should be, as they would become inconsistent not just in implementation but also in interface without further changes. diff --git a/.cursor/rules/luau-rfcs/change-global-version.md b/.cursor/rules/luau-rfcs/change-global-version.md deleted file mode 100644 index cdb6c1e7..00000000 --- a/.cursor/rules/luau-rfcs/change-global-version.md +++ /dev/null @@ -1,21 +0,0 @@ -# Change \_VERSION global to "Luau" - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Change \_VERSION global to "Luau" to differentiate Luau from Lua - -## Motivation - -Provide an official way to distinguish Luau from Lua implementation. - -## Design - -We inherit the global string \_VERSION from Lua (this is distinct from Roblox `version()` function that returns a full version number such as 0.432.43589). - -The string is set to "Lua 5.1" for us (and "Lua 5.2" etc for newer versions of Lua. - -Since our implementation is sufficiently divergent from upstream, this proposal suggests setting \_VERSION to "Luau". diff --git a/.cursor/rules/luau-rfcs/config-luauconfig.md b/.cursor/rules/luau-rfcs/config-luauconfig.md deleted file mode 100644 index dd90e4a9..00000000 --- a/.cursor/rules/luau-rfcs/config-luauconfig.md +++ /dev/null @@ -1,146 +0,0 @@ -# Support Luau-syntax configuration files - -**Status**: Implemented - -## Summary - -Introduce `.config.luau`: a Luau-syntax file used to configure analysis and runtime behavior. - -## Motivation - -We currently support analysis and runtime configuration in `.luaurc` files, which use a JSON-like syntax ([RFC](https://rfcs.luau.org/config-luaurc)). - -Under the current design, the burden of providing JSON-editing support is placed on anyone embedding Luau, even if their environment is not naturally suited for JSON configuration. -Ideally, embedding Luau should not require implementers to build or maintain specialized tooling for editing JSON-based configuration files. - -## Design - -We introduce a new configuration file called `.config.luau`. - -### Syntax - -An example `.config.luau` is given below. - -```luau -return { - luau = { - languagemode = "nonstrict", - lint = { - ["*"] = true, - LocalUnused = false - }, - linterrors = true, - typeerrors = true, - globals = {"expect"}, - aliases = { - src = "./src" - } - } -} -``` - -The file must return a Luau table of the following `Config` type (facilitated by type checking and autocomplete support): -```luau -type LanguageMode = "strict" | "nonstrict" | "nocheck" - -type LintWarning = - "*" - | "UnknownGlobal" - | "DeprecatedGlobal" - | "GlobalUsedAsLocal" - | "LocalShadow" - | "SameLineStatement" - | "MultiLineStatement" - | "LocalUnused" - | "FunctionUnused" - | "ImportUnused" - | "BuiltinGlobalWrite" - | "PlaceholderRead" - | "UnreachableCode" - | "UnknownType" - | "ForRange" - | "UnbalancedAssignment" - | "ImplicitReturn" - | "DuplicateLocal" - | "FormatString" - | "TableLiteral" - | "UninitializedLocal" - | "DuplicateFunction" - | "DeprecatedApi" - | "TableOperations" - | "DuplicateCondition" - | "MisleadingAndOr" - | "CommentDirective" - | "IntegerParsing" - | "ComparisonPrecedence" - | "RedundantNativeAttribute" - -type LuauConfig = { - languagemode: LanguageMode?, - lint: { [LintWarning]: boolean }?, - linterrors: boolean?, - typeerrors: boolean?, - globals: { string }?, - aliases: { [string]: string }?, -} - -type Config = { - luau: LuauConfig? -} -``` - -If configuration fields are not provided, `.config.luau` has the same default behavior as `.luaurc`. - -### Search semantics - -The search semantics of `.config.luau` files are the same as `.luaurc`'s (adapted from a previous RFC): - -> For a given `.luau` or `.lua` script, Luau will search for `.luaurc` files starting from the folder that the script is in; all files in the ancestry chain will be parsed and their configuration applied. -> When multiple configuration files exist throughout the ancestry chain, configurations closer to the script override those in higher-level directories. - -If both `.luaurc` and `.config.luau` are present in a directory, an error is thrown. - -### Configuration extraction - -Unlike `.luaurc` files, `.config.luau` files can contain runtime constructs like variables, functions, and loops. -To extract configuration from a `.config.luau` file, its contents are executed in an isolated Luau VM with only the standard libraries enabled (`luaL_openlibs`). -This approach ensures that configuration files can leverage Luau features while maintaining a sandboxed execution environment. -As a consequence, `.config.luau` files cannot require other scripts, as `require` is not included in the standard libraries. - -#### Timing out - -Executing arbitrarily complex Luau code requires us to guard against excessive computation: -```luau --- .config.luau with an infinite loop -return (function() - while true do - end -end)() -``` - -For analysis-time configuration extraction, we adopt the same behavior described in the [user-defined type functions RFC](https://rfcs.luau.org/user-defined-type-functions.html): we simply respect the time limit that the embedding context provides through the `Frontend` API. - -At runtime, the configuration extraction timeout for each `.config.luau` file is set to two seconds by default. -This duration is generally sufficient for typical configuration logic while being short enough to prevent accidental or malicious long-running scripts from impacting performance. -For more fine-grained control, however, embedders will be free to override this. -That is to say, we do not wish to prescribe a specific limit in general, but note that having a limit in place is important. - -### Interaction with `require` - -Despite `.config.luau` being a `.luau` file, it is not recognized as a module by `require` at runtime. -Concretely, the source file `foo.luau` cannot extract the contents of its sibling `.config.luau` file with the expression `require("./.config")`. - -## Drawbacks - -**Complexity**: Allowing arbitrary Luau code in configuration files increases the complexity of parsing and validating configurations, which might make debugging more difficult. -Allowing runtime constructs also makes automated edits more difficult to support. - -**Multiple formats**: There might be some confusion surrounding the two different configuration files. -Most of this can be mitigated by (1) editor tooling, and (2) embedded contexts will likely choose one to support, not both. - -## Alternatives - -**Restrict syntax**: Limit `.config.luau` files to only contain table literals and forbid functions, loops, and other runtime constructs to reduce complexity. -Instead of spawning a new Luau VM to "parse" the file, we could simply spin up a Luau parser. - -**Improve support for `.luaurc` files**: We already provide an autocomplete API for Luau-syntax files and could expose an API that facilitates editing `.luaurc` files. diff --git a/.cursor/rules/luau-rfcs/config-luaurc.md b/.cursor/rules/luau-rfcs/config-luaurc.md deleted file mode 100644 index b321b94b..00000000 --- a/.cursor/rules/luau-rfcs/config-luaurc.md +++ /dev/null @@ -1,68 +0,0 @@ -# Configure analysis via .luaurc - -**Status**: Implemented - -## Summary - -Introduces a way to configure type checker and linter using JSON-like .luaurc files - -## Motivation - -While Luau analysis tools try to provide sensible defaults, it's difficult to establish the rules that work for all code. -For example, some packages may decide that unused variables aren't interesting; other packages may decide that all files should be using strict typechecking mode. - -While it's possible to configure some aspects of analysis behavior using --! comments, it can be cumbersome to replicate this in all files. - -## Design - -To solve this problem, we are going to introduce support for `.luaurc` files for users of command-line Luau tools. -For a given .lua file, Luau will search for .luaurc files starting from the folder that the .lua file is in; all files in the ancestry chain will be parsed and their configuration -applied. When multiple files are used, the file closer to the .lua file overrides the settings. - -.luaurc is a JSON file that can also contain comments and trailing commas. The file can have the following keys: - -- `"languageMode"`: type checking mode, can be one of "nocheck", "nonstrict", "strict" -- `"lint"`: lints to enable; points to an object that maps string literals that correspond to the names of linting rules (see https://luau-lang.org/lint), or `"*"` that means "all rules", to a boolean (to enable/disable the lint) -- `"lintErrors"`: a boolean that controls whether lint issues are reported as errors or warnings (off by default) -- `"typeErrors"`: a boolean that controls whether type issues are reported as errors or warnings (on by default) -- `"globals"`: extra global values; points to an array of strings where each string names a global that the type checker and linter must assume is valid and of type `any` - -Example of a valid .luaurc file: - -```json5 -{ - "languageMode": "nonstrict", - "lint": { "*": true, "LocalUnused": false }, - "lintErrors": true, - "globals": ["expect"] // TestEZ -} -``` - -Note that in absence of a configuration file, we will use default settings: languageMode will be set to nonstrict, a set of lint warnings is going to be enabled by default (this proposal doesn't detail that set - that will be subject to a different proposal), type checking issues are going to be treated as errors, lint issues are going to be treated as warnings. - -## Design -- compatibility - -Today we support .robloxrc files; this proposal will keep parsing legacy specification of configuration for compatibility: - -- Top-level `"language"` key can refer to an object that has `"languageMode"` key that also defines language mode -- Top-level `"lint"` object values can refer to a string `"disabled"`/`"enabled"`/`"fatal"` instead of a boolean as a value. - -These keys are only going to be supported for compatibility and only when the file name is .robloxrc (which is only going to be parsed by internal Roblox command line tools but this proposal mentions it for completeness). - -## Drawbacks - -The introduction of configuration files means that it's now impossible to type check or lint sources in isolation, which complicates the code setup. - -File-based JSON configuration may or may not map cleanly to environments that don't support files, such as Roblox Studio. - -Using JSON5 instead of vanilla JSON limits the interoperability. - -There's no way to force specific lints to be fatal, although this can be solved in the future by promoting the "compatibility" feature where one can specify a string to a non-compatibility feature. - -## Alternatives - -It's possible to consider forcing users to specify the source settings via `--!` comments exclusively. This is problematic as it may require excessive amounts of annotation though, which this proposal aims to simplify. - -The format of the configuration file does not have to be JSON; for example, it can be a valid Luau source file which is the approach luacheck takes. This makes it more difficult to repurpose the .luaurc file to use third-party processing tools though, e.g. a package manager would need to learn how to parse Luau syntax to store configuration in .luaurc. - -It's possible to use the old style of lint rule specification with "enabled"/"fatal"/etc., but it's more verbose and is more difficult to use in common scenarios, such as "all enabled lints are fatal and these are the ones we need to enable in addition to the default set" is impossible to specify. diff --git a/.cursor/rules/luau-rfcs/const-keyword.md b/.cursor/rules/luau-rfcs/const-keyword.md deleted file mode 100644 index 89f93615..00000000 --- a/.cursor/rules/luau-rfcs/const-keyword.md +++ /dev/null @@ -1,152 +0,0 @@ -# Const Keyword - -## Summary - -Introduce a `const` keyword for local variable bindings that prevents reassignment after initialization. A const declaration makes the binding immutable, not the value, so tables and other mutable objects remain mutable through the binding. - -## Motivation - -When introducing the [`export`](https://github.com/luau-lang/rfcs/pull/42) keyword we will need to introduce the concept of `const`-ness to the language. Modules with exports return a frozen table of values; however, the variables used to declare those exports are not themselves immutable. This makes it possible to write code such as the following: - -```luau -export foo = 5 - -export function increment() - foo += 1 -end -``` - -This results in different values for `foo` depending on where it is accessed from: - -```luau --- Inside the module -print(foo) --> 5 -increment() -print(foo) --> 6 - --- Outside the module -print(module.foo) --> 5 -module.increment() -print(module.foo) --> 5 -``` - -To address this, we propose that all exported values are `const` by default, preventing reassignment within the module and ensuring that exported bindings represent stable values. - -However, this is not the only use-case for `const`. A `const` binding provides a clear guarantee that a name will always refer to the same value for the lifetime of its scope. This property is useful beyond module exports: it makes code easier to reason about, avoids accidental rebinding in closures or long-lived scopes, and allows tools and the typechecker to treat such bindings as stable references rather than values that may change over time. Since `export` already requires this guarantee to behave correctly, exposing `const` as a general language feature avoids introducing special-case rules and provides a simple, consistent way to express immutability of bindings where it is desired. - -## Design -### Syntax - -Allow `const` in declarations anywhere `local` is allowed: - -```luau -const x = 5 -const f = function() end -const t = { a = 1 } -``` - -Typed declarations remain valid: - -```luau -const x: number = 5 -const t: { a: number } = { a = 1 } -``` -Multi-assignment is also supported: - -```luau -const a, b = 1, 2 -``` - -A `function` can be declared as `const`: - -```luau -const function f() - -- do something -end -``` - -### Semantics - -A `const` variable is equivalent to a variable declared with `local` however `const` variables cannot be reassigned after they are initialized: - -```luau -const x = 1 -x = 2 -- error -``` - -This includes any assignment form that writes to the binding, such as compound assignment: - -```luau -const x = 1 -x += 1 -- error -``` - -It applies to the variable's binding, not to the value it refers to. If a const variable refers to a mutable value such as a table, that value can still be modified: - -```luau -const t = { count = 0 } -t.count += 1 -- ok (mutating the table) -t = {} -- error (reassigning the binding) -``` - -`const` is not a replacement for `table.freeze` which should be used to prohibit mutation of table contents. The two features address different problems and can be used together: - -```luau -const t = table.freeze({ - count = 0, -}) - -t.count += 1 -- error (mutating a frozen table) -t = {} -- error (reassigning the binding) -``` - -#### Initialization - -A `const` binding must be initialized at the point of declaration: - -``` -const x -- error: const variable must be initialized -``` - -This keeps the feature simple, avoids "definite assignment" rules, and makes the "never reassigned" intent explicit. - -#### Scope and Shadowing - -`const` follows normal lexical scoping rules. Shadowing creates a new binding and is allowed: - -```luau -const x = 1 -do - const x = 2 -- ok: new binding in inner scope -end - -const y = 1 -const y = 2 -- also ok: rebinding as const in same scope -``` - -#### Captures / Up-Values - -If a `const` variable is captured by an inner function, it remains non-reassignable from within that function as well: - -```luau -const x = 1 -const function f() - x = 2 -- error -end -``` - -### Grammar / Parsing - -`const` is a contextual keyword that is only valid in positions where `local` is valid. This makes the introduction fully backwards compatible with existing code. - -## Drawbacks - -- Potential false sense of immutability: developers may misread const as implying deep immutability. This is mitigated by clear documentation and examples, but the risk remains. -- Lua introduced `const` in the form `local foo = 5` which is inconsistent with this syntax. However, we've already decided we won't adopt Lua const syntax, therefore consider this an acceptable change. - -## Alternatives - -- Lint-only "never reassigned" rule: A linter can infer locals that are never reassigned and warn on future changes. This avoids new syntax, but loses the ability to declare intent directly in code (e.g., a new assignment becomes a warning rather than a clear violation of an explicit constraint). -- Deep immutability / freezing: Enforcing immutability of tables (recursively) would address mutation bugs but introduces complexity, runtime overhead, questions around metatables/userdata, and awkward interactions with existing patterns. This is explicitly out of scope for this proposal. -- Annotations instead of a keyword: An attribute-like syntax (comment directive or type-level modifier) could avoid reserving a keyword, but is less readable, less discoverable, and harder to standardize across tooling. -- Do nothing: Continue relying on convention and review. This keeps the language smaller but preserves a common footgun and prevents tooling from enforcing a widely useful invariant. diff --git a/.cursor/rules/luau-rfcs/deprecate-getfenv-setfenv.md b/.cursor/rules/luau-rfcs/deprecate-getfenv-setfenv.md deleted file mode 100644 index 9e80f9c6..00000000 --- a/.cursor/rules/luau-rfcs/deprecate-getfenv-setfenv.md +++ /dev/null @@ -1,38 +0,0 @@ -# Deprecate getfenv/setfenv - -**Status**: Implemented - -## Summary - -Mark getfenv/setfenv as deprecated - -## Motivation - -getfenv and setfenv are problematic for a host of reasons: - -- They allow uncontrolled mutation of global environment, which results in deoptimization; various important performance features -like builtin calls or imports are disabled when these functions are used. -- Because of the uncontrolled mutation code that uses getfenv/setfenv can't be typechecked correctly; in particular, injecting new -globals is going to produce "unknown globals" warnings, and modifying existing globals can trivially violate soundness wrt type -checking -- While these functions can be used for good (once you ignore the issues above), such as custom module systems, statistically speaking -they are mostly used to obfuscate code to hide malicious intent. - -## Design - -We will mark getfenv and setfenv as deprecated. The only consequence of this change is that the linter will start emitting warnings when they are used. - -Removing support for getfenv/setfenv, while tempting, is not planned in the foreseeable future because it will cause significant backwards compatibility issues. - -## Drawbacks - -There are valid uses for getfenv/setfenv, that include extra logging (in Roblox code this manifests as `getfenv(1).script`), monkey patching for mocks in unit tests, and custom -module systems that inject globals into the calling environment. We do have a replacement for logging use cases, `debug.info`, and we do have an officially recommended replacement -for custom module systems, which is to use `require` that doesn't result in issues that fenv modification carries and can be understood by the type checker, we do not have an -alternative for mocks. As such, testing frameworks that implement mocking via setfenv/getfenv will need to use `--!nolint DeprecatedGlobal` to avoid this warning. - -## Alternatives - -Besides the obvious alternative "do nothing", we could also consider implementing Lua 5.2 support for _ENV. However, since we do not have a way to load script files other than -via `require` that doesn't support _ENV, and `loadstring` is supported but discouraged, we do not currently plan to implement `_ENV` although it's possible that this will happen -in the future. diff --git a/.cursor/rules/luau-rfcs/deprecate-table-getn-foreach.md b/.cursor/rules/luau-rfcs/deprecate-table-getn-foreach.md deleted file mode 100644 index ea8e1e6b..00000000 --- a/.cursor/rules/luau-rfcs/deprecate-table-getn-foreach.md +++ /dev/null @@ -1,31 +0,0 @@ -# Deprecate table.getn/foreach/foreachi - -**Status**: Implemented - -## Summary - -Mark table.getn/foreach/foreachi as deprecated - -## Motivation - -`table.getn`, `table.foreach` and `table.foreachi` were deprecated in Lua 5.1 that Luau is based on, and removed in Lua 5.2. - -`table.getn(x)` is equivalent to `rawlen(x)` when `x` is a table; when `x` is not a table, `table.getn` produces an error. It's difficult to imagine code where `table.getn(x)` is better than either `#x` (idiomatic) or `rawlen(x)` (fully compatible replacement). However, `table.getn` is slower and provides yet another way to perform an operation, leading new users of the language to use it unknowingly. - -`table.foreach` is equivalent to a `for .. pairs` loop; `table.foreachi` is equivalent to a `for .. ipairs` loop; both may also be replaced by generalized iteration. Both functions are significantly slower than equivalent `for` loop replacements, are more restrictive because the function can't yield, and result in new users (particularly coming from JS background) unknowingly using these thus producing non-idiomatic non-performant code. - -In both cases, the functions bring no value over other library or language alternatives, and thus just serve as a distraction. - -## Design - -We will mark all three functions as deprecated. The only consequence of this change is that the linter will start emitting warnings when they are used. - -Removing support for these functions doesn't provide any measurable value and as such is not planned in the foreseeable future because it may cause backwards compatibility issues. - -## Drawbacks - -None - -## Alternatives - -If we consider table.getn/etc as supported, we'd want to start optimizing their usage which gets particularly tricky with foreach and requires more compiler machinery than this is probably worth. diff --git a/.cursor/rules/luau-rfcs/disallow-proposals-leading-to-ambiguity-in-grammar.md b/.cursor/rules/luau-rfcs/disallow-proposals-leading-to-ambiguity-in-grammar.md deleted file mode 100644 index 3dd52cd5..00000000 --- a/.cursor/rules/luau-rfcs/disallow-proposals-leading-to-ambiguity-in-grammar.md +++ /dev/null @@ -1,129 +0,0 @@ -# Disallow `name T` and `name(T)` in future syntactic extensions for type annotations - -## Summary - -We propose to disallow the syntax `` `('`` as well as ` ` in future syntax extensions for type annotations to ensure that all existing programs continue to parse correctly. This still keeps the door open for future syntax extensions of different forms such as `` `<' `>'``. - -## Motivation - -Lua and by extension Luau's syntax is very free form, which means that when the parser finishes parsing a node, it doesn't try to look for a semi-colon or any termination token e.g. a `{` to start a block, or `;` to end a statement, or a newline, etc. It just immediately invokes the next parser to figure out how to parse the next node based on the remainder's starting token. - -That feature is sometimes quite troublesome when we want to add new syntax. - -We have had cases where we talked about using syntax like `setmetatable(T, MT)` and `keyof T`. They all look innocent, but when you look beyond that, and try to apply it onto Luau's grammar, things break down really fast. - -### `F(T)`? - -An example that _will_ cause a change in semantics: - -```luau -local t: F -(u):m() -``` - -where today, `local t: F` is one statement, and `(u):m()` is another. If we had the syntax for `F(T)` here, it becomes invalid input because it gets parsed as - -```luau -local t: F(u) -:m() -``` - -This is important because of the `setmetatable(T, MT)` case: - -```luau -type Foo = setmetatable({ x: number }, { ... }) -``` - -For `setmetatable`, the parser isn't sure whether `{}` is actually a type or an expression, because _today_ `setmetatable` is parsed as a type reference, and `({}, {})` is the remainder that we'll attempt to parse as a statement. This means `{ x: number }` is invalid table _literal_. Recovery by backtracking is technically possible here, but this means performance loss on invalid input + may introduce false positives wrt how things are parsed. We'd much rather take a very strict stance about how things get parsed. - -### `F T`? - -An example that _will_ cause a change in semantics: - -```luau -local function f(t): F T - (t or u):m() -end -``` - -where today, the return type annotation `F T` is simply parsed as just `F`, followed by a ambiguous parse error from the statement `T(t or u)` because its `(` is on the next line. If at some point in the future we were to allow `T` followed by `(` on the next line, then there's yet another semantic change. `F T` could be parsed as a type annotation and the first statement is `(t or u):m()` instead of `F` followed by `T(t or u):m()`. - -For `keyof`, here's a practical example of the above issue: - -```luau -type Vec2 = {x: number, y: number} - -local function f(t, u): keyof Vec2 - (t or u):m() -end -``` - -There's three possible outcomes: - 1. Return type of `f` is `keyof`, statement throws a parse error because `(` is on the next line after `Vec2`, - 2. Return type of `f` is `keyof Vec2` and next statement is `(t or u):m()`, or - 3. Return type of `f` is `keyof` and next statement is `Vec2(t or u):m()` (if we allow `(` on the next line to be part of previous line). - -This particular case is even worse when we keep going: - -```luau -local function f(t): F - T(t or u):m() -end -``` - -```luau -local function f(t): F T - {1, 2, 3} -end -``` - -where today, `F` is the return type annotation of `f`, and `T(t or u):m()`/`T{1, 2, 3}` is the first statement, respectively. - -Adding some syntax for `F T` **will** cause the parser to change the semantics of the above three examples. - -### But what about `typeof(...)`? - -This syntax is grandfathered in because the parser supported `typeof(...)` before we stabilized our syntax, and especially before type annotations were released to the public, so we didn't need to worry about compatibility here. We are very glad that we used parentheses in this case, because it's natural for expressions to belong within parentheses `()`, and types to belong within angles `<>`. - -## The One Exception with a caveat - -This is a strict requirement! - -`function() -> ()` has been talked about in the past, and this one is different despite falling under the same category as `` `('``. The token `function` is in actual fact a "hard keyword," meaning that it cannot be parsed as a type annotation because it is not an identifier, just a keyword. - -Likewise, we also have talked about adding standalone `function` as a type annotation (semantics of it is irrelevant for this RFC) - -It's possible that we may end up adding both, but the requirements are as such: - 1. `function() -> ()` must be added first before standalone `function`, OR - 2. `function` can be added first, but with a future-proofing parse error if `<` or `(` follows after it - -If #1 is what ends up happening, there's not much to worry about because the type annotation parser will parse greedily already, so any new valid input will remain valid and have same semantics, except it also allows omitting of `(` and `<`. - -If #2 is what ends up happening, there could be a problem if we didn't future-proof against `<` and `(` to follow `function`: - -```luau - return f :: function(T) -> U -``` - -which would be a parse error because at the point of `(` we expect one of `until`, `end`, or `EOF`, and - -```luau - return f :: function(a) -> a -``` - -which would also be a parse error by the time we reach `->`, that is the production of the above is semantically equivalent to `(f < a) > (a)` which would compare whether the value of `f` is less than the value of `a`, then whether the result of that value is greater than `a`. - -## Alternatives - -Only allow these syntax when used inside parentheses e.g. `(F T)` or `(F(T))`. This makes it inconsistent with the existing `typeof(...)` type annotation, and changing that over is also breaking change. - -Support backtracking in the parser, so if `: MyType(t or u):m()` is invalid syntax, revert and parse `MyType` as a type, and `(t or u):m()` as an expression statement. Even so, this option is terrible for: - 1. parsing performance (backtracking means losing progress on invalid input), - 2. user experience (why was this annotation parsed as `X(...)` instead of `X` followed by a statement `(...)`), - 3. has false positives (`foo(bar)(baz)` may be parsed as `foo(bar)` as the type annotation and `(baz)` is the remainder to parse) - -## Drawbacks - -To be able to expose some kind of type-level operations using `F` syntax, means one of the following must be chosen: - 1. introduce the concept of "magic type functions" into type inference, or - 2. introduce them into the prelude as `export type F = ...` (where `...` is to be read as "we haven't decided") diff --git a/.cursor/rules/luau-rfcs/explicit-type-parameter-instantiation.md b/.cursor/rules/luau-rfcs/explicit-type-parameter-instantiation.md deleted file mode 100644 index 3c07fd60..00000000 --- a/.cursor/rules/luau-rfcs/explicit-type-parameter-instantiation.md +++ /dev/null @@ -1,208 +0,0 @@ -# Explicit type parameter instantiation - -**Status**: Implemented - -## Summary - -We will add support for the ability to bind a function defined with generics to specific types at the time of expression. This behavior is analagous to C++'s `f` and Rust's `f::`, where `f` is defined as a function accepting a type parameter `T`. - -## Motivation - -There are several cases where Luau either makes it overly difficult to declare a type in a function call or overly verbose. For example, let's consider something akin to React's bindings: - -```lua -local function createBinding(value: T): React.Binding - -- code -end -``` - -If we wanted a binding to a number, then Luau can trivially infer this type: - -```lua --- 1999 is a number, so moneyBinding is React.Binding -local moneyBinding = React.createBinding(1999) -``` - -In other cases, the type is more complex. For example, if we want money to be `number?`, then we cannot simply pass in `nil`, as that will infer as `React.Binding`. Furthermore, while there are theoretically cases like these where Luau can expand out a `nil` into `number?`, it is still beneficial to want this to be restricted at the type to prevent confusing debugging or potential for the type to infer wider than intended. - -There are two ways to do this. One is to declare the type of `moneyBinding` itself to `React.Binding`. This would look like... - -```lua -local moneyBinding: React.Binding = React.createBinding(nil) -``` - -This is not only quite verbose, but requires that the user know the exact type of the return value of `React.createBinding`, *and* requires that it really be as trivial as just passing in the types. For example, `React.Binding` could be an even more complex type that asks for some sort of initial state type, or setter type, and so on. In other cases, it might even be defined as an inline table, or as a non-exported type. - -The other alternative is something like: - -```lua -local moneyBinding = React.createBinding(nil :: number?) -``` - -However, `::` has the ability to cast things in unsound manners. Both these calls are accepted with `::` when we would not want it in this case: - -```lua -local function f(x: number?) - React.createBinding(x :: number) -- Allowed -end - -type Object = { a: number } -React.createBinding({} :: Object) -- Allowed -``` - -So while it would work in some cases, it provides an extra bit of uncertainty to the correctness of the call. - -In other cases, type parameters are used in places where there is no immediate value binding to that type. For example, a Signal type might be defined as: - -```lua -type Signal = { - fire: (Args...) -> (), - connect: ((Args...) -> ()) -> (), -} - -local function createSignal(): Signal -``` - -The usual local assignment bindings work fine here: - -```lua -local playerTookDamageSignal: Signal = createSignal() -``` - -...but only if this binding is actually declared through a local. In a case like: - -```lua -Signals.playerTookDamageSignal = createSignal() -``` - -...we either have to put this out into another variable above, which increases surface area, or use `::`, which has the problems described previously. This is not a problem specific to function calls, but is one of the places where they would be useful. - -## Design - -We propose allowing the following: - -```lua --- Saving `f<>` as a variable to called later -local a = f<> - --- Parameterized function call as statement -f<>() - --- Parameterized function call as expression -local b = f<>() - --- Calling through index -local c = t.f<>() -local d = t:f<>() -local e = t["f"]<>() -``` - -For parsing, we will do this by extending `var` to allow `prefixexp '<<' TypeList '>>'`. This will bind the prefixexp equivalent to the substitution of the type parameters. That is to say... - -```lua -local function f() end - --- Binds `T` and `U` to `number` and `string` -local f1 = f<> - --- Binds just `T` to number. The unspecified `U` type is anonymous in the same way it would be if this were just `f`. -local f2 = f<> -``` - -When this new syntax is used on a value that is not a function, or does not take those types, a static-time error will be given. This syntax has zero runtime effect. - -### Interoperability with metatables - -There are three problems that arise when attempting to instantiate a table with a metatable attached, namely: - -1. The forall quantifier is nested under the metamethod for that table's metatable, giving three levels of indirection. -2. It's unclear what metamethod to instantiate without a way to disambiguate, since a metatable can have multiple polymorphic metamethods. -3. If the `__metatable` field is present, `getmetatable` will throw an error, making it unsafe to work around this with `getmetatable(t).__call<>`. - -Hence, we must produce a type error if the term is not a function type of the correct kind, full stop. - -If it was supported, explicit type instantiation through the metatable would require disambiguation using the surrounding syntactic context. That is, `t<>.x` instantiates the `__index` metamethod, or `t<>(...)` instantiates the `__call` metamethod, and so forth. The tradeoff there is that the type inference engine will now have an extra `std::optional` parameter that is only used when checking an expression of the form `e<>`. - -This trivial (and contrived) example shows what it would look like in practice, and generalization to more complex cases is straightforward, but would obscure the core point. - -```luau -type T = setmetatable<{ x: number, y: string }, { - __index: (T, K) -> rawget, - __call: (T, K, rawget) -> rawget -}> - -local function f(t: T) - local x = t<<"x">>.x -- instantiates `__index` with `K = "x"`. - local y = t<<"y">>("x", "hello!") -- instantiates `__call` with `K = "y"` (and a type error `"x" >(c) -``` - -This is either a parameterized function call of `f(c)` with `a` and `b` as types, or a return of two values--`f << a`, and `b >> (c)`. - -Because there would be no ability to add bitwise shifts to the language, it is unlikely that any bitwise operators would be added, as it would be a stark omission. - -With that said, the ability to perform these kinds of shifts is already available through the `bit32` library, and [Luau's compatibility page](https://luau.org/compatibility#lua-53) has the following words on the topic in reference to their availability in Lua 5.3: - -> If integers are taken out of the equation, bitwise operators make less sense, as integers aren’t a first class feature; additionally, bit32 library is more fully featured (includes commonly used operations such as rotates and arithmetic shift; bit extraction/replacement is also more readable). Adding operators along with metamethods for all of them increases complexity, which means this feature isn’t worth it on the balance. - -The syntax is also unfamiliar not just in the context of Luau but in the context of programming languages in general--`<<` and `>>` as type parameter specification is completely unique to this call alone. - -## Alternatives - -### Syntax - -First, what we absolutely cannot pick: - -- `f()` is the choice of C++, but is ambiguous with `f(c)` in the same way we mentioned with bitwise operators above. C++ only disambiguates this with an extra pass using type information that would dramatically inflate the complexity of all Luau parsers. -- `f::()`, named the "turbofish", is the choice of Rust. This is not strictly ambiguous, but it would require infinite lookahead as it conflicts with casting generic functions. In `local x = f::(() -> T) -> ()`, which is valid code today, we cannot know this is a type assignment until we get to the first `)`, as until that point we might have code that looks like `local x = f::((x))`. This is not a cost we would like to add to the parser. - -For unambiguous alternatives, `f.` and `f:` are among the most discussed. This would look like: - -```lua -local moneyBinding = React.createBinding.() - --- or... -local moneyBinding = React.createBinding:() -``` - -The downside of these is that they blur the lines between runtime and static, in the sense that `React.createBinding.` starts out as a runtime concept, followed by the purely static ``. As for `:`, it carries the baggage of `x:y()` carrying the interesting behavior of adding `self` to the call, which it does not do here. - -There is also not necessarily a reason that we have to provide symmetrical operators, so something like `f!T, U()` is reasonably parseable, but is not obviously better and is even more unlike any other language's syntax. - -Ultimately, this RFC chooses `<>` as a least worst option that is fluid to type, easy to read, and easy to remember. - -### Limiting to function calls, instead of expressions - -This is allowed at the expression level as it allows for the obvious use of `f<>()`, but with the ability to be more expressive and pass it into places like: - -```lua -local function f( - a: (A) -> (), - b: (B) -> (), - c: (C) -> () -) end - -f(f1, f2<>, f3) -``` - -The equivalent syntax is allowed in both C++ and Rust, but it is a rare use case that could add significant complexity. In most cases, keeping it to function calls will work just fine. - -### Not doing it - -As always, we can not do this. It is worth noting that in the original generic functions RFC, parameterized function calls are explicitly omitted in a [section entitled "Turbofish", linked here](https://rfcs.luau.org/generic-functions.html#turbofish). - -Relevant to our purposes is the following section: - -> Some languages don’t have a way to specify the types at call site either, Swift being a prominent example. Thus it’s not a given we need this feature in Luau. - -This is still the case for Swift at time of writing. - diff --git a/.cursor/rules/luau-rfcs/function-bit32-byteswap.md b/.cursor/rules/luau-rfcs/function-bit32-byteswap.md deleted file mode 100644 index 958bb38a..00000000 --- a/.cursor/rules/luau-rfcs/function-bit32-byteswap.md +++ /dev/null @@ -1,48 +0,0 @@ -# bit32.byteswap - -**Status**: Implemented - -## Summary - -Add `bit32.byteswap` to swap the endianness of a 32-bit integer. - -## Motivation - -The endianness of an integer is generally invisible to Luau users. Numbers are treated as expected regardless of their underlying representation, as is standard across programming languages. However, in some file formats and algorithms, the endianness of an integer is important, so it becomes necessary to swap the order of bytes of an integer to 'pretend' that it is one endian or the other. - -While the endianness of numbers can be swapped through a few methods, it is cumbersome. Modern CPUs have instructions dedicated to this (`bswap` on x86-64, `rev` on aarch64) but in Luau, the current best method is to manually shift bytes around and OR them together. For 32-bit integers, this becomes a total of 7 calls: - -```luau -bit32.bor( - bit32.lshift(n, 24), - bit32.band(bit32.lshift(n, 8), 0xFF0000), - bit32.band(bit32.rshift(n, 8), 0xFF00), - bit32.rshift(n, 24), -) -``` - -Along with being inefficient, it is also difficult read this code and remember it. It took the author of this RFC several tries to write the above example correctly. - -## Design - -The `bit32` library will gain a new function: `bit32.byteswap`: - -```luau -bit32.byteswap(n: number): number -``` - -`byteswap` will take the bytes of a number and swap their endianness. To be exact, for an integer `0xA1B2_C3D4`, it will return `0xD4C3_B2A1`. - -## Drawbacks - -There is a reasonable expectation that `bit32` functions recieve built-in implementations to improve their performance. This is even more true with native codegen. As this functionality is relatively niche, it may not be worth including it for that reason alone because it would occupy a built-in function slot in the VM. - -However even without a built-in call, an initial implementation was still significantly faster than the alternative presented above. So, the only drawback known is in the marginal increase to the overall VM complexity, which is not considered to be a serious drawback. - -## Alternatives - -A function to simply convert an integer to little-endian was considered, but was rejected due to a basic logic: it is impossible to know whether a given integer is in little-endian so the function may as well be a generic swapping function. Naming such a function is also potentially complex without being verbose (`bit32.tole` is a bad name, but `bit32.tolittleendian` is too long). - -Simply using the existing `bit32` functions as presented at the beginning of the RFC is not unworkably slow, so it is a viable alternative for a niche use case like this. However, as noted before it is complicated to visually parse. - -It may be more reasonable to identify and implement use cases for this function rather than the function itself. However, this is not sustainable: it is doubtful anyone wishes to include support for MD5 hashing natively, as an example. diff --git a/.cursor/rules/luau-rfcs/function-bit32-countlz-countrz.md b/.cursor/rules/luau-rfcs/function-bit32-countlz-countrz.md deleted file mode 100644 index 9e17f82a..00000000 --- a/.cursor/rules/luau-rfcs/function-bit32-countlz-countrz.md +++ /dev/null @@ -1,52 +0,0 @@ -# bit32.countlz/countrz - -**Status**: Implemented - -## Summary - -Add bit32.countlz (count left zeroes) and bit32.countrz (count right zeroes) to accelerate bit scanning - -## Motivation - -All CPUs have instructions to determine the position of first/last set bit in an integer. These instructions have a variety of uses, the popular ones being: - -- Fast implementation of integer logarithm (essentially allowing to compute `floor(log2(value))` quickly) -- Scanning set bits in an integer, which allows efficient traversal of compact representation of bitmaps -- Allocating bits out of a bitmap quickly - -Today it's possible to approximate `countlz` using `floor` and `log` but this approximation is relatively slow; approximating `countrz` is difficult without iterating through each bit. - -## Design - -`bit32` library will gain two new functions, `countlz` and `countrz`: - -```luau -function bit32.countlz(n: number): number -function bit32.countrz(n: number): number -``` - -`countlz` takes an integer number (converting the input number to a 32-bit unsigned integer as all other `bit32` functions do), and returns the number of consecutive left-most zero bits - that is, the number of most significant zero bits in a 32-bit number until the first 1. The result is in `[0, 32]` range. - -For example, when the input number is `0`, it's `32`. When the input number is `2^k`, the result is `31-k`. - -`countrz` takes an integer number (converting the input number to a 32-bit unsigned integer as all other `bit32` functions do), and returns the number of consecutive right-most zero bits - that is, -the number of least significant zero bits in a 32-bit number until the first 1. The result is in `[0, 32]` range. - -For example, when the input number is `0`, it's `32`. When the input number is `2^k`, the result is `k`. - -> Non-normative: a proof of concept implementation shows that a polyfill for `countlz` takes ~34 ns per loop iteration when computing `countlz` for an increasing number sequence, whereas -> a builtin implementation takes ~4 ns. - -## Drawbacks - -None known. - -## Alternatives - -These functions can be alternatively specified as "find the position of the most/least significant bit set" (e.g. "ffs"/"fls" for "find first set"/"find last set"). This formulation -can be more immediately useful since the bit position is usually more important than the number of bits. However, the bit position is undefined when the input number is zero, -returning a sentinel such as -1 seems non-idiomatic, and returning `nil` seems awkward for calling code. Counting functions don't have this problem. - -An early version of this proposal suggested `clz`/`ctz` (leading/trailing) as names; however, using a full verb is more consistent with other operations like shift/rotate, and left/right may be easier to understand intuitively compared to leading/trailing. left/right are used by C++20. - -Of the two functions, `countlz` is vastly more useful than `countrz`; we could implement just `countlz`, but having both is nice for symmetry. diff --git a/.cursor/rules/luau-rfcs/function-buffer-bits.md b/.cursor/rules/luau-rfcs/function-buffer-bits.md deleted file mode 100644 index 4a7c33ab..00000000 --- a/.cursor/rules/luau-rfcs/function-buffer-bits.md +++ /dev/null @@ -1,62 +0,0 @@ -# buffer.readbits/writebits - -**Status**: Implemented - -## Summary - -Add `buffer.readbits` and `buffer.writebits` to give developers an easy way to work with bit buffers. - -## Motivation - -With the release of the buffer type, many developers have asked for a way to write integers of custom non-standard widths and just general bit access, based on previous experience with bit buffer libraries. - -While bit operations can be implemented manually, it requires careful bit manipulation, especially when partial byte writes are required or when reading bits is performed sequentially across bytes without a rigid 'bitfield' offset definition. - -## Design - -`buffer` library will gain two new functions, `readbits` and `writebits`: - -``` -buffer.readbits(b: buffer, bitOffset: number, bitCount: number): number -buffer.writebits(b: buffer, bitOffset: number, bitCount: number, value: number): () -``` - -`bitCount` is an integer in range [0, 32]. Error is thrown if number is not in range. - -0 bit width is supported only to not error in generalized cases where bit count is dynamic. Reading 0 bits returns 0 and writing has no effect. - -Similar to other numerical buffer read/write functions, if `bitOffset` and `bitCount` cause a bit access outside the bounds of the buffer, an error is thrown. - -In `writebits`, `value` is treated as an unsigned 32 bit number. Only `bitCount` least significant bits are written. - -In `readbits`, return value is unsigned. - ---- - -Operations are always preformed in little-endian byte order and starting from least significant bits. - -This means that: - -```lua -buffer.readbits(b, 0, 8) == buffer.readu8(b, 0) -buffer.readbits(b, 0, 16) == buffer.readu16(b, 0) -buffer.readbits(b, 0, 32) == buffer.readu32(b, 0) - -buffer.writebits(b, 0, 1, 1) -buffer.readi8(b, 0) == 1 - -buffer.writebits(b, 1, 1, 1) -buffer.readi8(b, 0) == 3 -``` - -> Only a library function implementation is suggested for implementation, the complexity of the operation of a prototype implementation is unlikely to benefit from a fastcall. - -## Drawbacks - -Because of the bounds checking requirements, implementation needs a loop to access the buffer bytes, which is potentially slower than what developers can do with existing functions when they know that it's safe to read a larger number and extract bits with bit32 functions. - -Because the max size of the buffer is 1GB, `bitOffset` cannot be handled as a 32-bit integer number like byte offset in other buffer functions. - -## Alternatives - -A signed version of `readbits` is not proposed to simplify the design. Writing and reading signed values can be performed with a bias. diff --git a/.cursor/rules/luau-rfcs/function-coroutine-close.md b/.cursor/rules/luau-rfcs/function-coroutine-close.md deleted file mode 100644 index b9ffbf6f..00000000 --- a/.cursor/rules/luau-rfcs/function-coroutine-close.md +++ /dev/null @@ -1,36 +0,0 @@ -# coroutine.close - -**Status**: Implemented - -## Summary - -Add `coroutine.close` function from Lua 5.4 that takes a suspended coroutine and makes it "dead" (non-runnable). - -## Motivation - -When implementing various higher level objects on top of coroutines, such as promises, it can be useful to cancel the coroutine execution externally - when the caller is not -interested in getting the results anymore, execution can be aborted. Since coroutines don't provide a way to do that externally, this requires the framework to implement -cancellation on top of coroutines by keeping extra status/token and checking that token in all places where the coroutine is resumed. - -Since coroutine execution can be aborted with an error at any point, coroutines already implement support for "dead" status. If it were possible to externally transition a coroutine -to that status, it would be easier to implement cancellable promises on top of coroutines. - -## Design - -We implement Lua 5.4 behavior exactly with the exception of to-be-closed variables that we don't support. Quoting Lua 5.4 manual: - -> coroutine.close (co) -> Closes coroutine co, that is, puts the coroutine in a dead state. The given coroutine must be dead or suspended. In case of error (either the original error that stopped the coroutine or errors in closing methods), returns false plus the error object; otherwise returns true. - -The `co` argument must be a coroutine object (of type `thread`). - -After closing the coroutine, it gets transitioned to dead state which means that `coroutine.status` will return `"dead"` and attempts to resume the coroutine will fail. In addition, the coroutine stack (which can be accessed via `debug.traceback` or `debug.info`) will become empty. Calling `coroutine.close` on a closed coroutine will return `true` - after closing, the coroutine transitions into a "dead" state with no error information. - -## Drawbacks - -None known, as this function doesn't introduce any existing states to coroutines, and is similar to running the coroutine to completion/error. - -## Alternatives - -Lua's name for this function is likely in part motivated by to-be-closed variables that we don't support. As such, a more appropriate name could be `coroutine.cancel` which also -aligns with use cases better. However, since the semantics is otherwise the same, using the same name as Lua 5.4 reduces library fragmentation. diff --git a/.cursor/rules/luau-rfcs/function-debug-info.md b/.cursor/rules/luau-rfcs/function-debug-info.md deleted file mode 100644 index 396739aa..00000000 --- a/.cursor/rules/luau-rfcs/function-debug-info.md +++ /dev/null @@ -1,109 +0,0 @@ -# debug.info - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Add `debug.info` as programmatic debug info access API, similarly to Lua's `debug.getinfo` - -## Motivation - -Today Luau provides only one method to get the callstack, `debug.traceback`. This method traverses the entire stack and returns a string containing the call stack details - with no guarantees about the format of the call stack. As a result, the string doesn't present a formal API and can't be parsed programmatically. - -There are a few cases where this can be inconvenient: - -- Sometimes it is useful to pass the resulting call stack to some system expecting a structured input, e.g. for crash aggregation -- Sometimes it is useful to use the information about the caller for logging or filtering purposes; in these cases using just the script name can be useful, and getting script name out of the traceback is slow and imprecise - -Additionally, in some cases instead of getting the information (such as script or function name) from the callstack, it can be useful to get it from a function object for diagnostic purposes. For example, maybe you want to call a callback and if it doesn't return expected results, display a user-friendly error message that contains the function name & script location - these aren't possible today at all. - -## Design - -The proposal is to expose a function from Lua standard library, `debug.getinfo`, to fix this problem - but change the function's signature for efficiency: - -> debug.info([thread], [function | level], options) -> any... - -(note that the function has been renamed to make it more obvious that the behavior differs from that of Lua) - -The parameters of the function match that of Lua's variant - the first argument is either a function object or a stack level (which is a number starting from 1, where 1 means "my caller"), or a thread (followed by the stack level), followed by a string that contains a list of things the result needs to contain: - - * s - function source identifier, in Roblox environment this is equal to the full name of the script the function is defined in - * l - line number that the function is defined on (when examining a function) or line number of the stack frame (when examining a stack frame) - * n - function name if present; this can be absent for anonymous functions or some C functions that don't have an assigned debug name - * a - function arity information, which refers to the parameter count and whether the function is variadic or not - * f - function object - -Unlike Lua version, which would use the options given to fill a resulting table (e.g. "l" would map to a "currentline" and "linedefined" fields of the output table), our version will return the requested information in the order that it was requested in in the string - all letters specified above map to one extra returned value, "a" maps to a pair of a parameter number and a boolean indicating variadic status. - -For example, here's how you implement a stack trace function: - -```luau - for i=1,100 do -- limit at 100 entries for very deep stacks - local source, name, line = debug.info(i, "snl") - if not source then break end - if line >= 0 then - print(string.format("%s(%d): %s", source, line, name or "anonymous")) - else - print(string.format("%s: %s", source, name or "anonymous")) - end - end -``` - -output: - -``` - cs.lua(3): stacktrace - cs.lua(17): bar - cs.lua(13): foo - [C]: pcall - cs.lua(20): anonymous -``` - -When the first argument is a number and the input level is out of bounds, the function returns no values. - -### Why the difference from Lua? - -Lua's variant of this function has the same string as an input and the same thread/function/level combo as arguments before that, but returns a table with the requested data - or nil, when stack is exhausted. - -The problem with this solution is performance. It results in generating excessive garbage by wrapping results in a table, which slows down the function call itself and generates extra garbage that needs to be collected later. This is not a problem for error handling scenarios, but can be an issue when logging is required; for example, `debug.info` with options containing a single result, "s" (mapping to source identifier aka script name), runs 3-4x slower when using a table variant with the current implementation of both functions in our VM. - -While the difference in behavior is unfortunate, note that Lua has a long-standing precedent of using characters in strings to define the set of inputs or outputs for functions; of particular note is string.unpack which closely tracks this proposal where input string characters tell the implementation what data to return. - -### Why not hardcode the options? - -One possibility is that we could return all data associated with the function or a stack frame as a tuple. - -This would work but has issues: - -1. Because of the tuple-like API, the code becomes more error prone and less self-descriptive. -2. Some data is more expensive to access than other data - by forcing all callers to process all possible data we regress in performance; this is also why the original Lua API has an options string - -To make sure we appropriately address 1, unlike Lua API in our API options string is mandatory to specify. - -### Sandboxing risk? - -Compared to information that you can already parse from traceback, the only extra data we expose is the function object. This is valuable when collecting stacks because retrieving the function object is faster than retrieving the associated source/name data - for example a very performant stack tracing implementation could collect data using "fl" (function and line number), and later when it comes the time to display the results, use `debug.info` again with "sn" to get script & name data from the object. - -This technically wasn't possible to get before - this means in particular that if your function is ever called by another function, a malicious script could grab that function object again and call it with different arguments. However given that it's already possible to mutate global environment of any function on the callstack using getfenv/setfenv, the extra risk presented here seems minimal. - -### Options delta from Lua - -Lua presents the following options in getinfo: - -* `n´ selects fields name and namewhat -* `f´ selects field func -* `S´ selects fields source, short_src, what, and linedefined -* `l´ selects field currentline -* `u´ selects field nup - -We chose to omit `namewhat` as it's not meaningful in our implementation, omit `what` as it's redundant wrt source/short_src for C functions, replace source/short_src with only a single option (`s`) to avoid leaking script source via callstack API, remove `u` because there are no use cases for knowing the number of upvalues without debug.getupvalue API, and add `a` which has been requested by Roact team before for complex backwards compatibility workarounds wrt passed callbacks. - -## Drawbacks - -Having a different way to query debug information from Lua requires language-specific dispatch for code that wants to work on Lua and Luau. - -## Alternatives - -We could expose `debug.getinfo` from Lua as is; the problem is that in addition to performance issues highlighted above, Luau implementation doesn't track the same data and as such can't provide a fully compatible implementation short of implementing a shim for the sake of compatibility - an option this proposal keeps open. diff --git a/.cursor/rules/luau-rfcs/function-inlining.md b/.cursor/rules/luau-rfcs/function-inlining.md deleted file mode 100644 index 54f52f95..00000000 --- a/.cursor/rules/luau-rfcs/function-inlining.md +++ /dev/null @@ -1,91 +0,0 @@ -# No support for user inlining (yet) - -## Summary -Luau's bytecode compiler is smart about inlining functions. We would rather focus on improving this automation than risk the chance of its misuse. - -## Motivation - -Whether the goal is to improve instruction locality or perform context specific optimizations, function inlining can be a great resource for developers. At `-02` or higher, the compiler is able to automatically decide if functions ought to be inlined. In the currrent state of the language, inlining can only be guaranteed in Luau that is specially crafted to be inlinable, and we demonstrate why below. We argue that exposing this to users could do more harm than good. - -```luau -local function sum(lst: {number}) - return sumAcc(0, 1, lst) -end - -@inline -local function sumAcc(acc: number, i: number, lst: {number}) - return if i > #lst then acc else sumAcc(acc + lst[i], i + 1, lst) -end - -local s = sum({1, 2, 3}) -``` - -Consider this "inlined" recursive call. Inlining a recursive function would mean either the bytecode size is infinite, or the generated code is effectively the same as a loop a la tail call optimization. - -This section further explores common developer patterns that may adopt `@inline` in ways the compiler cannot handle. - -1. Exported a `table` -```luau --- A.luau -local mod = {} - -@inline -function mod.foo(t) - print(t.foo) -end - -return mod -- no table.freeze - --- B.luau -local A = require("./A") - -local mod = {} - -function mod.foo() - A.foo(mod) -end - -return table.freeze(mod) -``` - -This example exports a mutable table `mod` in module `A`. Module `B` imports this table and calls it within another function, but because the compiler tries to decide what implementation of this method should be called at runtime through the metatables, it is unable to guarantee that `A.foo()` has not been mutated somewhere between the boundaries of both modules making `mod.foo` not suitable for an inline. Even with a frozen table being exported by module `B`, its function foo could also be mutated before its return leading us back to the same issue. - -2. "OOP" code -```luau -local Account = {} -Account.__index = Account - -function Account.new(name) - return setmetatable({ name = name, balance = 0 }, Account) -end - -@inline -function Account:deposit(bal) - self.balance += bal -end -``` - -With Object Oriented Programming style code, this mutable resolution problem persists. In this code sample, we define a base `Account` class with a deposit method. However, if an instance of this object were made, say `DavesAccount`, it could go on to overload the deposit method making this another case not suitable for inlining. - - -3. Metamethods -```luau -local Vec3 = {} -Vec3.__index = Vec3 - -function Vec3.new(x, y, z) - return setmetatable({ x = x, y = y, z = z }, Vec3) -end - -@inline -function Vec3:__add(rhs) - return Vec3.new(self.x + rhs.x, self.y + rhs.y, self.z + rhs.z) -end -``` -In this example, we declare `Vec3` with an inlined `__add` (`+`) operator overload. To make this inlining work, we would need to be able to statically link the `+` to the `__add` metamethod. However, dynamic dispatch means we cannot make this guarantee, making this case not a candidate for inlining. - -## Drawbacks -The major drawback here is that this prevents developers the opportunity to fine-tune performance-critical optimizations, forcing them to rely on the compiler for fine-grained optimizations, even if their use case may call for it. Doing this assures us that developers have no control over raising the maximum cost of Luau programs, especially in the case where developers would chose to riddle their code base with inlines to make the code "faster". - -## Alternatives -Automatic function inlining in Luau is already very efficient. We suggest opening Github issues with code samples of legitimate cases that we can use to further improve the compiler's automatic (function inlining and unrolling) optimizations. [File a Github issue](https://github.com/luau-lang/luau/issues/new?assignees=&labels=bug&projects=&template=bug_report.md&title=Inlining%20Support) \ No newline at end of file diff --git a/.cursor/rules/luau-rfcs/function-math-lerp.md b/.cursor/rules/luau-rfcs/function-math-lerp.md deleted file mode 100644 index 749d3e45..00000000 --- a/.cursor/rules/luau-rfcs/function-math-lerp.md +++ /dev/null @@ -1,106 +0,0 @@ -# math.lerp - -**Status**: Implemented - -## Summary - -Add a `lerp` function to the `math` library, which performs linear interpolation between two numbers. - -## Motivation - -Linear interpolation is a very common operation in game development. It is present in standard libraries of some general purpose languages (C++, C#, Zig) and all shading languages (HLSL, GLSL, Slang). It can be used for implementing object motion, GUI sliders, color transitions, gameplay logic, etc. - -Implementation of linear interpolation seems straightforward, but not all implementations have various numerical properties that can be important in practice. As such, a naive manual implementation may lead to unintended results. -Using `math.map` as a replacement with bounds 0..1 seems easy, but it results in worse performance and numerical properties compared to a specialized function, and is less intuitive than `lerp`. In presence of `math.map` and absence of `math.lerp`, users may gravitate towards the slower, numerically worse and less ergonomic solution. - -A native function would help boost ergonomics and provide a good quality-performance tradeoff by default. - -## Design - -A new function, `math.lerp`, will be added and will act equivalently to the following user-defined function: - -```luau -function math.lerp(a: number, b: number, t: number): number - return if t == 1 then b else a + (b - a) * t -end -``` - -Just like common Luau implementations, `t` is allowed to be outside the input range. Since clamped mapping is not as widely used and can be easily replicated using `math.clamp`, it would not be supported out of the box. - -Similarly, `a` and `b` range is allowed to be reversed; the behavior of suggested implementation is intuitive on a reversed range, and enforcing the additional restriction `a <= b` will reduce performance and limit use cases. - -The next section will explain the rationale for choosing the proposed implementation. - -## Rationale - -In addition to performance, interpolation functions can be evaluated using a set of criteria: - -- exactness: `lerp(0) = a`, `lerp(1) = b` -- monotonicity: `lerp(t1) >= lerp(t2)` for `t1 >= t2` -- determinacy: `lerp(a, b, t)` is NaN only if `t` is infinite or `a`/`b`/`t` are NaN -- boundedness: `lerp(t)` is in `[a, b]` interval for any `t` in `[0, 1]` -- consistency: `lerp(x, x, t) == x` for all `t` - -Some applications may require some of these properties but not others. Enforcing all of these properties is expensive, with the most difficult property being determinacy, as many pairs of `b` and `a` of opposite signs will overflow the `b-a` computation. [C++ std::lerp](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0811r3.html) uses a different formula to handle interpolation for `a` and `b` of different signs. - -In practice, exactness can be crucial for some applications as in common use cases, such as interpolating an object's motion from A to B, not reaching the exact final position may result in not triggering conditions based on comparing the result. Boundedness may be important when the result of `lerp` is an input to another function; for example, reverse trigonometric functions like `math.acos` will produce NaN for out of range inputs. Consistency can be valuable to avoid sub-pixel jitter in cases where the object is supposed to stay in place during an animation sequence where the position is being interpolated between two equal points. Similarly, monotonicity can be valuable to avoid sub-pixel jitter in reverse direction of motion in case the object is interpolated between two points. - -Thus, ideally we would like to find a function that is exact, monotonic, bounded and consistent; and, of course, enforcing these properties should come at the minimum performance cost. - -The following commonly encountered formulas have been evaluated for numerical properties, using a combination of numerical reasoning, exhaustive searches and randomized fuzzing. The analysis has been performed for 32-bit floats; it should hold for 64-bit floats as well. Monotonicity is only checked in the `[0, 1]` interval; we also assume `a <= b` for the sake of this analysis. - -```c++ -// exactness 0, monotonicity 1, determinacy 0, boundedness 0, consistency 1 -return a + (b - a) * t; - -// exactness 1, monotonicity 0, determinacy 1, boundedness 0, consistency 0 -return a * (1 - t) + b * t; - -// exactness 1, monotonicity 1, determinacy 0, boundedness 1, consistency 1 -return t == 1 ? b : a + (b - a) * t; - -// exactness 1, monotonicity 1, determinacy 0, boundedness 1, consistency 1 -return t < 0.5f ? a + (b - a) * t : b + (b - a) * (t - 1); - -// exactness 1, monotonicity 0, determinacy 1, boundedness 0, consistency 1 -return a == b ? a : a * (1 - t) + b * t; -``` - -The only two functions that seemingly satisfy our 4 (of 5) desired criteria are the implementation proposed in the design section, and another version that switches behavior around `t=0.5`. Both do not guarantee determinacy due to potential overflow in `b - a`, but seem to guarantee (empirically or provably) other properties for `a <= b` and `0 <= t <= 1`. - -While switching direction around `t=0.5` can increase precision in certain cases, it is also noticeably slower: a branchless implementation requires 6/9 instructions on A64/X64 (absent `fma`) for the proposed implementation, and 9/16 instructions for the last variant of the lerp. The standard implementation should strike the best balance between correctness and performance, and the `t == 1` variant seems to fit the bill. - -Our proposed implementation is trivially exact and consistent due to floating-point properties. Due to floating-point properties, it is monotonic with one possible exception of values around 1. Specifically, it's unclear what the relation is between: - -- `a + (b - a) * (1-ulp)` -- `b` -- `a + (b - a) * (1+ulp)` - -Due to monotonicity property, `a + (b - a) * (1-ulp) <= a + (b - a)`; due to floating point arithmetical properties, `a + (b - a)` should be at most within 1ulp from `b` if `b >= a >= 0`. Empirically, there are cases where it's `b-ulp`, `b` and `b+ulp`, depending on values of `a` and `b`. While it *seems* that our adjustment of the output for `t == 1` can't break monotonicity as it seems impossible that `a + (b - a) * (1-ulp)` is greater than `b`, or that `a + (b - a) * (1+ulp)` is less than `b`, this property has not been formally proven. As such, there's a risk that our implementation is not fully monotonic. C++ `std::lerp` includes a statement "monotonic except near t=1", and, for `a < b`, clamps the result of the lerp to ensure it's correctly ordered with respect to `b`. - -Since the fuzzer has not been able to find a counter-example for our implementation, we assume that either this property does hold or, if it doesn't, the counter-examples are extremely rare. It is likely that the claim C++ makes requires non-default rounding direction; the evaluation has been performed with round-to-nearest, which is the default on all platforms Luau targets. Additionally, the tests from Microsoft STL implementation have been validated against this implementation (the only test on finite numbers that fails compares the sign of the returned zero, which our implementation does not make promises about). The final analysis also involved running the fuzzer with both `float` and `double` inputs for 10 hours using 10 cores each and found no counterexamples where monotonicity is broken, evaluating ~300B triples for each type. Reverse ranges (`a > b`) were also lightly tested for monotonicity in the same 10 hour period on 1 core and found no issues either over ~75B triples. - -In the event monotonicity is indeed somehow broken around 1, the author still considers the `lerp` function described above practically useful and a good balance between performance and correctness. - -> Note: the evaluation and analysis has been performed without fma; while it *probably* holds when `+` and `*` are fused, that has not been established. - -Additional references: - -- [C++ proposal for std::lerp](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0811r3.html) -- [Rust discussion of fNN::lerp](https://github.com/rust-lang/rust/issues/86269) -- [StackOverflow discussion of lerp implementations](https://math.stackexchange.com/questions/907327/accurate-floating-point-linear-interpolation) -- [lerpfuzz.cpp used for analysis + tests](https://gist.github.com/zeux/ea70d4574a50cc819e5f02b6d7ebb1f2) - -## Drawbacks - -This adds yet another function to the standard library. - -The implementation does not guarantee all possible properties of a `lerp` function, and represents a balance between performance and numerical quality; in specific applications, different properties may be required to reach a different set of tradeoffs. - -## Alternatives - -Not doing anything and letting people continue writing their own lerping functions. - -Implementing the "perfect" `lerp` function from C++ standard (significantly slower, but guarantees determinacy), or the "lazy" `lerp` function from shading languages (no guarantees, maximum performance). - -Choosing an idiosyncratic name (`mix`) or argument order (`t, a, b`). diff --git a/.cursor/rules/luau-rfcs/function-math-map.md b/.cursor/rules/luau-rfcs/function-math-map.md deleted file mode 100644 index 8bb275b8..00000000 --- a/.cursor/rules/luau-rfcs/function-math-map.md +++ /dev/null @@ -1,37 +0,0 @@ -# math.map - -**Status**: Implemented - -## Summary - -Add a `map` function to the `math` library, which maps a number from one range to another. - -## Motivation - -Numerical mapping is a very common operation within game development. With only a brief search of the CoreScript source on the Roblox Client Tracker, there are about [three](https://github.com/MaximumADHD/Roblox-Client-Tracker/blob/9add9114d12e24cf08fa5680dbc95ace2af5c981/scripts/CoreScripts/Modules/PlayerList/Components/PresentationMobile/PlayerListApp.lua#L51) [different](https://github.com/MaximumADHD/Roblox-Client-Tracker/blob/9add9114d12e24cf08fa5680dbc95ace2af5c981/scripts/PlayerScripts/StarterPlayerScriptsCommon/RbxCharacterSounds.lua#L55) [implementations](https://github.com/MaximumADHD/Roblox-Client-Tracker/blob/9add9114d12e24cf08fa5680dbc95ace2af5c981/scripts/PlayerScripts/StarterPlayerScripts/PlayerModule.module/CameraModule/CameraUtils.lua#L53) of this function, each having about five to ten uses per context. - -A native function would help boost ergonomics and provide potential performance benefits in these cases. - -## Design - -A new function, `math.map`, will be added and will act equivalently to the following user-defined function. - -```luau -function math.map(x: number, inmin: number, inmax: number, outmin: number, outmax: number): number - return outmin + (x - inmin) * (outmax - outmin) / (inmax - inmin) -end -``` - -Just like common Luau implementations, `x` is allowed to be outside the input range. Since clamped mapping is not as widely used and can be easily replicated using `math.clamp`, it would not be supported. - -## Drawbacks - -This adds yet another function to the standard library. - -The function may also not provide enough performance improvements to warrant its addition, so implementations of this should be benchmarked. - -## Alternatives - -Not doing anything and letting people continue writing their own mapping functions. This would keep the same problems as before. - -If the use of clamped mapping turns out to be more widespread, then adding an optional sixth argument to enable clamping could be considered. Not doing this may lead to the same problem of people writing their own implementations as before. diff --git a/.cursor/rules/luau-rfcs/function-string-pack-unpack.md b/.cursor/rules/luau-rfcs/function-string-pack-unpack.md deleted file mode 100644 index 42039fc1..00000000 --- a/.cursor/rules/luau-rfcs/function-string-pack-unpack.md +++ /dev/null @@ -1,71 +0,0 @@ -# string.pack/unpack/packsize from Lua 5.3 - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Add string pack/unpack from Lua 5.3 for binary interop, with small tweaks to format specification to make format strings portable. - -## Motivation - -While the dominant usecase for Luau is a game programming language, for backend work it's sometimes the case that developers need to work with formats defined outside of Roblox. When these are structured as JSON, it's easy, but if they are binary, it's not. Additionally for the game programming, often developers end up optimizing their data transmission using custom binary codecs where they know the range of the data (e.g. it's much more efficient to send a number using 1 byte if you know the number is between 0 and 1 and 8 bits is enough, but RemoteEvent/etc won't do it for you because it guarantees lossless roundtrip). For both working with external data and optimizing data transfer, it would be nice to have a way to work with binary data. - -This is doable in Luau using `string.byte`/`string.char`/`bit32` library/etc. but tends to be a bit cumbersome. Lua 5.3 provides functions `string.pack`/`string.unpack`/`string.packsize` that, while not solving 100% of the problems, often make working with binary much easier and much faster. This proposal suggests adding them to Luau - this will both further our goal to be reasonably compatible with latest Lua versions, and make it easier for developers to write some types of code. - -## Design - -Concretely, this proposal suggests adding the following functions: - -``` -string.pack (fmt, v1, v2, ···) -``` - -Returns a binary string containing the values v1, v2, etc. packed (that is, serialized in binary form) according to the format string fmt. - -``` -string.packsize (fmt) -``` - -Returns the size of a string resulting from string.pack with the given format. The format string cannot have the variable-length options 's' or 'z'. - -``` -string.unpack (fmt, s [, pos]) -``` - -Returns the values packed in string s (see string.pack) according to the format string fmt. An optional pos marks where to start reading in s (default is 1). After the read values, this function also returns the index of the first unread byte in s. - -The format string is a sequence of characters that define the data layout that is described here in full: https://www.lua.org/manual/5.3/manual.html#6.4.2. We will adopt this wholesale, but we will guarantee that the resulting code is cross-platform by: - -a) Ensuring native endian is little endian (de-facto true for all our platforms) -b) Fixing sizes of native formats to 2b short, 4b int, 8b long -c) Treating `size_t` in context of `T` and `s` formats as a 32-bit integer - -Of course, the functions are memory-safe; if the input string is too short to provide all relevant data they will fail with "data string is too short" error. - -This may seem slightly unconventional but it's very powerful and expressive, in much the same way format strings and regular expressions are :) Here's a basic example of how you might transmit a 3-component vector with this: - -```luau --- returns a 24-byte string with 64-bit double encoded three times, similar to how we'd replicate 3 raw numbers -string.pack("ddd", x, y, z) - --- returns a 12-byte string with 32-bit float encoded three times, similar to how we'd replicate Vector3 -string.pack("fff", x, y, z) - --- returns a 3-byte string with each value stored in 8 bits --- assumes -1..1 range; this code doesn't round the right way because I'm too lazy -string.pack("bbb", x * 127, y * 127, z * 127) -``` - -The unpacking of the data is symmetrical - using the same format string and `string.unpack` you get the encoded data back. - -## Drawbacks - -The format specification is somewhat arbitrary and is likely to be unfamiliar to people who come with prior experience in other languages (having said that, this feature closely follows equivalent functionality from Ruby). - -The implementation of string pack/unpack requires yet another format string matcher, which increases complexity of the builtin libraries and static analysis (since we need to provide linting for another format string syntax). - -## Alternatives - -We could force developers to rely on existing functionality for string packing; it is possible to replicate this proposal in a library, although at a much reduced performance. diff --git a/.cursor/rules/luau-rfcs/function-table-clear.md b/.cursor/rules/luau-rfcs/function-table-clear.md deleted file mode 100644 index 92279928..00000000 --- a/.cursor/rules/luau-rfcs/function-table-clear.md +++ /dev/null @@ -1,21 +0,0 @@ -# table.clear - -> Note: this RFC was adapted from an internal proposal that predates RFC process and as such doesn't follow the template precisely - -**Status**: Implemented - -## Summary - -Add `table.clear` function that removes all elements from the table but keeps internal capacity allocated. - -## Design - -`table.clear` adds a fast way to clear a Lua table. This is effectively a sister function to `table.create()`, only for reclaiming an existing table's memory rather than pre-allocating a new one. Use cases: - -* Often you want to recalculate a set or map data structure based on a table. Currently there is no good way to do this, the fastest way is simply to throw away the old table and construct a new empty one to work with. This is wasteful since often the new structure will take a similar amount of memory to the old one. - -* Sometimes you have a shared table which multiple scripts access. In order to clear this kind of table, you have no other option than to use a slow for loop setting each index to nil. - -These use cases can technically be accomplished via `table.move` moving from an empty table to the table which is to be edited, but I feel that they are frequent enough to warrant a clearer more understandable method which has an opportunity to be more efficient. - -Like `table.move`, does not invoke any metamethods. Not that it would anyways, given that assigning nil to an index never invokes a metamethod. diff --git a/.cursor/rules/luau-rfcs/function-table-clone.md b/.cursor/rules/luau-rfcs/function-table-clone.md deleted file mode 100644 index e6ff47cb..00000000 --- a/.cursor/rules/luau-rfcs/function-table-clone.md +++ /dev/null @@ -1,66 +0,0 @@ -# table.clone - -**Status**: Implemented - -## Summary - -Add `table.clone` function that, given a table, produces a copy of that table with the same keys/values/metatable. - -## Motivation - -There are multiple cases today when cloning tables is a useful operation. - -- When working with tables as data containers, some algorithms may require modifying the table that can't be done in place for some reason. -- When working with tables as objects, it can be useful to obtain an identical copy of the object for further modification, preserving the metatable. -- When working with immutable data structures, any modification needs to clone some parts of the data structure to produce a new version of the object. - -While it's possible to implement this function in user code today, it's impossible to implement it with maximum efficiency; furthermore, cloning is a reasonably fundamental -operation so from the ergonomics perspective it can be expected to be provided by the standard library. - -## Design - -`table.clone(t)` takes a table, `t`, and returns a new table that: - -- has the same metatable -- has the same keys and values -- is not frozen, even if `t` was - -The copy is shallow: implementing a deep recursive copy automatically is challenging (for similar reasons why we decided to avoid this in `table.freeze`), and often only certain keys need to be cloned recursively which can be done after the initial clone. - -The table can be modified after cloning; as such, functions that compute a slightly modified copy of the table can be easily built on top of `table.clone`. - -`table.clone(t)` is functionally equivalent to the following code, but it's more ergonomic (on the account of being built-in) and significantly faster: - -```luau -assert(type(t) == "table") -local nt = {} -for k,v in pairs(t) do - nt[k] = v -end -if type(getmetatable(t)) == "table" then - setmetatable(nt, getmetatable(t)) -end -``` - -The reason why `table.clone` can be dramatically more efficient is that it can directly copy the internal structure, preserving capacity and exact key order, and is thus -limited purely by memory bandwidth. In comparison, the code above can't predict the table size ahead of time, has to recreate the internal table structure one key at a time, -and bears the interpreter overhead (which can be avoided for numeric keys with `table.move` but that doesn't work for the general case of dictionaries). - -Out of the abundance of caution, `table.clone` will fail to clone the table if it has a protected metatable. This is motivated by the fact that you can't do this today, so -there are no new potential vectors to escape various sandboxes. Superficially it seems like it's probably reasonable to allow cloning tables with protected metatables, but -there may be cases where code manufactures tables with unique protected metatables expecting 1-1 relationship and cloning would break that, so for now this RFC proposes a more -conservative route. We are likely to relax this restriction in the future. - -## Drawbacks - -Adding a new function to `table` library theoretically increases complexity. In practice though, we already effectively implement `table.clone` internally for some VM optimizations, so exposing this to the users bears no cost. - -Assigning a type to this function is a little difficult if we want to enforce the "argument must be a table" constraint. It's likely that we'll need to type this as `table.clone(T): T` for the time being, which is less precise. - -## Alternatives - -We can implement something similar to `Object.assign` from JavaScript instead, that simultaneously assigns extra keys. However, this won't be fundamentally more efficient than -assigning the keys afterwards, and can be implemented in user space. Additionally, we can later extend `clone` with an extra argument if we so choose, so this proposal is the -minimal viable one. - -We can immediately remove the rule wrt protected metatables, as it's not clear that it's actually problematic to be able to clone tables with protected metatables. diff --git a/.cursor/rules/luau-rfcs/function-table-create-find.md b/.cursor/rules/luau-rfcs/function-table-create-find.md deleted file mode 100644 index 52ad6a55..00000000 --- a/.cursor/rules/luau-rfcs/function-table-create-find.md +++ /dev/null @@ -1,28 +0,0 @@ -# table.create and table.find - -> Note: this RFC was adapted from an internal proposal that predates RFC process and as such doesn't follow the template precisely - -**Status**: Implemented - -## Design - -This proposal suggests adding two new builtin table functions: - -`table.create(count, value)`: Creates an array with count values, initialized to value. This can be useful to preallocate large tables - repeatedly appending an element to the table repeatedly reallocates it. count is converted to an integer using standard conversion/coercion rules (strings are converted to doubles, doubles are converted to integers using truncation). Negative counts result in the function failing. Positive counts that are too large and would cause a heap allocation error also result in function failing. When value is nil or omitted, table is preallocated without storing anything in it - this is roughly equivalent to creating a large table literal filled with `nil`, or preallocating a table by assigning a sufficiently large numeric index to a value and then erasing it by reassigning it to nil. - -`table.find(table, value [, init])`: Looks for value in the array part of the table; returns index of first occurrence or nil if value is not found. Comparison is performed using standard equality (non-raw) to make sure that objects like Vector3 etc. can be found. The first nil value in the array part of the table terminates the traversal. init is an optional numeric index where the search starts and it defaults to 1; this can be useful to go through repeat occurrences. - -`table.create` can not be replicated efficiently in Lua at all; `table.find` is provided as a faster and more convenient option compared to the code above. - -`table.find` is roughly equivalent to the following code modulo semantical oddities with #t and performance: - -```luau -function find(table, value, init) - for i=init or 1, #table do - if rawget(table, i) == value then - return i - end - end - return nil -end -``` diff --git a/.cursor/rules/luau-rfcs/function-table-freeze.md b/.cursor/rules/luau-rfcs/function-table-freeze.md deleted file mode 100644 index ca819882..00000000 --- a/.cursor/rules/luau-rfcs/function-table-freeze.md +++ /dev/null @@ -1,55 +0,0 @@ -# table.freeze - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Add `table.freeze` which allows to make a table read-only in a shallow way. - -## Motivation - -Lua tables by default are freely modifiable in every possible way: you can add new fields, change values for existing fields, or set or unset the metatable. - -Today it is possible to customize the behavior for *adding* new fields by setting a metatable that overrides `__newindex` (including setting `__newindex` to a function that always errors to prohibit additions of new fields). - -Today it is also possible to customize the behavior of setmetatable by "locking" the metatable - this can be achieved by setting a meta-index `__metatable` to something, which would block setmetatable from functioning and force metatable to return the provided value. With this it's possible to prohibit customizations of a table's behavior, but existing fields can still be assigned to. - -To make an existing table read-only, one needs to combine these mechanisms, by creating a new table with a locked metatable, which has an `__index` function pointing to the old table. However, this results in iteration and length operator not working on the resulting table, and carries a performance cost - both for creating the table, and for repeated property access. - -## Design - -This proposal proposes formalizing the notion of "read-only" tables by providing two new table functions: - -- `table.freeze(t)`: given a non-frozen table t, freezes it; fails when t is not a table or is already frozen. Returns t. -- `table.isfrozen(t)`: given a table t, returns a boolean indicating the frozen status; fails when t is not a table. - -When a table is frozen, the following is true: - -- Attempts to modify the existing keys of the table fail (regardless of how they are performed - via table assignments, rawset, or any other methods like table.sort) -- Attempts to add new keys to the table fail, unless `__newindex` is defined on the metatable (in which case the assignment is routed through `__newindex` as usual) -- Attempts to change the metatable of the table fail -- Reading the table fields or iterating through the table proceeds as usual - -This feature is useful for two reasons: - -a) It allows an easier way to expose sandboxed objects that aren't possible to monkey-patch for security reasons. We actually already have support for freezing and use it internally on various builtin tables like `math`, we just don't expose it to Lua. - -b) It allows an easier way to expose immutable objects for consistency/correctness reasons. For example, Cryo library provides an implementation of immutable data structures; with this functionality, it's possible to implement a lighter-weight library by, for example, extending a table with methods to return mutated versions of the table, but retaining the usual table interface - -To limit the use of `table.freeze` to cases when table contents can be freely manipulated, `table.freeze` shall fail when the table has a locked metatable (but will succeed if the metatable isn't locked). - -## Drawbacks - -Exposing the internal "readonly" feature may have an impact on interoperability between scripts - for example, it becomes possible to freeze some tables that scripts may be expecting to have write access to from other scripts. Since we don't provide a way to unfreeze tables and freezing a table with a locked metatable fails, in theory the impact should not be any worse than allowing to change a metatable, but the full extents are unclear. - -There may be existing code in the VM that allows changing frozen tables in ways that are benign to the current sandboxing code, but expose a "gap" in the implementation that becomes significant with this feature; thus we would need to audit all table writes when implementing this. - -## Alternatives - -We've considered exposing a recursive freeze. The correct generic implementation is challenging since it requires supporting infinitely nested tables when working on the C stack (or a stackless implementation that requires heap allocation); also, to handle self-recursive tables requires a separate temporary tracking table since stopping the traversal at frozen sub-tables is insufficient as their children may not have been frozen. As such, we leave recursive implementation to user code. - -We've considered exposing thawing. The problem with this is that freezing is required for sandboxing, and as such we'd need to support "permafrozen" status that is separate from "frozen". This complicates implementation and we didn't find compelling use cases for thawing - if it becomes necessary we can always expose it separately. - -We've considered calling this "locking", but the term has connotations coming from multithreading that aren't applicable here, and in absence of unlocking, "locking" makes a bit less sense. diff --git a/.cursor/rules/luau-rfcs/function-vector-lerp.md b/.cursor/rules/luau-rfcs/function-vector-lerp.md deleted file mode 100644 index 9dbea83f..00000000 --- a/.cursor/rules/luau-rfcs/function-vector-lerp.md +++ /dev/null @@ -1,35 +0,0 @@ - -# vector.lerp - -**Status**: Implemented - -## Summary -Add the function `vector.lerp` to the vector library, which performs linear interpolation between two vectors and is a direct parallel to [`math.lerp`](https://rfcs.luau.org/function-math-lerp.html). - -## Motivation -Linear interpolation is just as common of an operation with vector math as it is with scalars. For example, Roblox provides a [`Vector3:Lerp(goal, alpha)`](https://create.roblox.com/docs/reference/engine/datatypes/Vector3#Lerp) method for their vector implementation. - -Having a built-in library function for linearly interpolating vectors would help facilitate portability, ergonomic and performance improvements to vector math just like `math.lerp`. - -## Design -The function `vector.lerp` will be added to the vector library that behaves similar to the following user-defined function: - -```luau -function vector.lerp(a: vector, b: vector, t: number): vector - return if t == 1 then b else a + (b - a) * t -end -``` - -This implementation mirrors the one for `math.lerp` and inherits the same mathematical properties of exactness, monotonicity, boundedness and consistency. It also supports 4-wide vector mode. - -## Drawbacks -This adds another library function, and most likely would require another fast-call slot for any meaningful performance gain in an interpreted runtime. - -The implementation of `Vector3:Lerp(goal, alpha)` in Roblox does not have the same guarantees of its numerical properties, i.e. it is not exact or deterministic. This may cause confusion because the two won't behave or return the exact same results for certain cases. - -## Alternatives -Do nothing and leave people to write their own implementations. This forgoes any portability, ergonomic and performance opportunities, especially in cases where a numerically correct implementation is preferred and the context cannot take advantage of native codegen. - -Instead of a scalar `t` argument, the function could be fully vectorized and take in a vector for the alpha. While theoretically useful, most use-cases only require a scalar alpha, and the concerns for performance and numerical correctness of a fully vectorized implementation outweigh its usefulness. - -A different set of correctness tradeoffs could be chosen such as guaranteeing determinacy. This would come at the cost of performance and make `vector.lerp` inconsistent with `math.lerp`. diff --git a/.cursor/rules/luau-rfcs/generalized-iteration.md b/.cursor/rules/luau-rfcs/generalized-iteration.md deleted file mode 100644 index e89c4f6c..00000000 --- a/.cursor/rules/luau-rfcs/generalized-iteration.md +++ /dev/null @@ -1,126 +0,0 @@ -# Generalized iteration - -**Status**: Implemented - -## Summary - -Introduce support for iterating over tables without using `pairs`/`ipairs` as well as a generic customization point for iteration via `__iter` metamethod. - -## Motivation - -Today there are many different ways to iterate through various containers that are syntactically incompatible. - -To iterate over arrays, you need to use `ipairs`: `for i, v in ipairs(t) do`. The traversal goes over a sequence `1..k` of numeric keys until `t[k] == nil`, preserving order. - -To iterate over dictionaries, you need to use `pairs`: `for k, v in pairs(t) do`. The traversal goes over all keys, numeric and otherwise, but doesn't guarantee an order; when iterating over arrays this may happen to work but is not guaranteed to work, as it depends on how keys are distributed between array and hash portion. - -To iterate over custom objects, whether they are represented as tables (user-specified) or userdata (host-specified), you need to expose special iteration methods, for example `for k, v in obj:Iterator() do`. - -All of these rely on the standard Lua iteration protocol, but it's impossible to trigger them in a generic fashion. Additionally, you *must* use one of `pairs`/`ipairs`/`next` to iterate over tables, which is easy to forget - a naive `for k, v in tab do` doesn't work and produces a hard-to-understand error `attempt to call a table value`. - -This proposal solves all of these by providing a way to implement uniform iteration with self-iterating objects by allowing to iterate over objects and tables directly via convenient `for k, v in obj do` syntax, and specifies the default iteration behavior for tables, thus mostly rendering `pairs`/`ipairs` obsolete - making Luau easier to use and teach. - -## Design - -In Lua, `for vars in iter do` has the following semantics (otherwise known as the iteration protocol): `iter` is expanded into three variables, `gen`, `state` and `index` (using `nil` if `iter` evaluates to fewer than 3 results); after this the loop is converted to the following pseudocode: - -```luau -while true do - vars... = gen(state, index) - index = vars... -- copy the first variable into the index - if index == nil then break end - - -- loop body goes here -end -``` - -This is a general mechanism that can support iteration through many containers, especially if `gen` is allowed to mutate state. Importantly, the *first* returned variable (which is exposed to the user) is used to continue the process on the next iteration - this can be limiting because it may require `gen` or `state` to carry extra internal iteration data for efficiency. To work around this for table iteration to avoid repeated calls to `next`, Luau compiler produces a special instruction sequence that recognizes `pairs`/`ipairs` iterators and stores the iteration index separately. - -Thus, today the loop `for k, v in tab do` effectively executes `k, v = tab()` on the first iteration, which is why it yields `attempt to call a table value`. If the object defines `__call` metamethod then it can act as a self-iterating method, but this is not idiomatic, not efficient and not pure/clean. - -This proposal comes in two parts: general support for `__iter` metamethod and default implementation for tables without one. With both of these in place, there's going to be a single, idiomatic, general and performant way to iterate through the object of any type: - -```luau -for k, v in obj do -... -end -``` - -### __iter - -To support self-iterating objects, we modify the iteration protocol as follows: instead of simply expanding the result of expression `iter` into three variables (`gen`, `state` and `index`), we check if the first result has an `__iter` metamethod (which can be the case if it's a table, userdata or another composite object (e.g. a record in the future). If it does, the metamethod is called with `gen` as the first argument, and the returned three values replace `gen`/`state`/`index`. This happens *before* the loop: - -```luau -local genmt = rawgetmetatable(gen) -- pseudo code for getmetatable that bypasses __metatable -local iterf = genmt and rawget(genmt, "__iter") -if iterf then - gen, state, index = iterf(gen) -end -``` - -This check is comparatively trivial: usually `gen` is a function, and functions don't have metatables; as such we can simply check the type of `gen` and if it's a table/userdata, we can check if it has a metamethod `__iter`. Due to tag-method cache, this check is also very cheap if the metamethod is absent. - -This allows objects to provide a custom function that guides the iteration. Since the function is called once, it is easy to reuse other functions in the implementation, for example here's a node object that exposes iteration through its children: - -```luau -local Node = {} -Node.__index = Node - -function Node.new(children) - return setmetatable({ children = children }, Node) -end - -function Node:__iter() - return next, self.children -end -``` - -Luau compiler already emits a bytecode instruction, FORGPREP*, to perform initial loop setup - this is where we can evaluate `__iter` as well. - -Naturally, this means that if the table has `__iter` metamethod and you need to iterate through the table fields instead of using the provided metamethod, you can't rely on the general iteration scheme and need to use `pairs`. This is similar to other parts of the language, like `t[k]` vs `rawget(t, 'k')`, where the default behavior is overrideable but a library function can help peek behind the curtain. - -### Default table iteration - -If the argument is a table and it does not implement `__iter` metamethod, we treat this as an attempt to iterate through the table using the builtin iteration order. - -> Note: we also check if the table implements `__call`; if it does, we fall back to the default handling. We may be able to remove this check in the future, but we will need this initially to preserve backwards compatibility with custom table-driven iterator objects that implement `__call`. In either case, we will be able to collect detailed analytics about the use of `__call` in iteration, and if neither is present we can emit a specialized error message such as `object X is not iteratable`. - -To have a single, unified, iteration scheme over tables regardless of whether they are arrays or dictionaries, we establish the following semantics: - -- First, the traversal goes over numeric keys in range `1..k` up until reaching the first `k` such that `t[k] == nil` -- Then, the traversal goes over the remaining keys (with non-nil values), numeric and otherwise, in unspecified order. - -For arrays with gaps, this iterates until the first gap in order, and the remaining order is not specified. - -> Note: This behavior is similar to what `pairs` happens to provide today, but `pairs` doesn't give any guarantees, and it doesn't always provide this behavior in practice. - -To ensure that this traversal is performant, the actual implementation of the traversal involves going over the array part (in index order) and then over the hash part (in hash order). For that implementation to satisfy the criteria above, we need to make two additional changes to table insertion/rehash: - -- When inserting key `k` in the table when `k == t->sizearray + 1`, we force the table to rehash (resize its array portion). Today this is only performed if the hash portion is full, as such sometimes numeric keys can end up in the hash part. -- When rehashing the table, we ensure that the hash part doesn't contain the key `newsizearray + 1`. This requires checking if the table has this key, which may require an additional hash lookup but we only need to do this in rare cases based on the analysis of power-of-two key buckets that we already collect during rehash. - -These changes guarantee that the order observed via standard traversal with `next`/`pairs` matches the guarantee above, which is nice because it means we can minimize the complexity cost of this change by reusing the traversal code, including VM optimizations. They also mean that the array boundary (aka `#t`) can *always* be computed from just the array portion, which simplifies the table length computation and may slightly speed it up. - -## Drawbacks - -This makes `for` desugaring and implementation a little more complicated; it's not a large complexity factor in Luau because we already have special handling for `for` loops in the VM, but it's something to keep in mind. - -While the proposed iteration scheme should be a superset to both `pairs` and `ipairs` for tables, for arrays `ipairs` may in some cases be faster because it stops at the first `nil`, whereas the proposed new scheme (like `pairs`) needs to iterate through the rest of the table's array storage. This may be fixable in the future, if we replace our cached table length (`aboundary`) with Lua 5.4's `alimit`, which maintains the invariant that all values after `alimit` in the array are `nil`. This would make default table iteration maximally performant as well as help us accelerate GC in some cases, but will require extra checks during table assignments which is a cost we may not be willing to pay. Thus it is theoretically possible that we will end up with `ipairs` being a slightly faster equivalent for array iteration forever. - -The resulting iteration behavior, while powerful, increases the divergence between Luau and Lua, making more programs that are written for Luau not runnable in Lua. Luau language in general does not consider this type of compatibility essential, but this is noted for posterity. - -The changes in insertion behavior that facilitate single iteration order may have a small cost; that said, they are currently understood to belong to paths that are already slow and the added cost is minimal. - -The extra semantics will make inferring the types of the variables in a for loop more difficult - if we know the type of the expression that is being iterated through it probably is not a problem though. - -## Alternatives - -Other major designs have been considered. - -A minor variation of the proposal involves having `__iter` be called on every iteration instead of at loop startup, effectively having `__iter` work as an alternative to `__call`. The issue with this variant is that while it's a little simpler to specify and implement, it restricts the options when implementing custom iteratable objects, because it would be difficult for iteratable objects to store custom iteration state elsewhere since `__iter` method would effectively need to be pure, as it can't modify the object itself as more than one concurrent iteration needs to be supported. - -A major variation of the proposal involves instead supporting `__pairs` from Lua 5.2. The issue with this variant is that it still requires the use of a library method, `pairs`, to work, which doesn't make the language simpler as far as table iteration, which is the 95% case, is concerned. Additionally, with some rare exceptions metamethods today extend the *language* behavior, not the *library* behavior, and extending extra library functions with metamethods does not seem true to the core of the language. Finally, this only works if the user uses `pairs` to iterate and doesn't work with `ipairs`/`next`. - -Another variation involves using a new pseudo-keyword, `foreach`, instead of overloading existing `for`, and only using the new `__iter` semantics there. This can more cleanly separate behavior, requiring the object to have an `__iter` metamethod (or be a table) in `foreach` - which also avoids having to deal with `__call` - but it also requires teaching the users a new keyword which fragments the iteration space a little bit more. Compared to that, the main proposal doesn't introduce new divergent syntax, and merely tweaks existing behavior to be more general, thus making an existing construct easier to use. - -Finally, the author also considered and rejected extending the iteration protocol as part of this change. One problem with the current protocol is that the iterator requires an allocation (per loop execution) to keep extra state that isn't exposed to the user. The builtin iterators like `pairs`/`ipairs` work around this by feeding the user-visible index back to the search function, but that's not always practical. That said, having a different iteration protocol in effect only when `__iter` is used makes the language more complicated for unclear efficiency gains, thus this design doesn't suggest a new core protocol to favor simplicity. diff --git a/.cursor/rules/luau-rfcs/generic-function-subtyping.md b/.cursor/rules/luau-rfcs/generic-function-subtyping.md deleted file mode 100644 index bfbe03a5..00000000 --- a/.cursor/rules/luau-rfcs/generic-function-subtyping.md +++ /dev/null @@ -1,211 +0,0 @@ -# Expanded Subtyping for Generic Function Types - -## Summary - -Extend the subtyping relation for function types to relate generic function -types with compatible instantiated function types. - -## Motivation - -As Luau does not have an explicit syntax for instantiation, there are a number -of places where the typechecker will automatically perform instantiation with -the goal of permitting more programs. These instances of instantiation are -ad-hoc and strategic, but useful in practice for permitting programs such as: - -```luau -function id(x: T): T - return x -end - -local idNum : (number) -> number -idNum = id -- ok -``` - -However, they have also been a source of some typechecking bugs because of how -they actually make a determination as to whether the instantation should happen, -and they currently open up some potential soundness holes when instantiating -functions in table types since properties of tables are mutable and thus need to -be invariant (which the automatic-instantiation potentially masks). - -## Design - -The goal then is to rework subtyping to support the relationship we want in the -first place: allowing polymorphic functions to be used where instantiated -functions are expected. In particular, this means adding instantiation itself to -the subtyping relation. Formally, that'd look something like: - -``` -instantiate((T1) -> T2) = (T1') -> T2' -(T1') -> T2' <: (T3) -> T4 --------------------------------------------- -(T1) -> T2 <: (T3) -> T4) -``` - -Or informally, we'd say that a generic function type is a subtype of another -function type if we can instantiate it and show that instantiated function type -to be a subtype of the original function type. Implementation-wise, this loose -formal rule suggests a strategy of when we'll want to apply instantiation. -Namely, whenever the subtype and supertype are both functions with the potential -subtype having some generic parameters and the supertype having none. So, if we -look once again at our simple example from motivation, we can walk through how -we expect it to type check: - -```luau -function id(x: T): T - return x -end - -local idNum : (number) -> number -idNum = id -- ok -``` - -First, `id` is given the type `(T) -> T` and `idNum` is given the type -`(number) -> number`. When we actually perform the assignment, we must show that -the type of the right-hand side is compatible with the type of the left-hand -side according to subtyping. That is, we'll ask if `(T) -> T` is a subtype of -`(number) -> number` which matches the rule to apply instantiation since the -would-be subtype has a generic parameter while the would-be supertype has no -generic parameters. This contrasts with the current implementation which, before -asking the subtyping question, checks if the type of the right-hand side -contains any generics at any point and if the type of the left-hand side cannot -_possibly_ contain generics and instantiates the right-hand side if so. - -Adding instantiation to subtyping does pose some additional questions still -about when exactly to instantiate. Namely, we need to consider cases like -function application. We can see why by looking at some examples: - -```luau -function rank2(f: (a) -> a): (number) -> number - return f -end -``` - -In this case, we expect to allow the instantiation of `f` from `(a) -> a` to -`(number) -> number`. After all, we can consider other cases like where the body -instead applies `f` to some particular value, e.g. `f(42)`, and we'd want the -instantiation to be allowed there. However, this means we'd potentially run into -issues if we allowed call sites to `rank2` to pass in non-polymorphic functions. -A naive approach to implementing this proposal would do exactly that because we -currently treat contravariant subtyping positions (i.e. for the arguments of -functions) as being the same as our normal (i.e. covariant) subtyping relation -but with the arguments reversed. So, to type check an application like -`rank2(function(str: string) return str + "s" end)` (where the function argument -is of type `(string) -> string`), we would ask if `(a) -> a` is a subtype of -`(string) -> string`. This is precisely the question we asked in the original -example, but in the contravariant context, this is actually unsound since -`rank2` would then function as a general coercion from, e.g., -`(string) -> string` to `(number) -> number`. - -This sort of behavior does come up in other languages that mix polymorphism and -subtyping. If we consider the same example in F#, we can compare its behavior: - -```fsharp -let ranktwo (f : 'a -> 'a) : int -> int = f -let pluralize (s : string) : string = s + "s" -let x = ranktwo pluralize -``` - -For this example, F# produces one warning and one error. The warning is applied -to the function definition of `ranktwo` itself (coded `FS0064`), and says "This -construct causes code to be less generic than indicated by the type annotations. -The type variable 'a has been constrained to be type 'int'." This warning -highlights the actual difference between our example in Luau and the F# -translation. In F#, `'a` is really a free type variable, rather than a generic -type parameter of the function `ranktwo`, as such, this code actually -constrains the type of `ranktwo` to be `(int -> int) -> (int -> int)`. As such, -the application on line 3 errors because our `(string -> string)` function is -simply not compatible with that type. With higher-rank polymorphic function -parameters, it doesn't make sense to warn on their instantiation (as illustrated -by the example of actually applying `f` to some particular data in the -definition of `rank2`), but it's still just as problematic if we were to accept -instantiated functions at polymorphic types. Thus, it's important that we -actually ensure that we only instantiate in covariant contexts. So, we must -ensure that subtyping only instantiates in covariant contexts. - -It may also be helpful to consider an example of rank-1 polymorphism to -understand the full scope of the behavior. So, we can look at what happens if we -simply move the type parameter out in our working example: - -```luau -function rank1(f: (a) -> a): (number) -> number - return f -end -``` - -In this case, we expect an error to occur because the type of `f` depends on -what we instantiate `rank1` with. If we allowed this, it would naturally be -unsound because we could again provide a `(string) -> string` argument (by -instantiating `a` with `string`). This reinforces the idea that the presence of -the generic type parameter is likely to be a good option for determining -instantiation (at least when compared to the presence of free type variables). - -## Drawbacks - -One of the aims of this proposal is to provide a clear and predictable mental -model of when instantiation will take place in Luau. The author feels this -proposal is step forward compared to the existing ad-hoc usage of instantiation -in the typechecker, but it's possible that programmers are already comfortable -with the mental model they have built for the existing implementation. -Hopefully, this is mitigated by the fact that the new setup should allow all of -the _sound_ uses of instantiation permitted by the existing system. Notably, -however, programmers may be surprised by the added restriction when it comes to -properties in tables. In particular, we can consider a small variation of our -original example with identity functions: - -```luau -function id(x: T): T - return x -end - -local poly : { id : (a) -> a } = { id = id } - -local mono : { id : (number) -> number } -mono = poly -- error! -mono.id = id -- also an error! -``` - -In this case, the fact that we're dealing with a _property_ of a table type -means that we're in a context that needs to be invariant (i.e. not allow -subtyping) to avoid unsoundness caused by interactions between mutable -references and polymorphism (see things like the [value -restriction in OCaml][value-restriction] to understand why). In most cases, we -believe programmers will be using functions in tables as an implementation of -methods for objects, so we don't anticipate that they'll actually _want_ to do -the unsound thing here. The accepted RFC for [read-only -properties][read-only-props] gives us a technically-precise solution since -read-only properties would be free to be typechecked as a covariant context -(since they disallow mutation), and thus if the property `id` was marked -read-only, we'd be able to do both of the assignments in the above example. - -## Alternatives - -The main alternatives would likely be keeping the existing solution (and -likely having to tactically fix future bugs where instantiation either happens -too much or not enough), or removing automatic instantiation altogether in favor -of manual instantiation syntax. The former solution (changing nothing) is cheap -now (both in terms of runtime performance and also development cost), but the -existing implementation involves extra walks of both types to make a decision -about whether or not to perform instantiation. To minimize the performance -impact, the functions that perform these questions (`isGeneric` and -`maybeGeneric`) actually do not perform a full walk, and instead try to -strategically look at only enough to make the decision. We already found and -fixed one bug that was caused by these functions being too imprecise against -their spec, but fleshing them out entirely could potentially be a noticeable -performance regression since the decision to potentially instantiate is one that -comes up often. - -Removing automatic instantiation altogether, by contrast, will definitely be -"correct" in that we'll never instantiate in the wrong spot and programmers will -always have the ability to instantiate, but it would be a marked regression on -developer experience since it would increase the annotation burden considerably -and generally runs counter to the overall design strategy of Luau (which focuses -heavily on type inference). It would also require us to actually pick a syntax -for manual instantiation (which we are still open to do in the future if we -maintain an automatic instantiation solution) which is frought with parser -ambiguity issues or requires the introduction of a sigil like Rust's turbofish -for instantiation. Discussion of that syntax is present in the [generic -functions][generic-functions] RFC. - -[value-restriction]: https://stackoverflow.com/questions/22507448/the-value-restriction#22507665 -[read-only-props]: https://github.com/Roblox/luau/blob/master/rfcs/property-readonly.md -[generic-functions]: https://github.com/Roblox/luau/blob/master/rfcs/generic-functions.md diff --git a/.cursor/rules/luau-rfcs/generic-functions.md b/.cursor/rules/luau-rfcs/generic-functions.md deleted file mode 100644 index 6f49d19d..00000000 --- a/.cursor/rules/luau-rfcs/generic-functions.md +++ /dev/null @@ -1,155 +0,0 @@ -# Generic functions - -**Status**: Implemented - -## Summary - -Extend the syntax and semantics of functions to support explicit generic functions, which can bind type parameters as well as data parameters. - -## Motivation - -Currently Luau allows generic functions to be inferred but not given explicit type annotations. For example - -```luau -function id(x) return x end -local x: string = id("hi") -local y: number = id(37) -``` - -is fine, but there is no way for a user to write the type of `id`. - -## Design - -Allow functions to take type parameters as well as function parameters, similar to Java/Typescript/... - -```luau -function id(x : a) : a return x end -``` - -Functions may also take generic type pack arguments for varargs, for instance: - -```luau -function compose(... : a...) -> (a...) return ... end -``` - -Generic type and type pack parameters can also be used in function types, for instance: - -```luau -local id: (a)->a = function(x) return x end -``` - -This change is *not* only syntax, as explicit type parameters need to be part of the semantics of types. For example, we can define a generic identity function - -```luau -local function id(x) return x end -local x: string = id("hi") -local y: number = id(37) -type Id = typeof(id) -``` - -and two functions - -```luau -function f() - return id -end -function g() - local y - function oh(x) - if not(y) then y = x end - return y - end - return oh -end -``` - -The types of these functions are - -```luau - f : () -> (a) -> a - g : () -> (a) -> a -``` - -so this is okay: - -```luau - local i: Id = f() - local x: string = i("hi") - local y: number = i(37) -``` - -but this is not: - -```luau - -- This assignment shouldn't typecheck! - local i: Id = g() - local x: string = i("hi") - -- This is unsound, since it assigns a string to a variable of type number - local y: number = i(37) -``` - -Currently, Luau does not have explicit type binders, so `f` and `g` have the same type. We propose making type binders part of the semantics of types as well as their syntax (so `f` and `g` have different types, and the unsound example does not typecheck). - -We propose supporting type parameters which can be instantiated with any type (jargon: Rank-N Types) but not type functions (jargon: Higher Kinded Types) or types with constraints (jargon: F-bounded polymorphism). - -## Turbofish - -Note that this RFC proposes a syntax for adding generic parameters to functions, but it does *not* propose syntax for adding generic arguments to function call site. For example, for `id` function you *can* write: - -```luau - -- generic type gets inferred as a number in all these cases -local x = id(4) -local x = id(y) :: number -local x: number = id(y) -``` - -but you can *not* write `id(y)`. - -This syntax is difficult to parse as it's ambiguous wrt grammar for comparison, and disambiguating it requires being able to parse types in expression context which makes parsing slow and complicated. It's also worth noting that today there are programs with this syntax that are grammatically correct (eg `id('4')` parses as "compare variable `id` to variable `string`, and compare the result to string '4'"). The specific example with a single argument will always fail at runtime because booleans can't be compared with relational operators, but multi-argument cases such as `print(foo(4))` can execute without errors in certain cases. - -Note that in many cases the types can be inferred, whether through function arguments (`id(4)`) or through expected return type (`id(y) :: number`). It's also often possible to cast the function object to a given type, even though that can be unwieldy (`(id :: (number)->number)(y)`). Some languages don't have a way to specify the types at call site either, Swift being a prominent example. Thus it's not a given we need this feature in Luau. - -If we ever want to implement this though, we can use a solution inspired by Rust's turbofish and require an extra token before `<`. Rust uses `::<` but that doesn't work in Luau because as part of this RFC, `id::(a)->a` is a valid, if redundant, type ascription, so we need to choose a different prefix. - -The following two variants are grammatically unambiguous in expression context in Luau, and are a better parallel for Rust's turbofish (in Rust, `::` is more similar to Luau's `:` or `.` than `::`, which in Rust is called `as`): - -```luau -foo:() -- require : before <; this is only valid in Luau in variable declaration context, so it's safe to use in expression context -foo.() -- require . before <; this is currently never valid in Luau -``` - -This RFC doesn't propose using either of these options, but notes that either one of these options is possible to specify & implement in the future if we so desire. - -## Drawbacks - -This is a breaking change, in that examples like the unsound program above will no longer typecheck. - -Types become more complex, so harder for programmers to reason about, and adding to their space usage. This is particularly noticeable anywhere the typechecker has exponential blowup, since small increases in type size can result in large increases in space or time usage. - -Not having higher-kinded types stops some examples which are parameterized on container types, for example: - -```luau - function g(f : (a) -> c) : (b) -> c> - return function(x) return f(f(x)) end - end -``` - -Not having bounded types stops some examples like giving a type to the function that sums an non-empty array: - -```luau - function sum(xs) - local result = x[0] - for i=1,#xs - result += x[i] - end - return result - end -``` - -## Alternatives - -We did originally consider Rank-1 types, but the problem is that's not backward-compatible, as DataBrain pointed out in the [Dev Forum](https://devforum.roblox.com/t/luau-recap-march-2021/1141387/29), since `typeof` allows users to construct generic types even without syntax for them. Rank-1 types give a false positive type error in this case, which comes from deployed code. - -We could introduce syntax for generic types without changing the semantics, but then there'd be a gap between the syntax (where the types `() -> (a) -> a` and `() -> (a) -> a` are different) and the semantics (where they are not). As noted above, this isn't sound. - -Rather than using Rank-N types, we could use SML-style polymorphism, but this would need something like the [value restriction](http://users.cis.fiu.edu/~smithg/cop4555/valrestr.html) to be sound. diff --git a/.cursor/rules/luau-rfcs/index-type-operator.md b/.cursor/rules/luau-rfcs/index-type-operator.md deleted file mode 100644 index be634513..00000000 --- a/.cursor/rules/luau-rfcs/index-type-operator.md +++ /dev/null @@ -1,139 +0,0 @@ -# `index` type function - -**Status**: Implemented - -## Summary - -This RFC proposes the addition of one type function, `index`, which can be used to look up a specific property of another type (like TypeScript's Indexed Access Type). - -## Motivation - -The primary motivation of this proposal is to allow Luau to define a type by accessing a property of another existing type. For instance, consider the following example code: -```luau -type Person = { - age: number, - name: string, - alive: boolean -} - -local bob: Person = { - age = 22, - name = "Bob", - alive = true -} - -local function doSmt(param: typeof(bob["age"])) -- param = number - -- rest of code -end - -type unionType = typeof(bob["age"]) | typeof(bob["name"]) | typeof(bob["alive"]) -- unionType = number | string | boolean -``` - -This is a valid Luau program; however, in order to define the type of `Person["age"]` we had to first declare a variable `bob` and utilize the `typeof` type function. This is quite cumbersome when developers want to typecheck using the type of `Person["age"]` without having to declare a variable first. Additionally, in order to define the union type of all the properties of `Person`, current Luau requires an explicit list of each property using `typeof`. - -The expected outcome of the index type function is that it will enhance developer experience and allow Luau developers to more easily develop well-typed programs. - -## Design - -The solution to this problem is a type function, `index`, that can compute the type based on the static properties of `Person`. Formally, the `index` type function will take in two arguments: the type to index (indexee) and the type to index it with (indexer). This would allow us to instead write the following code: -```luau -type Person = { - age: number, - name: string, - alive: boolean -} - -local function doSmt(param: index) -- param = number - -- rest of code -end - -type idxType = index> -- idxType = number | string | boolean - -type idxType2 = index -- idxType2 = number | string -``` - -Now, the type of `doSmt()`'s parameter can be defined without declaring a variable `bob`. Additionally, regardless of how the type `Person` grows, `idxType` will always be defined as the union of all the properties. - -Error messages will be displayed for incorrect type arguments. If the indexer is not a property in the indexee, -```luau -type age = index -- Error message: Property '"ager"' does not exist on type 'Person' -``` -If the indexer is not a type, -```luau -local key = "age" -type age = index -- Error message: Second argument to index is not a valid index type; Unknown type 'key' -``` -Note: these errors will be part of the general type function reduction errors since `index` will be built into the type function system. - -The indexee may be a union type. In this case, the type function will distribute the arguments to multiple type families: -```luau -type Person2 = { - age: string -} - --- equivalent of `index | index` -type idxType3 = index -- idxType3 = number | string - --- equivalent of `index | index` -type idxType4 = index -- Error message: Property '"age" | "alive"' does not exist on type 'Person | Person2' -``` - -In the circumstance that the indexee's type is a class or table with an `__index` metamethod, the `__index` metamethod will *only* be invoked if the indexer is not found within the current scope: -```luau -local exampleClass = { Foo = "eight" } -local exampleClass2 = setmetatable({ Foo = 8 }, { __index = exampleClass }) -local exampleClass3 = setmetatable({ Bar = "nine" }, { __index = exampleClass }) - -type exampleTy2 = index -- exampleTy2 = number -type exampleTy3 = index -- exampleTy3 = string -``` - -One edge case to consider when using/designing this type function is that `__index` only supports 100 nested `__index` metamethods until it gives up. In the case that a property is not found within the 100 recursive calls, this type function will fail to reduce. - -Implementation is straight forward: the type of the indexee will be determined (table, class, etc) -> search through the properties of the indexee and reduce to the corresponding type of the indexer if it exists; otherwise, reduce to an error. - -## Drawbacks - -A drawback to this feature is the possible increase in the cost of maintenance. In the end, this RFC proposes adding another built-in type functions to the new type system. However, the addition of this feature may be worthwhile, as the `index` type function is a useful type feature that: -1. Alleviates the need to manually keep types in sync -2. Provides a powerful way to access the properties of an object and perform various operations on it with other type functions -3. Allows the community to write code with fewer errors and more safety - -## Alternatives - -An alternative design can be depicted from the example below: -```luau -type Person3 = { - age: number, - name: string, - alive: boolean, - job: string -} - -local function edgeCase(p: Person) - type unknownType = index -end -``` -In our current design, the program simply fails to reduce (and throws an error). However, it is worth noting that `index` can also reduce to type `unknown` because the parameter `p` can be of type `Person` or `Person3` (since tables support width subtyping; hence, `Person3` is a subtype of `Person`): -- If `p` is of type `Person`, `index` should reduce to an error. -- If `p` is of type `Person3`, `index` should reduce to type `string`. - -Because there are conflicting types for `p` depending on the run time, it is safest for the program to reduce to a type `unknown`. In this design, we would need a way to determine if the indexee can be different at runtime. We could determine this through the implementation of more table types, specifically exact and inexact table types. Then, the program will have two cases when an indexee does not contain the indexer type: -1. If the indexee is an inexact table type, reduce to an `unknown` type. -2. If the indexee is an exact table type, fail to reduce and throw an error. - -FYI: exact table type indicates that the table has only the properties listed in its type, and inexact table type indicates that the table has at least the properties listed in its type. - -Later down the line, we can also consider adding syntactic sugar for this type function. Instead of doing: -```luau -type name = index -``` -We could use: -```luau -type name = Person["name"] -``` -or -```luau -type name = Person.name -``` -or even both! \ No newline at end of file diff --git a/.cursor/rules/luau-rfcs/index.md b/.cursor/rules/luau-rfcs/index.md deleted file mode 100644 index 31f3d8cd..00000000 --- a/.cursor/rules/luau-rfcs/index.md +++ /dev/null @@ -1,21 +0,0 @@ -# RFCs - -{% assign sortedPages = site.pages | sort: 'title' %} - -Luau uses RFCs to discuss and document the language evolution process. They are hosted [in a GitHub repository](https://github.com/luau-lang/rfcs) which accepts pull requests for corrections to existing RFCs as well as new RFCs. - -If you'd like to submit a benign (grammatical, stylistic) correction, please open a pull request; all RFCs are in [docs folder in the repository](https://github.com/luau-lang/rfcs/tree/master/docs). - -If you'd like to submit a new RFC, please [read our guidelines first](https://github.com/luau-lang/rfcs/blob/master/README.md); RFCs often require a significant amount of design effort and precision to be considered. - -Note that if you'd like to submit a substantial change to an existing RFC that is already implemented according to its Status field, you would need to submit a new amendment RFC instead of editing an existing one. - -
    -{% for page in sortedPages %} -{% assign ext = page.name | split:'.' | last %} -{% if ext == 'md' and page.name != 'index.md' %} -
  • -{{ page.title }} -
  • -{% endif %} -{% endfor %} diff --git a/.cursor/rules/luau-rfcs/keyof-type-operator.md b/.cursor/rules/luau-rfcs/keyof-type-operator.md deleted file mode 100644 index ae8f8771..00000000 --- a/.cursor/rules/luau-rfcs/keyof-type-operator.md +++ /dev/null @@ -1,128 +0,0 @@ -# `keyof` and `rawkeyof` type functions - -**Status**: Implemented - -## Summary - -This RFC proposes the addition of two type functions, `keyof` and `rawkeyof`, -which can be used to derive a type automatically for the keys of a table or -class. - -## Motivation - -The primary motivation of this proposal is to make it easier to work with tables -as objects and/or enumerations, and to reduce the amount of duplicate work users -must undergo in order to type code that does this. For instance, consider the -following example code: - -```luau -type AnimalType = "cat" | "dog" | "monkey" | "fox" - -local animals = { - cat = { speak = function() print "meow" end }, - dog = { speak = function() print "woof woof" end }, - monkey = { speak = function() print "oo oo" end }, - fox = { speak = function() print "gekk gekk" end } -} - -function speakByType(animal: AnimalType) - animals[animal].speak() -end - -speakByType("dog") -- ok -speakByType("cactus") -- errors -``` - -This code is totally reasonable, but we had to manually write a type that lists -out the keys of the table `animals` in order to get type safety. The larger the -table is the less tractable this becomes, and it'd be easy to imagine a user -opting to instead provide the annotation `string` and just losing type safety in -this situation. - -## Design - -The solution to this problem is a type function, `keyof`, that can compute the -type based on the type of `animals`. This would allow us to instead write this -code as follows: - -```luau -local animals = { - cat = { speak = function() print "meow" end }, - dog = { speak = function() print "woof woof" end }, - monkey = { speak = function() print "oo oo" end }, - fox = { speak = function() print "gekk gekk" end } -} - -type AnimalType = keyof - -function speakByType(animal: AnimalType) - animals[animal].speak() -end - -speakByType("dog") -- ok -speakByType("cactus") -- errors -``` - -Now, regardless of how the `animals` table grows, `AnimalType` will always be -defined as the type of indices into the table. At its base, this is a simple -solution to a simple, but common problem of code duplication for types. - -Unfortunately, there are some edgecases to be concerned about because of -metatables and the `__index` metamethod in particular. There's valid arguments -for both including properties available from `__index` as well as for excluding -them. This RFC proposes that there are two reasonable solutions, which -correspond directly to the runtime operations `t[i]` and `rawget(t, i)`. The -former is an instance where you'd want the type to incorporate `__index` -properties appropriately, and the latter is a case where you would not. So, we -analogously provide both `keyof` and `rawkeyof` which provide all the -legal keys for indexing and only the keys legal for `rawget` respectively. - -So, if we consider some very simple strawman code here: - -```luau -local MyClass = { Foo = "Bar" } -local OtherClass = setmetatable({ Hello = "World" }, { __index = MyClass }) - -type MyClass = typeof(MyClass) -type OtherClass = typeof(OtherClass) -``` - -`keyof` will give you `"Foo" | "Hello"` while `rawkeyof` -will give you only `"Hello"`. This would then let you use indexing and `rawget` -appropriately in a type-safe way for the motivating style of dynamic code. - -The remaining bit of complexity is the question of what to do for types that do -not necessarily have one consistent set of keys. For instance, if you consider -the type `{ x: number, y: number } | { a: number, y: number }`, you might wonder -what you would get out of `keyof`. One reasonable answer is `"y"` since that is -the greatest common subset of keys present in the components of the union. -Another reasonable, albeit more conservative, answer is to simply say that the -operator fails to resolve in this situation. This RFC proposes that we return -the greatest common subset of keys since this corresponds to the set of keys -that are allowed by indexing operations on tables of that type. - -## Drawbacks - -The main drawbacks of implementing this are that it requires some pretty -powerful machinery to support properly. Fortunately, however, we've already -built the general machinery to support type functions into the ongoing work on -the new type inference engine for Luau, and as such, there is little remaining -drawback to implementing this. In fact, the implementation is already all done -in the new type inference engine and amounts to less than 200 lines of code -including comments. So, beyond looking for motivating examples for potentially -computing the greatest common subset of keys for unions of tables and the small -amount of work that implementing that might entail, the author of this RFC hopes -that this effort is simply an easy win for OOP in Luau supported by the -technical credit built up by implementing the new type inference engine. - -## Alternatives - -The main alternative designs are, in a sense, discussed in the design section. -We could simply choose to offer only one of `keyof` and `rawkeyof` in -order to keep things simpler, but both have corresponding operations in the -language, and seem useful, and almost all of the work to implement them is -shared. So, doing less here doesn't really save us anything. The other -alternative is surrounding the choice of what to do when the set of keys are not -identical across unions of tables. The proposal here was to provide the greatest -common subset of keys, but the alternative of failing to reduce and thus -producing a type error seems perfectly reasonable as well. diff --git a/.cursor/rules/luau-rfcs/len-metamethod-rawlen.md b/.cursor/rules/luau-rfcs/len-metamethod-rawlen.md deleted file mode 100644 index 60278dda..00000000 --- a/.cursor/rules/luau-rfcs/len-metamethod-rawlen.md +++ /dev/null @@ -1,45 +0,0 @@ -# Support `__len` metamethod for tables and `rawlen` function - -**Status**: Implemented - -## Summary - -`__len` metamethod will be called by `#` operator on tables, matching Lua 5.2 - -## Motivation - -Lua 5.1 invokes `__len` only on userdata objects, whereas Lua 5.2 extends this to tables. In addition to making `__len` metamethod more uniform and making Luau -more compatible with later versions of Lua, this has the important advantage which is that it makes it possible to implement an index based container. - -Before `__iter` and `__len` it was possible to implement a custom container using `__index`/`__newindex`, but to iterate through the container a custom function was -necessary, because Luau didn't support generalized iteration, `__pairs`/`__ipairs` from Lua 5.2, or `#` override. - -With generalized iteration, a custom container can implement its own iteration behavior so as long as code uses `for k,v in obj` iteration style, the container can -be interfaced with the same way as a table. However, when the container uses integer indices, manual iteration via `#` would still not work - which is required for some -more complicated algorithms, or even to simply iterate through the container backwards. - -Supporting `__len` would make it possible to implement a custom integer based container that exposes the same interface as a table does. - -## Design - -`#v` will call `__len` metamethod if the object is a table and the metamethod exists; the result of the metamethod will be returned if it's a number (an error will be raised otherwise). - -`table.` functions that implicitly compute table length, such as `table.getn`, `table.insert`, will continue using the actual table length. This is consistent with the -general policy that Luau doesn't support metamethods in `table.` functions. - -A new function, `rawlen(v)`, will be added to the standard library; given a string or a table, it will return the length of the object without calling any metamethods. -The new function has the previous behavior of `#` operator with the exception of not supporting userdata inputs, as userdata doesn't have an inherent definition of length. - -## Drawbacks - -`#` is an operator that is used frequently and as such an extra metatable check here may impact performance. However, `#` is usually called on tables without metatables, -and even when it is, using the existing metamethod-absence-caching approach we use for many other metamethods a test version of the change to support `__len` shows no -statistically significant difference on existing benchmark suite. This does complicate the `#` computation a little more which may affect JIT as well, but even if the -table doesn't have a metatable the process of computing `#` involves a series of condition checks and as such will likely require slow paths anyway. - -This is technically changing semantics of `#` when called on tables with an existing `__len` metamethod, and as such has a potential to change behavior of an existing valid program. -That said, it's unlikely that any table would have a metatable with `__len` metamethod as outside of userdata it would not anything, and this drawback is not feasible to resolve with any alternate version of the proposal. - -## Alternatives - -Do not implement `__len`. diff --git a/.cursor/rules/luau-rfcs/local-type-inference.md b/.cursor/rules/luau-rfcs/local-type-inference.md deleted file mode 100644 index 209f7f03..00000000 --- a/.cursor/rules/luau-rfcs/local-type-inference.md +++ /dev/null @@ -1,180 +0,0 @@ -# Local Type Inference - -## Summary - -We are going to supplant the current type solver with one based on Benjamin Pierce's Local Type Inference algorithm: - -https://www.cis.upenn.edu/~bcpierce/papers/lti-toplas.pdf - -## Motivation - -Luau's type inference algorithm is used for much more than typechecking scripts. It is also the backbone of an autocomplete algorithm which has to work even for people who don't know what types or type systems are. - -We originally implemented nonstrict mode by making some tactical adjustments to the type inference algorithm. This was great for reducing false positives in untyped code, but carried with it the drawback that the inference result was usually not good enough for the autocomplete system. In order to offer a high quality experience, we've found ourselves to run type inference on nonstrict scripts twice: once for error feedback, and once again to populate the autocomplete database. - -Separately, we would also like more accurate type inference in general. Our current type solver jumps to conclusions a little bit too quickly. For example, it cannot infer an accurate type for an ordinary search function: - -```luau -function index_of(tbl, el) - for i = 0, #tbl do - if tbl[i] == el then - return i - end - end - return nil -end -``` - -Our solver sees two `return` statements and assumes that, because the first statement yields a `number`, so too must the second. - -To fix this, we are going to move to an architecture where type inference and type checking are two separate steps. Whatever mode the user is programming with, we will run an accurate type inference pass over their code and then run one of two typechecking passes over it. - -## Notation - -We'll use the standard notation `A <: B` to indicate that `A` is a subtype of `B`. - -## Design - -At a very high level, local type inference is built around the idea that we track the lower bounds and their upper bounds. The lower bounds of a binding is the set of values that it might conceivably receive. If a binding receives a value outside of its upper bounds, the program will fail. - -At the implementation level, we reencode free types as the space between these bounds. - -Upper bounds arise only from type annotations and certain builtin operations whereas lower bounds arise from assignments, return statements, and uses. - -Free types all start out with bounds `never <: 't <: unknown`. Intuitively, we say that `'t` represents some set of values whose domain is at least `never` and at most `unknown`. This naturally could be any value at all. - -When dispatching a constraint `T <: 't`, we replace the lower bounds of `'t` by the union of its old lower bounds and `T`. When dispatching a constraint `'t <: T`, we replace the upper bounds by its upper bound intersected with `T`. In other words, lower bounds grow from nothing as we see the value used whereas the upper bound initially encompasses everything and shrinks as we constrain it. - -### Constraint Generation Rules - -A return statement expands the lower bounds of the enclosing function's return type. - -```luau -function f(): R - local x: X - return x - -- X <: R -end -``` - -An assignment adds to the lower bounds of the assignee. - -```luau -local a: A -local b: B -a = b --- B <: A -``` - -A function call adds to the upper bounds of the function being called. - -Equivalently, passing a value to a function adds to the upper bounds of that value and to the lower bounds of its return value. - -```luau -local g -local h: H -local j = g(h) --- G <: (H) -> I... --- I... <: J -``` - -Property access is a constraint on a value's upper bounds. -```luau -local a: A -a.b = 2 --- A <: {b: number} - -a[1] = 3 --- A <: {number} -``` - -### Generalization - -Generalization is the process by which we infer that a function argument is generic. Broadly speaking, we solve constraints that arise from the function interior, we scan the signature of the function for types that are unconstrained, and we replace those types with generics. This much is all unchanged from the old solver. - -Unlike with the old solver, we never bind free types when dispatching a subtype constraint under local type inference. We only bind free types during generalization. - -If a type only appears in covariant positions in the function's signature, we can replace it by its lower bound. If it only appears in contravariant positions, we replace it by its upper bound. If it appears in both, we'll need to implement bounded generics to get it right. This is beyond the scope of this RFC. - -If a free type has neither upper nor lower bounds, we replace it with a generic. - -Some simple examples: - -```luau -function print_number(n: number) print(n) end - -function f(n) - print_number(n) -end -``` - -We arrive at the solution `never <: 'n <: number`. When we generalize, we can replace `'n` by its upper bound, namely `number`. We infer `f : (number) -> ()`. - -Next example: - -```luau -function index_of(tbl, el) -- index_of : ('a, 'b) -> 'r - for i = 0, #tbl do -- i : number - if tbl[i] == el then -- 'a <: {'c} - return i -- number <: 'r - end - end - return nil -- nil <: 'r -end -``` - -When typechecking this function, we have two constraints on `'r`, the return type. We can combine these constraints by taking the union of the lower bounds, leading us to `number | nil <: 'r <: unknown`. The type `'r` only appears in the return type of the function. The return type of this function is `number | nil`. - -At runtime, Luau allows any two values to be compared. Comparisons of values of mismatched types always return `false`. We therefore cannot produce any interesting constraints about `'b` or `'c`. - -We end up with these bounds: - -``` -never <: 'a <: {'c} -never <: 'b <: unknown -never <: 'c <: unknown -number | nil <: 'r <: unknown -``` - -`'a` appears in the argument position, so we replace it with its upper bound `{'c}`. `'b` and `'c` have no constraints at all so they are replaced by generics `B` and `C`. `'r` appears only in the return position and so is replaced by its lower bound `number | nil`. - -The final inferred type of `index_of` is `({C}, B) -> number | nil`. - -## Drawbacks - -This algorithm requires that we create a lot of union and intersection types. We need to be able to consistently pare down degenerate unions like `number | number`. - -Local type inference is also more permissive than what we have been doing up until now. For instance, the following is perfectly fine: - -```luau -local x = nil -if something then - x = 41 -else - x = "fourty one" -end -``` - -We'll infer `x : number | string | nil`. If the user wishes to constrain a value more tightly, they will have to write an annotation. - -## Alternatives - -### What TypeScript does - -TypeScript very clearly makes it work in what we would call a strict mode context, but we need more in order to offer a high quality nonstrict mode. For instance, TypeScript's autocomplete is completely helpless in the face of this code fragment: - -```ts -let x = null; -x = {a: "a", b: "pickles"}; -x. -``` - -TypeScript will complain that the assignment to `x` is illegal because `x` has type `null`. It will further offer no autocomplete suggestions at all when the user types the final `.`. - -It's not viable for us to require users to write type annotations. Many of our users do not yet know what types are but we are nevertheless committed to providing them a tool that is helpful to them. - -### Success Typing - -Success typing is the algorithm used by the Dialyzer inference engine for Erlang. Instead of attempting to prove that values always flow in sensible ways, it tries to prove that values _could_ flow in sensible ways. - -Success typing is quite nice in that it's very forgiving and can draw surprisingly useful information from untyped code, but that forgiving nature works against us in the case of strict mode. diff --git a/.cursor/rules/luau-rfcs/lower-bounds-calculation.md b/.cursor/rules/luau-rfcs/lower-bounds-calculation.md deleted file mode 100644 index 93aaa016..00000000 --- a/.cursor/rules/luau-rfcs/lower-bounds-calculation.md +++ /dev/null @@ -1,219 +0,0 @@ -# Lower Bounds Calculation - -**Status**: Abandoned in favor of a future design for full local inference - -## Summary - -We propose adapting lower bounds calculation from Pierce's Local Type Inference paper into the Luau type inference algorithm. - -https://www.cis.upenn.edu/~bcpierce/papers/lti-toplas.pdf - -## Motivation - -There are a number of important scenarios that occur where Luau cannot infer a sensible type without annotations. - -Many of these revolve around type variables that occur in contravariant positions. - -### Function Return Types - -A very common thing to write in Luau is a function to try to find something in some data structure. These functions habitually return the relevant datum when it is successfully found, or `nil` in the case that it cannot. For instance: - -```luau --- A.lua -function find_first_if(vec, f) - for i, e in ipairs(vec) do - if f(e) then - return i - end - end - - return nil -end -``` - -This function has two `return` statements: One returns `number` and the other `nil`. Today, Luau flags this as an error. We ask authors to add a return annotation to make this error go away. - -We would like to automatically infer `find_first_if : ({T}, (T) -> boolean) -> number?`. - -Higher order functions also present a similar problem. - -```luau --- B.lua -function foo(f) - f(5) - f("string") -end -``` - -There is nothing wrong with the implementation of `foo` here, but Luau fails to typecheck it all the same because `f` is used in an inconsistent way. This too can be worked around by introducing a type annotation for `f`. - -The fact that the return type of `f` is never used confounds things a little, but for now it would be a big improvement if we inferred `f : ((number | string) -> T...) -> ()`. - -## Design - -We introduce a new kind of TypeVar, `ConstrainedTypeVar` to represent a TypeVar whose lower bounds are known. We will never expose syntax for a user to write these types: They only temporarily exist as type inference is being performed. - -When unifying some type with a `ConstrainedTypeVar` we _broaden_ the set of constraints that can be placed upon it. - -It may help to realize that what we have been doing up until now has been _upper bounds calculation_. - -When we `quantify` a function, we will _normalize_ each type and convert each `ConstrainedTypeVar` into a `UnionTypeVar`. - -### Normalization - -When computing lower bounds, we need to have some process by which we reduce types down to a minimal shape and canonicalize them, if only to have a clean way to flush out degenerate unions like `A | A`. Normalization is about reducing union and intersection types to a minimal, canonicalizable shape. - -A normalized union is one where there do not exist two branches on the union where one is a subtype of the other. It is quite straightforward to implement. - -A normalized intersection is a little bit more complicated: - -1. The tables of an intersection are always combined into a single table. Coincident properties are merged into intersections of their own. - * eg `normalize({x: number, y: string} & {y: number, z: number}) == {x: number, y: string & number, z: number}` - * This is recursive. eg `normalize({x: {y: number}} & {x: {y: string}}) == {x: {y: number & string}}` -1. If two functions in the intersection have a subtyping relationship, the normalization results only in the super-type-most function. (more on function subtyping later) - -### Function subtyping relationships - -If we are going to infer intersections of functions, then we need to be very careful about keeping combinatorics under control. We therefore need to be very deliberate about what subtyping rules we have for functions of differing arity. We have some important requirements: - -* We'd like some way to canonicalize intersections of functions, and yet -* optional function arguments are a great feature that we don't want to break - -A very important use case for us is the case where the user is providing a callback to some higher-order function, and that function will be invoked with extra arguments that the original customer doesn't actually care about. For example: - -```luau --- C.lua -function map_array(arr, f) - local result = {} - for i, e in ipairs(arr) do - table.insert(result, f(e, i, arr)) - end - return result -end - -local example = {1, 2, 3, 4} -local example_result = map_array(example, function(i) return i * 2 end) -``` - -This function mirrors the actual `Array.map` function in JavaScript. It is very frequent for users of this function to provide a lambda that only accepts one argument. It would be annoying for callers to be forced to provide a lambda that accepts two unused arguments. This obviously becomes even worse if the function later changes to provide yet more optional information to the callback. - -This use case is very important for Roblox, as we have many APIs that accept callbacks. Implementors of those callbacks frequently omit arguments that they don't care about. - -Here is an example straight out of the Roblox developer documentation. ([full example here](https://developer.roblox.com/en-us/api-reference/event/BasePart/Touched)) - -```luau --- D.lua -local part = script.Parent - -local function blink() - -- ... -end - -part.Touched:Connect(blink) -``` - -The `Touched` event actually passes a single argument: the part that touched the `Instance` in question. In this example, it is omitted from the callback handler. - -We therefore want _oversaturation_ of a function to be allowed, but this combines with optional function arguments to create a problem with soundness. Consider the following: - -```luau --- E.lua -type Callback = (Instance) -> () - -local cb: Callback -function register_callback(c: Callback) - cb = c -end - -function invoke_callback(i: Instance) - cb(i) -end - ---- - -function bad_callback(x: number?) -end - -local obscured: () -> () = bad_callback - -register_callback(obscured) - -function good_callback() -end - -register_callback(good_callback) -``` - -The problem we run into is, if we allow the subtyping rule `(T?) -> () <: () -> ()` and also allow oversaturation of a function, it becomes easy to obscure an argument type and pass the wrong type of value to it. - -Next, consider the following type alias - -```luau --- F.lua -type OldFunctionType = (any, any) -> any -type NewFunctionType = (any) -> any -type FunctionType = OldFunctionType & NewFunctionType -``` - -If we have a subtyping rule `(T0..TN) <: (T0..TN-1)` to permit the function subtyping relationship `(T0..TN-1) -> R <: (T0..TN) -> R`, then the above type alias normalizes to `(any) -> any`. In order to call the two-argument variation, we would need to permit oversaturation, which runs afoul of the soundness hole from the previous example. - -We need a solution here. - -To resolve this, let's reframe things in simpler terms: - -If there is never a subtyping relationship between packs of different length, then we don't have any soundness issues, but we find ourselves unable to register `good_callback`. - -To resolve _that_, consider that we are in truth being a bit hasty when we say `good_callback : () -> ()`. We can pass any number of arguments to this function safely. We could choose to type `good_callback : () -> () & (any) -> () & (any, any) -> () & ...`. Luau already has syntax for this particular sort of infinite intersection: `good_callback : (any...) -> ()`. - -So, we propose some different inference rules for functions: - -1. The AST fragment `function(arg0..argN) ... end` is typed `(T0..TN, any...) -> R` where `arg0..argN : T0..TN` and `R` is the inferred return type of the function body. Function statements are inferred the same way. -1. Type annotations are unchanged. `() -> ()` is still a nullary function. - -For reference, the subtyping rules for unions and functions are unchanged. We include them here for clarity. - -1. `A <: A | B` -1. `B <: A | B` -1. `A | B <: T` if `A <: T` or `B <: T` -1. `T -> R <: U -> S` if `U <: T` and `R <: S` - -We propose new subtyping rules for type packs: - -1. `(T0..TN) <: (U0..UN)` if, for each `T` and `U`, `T <: U` -1. `(U...)` is the same as `() | (U) | (U, U) | (U, U, U) | ...`, therefore -1. `(T0..TN) <: (U...)` if for each `T`, `T <: U`, therefore -1. `(U...) -> R <: (T0..TN) -> R` if for each `T`, `T <: U` - -The important difference is that we remove all subtyping rules that mention options. Functions of different arities are no longer considered subtypes of one another. Optional function arguments are still allowed, but function as a feature of function calls. - -Under these rules, functions of different arities can never be converted to one another, but actual functions are known to be safe to oversaturate with anything, and so gain a type that says so. - -Under these subtyping rules, snippets `C.lua` and `D.lua`, check the way we want: literal functions are implicitly safe to oversaturate, so it is fine to cast them as the necessary callback function type. - -`E.lua` also typechecks the way we need it to: `(Instance) -> () ()` and so `obscured` cannot receive the value `bad_callback`, which prevents it from being passed to `register_callback`. However, `good_callback : (any...) -> ()` and `(any...) -> () <: (Instance) -> ()` and so it is safe to register `good_callback`. - -Snippet `F.lua` is also fixed with this ruleset: There is no subtyping relationship between `(any) -> ()` and `(any, any) -> ()`, so the intersection is not combined under normalization. - -This works, but itself creates some small problems that we need to resolve: - -First, the `...` symbol still needs to be unavailable for functions that have been given this implicit `...any` type. This is actually taken care of in the Luau parser, so no code change is required. - -Secondly, we do not want to silently allow oversaturation of direct calls to a function if we know that the arguments will be ignored. We need to treat these variadic packs differently when unifying for function calls. - -Thirdly, we don't want to display this variadic in the signature if the author doesn't expect to see it. - -We solve these issues by adding a property `bool VariadicTypePack::hidden` to the implementation and switching on it in the above scenarios. The implementation is relatively straightforward for all 3 cases. - -## Drawbacks - -There is a potential cause for concern that we will be inferring unions of functions in cases where we previously did not. Unions are known to be potential sources of performance issues. One possibility is to allow Luau to be less intelligent and have it "give up" and produce less precise types. This would come at the cost of accuracy and soundness. - -If we allow functions to be oversaturated, we are going to miss out on opportunities to warn the user about legitimate problems with their program. I think we will have to work out some kind of special logic to detect when we are oversaturating a function whose exact definition is known and warn on that. - -Allowing indirect function calls to be oversaturated with `nil` values only should be safe, but a little bit unfortunate. As long as we statically know for certain that `nil` is actually a permissible value for that argument position, it should be safe. - -## Alternatives - -If we are willing to sacrifice soundness, we could adopt success typing and come up with an inference algorithm that produces less precise type information. - -We could also technically choose to do nothing, but this has some unpalatable consequences: Something I would like to do in the near future is to have the inference algorithm assume the same `self` type for all methods of a table. This will make inference of common OO patterns dramatically more intuitive and ergonomic, but inference of polymorphic methods requires some kind of lower bounds calculation to work correctly. diff --git a/.cursor/rules/luau-rfcs/luau-mascot.md b/.cursor/rules/luau-rfcs/luau-mascot.md deleted file mode 100644 index 7a92cd0b..00000000 --- a/.cursor/rules/luau-rfcs/luau-mascot.md +++ /dev/null @@ -1,61 +0,0 @@ -# An official mascot for Luau - -**Status**: Implemented - -## Summary - -Luau's branding is currently entirely based around a rotated square logo in a particular shade of blue. -This works well for professional presentation on the website and so forth, but there is a gap for -elements of the brand identity that are more personable and easier for people to identify with. Toward -that end, this RFC proposes Luau adopt an official mascot for the language. - -## Motivation - -The primary motivation is that Luau's current branding consists entirely of a logo, which is relatively -cold and harder for people to identify with. In the Rust community, there's been a lot of success with -[Ferris the crab](https://www.rustacean.net/) as a language mascot, leading to a variety of merchandise -and fanart from the language community. Ferris serves as an icon that Rust users are much happier to -identify with and portray than just the language's logo on its own, especially in less formal settings. -We'd like to be able to provide a mascot that can serve a similar role for Luau! - -## Design - -This RFC proposes that Luau adopt the Hawaiian monk seal as a mascot. There's a few reasons for this -choice. First, we want to have a brand and identity that is more distinct from Lua itself, and -therefore we want to choose a mascot that is _not_ based on the "moon" theme that is central to -Lua's brand identity. Second, Luau's name itself draws from Hawaiian culture since it is named after -a traditional Hawaiaan feast. The Hawaiian monk seal is the state mammal of Hawaii, and one of only -two mammals endemic to the islands. Third, the Hawaiian monk seal is an endangered species and we -can, at a minimum, use the choice of mascot to direct energy towards conservation efforts for this -adorable creature. - -For a concrete mascot design, I commissioned [Alex Mullins (@AlexMarieFina)](https://github.com/AlexMarieFina) -to produce a cartoon-style drawing of a Hawaiian monk seal in Luau's brand blue color. -This mascot is Hina the Seal. - -![Hina the Seal](mascot.png) - -We propose naming her Hina, after the Hawaiian goddess of the moon. The word moon itself in Hawaiian -(_mahina_) is derived from this name, and it pays a small homage to Luau's "moon" roots in Lua -while staying within the existing theme and not being too heavy-handed. - -## Drawbacks - -We may prefer to remain "neutral" and avoid expanding the scope of Luau's branding to leave room for -more organic adoption of a mascot within the community. - -## Alternatives - -In early discussions leading up to my commission, the two most serious suggestions for alternative -animals were rabbits (owing to the eastern cultural tradition of "moon rabbits") and a beluga -(thanks to the pun, "beluauga"). We could get some alternative art proposals for either mascot, but -an obvious downside to the beluga, in particular, is that we would have a blue whale mascot which -conflicts with a certain [already well-known blue whale mascot](https://docker.com). - -Additionally, there was some discussion about naming options. The main thrusts for name suggestions -were broadly in three categories: names starting with L (referencing Lua), names starting with S -(for alliteration with Seal), and names with alignment around the moon and Hawaiian and Polynesian -culture. Notable suggestions from these groups included Luna and Lucy, Sera and Selene, -and Mahina and Hina. This proposal chose `Hina` on the basis of its thematic fit, brevity (single -syllable), and distinctiveness (e.g. Luna is very close to Lune and Luau, Selene is already the name -of a community tool, etc.). diff --git a/.cursor/rules/luau-rfcs/mascot.png b/.cursor/rules/luau-rfcs/mascot.png deleted file mode 100644 index b6c1b9cd319dd0038d59270095e034fecc9efa91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17066 zcmX|p1yt0}`}Kmv(n~ii-6gck|Y8jjThUpTg-wt_%n9@ZUg-ECAtgRdG9*5cWgLHI9wW=ARZG!$Vef|5EXW#qT{8Vz=jts^UZ3EsUY!>Pj-XKru6{F+1?*} zlK@RTDM^U#TRCZ1SEww*Ak;PL$FdxPclsyka1jscsSgO>wOni z_}D&ks^Iha^_Pl@wBg0+A}-M{Z4YunMz{1+^eFtWg*ea_9i(;BP#Z=`^o=OS18$Ua zLnd*hBs-1hJ=i%@;Ls#n+X!>5^zf>c#l=ld*hJ{$gdki_&t6L7ZA*qr&NOo7FM^-k zSp#|lWtv7tYh$`Ey0D-IbSU_6Mhf~io{Ve)3QA*!z@&bnx=bHjiDtilU zn|iBRO6EcuDb;Z4ju;ZO@k}L$6eXeEUWx*`lGW_bLP=wTvn$7VSi3bnIT4eeCdhIM z_f~z7UQ$mlXLKAZ$c`ejK5!16dRZeB5+$H0fGj!a#~x1lOfEnQU%P*!Thzg!%0n16 zHg0#*Wpn3q@zu^lsZzSLv09!^qzXNv*S28DDsaNO6!MGy`Ht3St-BPtI?GrOMGCP( zlGpzH@q8~Q*mPcRKXD4QM2y95=u@TLVtI|zrKA2)u59iKbj=}GtVttM=?|HR7!#co7!-Y(mnq1dJ2}VU2yBtOcWQ^-pm5 zE3-RKj|ZL<9?m?_uUKz*PG%!`kq#BqXQW3Xz(LBJL11H67GHnZZujCFGk*FKT|7ys&s#|xdDUQ2v4rX_k!H2 zSSa<|X09mFz;T^KuiT{L$8~d4?|W~6AWwZ2s7lza5mhcpxx%55WC|f1-Dk> zPJUMr79rJeoYr5>mXC z?=6AyXU+ajT+i^HDLnRGDW0-@kCMmU+<1#LfhI_pkJ8w9lMwxq8s9$UMZhpHEyXOP`Ef1lrBEmP#=%Y<=fDxr~h!nYY7|F?R zlLruSBXaHgb1_j%`fL8_>GB%Y3*<{k$T-A=3kS)!E9*y2rV?+I`CFeOSi)19qv4^X zNnQs6FxO}*o$Qk-7f4F?=o=J#?JcL5kc1#_p#j(T0gFakPvk?SY=gUO`rcRcDbi*W zSEtZreFlM1D59Xm>Jh;Vo#w)!Yuw}b1&P4Qdg1@KoIlANCPm*~L{MKZSgKDx>MlRf zeP+c*QlZb|<&!o(5d@b;=9<@Wl+J{iRSUa4^z{urBu8|Mfu-hiCdNR^6Gh7;9$372 z2y*Pq)wIT(`o3NFg4U;GdqTWD7ce}u(Q7_zwY{>ulNNV(&gzF}r?t-@rn zikYUA2U5l13quz#yR@fGl|e26iz4acPwb>{E(5BLErl5Au+W$N38`+WFq90G?r^nK zkeu({8V|L|oyR zbD^nrn2m@L`2!lise?z_JTxJv$0ku;HSX#W85eAVUErD4vw zQ_ZYfk_#+Pnm6`J6;dk(RVX|(N%r9=IEq1D`im;pDE2zqr;GtgUV1m$F<_ODx%15* z)UK@`Eoj1--0)x9q%JQTReG$enh4TD=FOZ^AIo)1p=9MoN5Iy2gT0=nuo>&HU5kvH zep;E@m`56>;Iq1PQ?6hVU|QS37!W60MC-%>_1pgl^F9sWJ-K~VWuldBOZKGS#ATl7 z5FHklhEg9NrQ_n)kV&SHa=5_g=M`$AORgVhZb8RlJy^3^RH0DJ9GdSqoo)8)AcG$Lj6n5v`PwsR`gv^gYq2BW+Nlo84V$3%-@vzSV$>Ys=y#x|GjVPv*g>d&ygF4OF&#`n9w!a_^?F-FGcCaVX8e~)15g&uGaulbFD zDt4+*F@dGD)397oyYyh$(ss161Wc*=#mE}uVn#4{%CuPSg*#`2su{Q5_2(@9QYhEB zi2%x1$WJ7P(1L}(}%b-e(>u z6jjBjhEuF1{M%8_im z>c#5dU6Muf%U1`jH0#!|wv+;=Sli+0vs<<;(K@De)Sl5__z(G(TD3)uw@M6Hr7onw z8_cECL=y{(ibMm{_uZ6==%LfDo@!!G>w0UPy+oi9S#$5wz-eNkUX(w=k>-+?7U=Y< zC$7h=F|0_)xw>}Y`@T!(LzlYqE+L0!`UBqMF33ga#bLLH+eg-Rsp61*1f9bHJAaOj zj*dl*KGncNYQ!>k%$5h4!!w0B7(~Q>$Lc#qL>7lD8|#llh3!Lc#q!r7hv*A(53U2P zB2&PrU+1~fn?MydszQCOB-?0SZSZDBi|fj|+CWSLo^;XkXu`D-Ga^f+=VM-VqpavP z$EL#JJZ#kKt`RRv;vLD3zTCmv9_PXP??TI(R9>VwK2^~^ZYB%$r zuXZvO<+TN3*3)6U0@bM}t859;)}(Gl&I)D_m-z$-V>{nP*rT-;I?r+&h(8))!D9FG zm3gAxqtZFlA@YbXMEoQe-7m-z)=sWm0?cqCZL7=if9#&+JrpG&SGx?9Uyf3X~D+28z*9|9W-CQ8=D3WJl?N--hc+fLVF#(JuHXV5WcgZk;N{6O4fS=Ow z`PVTb%&5Q# z9(CYKz1^RBFvu)Syu#5O6_Io~yYqy(p8q$9kNJwrcT3Kh#~VDIKkMy}2G^qzM+ph) zt+yRZokM07kWM3NAK@H^i;NFrp5@T*IH$*EoCE#wcQGe*x)T?L{lgdMflCp4bEckg z;lAT@ltlBo9cv;9n0L^eaTNh&B!@a$4g>OFamkGlv!J_+;j*YiVOG;))4x~gk3Yg7 z7?F!s#$v&KvNK;M`#JxTy^(MlG zcpn8i^o|9(R{6R)I^u}W)zBka@aD5yWg93fY3%8`NyT;qY-F@=7Ayp!xix#_YRp&0 zjExDEpR}wl_E^qtn8}@lG7xF0@IuVHy2DM)j9MjsSC&*%Ncs0Y%h`F{9Su51P(qS$ z6F)BMhVg9CQ524%18_-dKn_A;R{XW#;ndK}N2X?!w9c?Lj~Ts2cPu6WX|*m$5cxL~ zub(>f2Yj>kiBD;QSGt#UjWmk?%kvXvZ1rSxtxUxTI^BF+FPfIecBxw#7a7W0AGHFb zg&Vz8n%4Ax;k)Ue27^3H#pSCt{Yb2dp>5@qn)1z*DVKsl5YyP)*KTshSJt z4Y{#Cr@DvgPJ{WmO6|x@i2AR^G=>>9e9U5NEjziXzo9-nQV&5JY7Ux^$(6#X=V6Bt zp!8~f)!TX^QthwSFAf54ovW(+ ztFHb1?%M3HPKQ|-&K-5`Tj|3~+%a?%O-D9vKa;AsuCL|O zR9*eKP}0hZp!!_NYDE7=vZq=Jv`}wx({`$f=;NRp@F7=L?E-g#(dn#0-Mo;E6$l5?}fIln+gKeWkQ%C1~Pie|#hH z+JJq14^r$eN~cmSn~$T8>OU;B=k^kIG4ar{;Bz<%r@ib<2Wv+?!6JYsU72OARXG@_ zB)>&SCPuK4`U2C`s0LDYs;TIEC+5YNP-bKwA1k3UROB1(T3@Jv$x?oK%e8bf@wvZ?8U280Fxf70D75{EY4Lc!P`yJ~8K zKjE!(#R&X_$`VOMP~mp2rK-*v8d`EL`*9^5w9z1Nc4l1T=NW4hEm&BPaxNSIAzd=t z4ULRKU2_hQi>jWkXb_UA+UGB-9KHuF)1nHL-O3TRm|Jg~{sAx9Sm(_Ka&>HY3+6ch zQ`pu6h_UL(aX~mLmp}Rnb5Q0!v!~~q_~nj~^!6Ei(v^%3nYqH_iyiM2nF4}Ig{GW` zir@RVKaiz9B53164JpUzCd|0!B@q4(=bMV87f@lugqzbI{|Z%%8tE}sOcK8k>5PTt z#H1H&%I!O7vk(u(V@Xr+AHEUv=PL3PT=8_5FvdliP42P@uP>B3u)a{eOI~E50F%xh zpPW4WBKTC_81cHWxxS4Goe`k~xP<3gSBA}gizqlob7uRobuvxwewIPn6pTHACi>~MUU_th9z}5P)JPJxI z@REUE;K`hg1UDylml_YhcinG^LXv;Q7-hl#x$Dx=tjQ&7io*p1H%`umn_2%f;l=G1 zrLV8yd3SUol1Gto`s-!_;mbqOTH3Hr1Z;vZ!)8cyhB9>``gtgjJLp*#6 zTPBJW2$jYt=<7~*EQHrjvXfrfb6$NG+lryxUoA}%TC_A^08KfYy-D%k&7pq;3EhpP z3ivSKAbC{^=Qf?$s|guR5;)&=$cus&jMYewm3s7-NTqhG1FoMk*##7dR44GM(F&i9$ zef#7UKP9?2;`+hhBN#Af2M4S03j0&}#I9=gJs9QW*78*fcqii8Fs$$6pAu`{J7Ubk zK?Y`$@mup8P;4^IU-FYv+e60zzW{pF;McoIZE0(%pebbTa#;;FPV-kt#WWHoY$M`o zp3nGz$E=q5>)VJMo}CzAItVG4Zi+w!ku}f;`S1B6dtam~*u{~V+0zk)jFAea_#@7H z40m8X$iLLe&p9`5tF(J#xqe0(L*Kv?KeR zDB*+m&2}H>>QuRQ)uk6k))IypY@WBjE?gXjy)n}a19*O`EiNe^AX5o0eRk@itQ#Lb z!>9;WkFC)g2EXi1(MrYrJ!Vz_1wqr+q>l%p64oS+g`jN{44uzUN~JYanqX z{tyHS%-YyZmRv-MQAoy+jUNvPq->{(vbStE7?c$ z?}|qLw0MoBG!k*n)nQdRVyl~fu#O+R`DG(8_&XEdOoy#hN^#Tx+u5h#XEtZ}qZfRQ z8wZeij+sxV(H>64(&(J%aDW;HFTZ`7dB2NpO0SiAmifR)O5dFILRTrm% zg|IWj`sT!^zEVG2Y9$EWbbjWp!RRFz9iWAlI5ulV-If*6Wtr6GM4MXvvtWA@P|lsL z^~h@Zn{Ul8ppPdCBiIGBsiSid8HIG~PO+D2fB(quCxDPAdlL9CH7>K%a6ty-90Hcn zvqt%%GpvEJmF8pf#&NKpqZ6-c%oVtww@bum;Qf9!^2g=&Jb{seE8YFY6MAZjQQof( z32Sx3TrASKf(ttI91I<~P$6O#uYg?d7RqcY04(r@eIjP@5;uNUQA?aRWTBrT3J>7s zC&pIs*|GEgx*`gm4}VIWNkMGA{KT@?O|~48SsfR^rpkyG@1c>lmnPwys1Zlq z%-TGeTFlbS0c#Z0WeIy|!ME{s(~C83r}prwL8aO`(YMT*9y}}rb;~1@_2tO2)+2~4 zLTeDHB97xzzT>I_m$;am(0!aUbj+}mS#pikW@AFdagipK*3XLzjf+hk(#7zfc`oUT zW!qWbIeM9%-8w-2OTj{RXx(y%l@TYeJoOXmvMv1zG90Nej;x8A^tTckqN?P&ZP2H( zp%&>VwnQi_Q2IK+enq?6J`v>mEmmy(GO9ezrRo_oRQi4Y1!vQet8&L4lPx_(v`o*E zASz_B~FbN>dop=UpB z#sai97K7VjrC;B>o}%EkpXVg3efy}sdTB&yTskq``H#C#^W;ET;aNxQ_!rYrFmHz5 zM$71?^9w}BM8CSe24YOqZLR>k3=a6WA8pcr6Yk0uOk@CTXUAqL(2QL1vD?m{vvkwC zX`PDeE-_rUBfZId{w{uE1JSv;3b|I&9Y8JcD_(}g(R_o5if=%4Kap?|VTVMTe3 z)ikp}eD?0?6Om%r1|ME z`<&JtFY_PY#HRrxESn{<^?drG$M0BKR_saD?DZV1>sS5@V^i6U@q~ak(G;MNoA+}B z|6S^N1BkT4n+f68MT60~3Y$GfP_&P4w5I$|-)pqYBCTd&Vo3kToi4IpwH=Qih$Q5v zZsRLTBIvA?rbH7@&^FqILJo^D7|sC@>nV^h!C_qzV&Q+s5G$^{|OqVs|I}tR9Aq1S|3FU z_D0I0MukW49quq(K=$c`d4xFGvO9`Y*u&6TX5~oL{mK_)%@qlW@Q6r*!hhk$2ib)`*KJc>K7m$u>A402aO=s$>d* z_6a~kG#gI`zx|&VARbf#ZpxZR1A=4`d|+&JbJAo~nIUgTO2{}&R0bgh3oBL45K#0>%?cj0H<=|Jy-Zl_t8C@daIS&jA{qkk&bnn|D3q~*P^MJo99>Y6 zO)}?|X%MupM9`xO^Ac553kF7awDJ6;dj$`2(?m|FET;IDE3SYdHP|a?#TEMqOD}(f zmxfd%k2G_9q8Q`Bcoqw^d;-W(Zz3Cx`zj-AEIdXj*ZpGf?>FiefYm@)Nr|T}|)D(o7QoG-! zFSf40P8J@(#K<2K;8BYAzyKim=zeX-Q%pS$1|2PNoNJP5Mk*Tf{|kN4-b6fb(fu>c z{=sN(Wa&jNLTl3x=08Aje^g{CKr1;?i!FnK?IrWfs0n8<9!xU#8#H ztiQ8Q;TxL<(iN~k(0hH+j__MERuKGe&I4A)(t?Ltu>qQp9hR%~j@22`1Fj5KoaSG!AJUL;m@j*zQ zI7$I>&D(O5WZO}NJmOK0>j&F+o`SMHT?^Tj|K%)#mnxZ@_k5bv%EG}>Vln!Y#m5;h zyG<<|<#QXN!kD=++WE&L{Qqwsz zifal$Tjptw1b$_DWL=)F~{NVDle{7)NpNQcen4|$but+lmI1V5IYft)XYWDHP5+PfL8_*#$W zV@msfOlpyizKDHXZ=MqcMu`9cfBZ_8guYGx{qu_-iHm=c6wKIDaW$4jxC_pH!G7jj zVVaHVB8%h`4Za{N!tHdqsxjd$xXSRB+3Az{elsb$ndh0XMpe>S+WZk30#62Wa>IyX zanD9Yn^*Zl-K7sRITv5Na_RU@_0UE<{sRBok<>h^oL4MW&Uq8(tw~}Nod3J}a?DXCpBAvqfIR@cSdy9tnr0JyYkiZ} z$Tl=2idUN@##d`^sbxWn?iOT>{Qbe$3q^Teu)vZl8F!sEM;-m>uKCxOzrWKl6v(^} zP%9vi7WAa{c8-7CLZ=>X_v9nczkxSuJ50ysg> z=Dzu&mh~2r)qtQ39oWpbI3$}#q4FT|e9p`n@%ovdp+;){^Cj->J&1Q#O#;VTv5(Al zy#hP3go{PDI^eOE8XYO2prkcbX4;Qde|EdQ0nSovxNd`}KF zPtz>KISgTV4kY}>NB&$uM09p~k}2NlTXom+y9r2F`~zxo zITm=qEw0o+J-=5>uUh7VA?h4ibuGz|M8`)2aMu_2j1xtK+MkzvIH3b@-v#mYTNm8V zmBx}e=_0a)FY=}2@Dl5!3V!za(+4i>QF5`XD#2tKzk%ch3|O+2sTl9vT&A$P6o2{f z?zFUdYkUyL3L=d~cO%UM4h9h+J2GtZ3xTibR^gVwA%Iqmx8_7ei)C&|X;C6xvV~Ur z325W85+`IpR`8xnl}V;cu^j3tT;Zm}uiA=BklU*uswQoy7E`}MT%#SuN>W623ogNB!Bh;Vb~;TrEb%L|7A%)*BK!OJfW z#@g5KcF@1=Xp4f{mg}P`(@!c7Ls^jqdj&E%q9%F6(&^yK<<3(-Mttm4!EVs$1Dei# z_ge=bHq*oBG(p3{>s-+ZB>unXt;nBQc;3WQHxgoRZ>pKp>v-a(3O1jtVG=tDnIz#p z6{SVtq?qKt{`r%F%z+4-1={@(Z=IWfI_I{Is>C?)cfE#?|1v!p&?~*I)ZT0KIiy8s z9PeBLc?qQ3Z*&g8-NU(fmZ!l7ZE;cj^8U(UFqPT3;uSv5#6$7iMV$mCMt=?96hJOj zWP~ETKtt$iV_!2Eetc3Y(WvV`_PbK5ufZ&;{|{CSO!$@mptxTaXk0?}<`P{upOFIY zrFcMhXG+5jdk~4xKKS{TV^< z{b#v(st-l$G@=3>T7>n`LplyJ$oOVt>?B>9cc>vkYunE}ADcY{-pY8HHy}HJetyv3 z)8LC5C}H>aD^vQDy(UMeHTrHu5P>5n2`P3HMD-N@_W<1|HsPH>%@2^!+kCF)SVb&)S~u=1tyc=CqF+^|u| zVU=v<-pMdYM>Rkr-R|&48Yb&p1ke*H>Gbx4RT8>jT}{G$Aj-Oh$ECQ< zmaK3_I*dSalIv?wjtHZ)(jiXguUvfN;EXUphqC?b~BPpv+ zv#H<&%y4t&aUxU0n|d(Pc|pAUf&xfTR@SzPU(Xc^Woiv{Jg4deAWFt-qtnh$v$Fy2 zD>D0|m{tR__)hiP#h#Do#)e;8oM!gJiVzdVSM@{R2vP9A%qM7gkiT=nQz=#eEVWz3 z-0=KDeu=H7F+j~`fYGP7V`{gR^A=#l*0VxhzDLFHT4oYT5pq zKTW3>A9L5l0U$8c+N^gveW)u!%Uf?|d%|}QRsjn%DANq*9f!PlZ*{}yinkaS`7kTzN%oscYCTa=J((eTcmB`P&%AY*s z2`6CM&SRp9Z(?J>CYxE6V|Su+JQyFHgfRYXUq^ry7{^29=&|I>A>xvgA({mPp}eG? z>P!N^jYssHyv#pK;o$_#SQo*`{{A@uz{S#*;M3hhneA$g8tli0h7>`)KQC4f=ceu- zK|eS+ZQVJbA7NP;q_>vsb{PAhlk`%H2OO!W<$Jq^-pyWG3X&}+MK?lrCPGzD?tVxH zLycyKQl#;#kZ{YK;IjKe7H+ z9}H_6-(@2QWQf9^r<1oq?F85=50dmLoqx|uBe{aXaheV;cHP4LHY7K3Vr-!cgmYN~ zVC_PWCctvFCEWWa0Eb`LlNqKR6$DK!L{cn|w>-FgUyc)Uc&}FjON5SUl8cJ=XHK-YOtC z_^<%UyIe?;-bQ567Q! zZO0hh4**gBr9N0Q3}Aq_5{W1UqtO#3uMjm+F0dXw< z!rei0RtmNv4{)k&i#v@Ob=BKf60C16haNmWa&;$DJMksS0~>MA#3@D2Az79FO0CV0 zw6&6c?#SsMz`>oEPCn%UD93we*?c_nJdngP>^nSNpR(0}x;jrS7`sY~FAEN-x1(jW zdn0v_Qt>;Tl-yXfWjn`z2AK&XnAAly*vscef=+@T`bi^~&TONTyk*fa0hVpD>*xD0 zp(4OfS0e=I?69JVSE21BAyKmT9-a6D@wDM-ug?EOv()lyUZ#6f*=0h!+ehWFpCW4G zasm+0j%bS%E+cn_P!DX4M8b6$fr{3SW3~#+vCrznK@H^{y%eNa`xMeD+HFP@vKZ7K zg0#f}OuRdQ)=DHMNn74Hsc$ZigwvA)X&2ZVKCj+$aPA3yA@jX-alkUVP%807kPamT zP8O7aK!RZRl%rLTymt7pAtY7)bQZ>XRR`)=k z8oLYPPIA978`wcdXO@^TgkfiZYjQcCnycl*1I26h8hKhH97e9Ev26Pz)=j#~AT^mF z4^F`hQOFu#WmSiD(E$dM>Sh?tpv>~#3YWlvAQhqhpADz*qR-%PPb!3&OcEM}2I0ki zMG;hNH_=)jg8T{vA7%dUmwS;l{c{X~t~>mnUns~jMPXfC4=KIEb0u4Ni<`nN6-_c_ z6$RfR*)Rp{nvULHfrvuVp}7gfkEdi3&aD)d?Loo3VqY@p@y|S!-00z#q*(8^Pu%XXuD6fn{l57Z5TasztUB(h=cDe)>Cnv6pJ_`m!bX_*5UTF)&d$*fvt9{W9kzotv{`h10JeT@l-;fQ6Z=U-+F7!SE z@()Kuu6NufUSDb`!!C2j#fSlYShv}rRU4CYZv#3=Y+o6zg#;}jvErcacE1mjWq{>* zua@*}3G)(vzA9XKjNPZ!D>ACK|0w+2)0x0T!-h|4E3`!f-J|#{8)Oua>zBVhXb}@k zE=P7YnL>SG-M*4$dw-LGhse~q<-AuXc7kUjD$`%*2uFBo?Q|_;scUI*iGhLx_~MKa zS+`L7Ef5#uK30(q9~hEL2lt2%ymSU4dwuS``)!wk8SUabYFC%+hpBRfXB@}0RdO;> zI^}3QBt2p#cUu~?J>y@M8W(tQKEByM?!L@N7o)B4(z3#gBMcMwRz{tk+etE%1qcq9 zUSs|#CeJkI=gvq@y($A@o2$f+*8^$^NuFB_a7@5NCo3Z&gU;dxHanAqFw*iP^D!PE zo6bY~L-MO)eEW3FKfq7=)Kst*L^s&`Oh0@97Xa@0R_bIVZay3!RUi`(fWrhDrp`Jc z#N1@iZdzH}BDRXTaL`^?loA@6Rs5Pb>&Z9o!`X*X6aKoJBg_QF2pYIOJW+rB#I-;iErYgW@2jxQxYpQ1T= zcwDmMj($MBQ{}>{hkX9b8UsX&Iizd(?f!eJahP|g>_Rqo5VgOghE8fLG4i>9S|3AG z8OABGQJV+ScC-oWkc?pC9u_x(u9tfVLNv6%`(nk;n1)x0u&kT~ihP4ls6+Jz-a<_b$*LCJZKk{A$$Wun8e`)h8}N*L-;wgOcYWuP(q&_m22&WU5f(NNU}EtGGf`h#NnPGxWi<>ccT07- zhCsRg??Os*1?XU0=X@4qs#~c2ns+>#-i2NAQVo3BpQVlou^7m5(X@X6e!q3ADhyZv zp|n^bJVfy-NANQK8Oy&7O$SV>&m%f$1R~Djwx#V-s7m3u%}h-k$&~* z#o>NnJHp*p45S$C{9pJqQD}#jhZRzgLvEVkP!$)-iDs@LBPRw5y-TsE0UC-3tj${$ z_x;~#DPJ*5*@dZlNB8gs)N=V zu?(x;Xfi8{CJ8=oEnagFaRD6j2It&w{s4f9FWfT8!NryBY5;%cU4fMJq_*g*)|4^yQvd{t$1%lTgXumQYs#cam44Knx2yuuwfrGOEz2Z$<&OPx}o;DkM6PB<*HSpfUkYFXOE?$uh89xE0I_;5`ij_1R z1DD2cB10c=jZ+_{`;cU>ZyORRCNPg*Di;hG=lP3G@%xF@ZiY_Z<-nl_#kYGp+V%`- zI}c9=76K?fb$uooC5rgj>E&9!4*VdtCxVocY>ayfG+(bsmRz)V|PNB=>V0p-vq(WMW=ih>%slTd@J-~ar@ z+Os;O8;7iA(RSjdC}44^A$*bh&{cW-%BXM|?QOVC^@9~uzEjprsB z61q~oAc;Zw+~W^xqgLmGJr=%g!n;wZOmei~52=AK+DM&b;m#*C(T*tU3UdDeG;h$G zGR=!+!bbNEt`C<3Y233^;)l2{%hUh`+#9RC`WcAM$Abf0(c01^i=zOF1Gg_gm)z`_ zg)8o<90nEY%Y4|ehgFFoUv5^=;sq&=wIZUbaG-}in))of8(P(Je_qoo4v zaWZz*my1>Vzk!X2@c8cjbd8P_!JkC5X&Pr|Z?DPmTkQ$3Jb)`AM1U(QZb0i6PM?tv zGLE!Rna$(+UNycq6TNV@iIyi(+ADB<>+=4LseP53=Kiy-j1u!UINg6X;q==W`n94P zMM21C4W?AV)sLtuT{SwaE|q)$KU;i;|Af?c;=Q;Bm;ljxHRwHmc0Z_qNW5C_?*aRG(a!m>3E2688}n3f}O{E>gmuMs%~mq%m&38)10#gizvTFLWJ& z=&TspHf2E@V9Qz`lj&H0W7`&pT^NlfIkqSWy2D;qV?ZQL$#7yv-{$Hz`_fKZgdx!} zP_)xOsT6-t&A}&txw`K=^?$(B=pgGQuS6HWVm; z;_aa%tc`B961@n{z>(nZ1!vjy-A6h)e;^hHxRyJ)OOxt0(+}ir{h}xN z-(sLaRU7S9Yy1vbTnTqMp8KYvp};GXs`8AEgCPz+F^<$l&;Q8(FBknN5y^3z4;t<5Q{MzI$E>SIn5*(2(ITls}QIbYhbZgF&(a)F6W1X z&JPo_(UW-Upzj6PPd7d{2;|QBFyuaZQkU$4)h8U1sLGry`~lUhQSakz473710o5Xl z_=3g*A2rM7?}H){BrNBRznP)lTlSrD{OC|}2re|o!9sRDk(40L?-}7iF_(%FVGJVJ zm#f6BPtSZe^FA$qn^$|QG8cB_Mi6@#F3TVdGd6y|EZ0k;>+VEG{xad#=dfhba}xfI zAudeDh-imvLo>8%FdX=GRvCFm2jl;$Q1{}wcWfL^&sNltlVL=9Dq?XVO}(N@EBWRY z1qZ^ZED?5(L!@df`A$TcIHrl6@P9Q7{0zv8vQ*eT=}3(QW+TE?y?b9&d`#402|zmE z68D9$l;R>lKMufaLA)Q?4L`H@JOlGTBZRW(JTCm*D)AefXf*sctQZQw`~WWJEbf-= zzH8smzfmN+wXNi8F4;tn7cDs z+ejs0hV%keU(uFM^<}}`$9s?fdZI3~^aK!c>nIHPk{A~wqpgLQohSrxi>L+^vQ^*) z?KH$ncoCQprLGf6BUHNUUd4v{b7>eahQlidVCG^y_l$aY1L1w@Iy8u2b2b@Tqg=g`nou;Yb50j7J9<|$jalZaFy&-&v6I|Yg!G&%HZ<)8BhbiRgERN zsv-FqOP|LNM;!t;?A9r?CP90!V59cGk}^GSU1)ASC1X)V9Jr$fPQ&4k1Y+(SDMtyY z8GHf`6}fbEjO?Ci1$+JE@M28tnetU^T*?G)JE^{qx70f>_M@W3-haLpaJ%x;huv7r zKhT`}cd`JXIoQkKOZ$qw)?A*sb<`^MemPy!j^n*!yTNYWP9&ZOx1)lH<;T4zv|a)_ z!EygK@-WH2cB~G5g*K@vsvZpvcr0BM?2)2ZA9aJ51QToX{tb@$q^W!=%8OOt_EqM{ zI`{FgO7SoB6=9(LuOMk~bNs6^6Tl^@;lvT{P~rpmkqhvW zb-;9$yVCr{Kc%8&;e_p<@h3&J?=tyzC(oyaMzZiw&ZwNA^xkJ64*&hFox*9A+Vj2# zN)pEe9xg~w#V1s~j+;r7&)*3E*QjgEEme#QRQroy*a0glFC|TH57tkla^^00HxiKM zp%9kg9_;Y+Nc2%;UL83heC~TPN|_h?A!X~YmH1Ovl1|TB?kJZ~U`Y^=glcAXdPUZI zMOP5E4}GbHccb^mWt=iU7mB{_B3N@??u F{|9b<1oHp@ diff --git a/.cursor/rules/luau-rfcs/math-constants.md b/.cursor/rules/luau-rfcs/math-constants.md deleted file mode 100644 index 897b43fb..00000000 --- a/.cursor/rules/luau-rfcs/math-constants.md +++ /dev/null @@ -1,56 +0,0 @@ -# Math constants - -## Summary - -Expand the constants provided in the `math` library. - -## Motivation - -With the introduction of [`math.isnan`](https://rfcs.luau.org/math-isnan-isfinite-isinf.html), Luau has the opportunity to add a new constant representing `NaN` (Not a Number). -As linting support for Luau continues becoming more robust, we can discourage patterns like `0/0` to generate `NaN` and instead provide the constant directly through the math library. - -Without the `math.isnan` API, this could have created confusion in the past: -```luau -if maybeNan == math.nan do - print("This line will never be hit: comparing to NaN always returns false.") -end -``` - -With the new API, however, this is now easier to use: -```luau -local maybeNan = math.nan -if math.isnan(maybeNan) do - print("This line will be hit!") -end -``` - -While adding `NaN`, we also have an opportunity to modernize the set of constants available through the `math` library. -Some history: -- Lua 5.0 (2003) introduced `math.pi`, representing the mathematical constant $\pi$. -- Lua 5.1 (2006) introduced `math.huge`, mapping directly to infinity as defined by the [IEEE 754 standard](https://en.wikipedia.org/wiki/IEEE_754). -- Lua 5.3 (2015) introduced integers and the `math.maxinteger` and `math.mininteger` constants alongside them. - -Luau currently only supports `math.pi` and `math.huge`. -Integer types are not supported in Luau, so `math.maxinteger` and `math.mininteger` wouldn't make much sense, but adding other commonly used constants would be an easy value-add for users of the language. - -## Design - -In addition to `math.pi` and `math.huge`, we propose adding the following constants. - -- `math.nan`: some `NaN` value as defined by IEEE 754. - - The exact representation (payload and sign) is unspecified. - - Comparing to `math.nan` will always return `false`; lint rules recommend using `math.isnan`. -- `math.e`: the mathematical constant $e = 2.71828182845904523536$. -- `math.phi`: the golden ratio, defined as $\phi = 1.61803398874989484820$. -- `math.sqrt2`: the square root of `2`, defined as equal to `math.sqrt(2)`. -- `math.tau`: the mathematical constant $\tau$, defined as equal to `2 * math.pi`. -## Drawbacks - -- The semantics of `math.nan` are unique and somewhat unexpected for users not already familiar with IEEE 754's floating-point arithmetic rules. -- Adding new constants increases the API surface of the `math` library and diverges further from Lua 5.1. - -## Alternatives - -- Do nothing: continue requiring users to define their own constants (e.g., `local nan = 0/0`, `local e = math.exp(1)`). -- Only add `math.nan` without the additional constants, deferring modernization for a future RFC. -- Rely on these constants being provided through external libraries. diff --git a/.cursor/rules/luau-rfcs/math-isnan-isfinite-isinf.md b/.cursor/rules/luau-rfcs/math-isnan-isfinite-isinf.md deleted file mode 100644 index d7618a4d..00000000 --- a/.cursor/rules/luau-rfcs/math-isnan-isfinite-isinf.md +++ /dev/null @@ -1,96 +0,0 @@ -# math.isnan, math.isinf and math.isfinite for Math Library - -**Status**: Implemented - -## Summary - -This RFC proposes a `math.isnan`, a `math.isinf`, and a `math.isfinite` function to be added to the math library. -These functions will validate that numbers are not NaN and are "finite" (non-NaN non-inf valid numbers) -respectively. - -## Motivation - -Currently, determinating if a value is `NaN` requires non-obvious and non-semantic check `x ~= x`. Determining if -a number is finite requires a verbose check that handles both `NaN` and `Inf` cases, typically like `x == x` -& `math.abs(x) ~= math.huge`. Checking specifically for Infinity also requires a manual check like -`math.abs(x) == math.huge`. - -Adding explicit `math.isnan(x)`, `math.isinf(x)` and `math.isfinite(x)` functions brings Luau's math library -in line with modern languages (such as C++, JavaScript, Python, etc), improving code clarity, robustness and -safety for mathemetical applications. In networked environments, validating numbers received from the client is a -must and applicable across most games. - -## Design - -We propose adding three new functions to the global `math` table: - - -`math.isnan(x: number): boolean` - -Returns `true` if `x` is Not-a-Number (`NaN`), and false otherwise. - -**Example:** -```luau -local x = 0 / 0 -- produces NaN -local y = 10 - -print(math.isnan(x)) -- true -print(math.isnan(y)) -- false -``` - -`math.isinf(x: number): boolean` - - -Returns `true` if `x` is positive or negative infinity (`Inf`), and `false` otherwise. - -**Example:** -```luau -local x = math.huge -local y = 10 - -print(math.isinf(x)) -- true -print(math.isinf(y)) -- false -print(math.isinf(0 / 0)) -- false (NaN) - -``` - - -`math.isfinite(x: number): boolean` - -Returns `true` if `x` is a finite number, meaning it is neither `NaN` nor positive or negative infinity -(`math.huge`). - -**Example:** -```luau -local x = math.huge -local y = 0 / 0 -local z = 123.45 - -print(math.isfinite(x)) -- false -print(math.isfinite(y)) -- false -print(math.isfinite(z)) -- true -``` - - -## Drawbacks - -1. Increased API: This proposal adds three new functions to the global `math` library, increasing the overall - size of the standard library. -2. Redundancy for experienced developers: Experienced developers familiary with these checks, may view these - functions as unnecessary syntactic sugar for the already fast and idiomatic check `x ~= x` and - `math.abs(x) ~= math.huge`. - -## Alternatives - -### **Alternative 1: Status Quo** - -**Proposal:** Do not add new functions. Continue to rely on checks for both. - -**Rejection:** This sacrifices clarity and developer experience for the sake of library minimalism. The lack of -standard functions makes code more brittle and harder to read, especially for newcomes to Luau. - -### **Alternative 2: Only add `math.isfinite`** - -**Proposal:** Only add the primary utility check, `math.isfinite(x)`, as it covers the most common use case -(checking if a number is safe). Users could rely on idioms (`x ~= x`) for `NaN` and (`math.abs(x) == math.huge`) -for `Inf`. diff --git a/.cursor/rules/luau-rfcs/metatable-type-functions.md b/.cursor/rules/luau-rfcs/metatable-type-functions.md deleted file mode 100644 index 3c18208c..00000000 --- a/.cursor/rules/luau-rfcs/metatable-type-functions.md +++ /dev/null @@ -1,90 +0,0 @@ -# Metatable Type Functions - -**Status**: Implemented - -## Summary - -Implement type functions for `getmetatable` and `setmetatable`. - -## Motivation - -### `setmetatable` Type Function - -There is currently no way for users to apply metatable type information to a type without the usage of `typeof()`. This isn't ideal, as it adds verbosity and boilerplate to common patterns such as object-oriented programming. For example, the following: - -```luau -local clock = {} -type Identity = typeof(setmetatable({} :: { time: number }, { __index = clock })) -``` - -could be reduced to: - -```luau -local clock = {} -type Identity = setmetatable<{ time: number }, { __index: typeof(clock) }> -``` - -### `getmetatable` Type Function - -[Issue #1435](https://github.com/luau-lang/luau/issues/1435) is caused by a lack of special behavior for `getmetatable` when the type's metatable has a `__metatable` field. This is fixable in a variety of ways, however a type function has multiple benefits and exposes more type-level expression for users. It fits in nicely with the new solver, as type functions are a cleaner alternative to magic functions. - -## Design - -### `setmetatable` Type Function - -In the following code example, `Identity` should evaluate to `{ sound: string, @metatable: { __index: typeof(animal) } }`: - -```luau -local animal = {} -type Identity = setmetatable<{ - sound: string -}, { - __index: typeof(animal) -}> -``` - -When a non-table type (number, boolean) is passed into the type function, it should result in an error. This includes classes. -If the type is an intersection or union of tables, then the metatable should be applied to every component type. -If the second argument of the type function isn't a table, then it should error. -If the first argument of `setmetatable` has a metatable with the `__metatable` field specified, then it should also report an error. - -### `getmetatable` Type Function - -In the following code example, `ReversedIdentity` should evaluate to `{ __index: typeof(animal) }`: - -```luau -local animal = {} -type Identity = setmetatable<{ - sound: string -}, { - __index: typeof(animal) -}> - -type ReversedIdentity = getmetatable -``` - -Due to `__metatable`, additional behavior needs to be met. In the following code example, `MetatableType` should evaluate to `"No metatable here!"`: - -```luau -type metatable = { - __metatable: "No metatable here!" -} - -type MetatableType = getmetatable> -``` - -If the type passed in does not support metatables in the type system (i.e. at the time of writing, is not any of a primitive, a singleton, a class, a table, or a union or intersection thereof), it should error when passed to `getmetatable`. -If the type passed in is an intersection or union of things that support metatables, then it will return an intersection or union of those metatables respectively. -If no metatable is present, but the type system supports metatables for that type, it should return the `nil` type indicating that there is no metatable present. - -## Drawbacks - -Introducing a large library of "global" type functions can clutter naming space for users. - -The name of `setmetatable` has an interpretation of implying a side effect; tables are references, and `setmetatable` is a side-effecting function. It could be argued that `setmetatable` is not a good name for a type function which has no side effects. However, consistency is desirable. A slight rename of a global function could cause confusion, and likely cause mistakes to be made. Type functions also have a precedent of not allowing side effects, so therefore a `setmetatable` type function would not have ambiguity when it comes to side effects. - -## Alternatives - -Do nothing, and rely on unique metatable type syntax to achieve what a `setmetatable` type function would achieve. However, this still has the issue of `getmetatable`. It is flat out incorrect at the moment, and a type function would be an ideal solution to that problem. If a type function is introduced, then any user could reasonably expect a counterpart `setmetatable` type function. Both metatable type functions and metatable syntax can exist at the same time, and that might be ideal. - -Do nothing. `typeof` solves the current issues with accessibility to the current object-oriented programming patterns, and the issue relating to getmetatable can be solved by overloads. diff --git a/.cursor/rules/luau-rfcs/method-type-issubtypeof.md b/.cursor/rules/luau-rfcs/method-type-issubtypeof.md deleted file mode 100644 index 6b77bc5c..00000000 --- a/.cursor/rules/luau-rfcs/method-type-issubtypeof.md +++ /dev/null @@ -1,116 +0,0 @@ -# type:issubtypeof - -## Summary - -New method on the [`type`](./user-defined-type-functions.md#type-instance) userdata in type functions for performing subtype checks. - -## Motivation - -Currently there is no built in way to do subtype checks in User-Defined Type Functions. This means the developer has to write the following if they wanted to do a subtype check. Subtype checks are useful for type functions, because it makes code like in the following 2 example cases unneeded. - -Case 1: Checking if a type is a string or a string singleton -```luau -local is_string = t:is("string") or (t:is("singleton") and type(t:value()) == "string") -``` - -Case 2: Checking if a type is an enum -```luau -type function isenum(t) - if t:is("union") then - local components = t:components() - local components_that_are_string = 0 - - for _, component in components do - if tv:is("string") or (tv:is("singleton") and type(tv:value()) == "string") then - components_that_are_string += 1 - end - end - return types.singleton( - components_that_are_string == #components - ) - else - return types.singleton(false) - end -end -``` - -Additionally it would be a pain for users to write a type function to be able to do subtype checks for any type. As the following example type function is already very long, despite not covering everything. - -```luau -type function issubtypeof(a, b) - local false_type = types.singleton(false) - local true_type = types.singleton(true) - local is_subtype = false - local a_tag = a.tag - local b_tag = b.tag - - if - (a_tag == b_tag) or - (b_tag == "singleton" and type(b:value()) == a_tag) or - (b_tag == "negation" and type(b:inner()) == a_tag) - then - is_subtype = true - elseif b_tag == "union" or b_tag == "intersection" then - local components = b:components() - local conmponents_that_are_subtype = 0 - - for _, component in components do - if issubtypeof(component):value() then - conmponents_that_are_subtype += 1 - end - end - - return types.singleton(#components == conmponents_that_are_subtype) - elseif b_tag == "table" and a_tag == "table" then - local b_mt = b:metatable() - local a_mt = a:metatable() - - if b_mt == a_mt then - return true_type - elseif b_mt and a_mt then - local b_mts = { b_mt } - local next_b_mt - local next_a_mt = a_mt - - while next_b_mt do - table.insert(b_mts, next_b_mt) - next_b_mt = next_b_mt:metatable() - end - - while next_a_mt do - for _, mt in b_mts do - if mt == next_a_mt then - return true_type - end - end - next_a_mt = next_a_mt:metatable() - end - else - --[[ - For the purposes of this rfc, my point has already been made. And I do not want to write the rest of this type function that nobody should ever use, - as its probably going to be an easy way to hit the type function time limit. - --]] - end - end - - return types.singleton(is_subtype) -end -``` - -## Design - -The [`type`](./user-defined-type-functions.md#type-instance) will gain a new method: `issubtypeof`: - -```luau -type:issubtypeof(arg: type): boolean -``` - -This method will return a boolean indicating if the type is a subtype of `arg`, using luau's existing subtyping algorithm. - -## Drawbacks - -Adds another method to the type userdata in User-Defined type functions. - -## Alternatives - -Do nothing, and let users write the checks themselves as it is currently. diff --git a/.cursor/rules/luau-rfcs/negation-types.md b/.cursor/rules/luau-rfcs/negation-types.md deleted file mode 100644 index 9a6dd593..00000000 --- a/.cursor/rules/luau-rfcs/negation-types.md +++ /dev/null @@ -1,86 +0,0 @@ -# Negation types - -## Summary - -A type that represents the complement of the type being negated, which is a union type of all inhabited types (`unknown`) excluding the type being negated. - -## Motivation - -Type refinements will produce negation types to get the complementation. For the most part, users will never need to write these negation types themselves, except for when they want to _maintain_ some invariants beyond the scope of the branch. - -A [cofinite set](https://en.wikipedia.org/wiki/Cofiniteness) arises when you have some negated `X` in conjunction with some supertype of `X`. For example, `string & ~"a"` is a cofinite string set that accepts any `string` excluding `"a"`. This happens often with type refinements where `typeof(x) == "string" and x ~= "a"` gives rise to the type `string & ~"a"`. - -## Design - -### Syntax - -The notation is `~T` where `T` is a type annotation. It binds tightly to the type it negates, so `~T | U` is `(~T) | U`, not `~(T | U)`. There's really not much to it, syntax-wise. It has the same precedence as the `not` expression, which is why `~T | U` is `(~T) | U` in the same way `not t or u` is `(not t) or u`. - -We propose to allow users to write such a type. Formally: - -```ebnf -ty ::= `~` ty - | name [`<` [ty {`,` ty}] `>`] - | ty {`|` ty} - | ty {`&` ty} - | `(` ty `)` - | `typeof` `(` exp `)` - | table_ty (* omitted for brevity *) - | function_ty (* omitted for brevity *) -``` - -### Semantics - -The basis set we want to perform set exclusion on is `unknown`, _not_ `any`. This means given the type `~"a"`, it is equivalent to the type `unknown & ~"a"`. - -Choosing `unknown` as the basis makes a lot of things fall in place properly, including the property we wish to maintain where `~~T` is equivalent to `T`. It's crucial that we handle negation of error types properly, otherwise double negations won't actually be consistent. It'd allow error suppression to be improperly suppressed! See below, where `~~any` ends up as `unknown` instead of `any`. - -1. `~~any` -2. `~~(unknown | *error*)` -3. `~(~unknown & ~*error*)` -4. `~(never & unknown)` -5. `~never` -6. `unknown` (not equivalent to `any`!) - -As you can see, since through the series of rewrites `~~any` did not produce a type equivalent to `any`, our basis set must be `unknown`, and negation of an error suppression is still an error suppressing type. Therefore `~*error*` is `*error*`. This fixes the double-negation inconsistency: - -1. `~~any` -2. `~~(unknown | *error*)` -3. `~(~unknown & ~*error*)` -4. `~(never & *error*)` -5. `~never | ~*error*` -6. `unknown | *error*` (`any` is an alias to `unknown | *error*`, so equivalence is achieved) - -### Restrictions - -We currently only support negation of _testable_ types. Intuitively, a testable type is one that can be tested by type refinements at runtime. This includes singleton types, primitive types, and classes. Of course, unions and intersections can be negated as well if and only if all of its constituent types are also testable types, due to the distributivity property of unions and intersections. - -Since types like `{ p: P }` and `(T) -> U` are structural types and the runtime offers no way to test for them, they cannot be negated. An attempt to negate this will just turn the negation type into an error suppressed type. This means `~{ p: P }` and `~(T) -> U` are nonsensical. In the event that you negate some non-testable type, you get a type error. - -Another restriction is that negation types cannot negate generic types. So `(T) -> ~T` is also not legible. - -### Implementation - -Most of the implementation of negation types are already in place. The three things missing are: - -1. the syntax, -2. some guarantee that no negation types survive if it negates non-testables, and -3. a type error if it negates a non-testable type in any way, shape, or form. - -The parser change for this is trivial, so this is of no concern. - -We can use type families to have this guarantee. Add a `negate` type family which would be internal to the type inference engine, and have the syntax `~T` produce that type family, not a `NegationType`. - -As for the type error, we can just consider `negate<{ p: P }>` to be an uninhabited type family, and resolve that as an error type. - -## Drawbacks - -Language design has a concept called weirdness budget. It's a fine line to balance, especially in this case where, even in popular type systems that have negation types, they are seldom used except by power users. - -## Alternatives - -We could provide a set of type aliases for some common use cases, e.g. `not_nil` for `~nil` and `not_string` for `~string` and so on. But this is limited, i.e. no way to negate for a specific string singleton except by a `typeof` hack. - -Alternatively, provide a type family `not`, which can be generalized to any type, so long as they obey the restrictions above! This alternative proposal is essentially the above proposal, sans syntax. - -We could also use the set exclusion syntax `T \ U` which does provide an advantage of an explicit set to exclude a subset of, but there are downsides with this, e.g. it is neither commutative nor associative, which makes for the implementation more annoying since you cannot fold over them as easily. diff --git a/.cursor/rules/luau-rfcs/never-and-unknown-types.md b/.cursor/rules/luau-rfcs/never-and-unknown-types.md deleted file mode 100644 index 7ab285db..00000000 --- a/.cursor/rules/luau-rfcs/never-and-unknown-types.md +++ /dev/null @@ -1,146 +0,0 @@ -# never and unknown types - -**Status**: Implemented - -## Summary - -Add `unknown` and `never` types that are inhabited by everything and nothing respectively. - -## Motivation - -There are lots of cases in local type inference, semantic subtyping, -and type normalization, where it would be useful to have top and -bottom types. Currently, `any` is filling that role, but it has -special "switch off the type system" superpowers. - -Any use of `unknown` must be narrowed by type refinements unless another `unknown` or `any` is expected. For -example a function which can return any value is: - -```luau - function anything() : unknown ... end -``` - -and can be used as: - -```luau - local x = anything() - if type(x) == "number" then - print(x + 1) - end -``` - -The type of this function cannot be given concisely in current -Luau. The nearest equivalent is `any`, but this switches off the type system, for example -if the type of `anything` is `() -> any` then the following code typechecks: - -```luau - local x = anything() - print(x + 1) -``` - -This is fine in nonstrict mode, but strict mode should flag this as an error. - -The `never` type comes up whenever type inference infers incompatible types for a variable, for example - -```luau - function oops(x) - print("hi " .. x) -- constrains x must be a string - print(math.abs(x)) -- constrains x must be a number - end -``` - -The most general type of `x` is `string & number`, so this code gives -a type error, but we still need to provide a type for `oops`. With a -`never` type, we can infer the type `oops : (never) -> ()`. - -or when exhaustive type casing is achieved: - -```luau - function f(x: string | number) - if type(x) == "string" then - -- x : string - elseif type(x) == "number" then - -- x : number - else - -- x : never - end - end -``` - -or even when the type casing is simply nonsensical: - -```luau - function f(x: string | number) - if type(x) == "string" and type(x) == "number" then - -- x : string & number which is never - end - end -``` - -The `never` type is also useful in cases such as tagged unions where -some of the cases are impossible. For example: - -```luau - type Result = { err: false, val: T } | { err: true, err: E } -``` - -For code which we know is successful, we would like to be able to -indicate that the error case is impossible. With a `never` type, we -can do this with `Result`. Similarly, code which cannot succeed -has type `Result`. - -These types can _almost_ be defined in current Luau, but only quite verbosely: - -```luau - type never = number & string - type unknown = nil | number | boolean | string | {} | (...never) -> (...unknown) -``` - -But even for `unknown` it is impossible to include every single data types, e.g. every root class. - -Providing `never` and `unknown` as built-in types makes the code for -type inference simpler, for example we have a way to present a union -type with no options (as `never`). Otherwise we have to contend with ad hoc -corner cases. - -## Design - -Add: - -* a type `never`, inhabited by nothing, and -* a type `unknown`, inhabited by everything. - -And under success types (nonstrict mode), `unknown` is exactly equivalent to `any` because `unknown` -encompasses everything as does `any`. - -The interesting thing is that `() -> (never, string)` is equivalent to `() -> never` because all -values in a pack must be inhabitable in order for the pack itself to also be inhabitable. In fact, -the type `() -> never` is not completely accurate, it should be `() -> (never, ...never)` to avoid -cascading type errors. Ditto for when an expression list `f(), g()` where the resulting type pack is -`(never, string, number)` is still the same as `(never, ...never)`. - -```luau - function f(): never error() end - function g(): string return "" end - - -- no cascading type error where count mismatches, because the expression list f(), g() - -- was made to return (never, ...never) due to the presence of a never type in the pack - local x, y, z = f(), g() - -- x : never - -- y : never - -- z : never -``` - -## Drawbacks - -Another bit of complexity budget spent. - -These types will be visible to creators, so yay bikeshedding! - -Replacing `any` with `unknown` is a breaking change: code in strict mode may now produce errors. - -## Alternatives - -Stick with the current use of `any` for these cases. - -Make `never` and `unknown` type aliases rather than built-ins. diff --git a/.cursor/rules/luau-rfcs/new-nonstrict.md b/.cursor/rules/luau-rfcs/new-nonstrict.md deleted file mode 100644 index dcbe9bf7..00000000 --- a/.cursor/rules/luau-rfcs/new-nonstrict.md +++ /dev/null @@ -1,340 +0,0 @@ -# New non-strict mode - -## Summary - -Currently, strict mode and non-strict mode infer different types for -the same program. With this feature, strict and non-strict modes will -share the [local type inference](local-type-inference.md) -engine, and the only difference between the modes will be in which -errors are reported. - -## Motivation - -Having two different type inference engines is unnecessarily -confusing, and can result in unexpected behaviors such as changing the -mode of a module can cause errors in the users of that module. - -The current non-strict mode infers very coarse types (e.g. all local -variables have type `any`) and so is not appropriate for type-driven -tooling, which results in expensively and inconsistently using -different modes for different tools. - -## Design - -### Code defects - -The main goal of non-strict mode is to minimize false positives, that -is if non-strict mode reports an error, then we have high confidence -that there is a code defect. Example defects are: - -* Run-time errors -* Dead code -* Using an expression whose only possible value is `nil` -* Writing to a table property that is never read - -*Run-time errors*: this is an obvious defect. Examples include: - -* Built-in operators (`"hi" + 5`) -* Luau APIs (`math.abs("hi")`) -* Function calls from embeddings (`CFrame.new("hi")`) -* Missing properties from embeddings (`CFrame.new().nope`) - -Detecting run-time errors is undecidable, for example - -```luau -if cond() then - math.abs(“hi”) -end -``` - -It is undecidable whether this code produces a run-time error, but we -do know that if `math.abs("hi")` is executed, it will produce a -run-time error, and so report a type error in this case. - -*Expressions guaranteed to be `nil`*: Luau tables do not error when a -missing property is accessed (though embeddings may). So something -like - -```luau -local t = { Foo = 5 } -local x = t.Fop -``` - -won’t produce a run-time error, but is more likely than not a -programmer error. In this case, if the programmer intent was to -initialize `x` as `nil`, they could have written - -```luau -local t = { Foo = 5 } -local x = nil -``` - -For this reason, we consider it a code defect to use a value that the -type system guarantees is of type `nil`. - -*Writing properties that are never read*: There is a matching problem -with misspelling properties when writing. For example - -```luau -function f() - local t = {} - t.Foo = 5 - t.Fop = 7 - print(t.Foo) -end -``` - -won’t produce a run-time error, but is more likely than not a -programmer error, since `t.Fop` is written but never read. We can use -read-only and write-only table properties for this, and make it an -error to create a write-only property. - -We have to be careful about this though, because if `f` ended with -`return t`, then it would be a perfectly sensible function with type -`() -> { Foo: number, Fop: number }`. The only way to detect that `Fop` -was never read would be whole-program analysis, which is prohibitively -expensive. - -*Implicit coercions*: Luau supports various implicit coercions, such -as allowing `math.abs("-12")`. These should be reported as defects. - -### New Non-strict error reporting - -The difficult part of non-strict mode error-reporting is detecting -guaranteed run-time errors. We can do this using an error-reporting -pass that generates a type context such that if any of the `x : T` in -the type context are satisfied, then the program is guaranteed to -produce a type error. - -For example in the program - -```luau -function h(x, y) - math.abs(x) - string.lower(y) -end -``` - -an error is reported when `x` isn’t a `number`, or `y` isn’t a `string`, so the generated context is - -``` -x : ~number -y : ~string -``` - -In the function: - -```luau -function f(x) - math.abs(x) - string.lower(x) -end -``` - -an error is reported when x isn’t a number or isn’t a string, so the constraint set is - -``` -x : ~number | ~string -``` - -Since `~number | ~string` is equivalent to `unknown`, non-strict mode -can report a warning, since calling the function is guaranteed to -throw a run-time error. In contrast: - -```luau -function g(x) - if cond() then - math.abs(x) - else - string.lower(x) - end -end -``` - -generates context - -``` -x : ~number & ~string -``` - -Since `~number & ~string` is not equivalent to `unknown`, non-strict mode reports no warning. - -* The disjunction of contexts `C1` and `C2` contains `x : T1|T2`, - where `x : T1` is in `C1` and `x : T2` is in `C2`. -* The conjunction of contexts `C1` and `C2` contains `x : T1&T2`, - where `x : T1` is in `C1` and `x : T2` is in `C2`. - -The context generated by a block is: - -* `x = E` generates the context of `E : never`. -* `B1; B2` generates the disjunction of the context of `B1` and the - context of `B2`. -* `if C then B1 else B2` end generates the conjunction of the context - of `B1` and the context of `B2`. -* `local x; B` generates the context of `B`, removing the constraint - `x : T`. If the type inferred for `x` is a subtype of `T`, then - issue a warning. -* `function f(x1,...,xN) B end` generates the context for `B`, - removing `x1 : T1, ..., xN : TN`. If any of the `Ti` are equivalent to - `unknown`, then issue a warning. - -The constraint set generated by a typed expression is: - -* The context generated by `x : T` is `x : T`. -* The context generated by `s : T` (where `s` is a scalar) is - trivial. Issue a warning if `s` has type `T`. -* The context generated by `F(M1, ..., MN) : T` is the disjunction of - the contexts generated by `F : ~function`, and by - `M1 : T1`, ...,`MN : TN` where for each `i`, `F` has an overload - `(unknown^(i-1),Ti,unknown^(N-i)) -> error`. (Pick `Ti` to be - `never` if no such overload exists). Issue a warning if `F` has an - overload `(unknown^N) -> S` where `S <: (T | error)`. -* The context generated by `M.p` is the context generated by `M : ~table`. -* The context generated by `M[N]` is the disjunction of the contexts - generated by `M : ~table` and `N : never`. - -For example: - -* The context generated by `math.abs("hi") : never` is - * the context generated by `"hi" : ~number`, since `math.abs` has an - overload `(~number) -> error`, which is trivial. - * A warning is issued since `"hi"` has type `~number`. -* The context generated by `function f(x) math.abs(x); string.lower(x) end` is - * the context generated by `math.abs(x); string.lower(x)` which is the disjunction of - * the context generated by `math.abs(x)`, which is - * the context `x : ~number`, since `math.abs` has an overload `(~number)->error` - * the context generated by `string.lower(x)`, which is - * the context `x : ~string`, since `string.lower` has an overload `(~string)->error` - * remove the binding `x : (~number | ~string)` - * A warning is issued since `(~number | ~string)` is equivalent to `unknown`. -* The context generated by `math.abs(string.lower(x))` is - * the context generated by `string.lower(x) : ~number`, since `math.abs` has an overload `(~number)->error`, which is - * the text`x : ~string`, since `string.lower` has an overload `(~string)->error`. - * An warning is issued, since `string.lower` has an overload `(unknown) -> (string | error)` and `(string | error) <: (~number | error)`. - -### Ergonomics - -*Error reporting*. A straightforward implementation of this design -issues warnings at the point that data flows into a place -guaranteed to later produce a run-time error, which may not be perfect -ergonomics. For example, in the program: - -```luau -local x -if cond() then - x = 5 -else - x = nil -end -string.lower(x) -``` - -the type inferred for `x` is `number?` and the context generated is `x -: ~string`. Since `number? <: ~string`, a warning is issued at the -declaration `local x`. For ergonomics, we might want to identify -either `string.lower(x)` or `x = 5` (or both!) in the error report. - -*Stringifying checked functions*. This design depends on functions -having overloads with `error` return type. This integrates with -[type error suppression](type-error-suppression.md), but would not be -a perfect way to present types to users. A common case is that the -checked type is the negation of the function type, for example the -type of `math.abs`: - -``` -(number) -> number & (~number) -> error -``` - -This might be better presented as an annotation on the argument type, something like: - -``` -@checked (number) -> number -``` - -The type - -``` - @checked (S1,...,SN) -> T -``` - -is equivalent to - - -``` - (S1,...,SN) -> T - & (~S1, unknown^N-1) -> error - & (unknown, ~S2, unknown^N-2) -> error - ... - & (unknown^N-1, SN) -> error -``` - -As a further extension, we might allow users to explicitly provide `@checked` type annotations. - -Checked functions are known as strong functions in Elixir. - -## Drawbacks - -This is a breaking change, since it results in more errors being issued. - -Strict mode infers more precise (and hence more complex) types than -current non-strict mode, which are presented by type error messages -and tools such as type hover. - -## Alternatives - -Success typing (used in Erlang Dialyzer) is the nearest existing -solution. It is similar to this design, except that it only works in -(the equivalent of) non-strict mode. The success typing function type -`(S)->T` is the equivalent of our -`(~S)->error & (unknown)->(T|error)`. - -We could put the `@checked` annotation on individual function argments -rather than the function type. - -We could use this design to infer checked functions. In function -`f(x1, ..., xN) B end`, we could generate the context -`(x1 : T1, ..., xN : TN)` for `B`, and add an overload -`(unknown^(i-1),Ti,unknown^(N-i))->error` to the inferred type of `f`. For -example, for the function - -```luau -function h(x, y) - math.abs(x) - string.lower(y) -end -``` - -We would infer type - -``` - (number, string) -> () -& (~number, unknown) -> error -& (unknown, ~string) -> error -``` - -which is the same as - -``` - @checked (number, string) -> () -``` - -The problem with doing this is what to do about recursive functions. - -## References - -Lily Brown, Andy Friesen and Alan Jeffrey -*Position Paper: Goals of the Luau Type System*, -in HATRA '21: Human Aspects of Types and Reasoning Assistants, -2021. -https://doi.org/10.48550/arXiv.2109.11397 - -Giuseppe Castagna, Guillaume Duboc, José Valim -*The Design Principles of the Elixir Type System*, -2023. -https://doi.org/10.48550/arXiv.2306.06391 - -Tobias Lindahl and Konstantinos Sagonas, -*Practical Type Inference Based on Success Typings*, -in PPDP '06: Principles and Practice of Declarative Programming, -pp. 167–178, 2006. -https://doi.org/10.1145/1140335.1140356 diff --git a/.cursor/rules/luau-rfcs/new-require-by-string-semantics.md b/.cursor/rules/luau-rfcs/new-require-by-string-semantics.md deleted file mode 100644 index d7befdb6..00000000 --- a/.cursor/rules/luau-rfcs/new-require-by-string-semantics.md +++ /dev/null @@ -1,196 +0,0 @@ -# Require by String with Relative Paths - -**Status**: Implemented - -## Summary - -We need to add relative paths to `require` statements to facilitate the grouping together of related Luau files into libraries and allow for future package managers to be developed and integrated easily. - -## Motivation - -The Roblox engine does not currently support require-by-string. One motivation for this RFC is to consolidate require syntax and functionality between the Roblox engine and the broader Luau language itself. - -Luau itself currently supports a basic require-by-string syntax that allows for requiring Luau modules by relative or absolute path. Unfortunately, the current implementation has a few issues. - -### Current Issues with Relative paths - -Currently, relative paths are always evaluated relative to the current working directory that the Luau CLI is running from. This leads to unexpected behavior when requiring modules from "incorrect" working directories. - -Suppose the module `math.luau` is located in `/Users/JohnDoe/LuauModules/Math` and contains the following: - -```luau --- Beginning of /Users/JohnDoe/LuauModules/Math/math.luau -local sqrt = require("../MathHelperFunctions/sqrt") -``` - -If we then launched the Luau CLI from the directory `/Users/JohnDoe/Projects/MyCalculator` and required `math.luau` as follows: - -```luau -local math = require("/Users/JohnDoe/LuauModules/Math/math") -``` -This would cause the following: -- The current implementation of require would successfully find `math.luau`, as its absolute path was given. -- Then, it would execute the contents of `math.luau` from the context of the current working directory `/Users/JohnDoe/Projects/MyCalculator`. -- When attempting to require `sqrt.luau` from `math.luau`, instead of looking in the directory `/Users/JohnDoe/LuauModules/MathHelperFunctions`, the relative path will be evaluated in relation to the current working directory. -- This will look for `sqrt.luau` in `/Users/JohnDoe/Projects/MathHelperFunctions`, which is a directory that may not even exist. - -This behavior is [problematic](https://github.com/Roblox/luau/issues/959), and puts an unnecessary emphasis on the directory from which the Luau CLI is running. A better solution is to evaluate relative paths in relation to the file that is requiring them. - -## Design - -### Package management - -While package management itself is outside of the scope of this RFC, we want to make it possible for a package management solution to be developed in a way that integrates well with our require syntax. - -To require a Luau module under the current implementation, we must require it either by relative or absolute path: - -### String syntax - -Our require syntax should: - -- Allow a library written in Luau to be imported into the Roblox engine and "just work". -- Support compile-time file resolution _where possible_ for type checking. -- Be consistent across platforms and both inside and outside of Roblox. -- Attempt to remain consistent with the existing Luau path syntax. - -For compatibility across platforms, we will automatically map `/` onto `\`. - -### Path resolution - -**This section is now obsoleted by [this RFC](https://github.com/luau-lang/rfcs/pull/56):** -The implicit resolution order described below is no longer supported. -If multiple files exist that could match a given `require` path, an error is thrown. - -If we find files with the same name but different extensions, then we will attempt to require a file with the following extensions (in this order): -1. `.luau` -2. `.lua` -3. All other file extensions are invalid. - -If the string resolves to a directory instead of a file, then we will attempt to require a file in that directory with the following name (in this order): -1. `init.luau` -2. `init.lua` - -### Relative paths - -**This section is now partially obsoleted by [this RFC](https://github.com/luau-lang/rfcs/pull/56):** -Relative paths *must* begin with either `./` or `../`, and the `paths` variable is no longer supported. - -Modules can be required relative to the requiring file's location in the filesystem (note, this is different from the current implementation, which evaluates all relative paths in relation to the current working directory). - -If we are trying to require a module called `MyModule.luau` in `C:/MyLibrary`: -```luau -local MyModule = require("MyModule") - --- From C:/MyLibrary/SubDirectory/SubModule.luau -local MyModule = require("../MyModule") - --- From C:/MyOtherLibrary/MainModule.luau -local MyModule = require("../MyLibrary/MyModule") -``` - -Relative paths may begin with `./` or `../`, which denote the directory of the requiring file and its parent directory, respectively. When a relative path does begin with one of these prefixes, it will only be resolved relative to the requiring file. If these prefixes are not provided, path resolution will fallback to checking the paths in the `paths` configuration variable, as described later. - -When a require statement is executed directly in a REPL input prompt (not in a file), relative paths will be evaluated in relation to the pseudo-file `stdin`, located in the current working directory. If the code being executed is not tied to a file (e.g. using `loadstring`), executing any require statements in this code will result in an error. - -### Absolute paths - -Absolute paths will no longer be supported in `require` statements, as they are unportable. The only way to require by absolute path will be through a explicitly defined paths or aliases defined in configuration files, as described in another [RFC](https://github.com/Roblox/luau/pull/1061). - -### Implementing changes to relative paths - -The current implementation of evaluating relative paths (in relation to the current working directory) can be found in [lua_require](https://github.com/Roblox/luau/blob/e25de95445f2d635a125ab463426bb7fda017093/CLI/Repl.cpp#L133). - -When reading in the contents of a module using [readFile](https://github.com/Roblox/luau/blob/e25de95445f2d635a125ab463426bb7fda017093/CLI/FileUtils.cpp#L47), the function `fopen`/`_wfopen` is called, which itself evaluates relative paths in relation to the CWD. In order to implement relative paths in relation to the requiring file, we have two options when evaluating a relative path. - -**Assume the following:** - - Current working directory: `"/Users/johndoe/project/subdirectory/cwd"` - - Requiring file's location: `"/Users/johndoe/project/requirer.luau"` - - Relative path given to require by user: `"./sibling"` - -**Approach 1: Translate to the "correct" relative path** - - Translated relative path given to `fopen`/`_wfopen`: `"../../sibling"` - -**Approach 2: Convert the given relative path into its corresponding absolute path** - - Translated relative path given to `fopen`/`_wfopen`: `"/Users/johndoe/project/sibling"` - -Although `fopen`/`_wfopen` can handle both relative (to CWD) and absolute paths, the second approach makes more sense for our use case. We already need absolute paths for caching, as explained in the "Caching" section, so we might as well generate these absolute paths during the path resolution stage. With the first approach, we would need to call `realpath` to convert the relative-to-CWD path into an absolute path for caching, which is an unnecessary extra step. - -However, for security reasons, we don't want to expose absolute paths directly to Luau scripts (for example, through `debug.info`). To prevent this, even though we will cache and read files by absolute path (which helps reduce cache misses), the `chunkname` used to load code [here](https://github.com/Roblox/luau/blob/e25de95445f2d635a125ab463426bb7fda017093/CLI/Repl.cpp#L152) will be the file's path relative to the current working directory. This way, the output of `debug.info` will be unaffected by this RFC's proposed changes. - -- In the example above, the requiring file's stored `chunkname` would be `"../../requirer.luau"`, and its cache key would be `"/Users/johndoe/project/requirer.luau"` (was set when it was required). -- When resolving the path `"./sibling"`, we would apply this to `"../../requirer.luau"`, obtaining the relative-to-cwd path `"../../sibling.luau"`. -- This would become the `chunkname` of `sibling.luau` during loading. -- This would then be converted to an absolute path `"/Users/johndoe/project/sibling"` for caching by resolving it relative to the CWD. - -In the case of an aliased path, it doesn't make sense to make the path relative to the CWD. In this case, the alias would remain in the `chunkname` to prevent leaking any absolute paths. - -#### Where to begin traversal - -One key assumption of this section is that we will have the absolute path of the requiring file when requiring a module by relative path. - -While we could add an explicit reference to this directory to the `lua_State`, we already have an internal mechanism that allows us to get this information. We essentially want to call the `C++` equivalent of `debug.info(1, "s")` when we enter `lua_require`, which would return the name of the file that called `require`, or `stdin` if the module was required directly from the CLI. - -As an example, we might do something like this in `lua_require`: - -```cpp -static int lua_require(lua_State* L) -{ - lua_Debug ar; - lua_getinfo(L, 1, "s", &ar); - - // Path of requiring file - const char* basepath = ar.source; - - // ... -} -``` - -#### Impact on `debug.info` output - -The current implementation also has a slight inconsistency that should be addressed. When executing a Luau script directly (launching Luau with a command-line argument: `"luau script.luau"`), that base script's name is internally stored with a file extension. However, files that are later required are stored with this extension omitted. As a result, the output of `debug.info` depends on whether the file was the base Luau script being executed or was required as a dependency of the base script. - -For consistency, we propose storing the file extension in `lua_require` and always outputting it when `debug.info` is called. - -## Use cases - -### Improvements to relative-path requires - -By interpreting relative paths relative to the requiring file's location, Luau projects can now have internal dependencies. For example, in [Roact's current implementation](https://github.com/Roblox/roact), `Component.lua` requires `assign.lua` [like this](https://github.com/Roblox/roact/blob/beb0bc2706b307b04204abdcf129385fd3cb3e6f/src/Component.lua#L1C1-L1C45): - -```luau -local assign = require(script.Parent.assign) -``` - -By using "Roblox-style" syntax (referring to Roblox Instances in the require statement), `Component.lua` is able to perform a relative-to-requiring-script require. However, with the proposed changes in this RFC, we could instead do this with clean syntax that works outside of the context of Roblox: - -```luau -local assign = require("./assign") -``` - -(Of course, for this to work in the Roblox engine, there needs to be support for require-by-string in the engine. This is being discussed internally.) - -## Drawbacks - -### Backwards compatibility - -Luau libraries are already not compatible with existing Lua libraries. This is because Lua favors the `.` based require syntax instead and relies on the `LUA_PATH` environment variable to search for modules, whereas Luau currently supports a basic require-by-string syntax. - -- Libraries are fully compatible with the Roblox engine, as require-by-string is currently unimplemented. -- Luau currently implements relative paths in relation to the current working directory. -- We propose changing this behavior and breaking backwards compatibility on this front. -- With the current implementation, requiring a library that itself contains relative-path require statements [can become a mess](https://github.com/Roblox/luau/issues/959) if the Luau VM is not launched from the "correct" working directory. -- We propose the following change: relative paths passed to require statements will be evaluated in relation to the requiring file's location, not in relation to the current working directory. - - Caveat 1: if the relative-path require is executed directly in a REPL input prompt (not in a file), it will be evaluated relative to the pseudo-file `stdin`, located in the current working directory. - - Caveat 2: if the code being executed is not tied to a file (e.g. using `loadstring`), executing require statements contained in this code will throw an error. -- If this causes issues, we can later introduce a default alias for the current working directory (e.g. `@CWD`). - -## Alternatives - -### Different ways of importing packages - -In considering alternatives to enhancing relative imports in Luau, one can draw inspiration from other language systems. An elegant solution is the package import system similar to Dart's approach. Instead of relying on file-specific paths, this proposed system would utilize an absolute `package:` syntax: - -``` -import 'package:my_package/my_file.lua'; -``` -Undesirable because this would be redundant with the [alias RFC](https://github.com/Roblox/luau/pull/1061). diff --git a/.cursor/rules/luau-rfcs/property-readonly.md b/.cursor/rules/luau-rfcs/property-readonly.md deleted file mode 100644 index b692e0fe..00000000 --- a/.cursor/rules/luau-rfcs/property-readonly.md +++ /dev/null @@ -1,148 +0,0 @@ -# Read-only properties - -## Summary - -Allow properties of classes and tables to be inferred as read-only. - -## Motivation - -Currently, Roblox APIs have read-only properties of classes, but our -type system does not track this. As a result, users can write (and -indeed due to autocomplete, an encouraged to write) programs with -run-time errors. - -In addition, user code may have properties (such as methods) -that are expected to be used without modification. Currently there is -no way for user code to indicate this, even if it has explicit type -annotations. - -It is very common for functions to only require read access to a parameter, -and this can be inferred during type inference. - -## Design - -### Properties - -Add a modifier to table properties indicating that they are read-only. - -This proposal is not about syntax, but it will be useful for examples to have some. Write: - -* `read p: T` for a read-only property of type `T`. - -For example: -```luau -function f(t) - t.p = 1 + t.p + t.q -end -``` -has inferred type: -``` -f: (t: { p: number, read q: number }) -> () -``` -indicating that `p` is used read-write but `q` is used read-only. - -### Subtyping - -Read-only properties are covariant: - -* If `T` is a subtype of `U` then `{ read p: T }` is a subtype of `{ read p: U }`. - -Read-write properties are a subtype of read-only properties: - -* If `T` is a subtype of `U` then `{ p: T }` is a subtype of `{ read p: U }`. - -### Indexers - -Indexers can be marked read-only just like properties. In -particular, this means there are read-only arrays `{read T}`, that are -covariant, so we have a solution to the "covariant array problem": - -```luau -local dogs: {Dog} -function f(a: {read Animal}) ... end -f(dogs) -``` - -It is sound to allow this program, since `f` only needs read access to -the array, and `{Dog}` is a subtype of `{read Dog}`, which is a subtype -of `{read Animal}`. This would not be sound if `f` had write access, -for example `function f(a: {Animal}) a[1] = Cat.new() end`. - -### Functions - -Functions are not normally mutated after they are initialized, so -```luau -local t = {} -function t.f() ... end -function t:m() ... end -``` - -should have type -``` -t : { - read f : () -> (), - read m : (self) -> () -} -``` - -If developers want a mutable function, -they can use the anonymous function version -```luau -t.g = function() ... end -``` - -For example, if we define: -```luau - type RWFactory = { build : () -> A } -``` - -then we do *not* have that `RWFactory` is a subtype of `RWFactory` -since the build method is read-write, so users can update it: -```luau - local mkdog : RWFactory = { build = Dog.new } - local mkanimal : RWFactory = mkdog -- Does not typecheck - mkanimal.build = Cat.new -- Assigning to methods is OK for RWFactory - local fido : Dog = mkdog.build() -- Oh dear, fido is a Cat at runtime -``` - -but if we define: -```luau - type ROFactory = { read build : () -> A } -``` - -then we do have that `ROFactory` is a subtype of `ROFactory` -since the build method is read-write, so users can update it: -```luau - local mkdog : ROFactory = { build = Dog.new } - local mkanimal : ROFactory = mkdog -- Typechecks now! - mkanimal.build = Cat.new -- Fails to typecheck, since build is read-only -``` - -Since most idiomatic Lua does not update methods after they are -initialized, it seems sensible for the default access for methods should -be read-only. - -*This is a possibly breaking change.* - -### Classes - -Classes can also have read-only properties and accessors. - -Methods in classes should be read-only by default. - -Many of the Roblox APIs an be marked as having getters but not -setters, which will improve accuracy of type checking for Roblox APIs. - -## Drawbacks - -This is adding to the complexity budget for users, -who will be faced with inferred get modifiers on many properties. - -## Alternatives - -Rather than making read-write access the default, we could make read-only the -default and add a new modifier for read-write. This is not backwards compatible. - -We could continue with read-write access to methods, -which means no breaking changes, but means that users may be faced with type -errors such as "`Factory` is not a subtype of `Factory`". diff --git a/.cursor/rules/luau-rfcs/property-writeonly.md b/.cursor/rules/luau-rfcs/property-writeonly.md deleted file mode 100644 index 22e365a7..00000000 --- a/.cursor/rules/luau-rfcs/property-writeonly.md +++ /dev/null @@ -1,179 +0,0 @@ -# Write-only properties - -## Summary - -Allow properties of classes and tables to be inferred as write-only. - -## Motivation - -This RFC is a follow-on to supporting read-only properties. - -Read-only properties have many obvious use-cases, but write-only properties -are more technical. - -The reason for wanting write-only properties is that it means -that we can infer a most specific type for functions, which we can't do if -we only have read-write and read-only properties. - -For example, consider the function -```luau - function f(t) t.p = Dog.new() end -``` - -The obvious type for this is -```luau - f : ({ p: Dog }) -> () -``` - -but this is not the most specific type, since read-write properties -are invariant, We could have inferred `f : ({ p: Animal }) -> ()`. -These types are incomparable (neither is a subtype of the other) -and there are uses of `f` that fail to typecheck depending which one choose. - -If `f : ({ p: Dog }) -> ()` then -```luau - local x : { p : Animal } = { p = Cat.new() } - f(x) -- Fails to typecheck -``` - -If `f : ({ p: Animal }) -> ()` then -```luau - local x : { p : Dog } = { p = Dog.new() } - f(x) -- Fails to typecheck -``` - -The reason for these failures is that neither of these is the most -specific type. It is one which includes that `t.p` is written to, and -not read from. -```luau - f : ({ write p: Dog }) -> () -``` - -This allows both example uses of `f` to typecheck. To see that it is more specific than `({ p: Animal }) -> ()`: - -* `Dog` is a subtype of `Animal` -* so (since write-only properties are contravariant) `{ write p: Dog }` is a supertype of `{ write p: Animal }` -* and (since read-write properties are a subtype of write-only properties) `{ write p: Animal }` is a supertype of `{ p: Animal }` -* so (by transitivity) `{ write p: Dog }` is a supertype of `{ write p: Animal }` is a supertype of `{ p: Animal }` -* so (since function arguments are contravariant `({ write p: Dog }) -> ()` is a subtype of `({ p: Animal }) -> ()` - -and similarly `({ write p: Dog }) -> ()` is a subtype of `({ p: Dog }) -> ()`. - -Local type inference depends on the existence of most specific (and most general) types, -so if we want to use it "off the shelf" we will need write-only properties. - -There are also some security reasons why properties should be -write-only. If `t` is a shared table, and any security domain can -write to `t.p`, then it may be possible to use this as a back-channel -if `t.p` is readable. If there is a dynamic check that a property is -write-only then we may wish to present a script analysis error if a -user tries reading it. - -## Design - -### Properties - -Add a modifier to table properties indicating that they are write-only. - -This proposal is not about syntax, but it will be useful for examples to have some. Write: - -* `write p: T` for a write-only property of type `T`. - -For example: -```luau -function f(t) - t.p = 1 + t.q -end -``` -has inferred type: -``` -f: (t: { write p: number, read q: number }) -> () -``` -indicating that `p` is used write-only but `q` is used read-only. - -### Adding read-only and write-only properties - -There are various points where type inference adds properties to types, we now have to consider how to treat each of these. - -When reading a property from a free table, we should add a read-only -property if there is no such property already. If there is already a -write-only property, we should make it read-write. - -When writing a property to a free table, we should add a write-only -property if there is no such property already. If there is already a -read-only property, we should make it read-write. - -When writing a property to an unsealed table, we should add a read-write -property if there is no such property already. - -When declaring a method in a table or class, we should add a read-only property for the method. - -### Subtyping - -Write-only properties are contravariant: - -* If `T` is a subtype of `U` then `{ write p: U }` is a subtype of `{ write p: T }`. - -Read-write properties are a subtype of write-only properties: - -* If `T` is a subtype of `U` then `{ p: U }` is a subtype of `{ write p: T }`. - -### Indexers - -Indexers can be marked write-only just like properties. In -particular, this means there are write-only arrays `{write T}`, that are -contravariant. These are sometimes useful, for example: - -```luau -function move(src, tgt) - for i,v in ipairs(src) do - tgt[i] = src[i] - src[i] = nil - end -end -``` - -we can give this function the type -``` - move: ({a},{write a}) -> () -``` - -and since write-only arrays are contravariant, we can call this with differently-typed -arrays: -```luau - local dogs : {Dog} = {fido,rover} - local animals : {Animal} = {tweety,sylvester} - move (dogs,animals) -``` - -This program does not type-check with read-write arrays. - -### Classes - -Classes can also have write-only properties and indexers. - -Some Roblox APIs which manipulate callbacks are write-only for security reasons. - -### Separate read and write types - -Once we have read-only properties and write-only properties, type intersection -gives read-write properties with different types. - -```luau - { read p: T } & { write p : U } -``` - -If we infer such types, we may wish to present them differently, for -example TypeScript allows both a getter and a setter. - -## Drawbacks - -This is adding to the complexity budget for users, who will be faced -with inferred set modifiers on many properties. There is a trade-off -here about how to spend the user's complexity budget: on understanding -inferred types with write-only properties, or debugging false positive -type errors caused by variance issues). - -## Alternatives - -Just stick with read-only and read-write accesses. diff --git a/.cursor/rules/luau-rfcs/rawget-type-operator.md b/.cursor/rules/luau-rfcs/rawget-type-operator.md deleted file mode 100644 index adac2db4..00000000 --- a/.cursor/rules/luau-rfcs/rawget-type-operator.md +++ /dev/null @@ -1,53 +0,0 @@ -# `rawget` type function - -**Status**: Implemented - -## Summary - -This RFC proposes the addition of a new type function, `rawget`, which can be used to look up a specific property of a table type *without* invoking the `__index` metamethod. - -## Motivation - -Currently, `rawget` is a built-in runtime operator in the language ([rawget in Luau Global functions](https://luau-lang.org/library#global-functions)) that is missing a corresponding type function that captures its behavior. This RFC seeks to address this hole in the type system by providing a builtin type function for `rawget` that will allow Luau developers to express more accurate types in their code: - -```luau -local prop: rawget = rawget(someExpr, "someProp") -``` - -## Design - -The functionality of the `rawget` type function behaves the same as its [runtime counterpart](https://luau-lang.org/library#global-functions). Namely, it provide a way to look up a specific property of a table type without invoking the `__index` metamethod. - -```luau -local var1 = { - property = "Hello" -} - -local var2 = setmetatable({ }, { __index = var1 }) -type doesntExist = rawget -- reduces to an error - -local var3 = setmetatable({ property = 1 }, { __index = var1 }) -type doesExist = rawget -- doesExist = number -``` - -Error messages would be consistent with those of the `index` type function: -```luau -type doesntExist = rawget -- Error message: Property '"property"' does not exist on type 'var2' - -local key = "property" -type age = rawget -- Error message: Second argument to rawget is not a valid index type; Unknown type 'key' -``` - -Note: `rawget` type function does not work on class types because they do not have direct fields that can be looked up without invoking its metamethod. - -The implementation effort for this type function is very minimal. Since the `rawget` type function functions similarly to the `index` type function, we can reuse the functions already used to implement the `index` type function. - -## Drawbacks - -There aren't appreciable drawbacks. One possible drawback is the increase in the size of the codebase, which may complicate maintenance. However, this is not expected to be a major drawback since the code for `index` type functions already exists. By reusing the code, it is even fair to say that there will be less than 50 lines of code needed to implement this type function. - -Another drawback can come from the extra knowledge a user may need in order to use this type function. For example, users will need to know the inner workings of types and how different operations interact with them (for instance, how `index` interacts with metatables that have the `__index` metamethod). However, this additional complexity is manageable because the language already incorporates such complexities at the runtime level. Developers are already familiar with concepts like `rawget`, so this does not add much new complexity. - -## Alternatives - -An alternative to the `rawget` type function is to enable users to modify the behavior of the existing `index` type function to control its recursive nature. While this approach offers flexibility, it requires additional design considerations and complicates both usage and implementation. However, the introduction of "user-defined type functions" is planned for the near future. This will allow users to create their own type functions, making this alternative design feasible for developers to implement. \ No newline at end of file diff --git a/.cursor/rules/luau-rfcs/recursive-type-restriction.md b/.cursor/rules/luau-rfcs/recursive-type-restriction.md deleted file mode 100644 index e7198c28..00000000 --- a/.cursor/rules/luau-rfcs/recursive-type-restriction.md +++ /dev/null @@ -1,65 +0,0 @@ -# Recursive type restriction - -**Status**: Implemented - -## Summary - -Restrict generic type aliases to only be able to refer to the exact same instantiation of the generic that's being declared. - -## Motivation - -Luau supports recursive type aliases, but with an important restriction: -users can declare functions of recursive types, such as: -```luau - type Tree = { data: a, children: {Tree} } -``` -but *not* recursive type functions, such as: -```luau - type Weird = { data: a, children: Weird<{a}> } -``` -If types such as `Weird` were allowed, they would have infinite unfoldings for example: -```luau - Weird = { data: number, children: Weird<{number}> }` - Weird<{number}> = { data: {number}, children: Weird<{{number}}> } - Weird<{{number}}> = { data: {{number}}, children: Weird<{{{number}}}> } - ... -``` - -Currently Luau has this restriction, but does not enforce it, and instead -produces unexpected types, which can result in free types leaking into -the module exports. - -## Design - -To enforce the restriction that recursive types aliases produce functions of -recursive types, we require that in any recursive type alias defining `T`, -in any recursive use of `T`, we have that `gs` and `Us` are equal. - -This allows types such as: -```luau - type Tree = { data: a, children: {Tree} } -``` -but *not*: -```luau - type Weird = { data: a, children: Weird<{a}> } -``` -since in the recursive use `a` is not equal to `{a}`. - -This restriction applies to mutually recursive types too. - -## Drawbacks - -This restriction bans some type declarations which do not produce infinite unfoldings, -such as: -```luau - type WeirdButFinite = { data: a, children: WeirdButFinite } -``` -This restriction is stricter than TypeScript, which allows programs such as: -```typescript -interface Foo { x: Foo[]; y: a; } -let x: Foo = { x: [], y: 37 } -``` - -## Alternatives - -We could adopt a solution more like TypeScript's, which is to lazily rather than eagerly instantiate types. diff --git a/.cursor/rules/luau-rfcs/relax-recursive-type-restriction.md b/.cursor/rules/luau-rfcs/relax-recursive-type-restriction.md deleted file mode 100644 index 3dd3da59..00000000 --- a/.cursor/rules/luau-rfcs/relax-recursive-type-restriction.md +++ /dev/null @@ -1,80 +0,0 @@ -# Relax the recursive type restriction - -## Summary - -Relax the [recursive type restriction](recursive-type-restriction.md) by implementing isorecursive -types properly for parameterized type aliases. - -## Motivation - -Luau supports parameterized type aliases as follows: -```luau -type Box = { data: T } -``` - -These type aliases can also be recursive: -```luau -type Tree = { data: T, children: {Tree} } -``` -but the [recursive type restriction](recursive-type-restriction.md) limits us to supporting only -direct recursion as above, where the type aliases' parameters remain unchanged. - -At the time the restriction was implemented, Luau featured a greedy type inference engine that would -forward declare type aliases using a free type. Recursive uses of that type alias in the definition -would attempt to instantiate them before the alias is resolved (effectively a noop). The result was -often nonsensical, incomplete types with unresolved free types present in them. - -This limitation means that Luau's type system is unable to express common recursive type patterns -for data structures, such as `andThen` for a monadic data type like `Promise`. For instance, the -following definition is rejected because of the use of `Promise` in the signature of `andThen`: -```luau -type Promise = { - create: (T) -> Promise, - andThen: (self: Promise, callback: (T) -> Promise) -> Promise -} -``` - -## Design - -Today, Luau has a new type inference engine that is able to deal with dynamic constraint resolution -and has already allowed us to build a system for arbitrary type functions, both builtin and -provided with the language and [user-defined type functions](user-defined-type-functions.md). We can -relax the recursive type restriction today in this new type inference engine by treating type -aliases as proper type functions that are lazily expanded when their contents are needed. - -## Drawbacks - -Eliminating this restriction means committing to an intrinsically more complicated architecture for -type inference in Luau in general. The Luau team, however, has already made the decision to do this, -and so there seems to be little drawback beyond the obvious implementation work required in making -type alias expansion completely lazy. This pays for itself in the considerable gain in expressivity -gained for users of the type system. - -## Alternatives - - -### Equirecursive Types - -The main alternative besides doing nothing at all would be to implement equirecursive types. -Equirecursive types have considerably greater complexity, both for humans and for computers. They -pose considerable algorithmic challenges for both type checking and type inference, and require -an implementation of a canonicalization of recursive types that is O(n log n). Isorecursive types -are simpler, map closely to what is already implemented in Luau today, and match the intuitions -users likely have from interacting with recursive types in nominal object-oriented languages. - -### Strict type aliases with Caching - -[A previous RFC](https://github.com/asajeffrey/rfcs/blob/recursive-type-unrestriction/docs/recursive-type-unrestriction.md) -proposed loosening the recursive type restriction, but still leaving it partially in tact, by implementing a strategy of -mapping distinct recursive uses of a type alias to a free type during the definition portion of constructing the type alias -and then tying the knot using that mapping as a cache. This feels in the spirit of Landin's Knot, and was a meaningful -proposal to improve the status quo without us implementing a new type inference engine, but as mentioned in the drawbacks -section, this work is already well underway for other reasons and so the appeal of taking this route today is lessened. - -### Lazy recursive type instantiations with Caching - -The previous RFC also mentioned briefly both the approach proposed by this RFC and an approach that uses a cache as well -to limit the size of the graph. This may be useful, and may in fact be what we implement, but the author of this RFC does -not feel that it is necessary to make a commitment one way or the other to the implementation using caching. We will do -whatever gets us the correct semantics for recursive types, and if there is any caching, it should not be visible to the -user. diff --git a/.cursor/rules/luau-rfcs/require-by-string-aliases.md b/.cursor/rules/luau-rfcs/require-by-string-aliases.md deleted file mode 100644 index 35e7c502..00000000 --- a/.cursor/rules/luau-rfcs/require-by-string-aliases.md +++ /dev/null @@ -1,275 +0,0 @@ -# Require by String with Aliases - -**Status**: Implemented - -## Summary - -We need to add intuitive alias and paths functionality to facilitate the grouping together of related Luau files into libraries and allow for future package managers to be developed and integrated easily. - -## Motivation - -The Roblox engine does not currently support require-by-string. One motivation for this RFC is to consolidate require syntax and functionality between the Roblox engine and the broader Luau language itself. - -Luau itself currently supports a basic require-by-string syntax that allows for requiring Luau modules by relative or absolute path. Unfortunately, the current implementation does not support aliases. - -### Package management - -While package management itself is outside of the scope of this RFC, we want to make it possible for a package management solution to be developed in a way that integrates well with our require syntax. - -To require a Luau module under the current implementation, we must require it either by relative or absolute path: - -```luau --- Requiring Roact by absolute path -local Roact = require("C:/LuauModules/Roact-v1.4.2") -``` - -If we wanted to change the location of this package on disk, we would have to modify all files that require the old path above, which essentially boils down to manual package management. This approach is tedious and prone to mistakes. - -To solve this, we introduce path and alias configuration in this RFC, which would allow for future package management software to maintain package paths and versions by directly modifying configuration files. - -This would also create simple and readable require statements for developers. - -```luau --- Suppose "@src" is an alias for the same directory as "../../../../../" - --- Instead of this: -local result = require("../../../../../HelperModules/graphing") - --- We could have this: -local result = require("@src/HelperModules/graphing") -``` - -## Design - -### Aliases - -Aliases can be used to bind an absolute or relative path to a convenient, case-insensitive name that can be required directly. - -```json -"aliases": { - "Roact": "C:/LuauModules/Roact-v1.4.2" -} -``` - -Based on the alias map above, you would be able to require Roact directly with an `@` prefix: - -```luau -local Roact = require("@Roact") -``` - -Or even a sub-module: - -```luau -local createElement = require("@Roact/createElement") -``` - -Aliases are overrides. Whenever the first component of a path exactly matches a pre-defined alias, it will be replaced before the path is resolved to a file. Alias names are also restricted to the charset `[A-Za-z0-9.\-_]`. We restrict the charset and make them case insensitive because we envision alias names to be primarily used as package names, which tend to be case insensitive and alphanumeric. They also must be preceded by an `@` symbol. - -#### Versioning - -Aliases are simple bindings and aren't concerned with versioning. The intention is to allow package management software to leverage aliases by automatically adding and updating the alias map to reflect a package's dependencies. For manual versioning, a user could always "version" their aliases: `@MyModule-v1`, `@MyModule-v2`, etc. - -#### Library root alias - -In the past, it has been proposed to define an alias (e.g. "`@`") to represent the root directory of a file's encapsulating library. -- However, the concept of a "Luau library" and its root directory is not yet rigorously defined in Luau, in terms of folder/file structure. -- In the future, we may add a `package.json` file or something similar that marks the root directory of a library, but this is outside of the scope of this RFC, which primarily focuses on improving require-by-string. -- For the time being, this functionality will remain unimplemented for this reason. The alias "`@`" will remain reserved for now, meaning it cannot be overridden. - -Of course, users can still use the alias map to explicitly define this behavior with a named alias: - -```json -"aliases": { - "src": "../" -} -``` - -#### Current limitations of aliases - -- Alias names cannot contain the directory separators `/` and `\`. -- Aliases can only occur at the beginning of a path. - -#### Configuring alias maps: .luaurc - -As part of this proposal, alias maps will be configured in `.luaurc`, which follows a JSON-like syntax. - -Proposed structure of an alias map: -```json -{ - "aliases": { - "alias1": "/path/of/alias1", - "alias2": "/path/of/alias2" - } -} -``` - -Missing aliases in `.luaurc` are inherited from the alias maps of any parent directories, and fields can be overridden. - -If an alias is bound to a relative path, the path will be evaluated relative to the `.luaurc` file in which the alias was defined. -If an alias resolves to an aliased path, the aliased path is resolved by checking the current `.luaurc` file and falling back to parent directories if needed. -This search continues iteratively if a chain of aliases must be resolved; if a cycle is detected, alias resolution will fail with an error. - -Finally, providing support for alias maps within the Roblox engine is out of the scope of this RFC but is being considered internally. - -### Paths - -**This section is now obsoleted by [this RFC](https://github.com/luau-lang/rfcs/pull/56):** -The `paths` array described below is no longer supported. - -Similar to [paths in TypeScript](https://www.typescriptlang.org/tsconfig#paths), we will introduce a `paths` array that can be configured in `.luaurc` files. Whenever a path is passed to `require` and does not begin with `./` or `../`, the path will first be resolved relative to the requiring file. If this fails, we will attempt to resolve paths relative to each path in the `paths` array. - -The `paths` array can contain absolute paths, and relative paths are resolved relative to `.luaurc` file in which they appear. - -#### Example Definition - -With the given `paths` definition (`.luaurc` file located in `/Users/johndoe/Projects/MyProject/src`): -```json -"paths": [ - "../dependencies", - "/Users/johndoe/MyLuauLibraries", - "/Users/johndoe/MyOtherLuauLibraries", -] -``` - -If `/Users/johndoe/Projects/MyProject/src/init.luau` contained the following code: -```luau -local graphing = require("graphing") -``` -We would search the following directories, in order: -- `/Users/johndoe/Projects/MyProject/src` -- `/Users/johndoe/Projects/MyProject/dependencies` -- `/Users/johndoe/MyLuauLibraries` -- `/Users/johndoe/MyOtherLuauLibraries` - -### Symlinks - -Symlinks carry some security concerns; for example, a link's target might exist outside of the project folder in which the link was defined. For the first version of this implementation, symlinks will not be supported and will be treated as ordinary files. - -If we do implement symlinks in the future, we will likely use our own limit to the number of symlinks to "follow through" for cross-platform compatibility. It is also possible that we will add a new configurable property in `.luaurc` that will allow developers to toggle whether or not to resolve symlinks. - -Similar examples: -- https://www.typescriptlang.org/tsconfig#preserveSymlinks -- https://webpack.js.org/configuration/resolve/#resolvesymlinks - -## Use Cases - -### Alias map - -Using alias maps, Luau developers can require globally installed Luau libraries in their code without needing to specify their locations in Luau scripts. - -``` -luau-aliases-project -├── .luaurc -└── src - └── module.luau -``` - -For example, if we wanted to require `Roact` in `module.luau`, we could add the following alias to `.luaurc`: - -```json -{ - "aliases": { - "Roact": "/Users/johndoe/LuauLibraries/Roact/src" - } -} -``` - -Then, we could simply write the following in `module.luau`, and everything would work as intended: -```luau -local Roact = require("@Roact") -local Component = require("@Roact/Component") -``` - -If we ever wanted to change the version of `Roact` used by `luau-aliases-project`, we would simply change the absolute path to `Roact` in `.luaurc`. By abstracting away the exact location of globally installed libraries like this, we get clean, readable code, and we make it easier for a future package manager to update dependencies by modifying `.luaurc` files. - -### Paths array - -**This section is now obsoleted by [this RFC](https://github.com/luau-lang/rfcs/pull/56):** -The `paths` array described below is no longer supported. - -The `paths` configuration variable provides convenience and allows Luau developers to build complex, well-organized libraries. Imagine the following project structure: - -``` -luau-paths-project -├── .luaurc -├── dependencies -│ └── dependency.luau -└── src - └── module.luau -``` - -If `.luaurc` contained the following `paths` array: -```json -{ - "paths": ["./dependencies"] -} -``` - -Then, `module.luau` could simply require `dependency.luau` like this: -```luau -local dependency = require("dependency") - --- Instead of: require("../dependencies/dependency") -``` - -Using the `paths` array allows Luau developers to organize their projects however they like without compromising code readability. - -### Large-scale projects in Luau - -For large-scale Luau projects, we might imagine that every dependency of the project is a Luau project itself. We might use an organizational structure like this to create a clean hierarchy: - -``` -large-luau-project -├── .luaurc -├── subproject-1 -├── subproject-2 -└── subproject-3 -``` - -We can provide the following alias in `large-luau-project/.luaurc`: - -```json -{ - "aliases": { - "com.roblox.luau": "." - } -} -``` - -This way, each subproject directory can contain its own source code, dependencies, and `.luaurc` configuration files, while also inheriting the `com.roblox.luau` alias from `large-luau-project/.luaurc`. - -This allows us to refer to other subprojects like this, regardless of the exact location of the requiring file in `large-luau-project`: -```luau -local subproject1 = require("@com.roblox.luau/subproject-1") -``` -### Roblox Specifics -In the Roblox engine, a similar aliasing system could be implemented. Assuming a central package management system were available, a Roblox Script could contain local Roact = require("@Roact"), and everything would "just work". - -## Drawbacks -## Backwards Compatibility -This alias system introduces a new layer to require that wasn't previously there. However, the advantages of this system are expected to outweigh the complexities it introduces. - -## Alternatives - -### Different ways of defining aliases - -#### Defining paths/aliases directly in the requiring file - -Rather than defining paths/alias maps in an external configuration file, we could alternatively define paths/aliases directly in the files that require them. For example, this could manifest itself through an extension of the `--!` comment syntax or introduce new syntax like `--@ = @`. -```luau ---@"Roact" = @"C:/LuauModules/Roact-v1.4.2" -local Roact = require("@Roact") - --- Same as this: -local Roact = require("C:/LuauModules/Roact-v1.4.2") -``` - -Some potential issues with this approach: -- Could lead to Luau file headers becoming cluttered. -- Would probably lead to substantial copy-and-pasting between modules in the same library, as they would likely need to share certain paths/aliases. -- Using configuration files for paths/alias maps allows modules to share aliases while still providing the flexibility to override if needed. This approach does not support inheritance and overriding in an obvious way. -- Removes the layer of abstraction that is provided by external paths/alias maps. This might also blur the scope of package managers. The software would need to directly modify lines of code in `.luau` files, rather than modifying configuration files. - -#### Defining configuration files in a non-JSON format - -Alias maps could alternatively be defined in specially named `.luau` files themselves, or at least adhering to Luau syntax. This approach is somewhat unappealing, however, as it would require package management software to parse Luau syntax. JSON syntax is well-understood and well-supported, which would likely facilitate the development of package management software. diff --git a/.cursor/rules/luau-rfcs/reserve-dollar-sign.md b/.cursor/rules/luau-rfcs/reserve-dollar-sign.md deleted file mode 100644 index eecf1bd1..00000000 --- a/.cursor/rules/luau-rfcs/reserve-dollar-sign.md +++ /dev/null @@ -1,34 +0,0 @@ -# Reserve dollar sign (`$`) to be forever unused - -## Summary - -This RFC proposes a stable contract that `$` will not be used for any features in Luau, and will not be accepted as part of identifier tokens. - -## Motivation - -By reserving `$` external pattern matching tools, which at time of writing are already planned to be created by both Roblox and full-moon, can use it to symbolize things like placeholder tokens, similar to [ast-grep](https://ast-grep.github.io/guide/pattern-syntax.html). - -For example, a search in ast-grep for "checking equality to itself" would be `$A == $A`. This becomes ambiguous and harder to write if `$A` is also a valid identifier, or means some potential expression. - -## Design - -Nothing more than a stable contract is necessary. `$` will not be allowed in identifiers, and `$` will not be a component of any syntax being added to the language. - -`$` is chosen as it seems fairly unlikely we will ever use it for any syntax, while at the same time its use as a placeholder token is common. -- ast-grep, as mentioned before -- SQL uses `$` for binded parameters in prepared statements - -## Drawbacks - -The dollar sign is used in a couple of places outside Luau: - -- JavaScript, C++, and probably others allow it as an identifier, which jQuery uses as its primary controller -- PHP, Perl, Bash, and others both use it for variables (`$name = "John"`) -- Haskell uses it as an infix operator as sugar to help clean up function applications - -These use cases are nowhere near compelling enough to where we would likely do the same. - -## Alternatives - -- Don't do it, as always. -- Pick a different sigil, though `$` is a fairly clear choice diff --git a/.cursor/rules/luau-rfcs/sealed-table-subtyping.md b/.cursor/rules/luau-rfcs/sealed-table-subtyping.md deleted file mode 100644 index 006d8dc5..00000000 --- a/.cursor/rules/luau-rfcs/sealed-table-subtyping.md +++ /dev/null @@ -1,106 +0,0 @@ -# Sealed table subtyping - -**Status**: Implemented - -## Summary - -In Luau, tables have a state, which can, among others, be "sealed". A sealed table is one that we know the full shape of and cannot have new properties added to it. We would like to introduce subtyping for sealed tables, to allow users to express some subtyping relationships that they currently cannot. - -## Motivation - -We would like this code to type check: -```luau -type Interface = { - name: string, -} - -type Concrete = { - name: string, - id: number, -} - -local x: Concrete = { - name = "foo", - id = 123, -} - -local function getImplementation(): Interface - return x -end -``` -Right now this code fails to type check, because `x` contains an extra property, `id`. Allowing sealed tables to be subtypes of other sealed tables would permit this code to type check successfully. - -## Design - -In order to do this, we will make sealed tables act as a subtype of other sealed tables if they contain all the properties of the supertype. - -``` -type A = { - name: string, -} - -type B = { - name: string, - id: number, -} - -type C = { - id: number, -} - -local b: B = { - name = "foo", - id = 123, -} - --- works: B is a subtype of A -local a: A = b - --- works: B is a subtype of C -local c: C = b - --- fails: A is not a subtype of C -local a2: A = c -``` - -This change affects existing code, but it should be a strictly more permissive change - it won't break any existing code, but it will allow code that was previously denied before. - -## Drawbacks - -This change will mean that sealed tables that don't exactly match may be permitted. In the past, this was an error; users may be relying on the type checker to perform these checks. We think the risk of this is minimal, as the presence of extra properties is unlikely to break user code. This is an example of code that would have raised a type error before: - -```luau -type A = { - name: string, -} - -local a: A = { - name = "foo", - -- Before, we would have raised a type error here for the presence of the - -- extra property `id`. - id = 123, -} -``` - -## Alternatives - -In order to avoid any chance of breaking backwards-compatibility, we could introduce a new state for tables, "interface" or something similar, that can only be produced via new syntax. This state would act like a sealed table, except with the addition of the subtyping rule described in this RFC. An example syntax for this: - -```luau --- `interface` context-sensitive keyword denotes an interface table -type A = interface { - name: string, -} - -type B = { - name: string, - id: number, -} - -local b: B = { - name = "foo", - id = 123, -} - -local a: A = b -``` diff --git a/.cursor/rules/luau-rfcs/shared-self-types.md b/.cursor/rules/luau-rfcs/shared-self-types.md deleted file mode 100644 index 33fc8909..00000000 --- a/.cursor/rules/luau-rfcs/shared-self-types.md +++ /dev/null @@ -1,367 +0,0 @@ -# Shared self types - -## Summary - -This RFC proposes sharing `self` types between method definitions which share a metatable. - -## Motivation - -Currently, metamethods are type-inferred independently, and so give -completely separate types to `self`. This has poor ergonomics, as type -errors for inconsistent methods are produced on method calls rather -than method definitions. It also has poor performance, as the independent -self types have separate memory footprints, and there is idiomatic code with -exponential blowup in the size of the type graph. - -For example, `Point` class can be simulated using metatables: - -```luau - --!strict - - local Point = {} - Point.__index = Point - - function Point.new() - local result = {} - setmetatable(result, Point) - result.x = 0 - result.y = 0 - return result - end - - function Point:getX() - return self.x - end - - function Point:getY() - return self.Y - end - - function Point:abs() - return math.sqrt(self:getX() * self:getX() + self:getY() * self:getY()) - end -``` - -Currently, this code is problematic, since there is no connection between the types -of the `Point` metamethods. For example, the inferred type for `Point.getX` -is `({ x : a }) -> a`, rather than the expected `(Point) -> number`. - -Even worse, the method `Point.abs` does not type-check, since the type -of `self.x * self.x` is unknown. If Luau had subtyping constraints and type families -for overloaded operators, the inferred type would be something like: - -```luau - type PointMT = { - new : () -> Point, - getX : ({ x : a }) -> a, - getY : ({ y : a }) -> a, - abs : (a) -> number where - a <: { getX : (a) -> b, getY : (a) -> c } - Add, Mul> <: number, - } - type Point = { - x : number, - y : number, - @metatable PointMT - } -``` - -but this type is not great ergonomically, since this type may be presented to -users in type hover or type error messages, and will surprise users -expecting a simpler type such as: - -```luau - type PointMT = { - new : () -> Point - getX : (Point) -> number, - getY : (Point) -> number, - abs : (Point) -> number - } - type Point = { - x : number, - y : number, - @metatable PointMT - } -``` - -This is the type inferred by *shared self types*. Rather than -inferring the `self` type separately for each metamethod declared on a -table, and for each use of `setmetatable` the same type is used. - -Unfortunately, while this change is fairly straightforward for -monomorphic types like `Point`, it is problematic for generic classes -such as containers. For example: - -```luau -local Set = {} -Set.__index = Set - -function Set.new() - return setmetatable({ - elements={} - }, Set) -end - -function Set:add(el) - self.elements[el] = true -end - -function Set:contains(el) - return self.elements[el] ~= nil -end -``` - -In this case, the expected type would be something like: - - -```luau - type SetMT = { - new : () -> Set, - add : (Set, E) -> (), - contains : (Set, E) -> boolean - } - type Set = { - elements : { [E] : boolean }, - @metatable SetMT - } -``` - -Inferring this type is beyond the scope of this RFC, though. Initially, we propose only inferring `self` monotypes, -in this case: - - -```luau - type SetMT = { - new : () -> Set, - add : (Set, unknown) -> (), - contains : (Set, unknown) -> boolean - } - type Set = { - elements : { [unknown] : boolean }, - @metatable SetMT - } -``` - -and propose allowing explicit declaration of the shared self type, -following the common practice of naming the self type after the metatable: - -```luau - type Set = { elements : { [E] : boolean } } -``` - -This type (and its generic type parameters) are used to derive the -type of `self` in methods declared using `function Set:m()` -declarations: - -```luau - type SetSelf = { - elements : { [E] : boolean }, - @metatable SetMT - } -``` - -In cases where shared self types are just getting in the way, there -are two work-arounds. Firstly, the shared self type can be declared to -be `any`, which will silence type errors: - -```luau - type Foo = any -``` - -Secondly, the self type can be declared explicitly: - -```luau - function Foo.m(self : Bar) ... end -``` - -## Design - -### Self types - -For each table `t`, introduce: - -* the self type parameters of `t`, a sequence of generic type and typepack variables, -* the self type definition of `t`, a type which can use the type parameters of `t`, and -* the self type of `t`, a type which can use the type parameters of `t`. - -These can be declared explicitly: - -```luau - type t = U -``` - -which defines, when `t` has type `T`: - -* the self type parameters of `t` to be `As`, -* the self type definition of `t` to be `U`, and -* the self type of `t` to be `U` extended with `@metatable T`. - -For example, - -```luau - type Set = { [E] : boolean } -``` - -declares, when `Set` has type `SetMT`: - -* the self type parameters of `Set` to be `E`, -* the self type definition of `Set` to be `{ [E] : boolean }`, and -* the self type of `Set` to be `{ [E] : boolean, @metatable SetMT }`. - -If there is no explicit declaration of the self type of `t`, then, when `t` has type `T`: - -* the self type parameters of `t` are empty, -* the self type definition of `t` is a free table type `U`, -* if `t` has an `__index` property of type `MT`, then the self type of `t` is - a metatable type, whose metatable is `MT`, and whose table is `U`, and -* if `t` does not have an `__index` property, then the self type of `t` is `U`. - -The free table type is unified in the usual fashion. - -Self types are used in two ways: in calls to `setmetatable`, and in metamethod declarations. - -### `setmetatable` - -In calls to `setmetatable(t, mt)`: - -* if `mt` has self type parameters `As`, self type definition `T` and self type `S`, -* and `t` has (final) type `T [ Ts/As ]` -* then `setmetatable(t, mt)` has type `S [ Ts/As ]`. - -As currently, this has a side-effect of updating the type state of `t` from -`T [ Ts/As ]` to `S [ Ts/As ]`. - -For example, in `setmetatable({ elements = {} }, Set)`, we have: - -* `Set` has type `SetMT`, self type parameter `E`, self type definition` { elements : { [E] : boolean } }`, and self type `{ elements : { [E] : boolean }, @metatable SetMT }`, -* and `{ elements = {} }` has type `{ elements : { [X] : boolean } }` for a free `X`, -* so `setmetatable({ elements = {} }, Set)` has type `{ elements : { [X] : boolean }, @metatable SetMT }`. - -as a result `Set.new` has type `() -> { elements : { [a] : boolean }, @metatable SetMT }`. - -As another example, in `setmetatable(result, Point)`: - -* `Point` has type `PointMT`, no self type parameters, a free self type definition (call it `T`), and a self type whose table type is `T` and whose metatable is `PointMT`, -* and `result` has final type `{ x : number, y : number }`, -* so (by unifying `T` with `{ x : number, y : number }`) `setmetatable(Point, result)` has type `{ x : number, y : number, @metatable PointMT }`. - -As a side-effect, the type state of `result` is updated to be `{ x : number, y : number, @metatable PointMT }`, -and unification causes the self type of `Point` to be `{ x : number, y : number, @metatable PointMT }`. - -Note that this relies on the type of `result` being `{ x : number, y : number }`, which is why we use the final -long-lived type of `t` rather than its current type state. - -### Method declarations - -In method declarations `function mt:m`: - -* if `mt` has self type parameters `As` and self type `S`, -* then give the `self` parameter of `mt:m` the type `S [ Xs/As ]` for fresh free Xs (these types are quantified as all other free types are). - -For example, in the method `Set:add(el)`: - -* `Set` has self type parameter `E`, and self type `{ elements : { [E] : boolean }, @metatable SetMT }`, -* so `self` has type `{ elements : { [X] : boolean }, @metatable SetMT }` when type checking the body of `Set:add(el)`. - -At this point, type inference proceeds as usual: - -* `el` is given fresh free type `Y`, -* the statement `self.elements[el] = true` will unifies `X` and `Y`, and -* quantifying results in type `({ elements : { [a] : boolean }, @metatable SetMT }) -> ()`. - -## Drawbacks - -### Partially-constructed objects - -Shared self types capture an idiom where tables with metatables have -all of their fields initialized *before* any methods are called. In -cases where methods are called before all the fields are initialized, -this will result in optional types being inferred. For example: - -```luau - function Point.new() - local result = setmetatable({}, Point) - result.x = 0 - print(result:getX()) - result.y = 0 - print(result:getY()) - return result - end -``` - -the call to `result:getY()` uses the *current* type state of `result`, which is `{ x : number, @metatable PointMT }`. -Unification will then cause `Point` to consider `y` to be optional: - -```luau - type PointMT = { - new : () -> Point - getX : (Point) -> number, - getY : (Point) -> number?, - abs : (Point) -> number -- with a type error! - } - type Point = { - x : number, - y : number?, - @metatable PointMT - } -``` - -Since `y` has type `number?` rather than `number`, the `abs` method will fail to type check. - -As a workaround, developers can declare different self types for different methods: - -```luau - function Point.getX(self : { x : number }) : number - return self.x - end - function Point.getY(self : { y : number }) : number - return self.y - end -``` - -resulting in: - -```luau - type PointMT = { - new : () -> Point - getX : ({ x : number }) -> number, - getY : ({ y : number }) -> number, - abs : (Point) -> number -- without a type error! - } - type Point = { - x : number, - y : number, - @metatable PointMT - } -``` - -or can switch off type checking `self` by declaring `type Point = any`. - -### Methods called on both tables and metatables. - -This is a similar problem, caused by calling methods directly on -metatables as well as tables. For example calling `Point:abs()` will -result in inferring that both `x` and `y` are optional, - -### Classes with multiple constructors - -With the current greedy unifier, classes with constructors of different types will fail: - -```luau - local Foo = {} - Foo.__index = Foo - function Foo.from(x) return setmetatable({ msg = tostring(x) }, Foo) end - function Foo.new() return setmetatable({}, Foo) end -``` - -rather than inferring an optional field, this will report a type error. - -## Alternatives - -We could use new syntax for declaring self types, rather than using -the convention that they have the same name as the metatable. - -We could do nothing, but at a performance and ergonomics cost. - -We could introduce special syntax for classes or records, though this -doesn't address type checking current code. diff --git a/.cursor/rules/luau-rfcs/support-for-generic-function-types-in-user-defined-type-functions.md b/.cursor/rules/luau-rfcs/support-for-generic-function-types-in-user-defined-type-functions.md deleted file mode 100644 index 540183c4..00000000 --- a/.cursor/rules/luau-rfcs/support-for-generic-function-types-in-user-defined-type-functions.md +++ /dev/null @@ -1,124 +0,0 @@ -# Support for Generic Types and Packs in User-Defined Type Functions - -**Status**: Implemented - -## Summary - -Add support for generic function types in type functions to allow more types to be accepted by them, including tables and classes which might contain generic function types. - -## Motivation - -Generic functions are very common in Luau, especially when inferred by the typechecking engine. They are also often present in classes defined by the environment. - -Omitting generic types from appearing in type functions limits their use. -Today, even if there is no direct manipulation of generics, a serialization error appears immediately for any generic function or class containing them. -Ideally, we want user-defined type functions to support any possible type, aside from temporary implementation-detail types of the type solver. - -## Design - -We will introduce a single 'generic' kind of runtime type for both generic types and generic packs. - -While this doesn't match up the typechecking engine representation directly, we avoid having to deal with two different userdata types. -Since the value of a generic type or pack is not known upfront, assigning separate tags is not that different from having an extra property on it. - -We already have variadic types (`...number`) that get represented as a regular runtime type and only gain that special meaning when placed in a 'tail' spot. -We also have a different representation of a table with a metatable between type functions and typechecking. -There alternative representations were chosen to improve developer experience working with user-defined type functions based on the experience of people working on the type checker. -It is still compatible with potential extensions to have other kinds of type packs represented as types in the future. - -Generics are created by specifying a name and a boolean marking it as a type or a pack. -Generics that are coming from type inference might not have a display name, but still hold an auto-generated name internally. - -Names are the way generic identity is specified. -Generic types are immutable and two generics with the same name are equal, even if they are defined in different function type scopes. - -For example, consider a type `(T, U, (T) -> U) -> ()` - -From the typechecking perspective, inner and outer function 'T' types are different, but they are still represented by the same runtime generic named 'T'. - -The ambiguity is resolved based on the scoping of the generic in question. -When the runtime type is returned back to the typechecking engine, only those generics that are in the current set of function type generic lists are allowed to be mentioned. Usage of ill-scoped generics will result in serialization errors. -When the inner generic function list places the name 'T' again, it represents a different typechecking type and hides the outer 'T' until the scope of the inner type ends. - -As such, generics are defined by their lexical scope, matching how they are written out in source code. - -Just like in the syntax of the language, reusing the same generic name, even between types and packs in a single list results in a duplicate generic definition error. - -### Examples - -Creating a function type with generic types and packs: - -```lua -type function pass() - local T = types.generic("T") - local Us, Vs = types.generic("U", true), types.generic("V", true) - - local f = types.newfunction() - f:setparameters({T}, Us); - f:setreturns({T}, Vs); - f:setgenerics({T, Us, Vs}); - return f -end - -type X = pass<> -- (T, U...) -> (T, V...) -``` - -Creating a function type with a nested function type that reuses a generic name: - -```lua -type function pass() - local T, U = types.generic("T"), types.generic("U") - - -- (T) -> () - local func = types.newfunction({ head = {T} }, {}, {T}); - - -- { x: (T) -> (), y: U } - local tbl = types.newtable({ [types.singleton("x")] = func, [types.singleton("y")] = U }) - - -- (T, { x: (T) -> (), y: U }) -> () - return types.newfunction({ head = {T, tbl} }, {}, {T, U}) -end -``` - -## Updates to the library and type userdata - -### `types` Library - -| New/Update | Library Functions | Return Type | Description | -| ------------- | ------------- | ------------- | ------------- | -| New | `generic(name: string, ispack: boolean?)` | `type` | returns an immutable instance of a generic type or a pack; name cannot be empty | -| Update | `newfunction(parameters: { head: {type}?, tail: type? }, returns: { head: {type}?, tail: type? }, generics: {type}?)` | `type` | New `generic` argument is added to specify generic types and packs in a single list | - -### `type` Instance - -| New/Update | Instance Properties | Type | Description | -| ------------- | ------------- | ------------- | ------------- | -| Update | `tag` | `"nil" \| "unknown" \| "never" \| "any" \| "boolean" \| "number" \| "string" \| "singleton" \| "negation" \| "union" \| "intersection" \| "table" \| "function" \| "class" \| "thread" \| "buffer" \| "generic"` | Added `generic` as a possible tag | - -#### Generic `type` instance - -| New/Update | Instance Methods | Type | Description | -| ------------- | ------------- | ------------- | ------------- | -| New | `name()` | `string?` | name of the generic; `nil` for inferred generics | -| New | `ispack()` | `boolean` | `true` if the generic represents a pack, `false` otherwise | - -#### Function `type` instance - -| New/Update | Instance Methods | Return Type | Description | -| ------------- | ------------- | ------------- | ------------- | -| New | `setgenerics({type}?)` | `()` | sets the function's generic types and packs list; types cannot follow a pack | -| New | `generics()` | `{type}` | returns the function's generic types and packs (in that order in the array) | - -## Alternatives - -We can assign a different `tag` to a generic pack instead of the `ispack` property. - -It is also possible to split a single list containing both generic types and packs into two. -This was done in an initial prototype implementation and was inconvenient to specify. -One benefit was that list didn't have to be split manually when reading types or packs individually. - -## Drawbacks - -Generics do bring additional complexity to type functions, especially with the way we can now hold a generic type pack as a separate item (while `type T = U...` impossible to define in the syntax of the language). - -The way they bring in lexical scoping considerations is also new for the type function runtime. diff --git a/.cursor/rules/luau-rfcs/support-for-thread-and-buffer-types-in-user-defined-type-functions.md b/.cursor/rules/luau-rfcs/support-for-thread-and-buffer-types-in-user-defined-type-functions.md deleted file mode 100644 index 3bf88449..00000000 --- a/.cursor/rules/luau-rfcs/support-for-thread-and-buffer-types-in-user-defined-type-functions.md +++ /dev/null @@ -1,36 +0,0 @@ -# Support for thread and buffer Types in User-Defined Type Functions - -**Status**: Implemented - -## Summary - -Add support for 'thread' and 'buffer' primitive types, omitted from original user-defined type function RFC. - -## Motivation - -While more rarely used than 'string' or 'number', 'thread' and 'buffer' are perfectly valid primitive types already supported by Luau typechecking engine, so should be included in user-defined type function API. - -Developers are already hitting this limitation and there's no specific reason to exclude these types. - -## Design - -We propose two new library properties and two new type tags. - -No methods are added for types with these new tags. - -### Update `types` Library - -| Library Properties | Type | Description | -| ------------- | ------------- | ------------- | -| `thread` | `type` | an immutable instance of the built-in type `thread` | -| `buffer` | `type` | an immutable instance of the built-in type `buffer` | - -### Update `type` Instance - -| Instance Properties | Type | Description | -| ------------- | ------------- | ------------- | -| `tag` | `"nil" \| "unknown" \| "never" \| "any" \| "boolean" \| "number" \| "string" \| "singleton" \| "negation" \| "union" \| "intersection" \| "table" \| "function" \| "class" \| "thread" \| "buffer"` | an immutable property holding this type's tag | - -## Drawback - -Unclear if this proposal has any drawbacks. diff --git a/.cursor/rules/luau-rfcs/syntax-array-like-table-types.md b/.cursor/rules/luau-rfcs/syntax-array-like-table-types.md deleted file mode 100644 index 486f7deb..00000000 --- a/.cursor/rules/luau-rfcs/syntax-array-like-table-types.md +++ /dev/null @@ -1,65 +0,0 @@ -# Array-like table types - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Add special syntax for array-like table types, `{ T }` - -## Motivation - -Luau supports annotating table types. Tables are quite complex beasts, acting as essentially an associative container mapping any value to any other value, and to make it possible to reason about them at type level we have a more constrained definition of what a table is: - -- A table can contain a set of string keys with a specific type for each key -- A table can additionally have an "indexer" for a given key/value type, meaning that it acts as an associative container mapping keys of type K to values of type V - -The syntax for this right now looks like this: - -``` -{ key1: Type1, key2: Type2, [KeyType]: ValueType } -``` - -This is an example of a hybrid table that has both an indexer and a list of specific key/value pairs. - -While Luau technically doesn't support arrays, canonically tables with integer keys are called arrays, or, more precisely, array-like tables. Luau way to specify these is to use an indexer with a number key: - -``` -{ [number]: ValueType } -``` - -(note that this permits use of non-integer keys, so it's technically richer than an array). - -As the use of arrays is very common - for example, many library functions such as `table.insert`, `table.find`, `ipairs`, work on array-like tables - Luau users who want to type-annotate their code have to use array-like table annotations a lot. - -`{ [number]: Type }` is verbose, and the only alternative is to provide a slightly shorter generic syntax: - -``` -type Array = { [number]: T } -``` - -... but this is necessary to specify in every single script, as we don't support preludes. - -## Design - -This proposal suggests adding syntactic sugar to make this less cumbersome: - -``` -{T} -``` - -This will be exactly equivalent to `{ [number]: T }`. `T` must be a type definition immediately followed by `}` (ignoring whitespace characters of course) - -Conveniently, `{T}` syntax matches the syntax for arrays in Typed Lua (a research project from 2014) and Teal (a recent initiative for a TypeScript-like Lua extension language from 2020). - -## Drawbacks - -This introduces a potential ambiguity wrt a tuple-like table syntax; to represent a table with two values, number and a string, it's natural to use syntax `{ number, string }`; however, how would you represent a table with just one value of type number? This may seem concerning but can be resolved by requiring a trailing comma for one-tuple table type in the future, so `{ number, }` would mean "a table with one number", vs `{ number }` which means "an array-like table of numbers". - -## Alternatives - -A different syntax along the lines of `[T]` or `T[]` was considered and rejected in favor of the current syntax: - -a) This allows us to, in the future - if we find a good workaround for b - introduce "real" arrays with a distinct runtime representation, maybe even starting at 0! (whether we do this or not is uncertain and outside of scope of this proposal) -b) Square brackets don't nest nicely due to Lua lexing rules, where [[foo]] is a string literal "foo", so with either syntax with square brackets array-of-arrays is not easy to specify diff --git a/.cursor/rules/luau-rfcs/syntax-attribute-functions-deprecated.md b/.cursor/rules/luau-rfcs/syntax-attribute-functions-deprecated.md deleted file mode 100644 index 20024925..00000000 --- a/.cursor/rules/luau-rfcs/syntax-attribute-functions-deprecated.md +++ /dev/null @@ -1,93 +0,0 @@ -# Deprecated Attribute for Functions - -**Status**: Implemented - -## Summary - -This RFC proposes a `@deprecated` attribute to annotate Luau functions for deprecation. Using these functions will result in a deprecation warning from the linter. The Luau LSP can indicate the deprecated status of these functions in its completion list by showing them in a visually distinct style. - -## Motivation - -Roblox already has numerous deprecated Luau APIs. LSP strikes out the names of these APIs in the autocompletion popup in Roblox Studio, their use issues deprecation warnings, and their deprecation status is reflected in Roblox's Creator Hub documentation. Unfortunately, Luau lacks support to leverage this tooling for deprecating custom creator-defined functions. Even for core Luau deprecated functions, `getfenv` and `setfenv`, the linter has hardcoded name comparisons to identify their uses and report deprecation messages. Deprecating new APIs requires ad-hoc modifications to the tooling which can only be performed by the language designers. - -This RFC proposes the introduction of a `@deprecated` attribute to mark deprecated Luau APIs. This has multiple benefits: -1. It provides an explicit syntactic marker to identify deprecated functions in Luau code. -2. The LSP interface can display the deprecated API in a visually distinct style in the autocompletion popup. -3. The linter can issue a warning message when the deprecated function is used. - -## Design - -The `@deprecated` attribute can be used on named functions and properties. It does not apply recursively to the functions defined within the lexical scope of the attributed function. It can take up to two named string parameters. The parameters affect the warning message issued by the linter. The `reason` parameter gives the reason for deprecation and the `use` parameter gives the name of the function that should be used in lieu of the deprecated function. The following table shows the warning message issued by the different styles of this attribute when used on a function named `foo`. - -| Style | Message | -| ----------------------------------------------------- | -----------------------------------------------------------------------| -| `@deprecated` | `"Function 'foo' is deprecated."` | -| `@[deprecated {reason = "my reason"}]` | `"Function 'foo' is deprecated. "` | -| `@[deprecated {use = "bar()"}]` | `"Function 'foo' is deprecated, use '' instead."` | -| `@[deprecated {reason = "my reason", use = "bar()"}]` | `"Function 'foo' is deprecated, use '' instead. "` | - -If `foo` is a member of class `bar`, the warning messages above will start as `"Member 'bar.foo' is deprecated ...`. - -Consider the following example. Function `printTable` is marked deprecated. - -```lua -@[deprecated { - use = "table.foreach(table, print)", - reason = "`printTable` forces tables to be printed in one style; `table.foreach` allows configurable printing.", -}] -local function printTable(t) - for k,v in pairs(t) do - print(k, v) - end -end - -printTable({"a", "b", "c", "d"}) -``` - -The call to `printTable` causes the linter to issue the following warning message: - -``` -Function `printTable` is deprecated, use `table.foreach(table, print)` instead. `printTable` forces tables to be printed in one style; `table.foreach` allows configurable printing. -``` - -Table and class properties also support deprecated members. In the following example property `m` of table `t` is deprecated. - -```lua -local t = {} - -@deprecated -function t:m() end -``` - -## Related Work - -Many mainstream languages provide a similar mechanism for deprecating language features. They differ in the kind of program elements that can be deprecated, the ability to convert deprecation warnings to errors, and the ability to specify the version which deprecated the API. - -1. **C++** since C++14 provides a `[[deprecated(msg)]]` attribute that can be applied to declaration of a class, a typedef-name, a variable, a nonstatic data member, a function, a namespace, an enumeration, an enumerator, or a template specialization. The compiler emits a deprecation message, `msg`, when the deprecated program element is used. - -2. **C#** provides a `[ObsoleteAttribute(msg, error)]` which can be applied to all program elements except assemblies, modules, parameters, and return values. The `msg` string is emitted by the compiler when the deprecated program element is used in code. The `error` flag converts the warning to an error. - -3. **Java** provides a `@Deprecated` annotation to deprecate a class, method, or field. The Java compiler issues warnings when these program elements are used. A detailed deprecation message can be supplied by a corresponding javadoc `@deprecated` tag. - -4. **Rust** provides a `#[deprecated(since, note)]` attribute. `since` specifies a version number when the item was deprecated and `note` specifies a string that should be included in the deprecation message. The deprecated attribute can be applied to many program elements such as macros, modules, functions, enums, structs, traits, enum variants, struct fields, etc. When applied to an item containing other items, such as a module, all child items inherit the deprecation attribute. - -5. **Scala** provides a `@deprecated(msg, version)` annotation for deprecating definitions. The annotation takes a message and a string specifying the first version since the definition has been deprecated. - -6. **Kotlin** provides a `@Deprecated(message, replaceWith, level)` annotation. The `message` and `replaceWith` fields translate respectively to `msg` and `alt` fields of the `@deprecated` attribute proposed in this RFC. The `level` field can be `WARNING`: to report use of the API as a warning, `ERROR`: to report use of the API as an error, and `HIDDEN`: to make the API inaccessible from code. - -7. **Dart** provides a `Deprecated(msg)` annotation that applies to libraries, top-level declarations (variables, getters, setters, functions, classes, mixins, extension and typedefs), class-level declarations (variables, getters, setters, methods, operators or constructors, whether static or not), named optional parameters and trailing optional positional parameters. This annotation applies transitively. Deprecating a library or a class deprecates all its members. Deprecating a variable deprecates its implicit getter and setter. Deprecating a superclass does not deprecate its subclass. Deprecation warning is issued when the code imports a deprecated library or any deprecated member. - -8. **Python** decorators provide a mechanism for developers to roll their own deprecated decoration. A popular implementation is provided by the `deprecation` library which provides `@deprecation.deprecated(deprecated_in, removed_in, current_version, details)` decorator that updates the docstring of the deprecated method and issues warning when it is used. `deprecated_in` is the version at which the decorated method is considered deprecated, `removed_in` is the version when the decorated method will be removed, and `current_version` is the version information for the currently running code, and `details` string provides extra details added to the method docstring and warning. - -The description above shows the full-form of the deprecation annotation. In most cases, it is valid to leave the message parameter in favor of a generic deprecation message. Compared to most of these languages, the design proposed for deprecating Luau APIs is simpler. -1. Deprecation is not supported for non-function program elements because Luau only supports attributes on functions. -2. There is no way to convert deprecation warnings to errors. -3. There is no explicit attribute parameter for specifying version string. They can be accommodated in the `reason` parameter. If desired, a future RFC could introduce a `version` parameter to the `@deprecated` attribute. - -## Drawbacks - -Adding this attribute increases complexity of code. Once the attribute is released, we cannot deprecate it. - -## Alternatives - -The alternative would be to not provide this attribute; core Luau APIs will rely on custom enhancements to the Linter for deprecation but creators will have no way to deprecate their Luau functions. \ No newline at end of file diff --git a/.cursor/rules/luau-rfcs/syntax-attribute-functions-native.md b/.cursor/rules/luau-rfcs/syntax-attribute-functions-native.md deleted file mode 100644 index 807ae519..00000000 --- a/.cursor/rules/luau-rfcs/syntax-attribute-functions-native.md +++ /dev/null @@ -1,51 +0,0 @@ -# Native Attribute for Functions - -**Status**: Implemented - -## Summary - -This RFC proposes a function-level `@native` attribute to request native compilation for individual functions, independent of the script-level `--!native` comment directive. - -## Motivation - -Luau's native compiler currently compiles whole scripts annotated with `--!native` comment directive. The compiler imposes an upper limit on the memory consumed by the generated native code which makes it important to target native compilation for functions that will benefit from it the most. This might force creators to break their code organization and move unrelated functions together to scripts marked `--!native`. In this RFC, we propose a function-level `@native` attribute to facilitate developers to request native compilation for individual functions. In the future, we want Luau's native compiler to automatically pick functions for native compilation, making the `--!native` comment directive redundant. Since compiler heuristics can be suboptimal, the proposed `@native` attribute would still remain useful by providing creators with a way to force native compilation of functions that were not automatically chosen by the compiler but would benefit significantly from native execution. - -## Design - -Syntactically, the `@native` attribute takes no parameters. It can be used on both top-level and inner functions. It does not apply recursively to the functions defined within the lexical scope of the attributed function. These "inner" functions have to be explicitly attributed for native compilation. - -In the following example, only `parent` will be natively compiled. - -```lua -@native -function parent() - function child() - -- do something - end - -- do something -end -``` - -On the other hand, in this example, both `parent` and `child` will be natively compiled. - -```lua -@native -function parent() - @native - function child() - -- do something - end - -- do something -end -``` - -## Drawbacks - -Introducing this attribute will have two adverse consequences: - -1. It will increase the complexity of the implementation which will now have to make compilation decisions on a per-function basis. -2. Experience code will be strewn with occurrences of `@native` attribute. - -## Alternatives - -The alternative would be to not provide this attribute and rely on `--!native` comment directive to make compilation decisions on a per-script basis. This might force developers to break their code organization and move unrelated functions together but it does not prevent them from getting performance benefits. diff --git a/.cursor/rules/luau-rfcs/syntax-attributes-functions-parameters.md b/.cursor/rules/luau-rfcs/syntax-attributes-functions-parameters.md deleted file mode 100644 index 953dcda6..00000000 --- a/.cursor/rules/luau-rfcs/syntax-attributes-functions-parameters.md +++ /dev/null @@ -1,75 +0,0 @@ -# Function Attribute Parameters - -**Status**: Implemented - -## Summary - -This RFC proposes a syntax for function attribute parameters. This is a follow up to the [Attributes](./syntax-attributes-functions.md) RFC, which proposed a design for function attributes. We only propose a syntactic extension in this RFC; the rest of the implementation details remain unchanged. - -## Motivation - -The [Attributes](./syntax-attributes-functions.md) RFC provides a syntax for parameterless function attributes. This suffices for some potential use cases, such as `@native`, and `@inline`. However, other potential cases such as `@deprecated` will benefit from an expressive attribute syntax that allows parameters to be supplied. We can use the parameters to provide the name of the function to be used in place of the deprecated function, and the reason for deprecation. This information can be used to generate informative deprecation warning messages. Another potential use case could be an `@unroll` attribute for loop unrolling which could use a numeric parameter for specifying the number of iterations to be unrolled. This would also require supporting attributes on loops, which would be a topic of discussion for a separate RFC. - -## Design - -Attributes with parameters can only be specified inside `@[]`, separated by commas. Attribute parameter syntax mirrors the syntax for function calls; parameters are specified as a comma-separated list of zero or more literal values enclosed in parentheses, which are optional for single-parameter attributes if the parameter is either a literal string or a table constructor. `@[]` cannot be empty or nested. Attributes inside `@[]` cannot have a leading `@`. Attribute parameters cannot have attributes on them. - -`@[attr "literal string"]`, `@[attr {key = 1, 2, 3}]`, `@[attr()]`, `@[attr(1, 2, 3)]`, `@[attr(1, nil, true, false, "literal string", {name = "value", 3.0})]` are some examples of attributes that conform to the proposed syntax. - -The formal syntax for attributes with parameters is described below. - -```ebnf -littable ::= '{' [fieldlist] '}' -fieldlist ::= field {fieldsep field} [fieldsep] -field ::= Name '=' literal | literal -fieldsep ::= ',' | ';' - -literal ::= 'nil' | 'false' | 'true' | Numeral | LiteralString | littable - -litlist ::= literal {‘,’ literal} - -pars ::= ‘(’ [litlist] ‘)’ | littable | LiteralString - -parattr ::= Name [pars] - -attribute ::= '@' Name | '@[' parattr {',' parattr} ']' - -attributes ::= {attribute} -``` - -Attributes can appear before `function` and `local function` statements, augmenting the allowed statement syntax as follows: - -```ebnf -stat ::= attributes 'function' funcname funcbody -stat ::= attributes 'local' 'function' Name funcbody -``` - -Attributes can also used in declaration files with the following syntax: - -```ebnf -type ::= Type | Name ':' Type -decl ::= attributes 'declare' 'function' '(' {type} ')' : Type -decl ::= 'declare' Name ':' '{' {Name ':' attributes '(' {type} ')' '->' Type} '}' -``` - -The extensions proposed to the [Attributes](./syntax-attributes-functions.md) RFC are: - -1. An attribute list, `@[]`, for specifying multiple comma-separated attributes with parameters. -2. A parameter syntax for attributes. -3. An attribute syntax for declaration files. - -Attributes with parameters are enclosed with `@[]` to facilitate syntax evolution without introducing parsing ambibguity. Without `@[]`, if we decide to allow attributes on arbitrary expressions in the future, `@attr(...)` will have two meanings; an attribute with parameters or an attribute on a parenthesized expression. `@[]` resolves this by providing a closing delimiter, `]`, to separate the attribute from the expression. `@[` has been chosen instead of `[` since it is unique and does not introduce ambiguity if we enable attributes on table entries of the form `[exp1] = [exp2]`. - -`@attr`, `@[attr]`, and `@[attr()]` are equivalent. The order in which attributes is specified is irrelevant. Hence, `@attr1 @[attr2, attr3(2, "hi")]`, `@attr1 @attr2 @[attr3(2, "hi")]`, `@attr1 @[attr3(2, "hi")] @attr2`, and `@[attr1, attr2, attr3(2, "hi")]` are also equivalent. - -Attribute parameters are restricted to be literals, i.e., values that evaluate to themselves. This is because attributes are a mechanism for providing tagged metadata to the implementation. They are not user-extensible and have no evaluation semantics of their own. For this reason, even entries of the form `[exp1] = [exp2]` in table literal parameters are disallowed, since they would require evaluating `exp1` at construction time. - -Attributes should not be repeated on a definition or a declaration and every attribute should receive the correct number and type of parameters. Non-conformance should result in a parsing error, obviating the need for a separate linting pass. - -## Drawbacks - -Extending attribute syntax to accept parameters contributes to the complexity of the language in the parsing phase. - -## Alternatives - -The alternative is to not support attribute parameters. This will lead to substandard warning messages from `@deprecated` attribute. It will also prevent us from introducing `@unroll` attribute in the future. diff --git a/.cursor/rules/luau-rfcs/syntax-attributes-functions.md b/.cursor/rules/luau-rfcs/syntax-attributes-functions.md deleted file mode 100644 index f961ca67..00000000 --- a/.cursor/rules/luau-rfcs/syntax-attributes-functions.md +++ /dev/null @@ -1,98 +0,0 @@ -# Attributes (for Functions) - -**Status**: Implemented - -## Summary - -Add a syntax for attributes to function declarations in the style of `@name` that can be placed before their declarations to adjust the behavior of the compiler, analyzer, and runtime. - -These attributes would be valid in both the normal syntax for declaring functions and the syntax for anonymous functions, with or without locally scoped names. - -Due to attributes being tied to the language's behavior, this proposal does not allow for them to be implemented by users. A mechanism to do so would be either very complex or wildly unsafe and is thus not considered by this proposal. - -## Motivation - -It's desirable to have control over various parts of Luau. Consider three potential attributes: - -- `@native`, to indicate that a function should be compiled using native codegen -- `@inline`, to indicate that a function should be inlined where called -- `@deprecated`, to indicate that a function should be marked as deprecated by the analyzer - -Right now, `@native` has an equivalent directive at the top of scripts in the form of `--!native`, albeit for the entire chunk being processed. In the future however, this may be guided by heuristics on a per-function basis to determine if doing so is 'profitable'. While cost models of this nature can be extremely well tuned, they tend to err on the side of caution so are not always correct. Without some way to indicate that a specific function should be natively compiled, users are at the whim of a cost model that might change unexpectedly and negatively impact performance. - -Functions are sometimes inlined too, based on a heuristic cost model. There is currently no way to tell one way or another whether the model has determined if a function is a good candidate for inlining without inspecting bytecode however, which is often not possible (as in the case of Roblox). An `@inline` attribute would allow a user to heavily suggest the compiler inline a function, trusting that they know the potential downsides and have decided it's worth it. - -There is currently no way to discourage the use of functions in user code. Luau has existing lints for this named `DeprecatedGlobal` and `DeprecatedApi`, which flag the use of deprecated globals and API members in code, but they do not have a user-facing API. A `@deprecated` attribute could be used to let users indicate that a piece of code is deprecated, which is an obvious boost to the user experience, and would do so without introducing any new syntax beyond that of attributes. - -While all of these attributes could be supported on a case-by-case basis, a unified syntax for them would simplify the language's grammar and ease their implementation as well as any other features of this sort in the future. - -## Design - -The following syntax is proposed for attributes: - -```ebnf -attribute = '@' NAME -``` - -Attributes would attach to the function as a form of metadata to adjust the behavior of Luau, whether it be in the compiler, analyzer, or otherwise. - -Attributes would be valid before function declarations, both anonymous and named: -```luau -@example -function foo() -end - -foo = @example function() end -``` - -Whether the name of a function is a local variable would have no impact on the use of attributes. - -When declaring a function as a member of a table, any attributes should be for the function: -```luau -@example -- @example applies to `bar`, not `foo` -function foo:bar() -end -``` - -This is consistent with other uses, as it applies the attribute to what is being declared. - -Multiple attributes are supported inline, so that a function with multiple attributes does not have several lines of boilerplate: -```luau -@attribute1 @attribute2 @attribute3 @attribute4 @attribute5 -local function example() -end -``` - -Attributes with parameters are not included in this proposal because it's unclear what the syntax and limitations should be. However, the syntax proposed would not conflict with a future addition of parameters provided they used proper delimiters. - -User-defined attributes are not proposed because they are considered incompatible with Luau's goals of being a simple but safe-to-embed language. Since the compiler would at least in part be controlled by attributes, allowing them to be implemented by users would be either prohibitively complex or unsafe. - -## Drawbacks - -Attributes are a potentially very broad-reaching syntax extension. While there are tangible benefits to users, it may not be worth the complexity they bring to the table. Though it is not currently proposed, attributes may eventually become attached to other language constructs like loops and variable declarations, which would heighten this problem. - -Allowing manual control over language features like inlining and native codegen may be a bad idea, since it means that obvious flaws in the heuristics used for doing this normally may go unreported by power users that care about performance. It may be better to not include them simply for the sake of refining the cost models used for these things. - -Adding yet another symbol (`@`) contributes to the complexity of the language, both in the literal implementation and to read, write, and learn. - -## Alternatives - -Most of the features attributes can support could be implemented by refining the type system (in the case of `@deprecated` and attributes of that nature) and improving heuristics for the compiler (in the case of `@native` and `@inline`). This is very much an option, but in the case of the type system is probably not sustainable since every new feature adds more complexity. - -Attributes are distinct from decorators in that they are compiler defined and thus cannot be defined during runtime. An alternative use for this syntax may be user-defined decorators as in JavaScript. If the language provided special built-in decorators, this could serve a very similar purpose. This is not rejected on merit, it's simply that attributes have a more obvious path to implementation. - -A more complete syntax for attributes with parameters could be proposed instead, but it would require quite a bit more consideration than this proposal. Since it's not currently clear what the needs of attribute parameters are, any proposed syntax would be speculative and might be overly or underly ambitious. Many of the 'obvious' attributes don't require parameters to be useful, so in the current state of this proposal is designed to be straightforward to facilitate their implementation. - -Other potential syntaxes that were considered include a Rust-style syntax (`#[attribute]`) and comment directives (`--!attribute`). These were rejected because: - -- `#` is used in other places in the language, where it means something totally unrelated - -- Comments being used to control language features and flow means that tooling and users must care about them, which is antithetical to how comments are traditionally used - -- Attribute-as-comments would naturally conflict with the language in a lot of weird ways and would just cause a lot of problems: -```luau -local f = --!native function() end -print(f) -``` - -As proposed, attributes would only be applicable on functions at first. They could instead be added to the entire language at once, which would facilitate widespread adoption immediately. However, that is a lot more work, and most of the potential uses for attributes are on functions, so it makes sense to begin with them. diff --git a/.cursor/rules/luau-rfcs/syntax-compound-assignment.md b/.cursor/rules/luau-rfcs/syntax-compound-assignment.md deleted file mode 100644 index e1c13151..00000000 --- a/.cursor/rules/luau-rfcs/syntax-compound-assignment.md +++ /dev/null @@ -1,49 +0,0 @@ -# Compound assignment using `op=` syntax - -> Note: this RFC was adapted from an internal proposal that predates RFC process and as such doesn't follow the template precisely - -**Status**: Implemented - -## Design - -A feature present in many many programming languages is assignment operators that perform operations on the left hand side, for example - -```luau -a += b -``` - -Lua doesn't provide this right now, so it requires code that's more verbose, for example - -```luau -data[index].cost = data[index].cost + 1 -``` - -This proposal suggests adding `+=`, `-=`, `*=`, `/=`, `%=`, `^=` and `..=` operators to remedy this. This improves the ergonomics of writing code, and occasionally results in code that is easier to read to also be faster to execute. - -The semantics of the operators is going to be as follows: - -- Only one value can be on the left and right hand side -- The left hand side is evaluated once as an l-value, similarly to the left hand side of an assignment operator -- The right hand side is evaluated as an r-value (which results in a single Lua value) -- The assignment-modification is performed, which can involve table access if the left hand side is a table dereference -- Unlike C++, these are *assignment statements*, not expressions - code like this `a = (b += 1)` is invalid. - -Crucially, this proposal does *not* introduce new metamethods, and instead uses the existing metamethods and table access semantics, for example - -```luau -data[index].cost += 1 -``` - -translates to - -```luau -local table = data[index] -local key = "cost" -table[key] = table[key] + 1 -``` - -Which can invoke `__index` and `__newindex` on table as necessary, as well as `__add` on the element. In this specific example, this is *faster* than `data[index].cost = data[index].cost + 1` because `data[index]` is only evaluated once, but in general the compound assignment is expected to have the same performance and the goal of this proposal is to make code easier and more pleasant to write. - -The proposed new operators are currently invalid in Lua source, and as such this is a backwards compatible change. - -From the implementation perspective, this requires adding new code/structure to AST but doesn't involve adding new opcodes, metatables, or any extra cost at runtime. diff --git a/.cursor/rules/luau-rfcs/syntax-continue-statement.md b/.cursor/rules/luau-rfcs/syntax-continue-statement.md deleted file mode 100644 index ff77e545..00000000 --- a/.cursor/rules/luau-rfcs/syntax-continue-statement.md +++ /dev/null @@ -1,98 +0,0 @@ -# continue statement - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Add `continue` statement to `for`, `while` and `repeat` loops using a context-sensitive keyword to preserve compatibility. - -## Motivation - -`continue` statement is a feature present in basically all modern programming languages. It's great for ergonomics - often you want the loop to only process items of a specific kind, so you can say `if item.kind ~= "blah" then continue end` in the beginning of the loop. - -`continue` never makes code that was previously impossible to write possible, but it makes some code easier to write. - -We'd like to add this to Luau but we need to keep backwards compatibility - all existing scripts that parse correctly must parse as they do now. The rest of the proposal outlines the exact syntax and semantics that makes it possible. - -## Design - -`continue` statement shall be the statement that *starts* with "continue" identifier (*NOT* keyword - effectively it will be a context-sensitive keyword), and such that the *next* token is none of (`.`, `[`, `:`, `{`, `(`, `=`, string literal or ','). - -These rules effectively say that continue statement is the statement that *does not* parse as a function call or the beginning of an assignment statement. - -This is a continue statement: - -```luau -do -continue -end -``` - -This is not a continue statement: - -```luau -do -continue = 5 -end -``` - -This is not a continue statement: - -```luau -do -continue(5) -end -``` - -This is not a continue statement either, why do you ask? - -```luau -do -continue, foo = table.unpack(...) -end -``` - -These rules are simple to implement. In any Lua parser there is already a point where you have to disambiguate an identifier that starts an assignment statement (`foo = 5`) from an identifier that starts a function call (`foo(5)`). It's one of the few, if not the only, place in the Lua grammar where single token lookahead is not sufficient to parse Lua, because you could have `foo.bar(5)` or `foo.bar=5` or `foo.bar(5)[6] = 7`. - -Because of this, we need to parse the entire left hand side of an assignment statement (primaryexp in Lua's BNF) and then check if it was a function call; if not, we'd expect it to be an assignment statement. - -Alternatively in this specific case we could parse "continue", parse the next token, and if it's one of the exclusion list above, roll the parser state back and re-parse the non-continue statement. Our lexer currently doesn't support rollbacks but it's also an easy strategy that other implementations might employ for `continue` specifically. - -The rules make it so that the only time we interpret `continue` as a continuation statement is when in the old Lua the program would not have compiled correctly - because this is not valid Lua 5.x: - -```luau -do -continue -end -``` - -There is one case where this can create new confusion in the newly written code - code like this: - -```luau -do -continue -(foo())(5) -end -``` - -could be interpreted both as a function call to `continue` (which it is!) and as a continuation statement followed by a function call (which it is not!). Programmers writing this code might expect the second treatment which is wrong. - -We have an existing linter rule to prevent this, however *for now* we will solve this in a stronger way: - -Once we parse `continue`, we will treat this as a block terminator - similarly to `break`/`return`, we will expect the block to end and the next statement will have to be `end`. This will make sure there's no ambiguity. We may relax this later and rely on the linter to tell people when the code is wrong. - -Semantically, continue will work as you would expect - it would skip the rest of the loop body, evaluate the condition for loop continuation (e.g. check the counter value for numeric loops, call the loop iterator for generic loops, evaluate while/repeat condition for while/repeat loops) and proceed accordingly. Locals declared in the loop body would be closed as well. - -One special case is the `until` expression: since it has access to the entire scope of `repeat` statement, using `continue` is invalid when it would result in `until` expression accessing local variables that are declared after `continue`. - -## Drawbacks - -Adding `continue` requires a context-sensitive keyword; this makes editor integration such as syntax highlighting more challenging, as you can't simply assume any occurrence of the word `continue` is referring to the statement - this is different from `break`. - -Implementing `continue` requires special care for `until` statement as highlighted in the design, which may make compiler slower and more complicated. - -## Alternatives - -In later versions of Lua, instead of `continue` you can use `goto`. However, that changes control flow to be unstructured and requires more complex implementation and syntactic changes. diff --git a/.cursor/rules/luau-rfcs/syntax-default-type-alias-type-parameters.md b/.cursor/rules/luau-rfcs/syntax-default-type-alias-type-parameters.md deleted file mode 100644 index 6d352942..00000000 --- a/.cursor/rules/luau-rfcs/syntax-default-type-alias-type-parameters.md +++ /dev/null @@ -1,97 +0,0 @@ -# Default type alias type parameters - -**Status**: Implemented - -## Summary - -Introduce syntax to provide default type values inside the type alias type parameter list. - -## Motivation - -Luau has support for type parameters for type aliases and functions. -In languages with similar features like C++, Rust, Flow and TypeScript, it is possible to specify default values for looser coupling and easier composability, and users with experience in those languages would like to have these design capabilities in Luau. - -Here is an example that is coming up frequently during development of GraphQL Luau library: -```luau -export type GraphQLFieldResolver< - TSource, - TContext, - TArgs = { [string]: any } -> = (TSource, TArgs, TContext, GraphQLResolveInfo) -> any -``` -If we could specify defaults like that, we won't have to write long type names when type alias is used unless specific customization is required. -Some engineers already skip these extra arguments and use `'any'` to save time, which gives worse typechecking quality. - -Without default parameter values it's also harder to refactor the code as each type alias reference that uses 'common' type arguments has to be updated. - -While previous example uses a concrete type for default type value, it should also be possible to reference generic types from the same list: -```luau -type Eq = (l: T, r: U) -> boolean - -local a: Eq = ... -local b: Eq = ... -``` - -Generic functions in Luau also have a type parameter list, but it's not possible to specify type arguments at the call site and because of that, default type parameter values for generic functions are not proposed. - -## Design - -If a default type parameter value is assigned, following type parameters (on the right) must also have default type parameter values. -```luau -type A = ... -- not allowed -``` - -Default type parameter values can reference type parameters which were defined earlier (to the left): -```luau -type A = ...-- ok - -type A = ... -- not allowed -``` - -Default type parameter values are also allowed for type packs: -```luau -type A -- ok, variadic type pack -type B -- ok, type pack with no elements -type C -- ok, type pack with one element -type D -- ok, type pack with two elements -type E -- ok, variadic type pack with a different first element -type F -- ok, same type pack as T... -``` - ---- - -Syntax for type alias type parameter is extended as follows: - -```typeparameter ::= Name [`...'] [`=' typeannotation]``` - -Instead of storing a simple array of names in AstStatTypeAlias, we will store an array of structs containing the name and an optional default type value. - -When type alias is referenced, missing type parameters are replaced with default type values, if they are available. - -If all type parameters have a default type value, it is now possible to reference that without providing a type parameter list: -```luau -type All = ... - -local a: All -- ok -local b: All<> -- ok as well -``` - -If type is exported from a module, default type parameter values will still be available when module is imported. - ---- -Type annotations in Luau are placed after `':'`, but we use `'='` here to assign a type value, not to imply that the type parameter on the left has a certain type. - -Type annotation with `':'` could be used in the future for bounded quantification which is orthogonal to the default type value. - -## Drawbacks - -Other languages might allow references to the type alias without arguments inside the scope of that type alias to resolve into a recursive reference to the type alias with the same arguments. - -While that is not allowed in Luau right now, if we decide to change that in the future, we will have an ambiguity when all type alias parameters have default values: -```luau --- ok if we allow Type to mean Type -type Type = { x: number, b: Type? } - --- ambiguity, Type could mean Type or Type -type Type = { x: number, b: Type? } -``` diff --git a/.cursor/rules/luau-rfcs/syntax-floor-division-operator.md b/.cursor/rules/luau-rfcs/syntax-floor-division-operator.md deleted file mode 100644 index 8734d22a..00000000 --- a/.cursor/rules/luau-rfcs/syntax-floor-division-operator.md +++ /dev/null @@ -1,64 +0,0 @@ -# Floor division operator - -**Status**: Implemented - -## Summary - -Add floor division operator `//` to ease computing with integers. - -## Motivation - -Integers are everywhere. Indices, pixel coordinates, offsets, ranges, quantities, counters, rationals, fixed point arithmetic and bitwise operations all use integers. - -Luau is generally well suited to work with integers. The math operators +, -, \*, ^ and % support integers. That is, given integer operands these operators produce an integer result (provided that the result fits into representable range of integers). However, that is not the case with the division operator `/` which in the general case produces numbers with fractionals. - -To overcome this, typical Luau code performing integer computations needs to wrap the result of division inside a call to `math.floor`. This has a number of issues and can be error prone in practice. - -A typical mistake is to forget to use `math.floor`. This can produce subtle issues ranging from slightly wrong results to script errors. A script error could occur, for example, when the result of division is used to fetch from a table with only integer keys, which produces nil and a script error happens soon after. Another type of error occurs when an accidental fractional number is passed to a C function. Depending on the implementation, the C function could raise an error (if it checks that the number is actually an integer) or cause logic errors due to rounding. - -Particularly problematic is incorrect code which seems to work with frequently used data, only to fail with some rare input. For example, image sizes often have power of two dimensions, so code dealing with them may appear to work fine until much later some rare image has an odd size and a division by two in the code does not produce the correct result. Due to better ergonomics of the floor division operator, it becomes a second nature to write `//` everywhere when integers are involved and thus this class of bugs is much less likely to happen. - -Another issue with using `math.floor` as a workaround is that code performing a lot of integer calculations is harder to understand, write and maintain. - -Especially with applications dealing with pixel graphics, such as 2D games, integer math is so common that `math.floor` could easily become the most commonly used math library function. For these applications, avoiding the calls to `math.floor` is alluring from the performance perspective. - -> Non-normative: Here are the top math library functions used by a shipped game that heavily uses Lua: -> `floor`: 461 matches, `max`: 224 matches, `sin`: 197 matches, `min`: 195 matches, `clamp`: 171 matches, `cos`: 106 matches, `abs`: 85 matches. -> The majority of `math.floor` calls disappear from this codebase with the floor division operator. - -Lua has had floor division operator since version 5.3, so its addition to Luau makes it easier to migrate from Lua to Luau and perhaps more importantly use the wide variety of existing Lua libraries in Luau. Of other languages, most notably Python has floor division operator with same semantics and same syntax. R and Julia also have a similar operator. - -## Design - -The design mirrors Lua 5.3: - -New operators `//` and `//=` will be added to the language. The operator `//` performs division of two operands and rounds the result towards negative infinity. By default, the operator is only defined for numbers. The operator has the same precedence as the normal division operator `/`. `//=` is the compound-assignment operator for floor division, similar to the existing operator `/=`. - -A new metamethod `__idiv` will be added. The metamethod is invoked when any operand of floor division is not a number. The metamethod can be used to implement floor division for any user defined data type as well as the built-in vector type. - -The typechecker does not need special handling for the new operators. It can simply apply the same rules for floor division as it does for normal division operators. - -Examples of usage: - -```luau --- Convert offset into 2d indices -local i, j = offset % 5, offset // 5 - --- Halve dimensions of an image or UI element -width, height = width // 2, height // 2 - --- Draw an image to the center of the window -draw_image(image, window_width // 2 - element_width // 2, window_height // 2 - element_height // 2) -``` - -## Drawbacks - -The addition of the new operator adds some complexity to the implementation (mostly to the VM) and to the language, which can be seen as a drawback. - -C like languages use `//` for line comments. Using the symbol `//` for floor division closes the door for using it for line comments in Luau. On the other hand, Luau already has long and short comment syntax, so adding yet another syntax for comments would add complexity to the language for little benefit. Moreover, it would make it harder to translate code from Lua to Luau and use existing Lua libraries if the symbol `//` has a completely different meaning in Lua and Luau. - -## Alternatives - -An alternative would be to do nothing but this would not solve the issues the lack of floor division currently has. - -An alternative implementation would treat `//` and `//=` only as syntactic sugar. The addition of new VM opcode for floor division could be omitted and the compiler could be simply modified to automatically emit a call to `math.floor` when necessary. This would require only minimal changes to Luau, but it would not support overloading the floor division operator using metamethods and would not have the performance benefits of the full implementation. diff --git a/.cursor/rules/luau-rfcs/syntax-if-expression.md b/.cursor/rules/luau-rfcs/syntax-if-expression.md deleted file mode 100644 index 6c1a7e48..00000000 --- a/.cursor/rules/luau-rfcs/syntax-if-expression.md +++ /dev/null @@ -1,108 +0,0 @@ -# if-then-else expression - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Introduce a form of ternary conditional using `if cond then value else alternative` syntax. - -## Motivation - -Luau does not have a first-class ternary operator; when a ternary operator is needed, it is usually emulated with `and/or` expression, such as `cond and value or alternative`. - -This expression evaluates to `value` if `cond` and `value` are truthy, and `alternative` otherwise. In particular it means that when `value` is `false` or `nil`, the result of the entire expression is `alternative` even when `cond` is truthy - which doesn't match the expected ternary logic and is a frequent source of subtle errors. - -Instead of `and/or`, `if/else` statement can be used but since that requires a separate mutable variable, this option isn't ergonomic. An immediately invoked function expression is also unergonomic and results in performance issues at runtime. - -## Design - -To solve these problems, we propose introducing a first-class ternary conditional. Instead of `? :` common in C-like languages, we propose an `if-then-else` expression form that is syntactically similar to `if-then-else` statement, but lacks terminating `end`. - -Concretely, the `if-then-else` expression must match `if then else `; it can also contain an arbitrary number of `elseif` clauses, like `if then elseif then else `. Unlike if statements, `else` is mandatory. - -The result of the expression is the then-expression when condition is truthy (not `nil` or `false`) and else-expression otherwise. Only one of the two possible resulting expressions is evaluated. - -Example: - -```luau -local x = if FFlagFoo then A else B - -MyComponent.validateProps = t.strictInterface({ - layoutOrder = t.optional(t.number), - newThing = if FFlagUseNewThing then t.whatever() else nil, -}) -``` - -Note that `else` is mandatory because it's always better to be explicit. If it weren't mandatory, it opens the possiblity that someone might be writing a chain of if-then-else and forgot to add in the final `else` that _doesn't_ return a `nil` value! Enforcing this syntactically ensures the program does not run. Also, with it being mandatory, it solves many cases where parsing the expression is ambiguous due to the infamous [dangling else](https://en.wikipedia.org/wiki/Dangling_else). - -This example will not do what it looks like it's supposed to do! The if expression will _successfully_ parse and be interpreted as to return `h()` if `g()` evaluates to some falsy value, when in actual fact the clear intention is to evaluate `h()` only if `f()` is falsy. - -```luau -if f() then - ... - local foo = if g() then x -else - h() - ... -end -``` - -The only way to solve this had we chose optional `else` branch would be to wrap the if expression in parentheses or to place a semi-colon. - -## Drawbacks - -Studio's script editor autocomplete currently adds an indented block followed by `end` whenever a line ends that includes a `then` token. This can make use of the if expression unpleasant as developers have to keep fixing the code by removing auto-inserted `end`. We can work around this on the editor side by (short-term) differentiating between whether `if` token is the first on its line, and (long-term) by refactoring completion engine to use infallible parser for the block completer. - -Parser recovery can also be more fragile due to leading `if` keyword - when `if` was encountered previously, it always meant an unfinished expression, but now it may start an `if-expr` that, when confused with `if-end` statement can lead to a substantially incorrect parse that is difficult to recover from. However, similar issues occur frequently due to function call statements and as such it's not clear that this makes the recovery materially worse. - -While this is not a problem today, in the past we've contemplated adding support for mid-block `return` statements; these would create an odd grammatical quirk where an `if..then` statement following an empty `return` would parse as an `if` expression. This would happen even without `if` expressions though for function calls (e.g. `return` followed by `print(1)`), and is more of a problem with the potential `return` statement changes and less of a problem with this proposal. - -## Alternatives - -We've evaluated many alternatives for the proposed syntax. - -### Python syntax -``` -b if a else c -``` -Undesirable because expression evaluation order is not left-to-right which is a departure from all other Lua expressions. Additionally, since `b` may be ending a statement (followed by `if` statement), resolving this ambiguity requires parsing `a` as expression and backtracking if `else` is not found, which is expensive and likely to introduce further ambiguities. - -### C-style ternary operator -``` -a ? b : c -``` -Problematic because `:` is used for method calls. In Julia `? :` and `:` are both operators which are disambiguated by _requiring_ spaces in the first case and _prohibiting_ them in the second case; this breaks backwards compatibility and doesn't match the rest of the language where whitespace in the syntax is not significant. - -### Function syntax -``` -iff(a, b, c) -``` -If implemented as a regular function call, this would break short-circuit behavior. If implemented as a special builtin, it would look like a regular function call but have magical behavior -- something likely to confuse developers. - -### Perl 6 syntax -``` -a ?? b !! c -``` -Syntax deemed too unconventional to use in Luau. - -### Smaller variations -``` -(if a then b else c) -``` -Ada uses this syntax (with parentheses required for clarity). Similar solutions were discussed for `as` previously and rejected to make it easier for humans and machines to understand the language syntax. - -``` -a then b else c -``` -This is ambiguous in some cases (like within if condition) so not feasible from a grammar perspective. - -``` -if a then b else c end -``` -The `end` here is unnecessary since `c` is not a block of statements -- it is simply an expression. Thus, use of `end` here would be inconsistent with its other uses in the language. It also makes the syntax more cumbersome to use and could lead to developers sticking with the error-prone `a and b or c` alternative. - -### `elseif` support - -We discussed a simpler version of this proposal without `elseif` support. Unlike if statements, here `elseif` is purely syntactic sugar as it's fully equivalent to `else if`. However, supporting `elseif` makes if expression more consistent with if statement - it is likely that developers familiar with Luau are going to try using `elseif` out of habit. Since supporting `elseif` here is trivial we decided to keep it for consistency. diff --git a/.cursor/rules/luau-rfcs/syntax-leading-bar-and-ampersand.md b/.cursor/rules/luau-rfcs/syntax-leading-bar-and-ampersand.md deleted file mode 100644 index 01062440..00000000 --- a/.cursor/rules/luau-rfcs/syntax-leading-bar-and-ampersand.md +++ /dev/null @@ -1,84 +0,0 @@ -# Leading `|` and `&` in types - -**Status**: Implemented - -## Summary - -Allow the use of `|` and `&` without any types preceding them. - -## Motivation - -Occasionally, you will have many different types in a union or intersection type that exceeds a reasonable line limit and end up formatting it to avoid horizontal scrolling. Using the English alphabet as an example: - -```luau -type EnglishAlphabet = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" | "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" -``` - -Or you might just format it for readability: - -```luau -type EnglishAlphabet = never - | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" - | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" - | "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" - | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" -``` - -Currently, there are two solutions to effect it: - -1. Moving `=` to the next line -2. Keep `=` on the line and add `never` if using `|`, or `unknown` if using `&` - -```luau --- 1) union: -type Result - = { tag: "ok", value: T } - | { tag: "err", error: E } - --- 2) union: -type Result = never - | { tag: "ok", value: T } - | { tag: "err", error: E } - --- 1) intersection: -type MyOverloadedFunction - = ((string) -> number) - & ((number) -> string) - --- 2) intersection: -type MyOverloadedFunction = unknown - & ((string) -> number) - & ((number) -> string) -``` - -OCaml and TypeScript support this same syntax: - -```ocaml -type 'a tree = - | Leaf - | Node of 'a tree * 'a * 'a tree;; -``` - -```ts -type Tree = - | { type: "leaf" } - | { type: "node", left: Tree, value: T, right: Tree }; -``` - -## Design - -This type becomes valid Luau syntax. - -```luau -type Tree = - | { type: "leaf" } - | { type: "node", left: Tree, value: T, right: Tree } -``` - -## Drawbacks - -No drawbacks. The parser change is trivial. Instead of trying to parse a simple type and then calling `Parser::parseTypeSuffix`, simply sense whether the current lexeme is `|` or `&` and directly invoke `Parser::parseTypeSuffix` with `nullptr` for the first type and making sure that `nullptr` does not get pushed into the resulting vector. If the current lexeme is not `|` or `&`, then revert to current logic. - -## Alternatives - -Don't do this and accept one of the solutions already mentioned. diff --git a/.cursor/rules/luau-rfcs/syntax-named-function-type-args.md b/.cursor/rules/luau-rfcs/syntax-named-function-type-args.md deleted file mode 100644 index 14dbd7c4..00000000 --- a/.cursor/rules/luau-rfcs/syntax-named-function-type-args.md +++ /dev/null @@ -1,58 +0,0 @@ -# Named function type arguments - -**Status**: Implemented - -## Summary - -Introduce syntax for optional names of function type arguments. - -## Motivation - -This feature will be useful to improve code documentation and provide additional information to LSP clients. - -## Design - -This proposal uses the same syntax that functions use to name the arguments: `(a: number, b: string) -> string` - -Names can be provided in any place where function type is used, for example: - -* in type aliases: -```luau -type MyFunc = (cost: number, name: string) -> string -``` - -* in definition files for table types: -```luau -declare string: { - rep: (pattern: string, repeats: number) -> string, - sub: (string, start: number, end: number?) -> string -- names are optional, here the first argument doesn't use a name -} -``` - -* for variables: -```luau -local cb: (amount: number) -> number -local function foo(cb: (name: string) -> ()) -``` - -Variadic arguments cannot have a name, they are already written as ...: number. - -This feature can be found in other languages: - -* TypeScript (names are required): `let func: (p: type) => any` -* C++: `void (*f)(int cost, std::string name) = nullptr;` - -Implementation will store the names inside the function type description. - -Parsing the argument list will require a single-token lookahead that we already support. -Argument list parser will check if current token is an identifier and if the lookahead token is a colon, in which case it will consume both tokens. - -Function type comparisons will ignore the argument names, this proposal doesn't change the semantics of the language and how typechecking is performed. - -## Drawbacks - -Argument names require that we create unique function types even when these types are 'identical', so we can't compare types using pointer identity. - -This is already the case in current Luau implementation, but it might reduce the optimization opportunities in the future. - -There might also be cases of pointer identity checks that are currently hidden and named arguments might expose places where correct unification is required in the type checker. diff --git a/.cursor/rules/luau-rfcs/syntax-number-literals.md b/.cursor/rules/luau-rfcs/syntax-number-literals.md deleted file mode 100644 index 2ad6a6fa..00000000 --- a/.cursor/rules/luau-rfcs/syntax-number-literals.md +++ /dev/null @@ -1,14 +0,0 @@ -# Extended numeric literal syntax - -> Note: this RFC was adapted from an internal proposal that predates RFC process and as such doesn't follow the template precisely - -**Status**: Implemented - -## Design - -This proposal suggests extending Lua number syntax with: - -1. Binary literals: `0b10101010101`. The prefix is either '0b' or '0B' (to match Lua's '0x' and '0X'). Followed by at least one 1 or 0. -2. Number literal separators: `1_034_123`. We will allow an arbitrary number and arrangement of underscores in all numeric literals, including hexadecimal and binary. This helps with readability of long numbers. - -Both of these features are standard in all modern languages, and can help write readable code. diff --git a/.cursor/rules/luau-rfcs/syntax-property-access-modifiers.md b/.cursor/rules/luau-rfcs/syntax-property-access-modifiers.md deleted file mode 100644 index 642b2020..00000000 --- a/.cursor/rules/luau-rfcs/syntax-property-access-modifiers.md +++ /dev/null @@ -1,197 +0,0 @@ -# Syntax for table property access modifiers - -**Status**: Implemented - -## Summary - -We need syntax to match the semantics of read-only and write-only modifiers for table properties and indexers. - -## Motivation - -See the semantic RFCs for motivation: - -* [Read-only table properties](https://github.com/luau-lang/rfcs/blob/master/docs/property-readonly.md) -* [Write-only table properties](https://github.com/luau-lang/rfcs/blob/master/docs/property-writeonly.md) - -## Design - -We will use the following syntax for describing a read or a write type of a property: - -```luau -type ReadOnly = { read x: number } -type WriteOnly = { write x: number } -``` - -A property will occasionally be both readable and writable, but using different -types. The author will have to duplicate the property name in this case: - -```luau -type Foo = { - read p: Animal, - write p: Dog -} -``` - -The tokens `read` and `write` are contextual. They are still valid property names. - -```luau -type Reader = { read: () -> number } -type Writer = { write: (number) -> () } -``` - -Indexers can also be read-only or write-only. - -```luau -type ReadOnlyMap = { read [K]: V } -type WriteOnlyMap = { write [K]: V } - -type ReadAnimals = { read Animal } -type WriteDogs = { write Dog } -``` - -Mixed indexers are allowed but heavily discouraged: - -```luau -type MixedMap = { read [string]: Animal, write [string]: Dog } -type MixedArray = { read Animal, write Dog } -``` - -Redundant record fields are still disallowed: Each field may have at most one -read type and one write type: - -```luau -type A = { read x: string, write x: "Hello" } -- OK -type C = { read x: string, read x: "hello" } -- ERROR -type B = { x: string, read x: "hello" } -- ERROR -``` - -We place no restriction on the relationship between the read and write type. -The following is certainly a bad idea, but it is legal: - -```luau -type T = { read n: number, write n: string } -``` - -This syntax is readable, matches the flavour of preexisting Luau syntax well, -and is pretty easy to parse efficiently. - -## Drawbacks - -We expect it to be very commonplace to have table types containing read-only -functions. This syntax is a little bit verbose and maybe unintuitive for that -use case. - -`read` and `write` are also very useful method names. It's a little bit -awkward to talk about a table that has a `read` or a `write` method: - -```luau -type Reader = { read read: () -> number } -type Writer = { read write: (number) -> () } -``` - -It is important to consider that this will be an issue for any keywords we might -choose unless we were to take the step of picking something unlikely to be a -useful property name. (ie something weird looking and ugly) - -Lastly, mixed indexers are very awkward both in syntax and semantics. - -## Alternatives - -The design space for syntax includes: - -* Names, symbols or attributes? -* Modifier position? -* How to parse or serialize properties with differing read- and write-types? - -### Names, symbols or attributes? - -We could use names for modifiers, such as - -* `get` and `set` -* `const` and `mut` -* `read` and `write` -* `readonly` and `writeonly` - -One issue is that these are all valid identifiers, so if we want -backward compatbility, they cannot be made keywords. This presents -issues with code that uses the chosen names as type or property names, -for instance: - -```luau - type set = { [any] : bool } - type ugh = { get set : set } -``` - -We could use symbols, for example - -* `+` and `-` -* (Are there other obvious pairs of symbols?) - -We could use attributes, for example - -* `@read` and `@write` -* ... as per "names for modifiers", only prefixed by `@` ... - -These both have the advantage of being unambiguous and easier to parse. Symbols -are terser, whch is both good and bad. - -We decided not to use glyphs because they are more difficult to understand, -don't contribute very much, and aren't very stylistically consistent with other -Luau syntax. - -### Modifier position? - -For attributes, the position is given by the syntax of attributes, for example: - -```luau - type Vector2 = { @read x: number, @read y : Number } -``` - -For the other proposals, there are four possibilities, depending on whether the -modifier is west-coast or east-coast, and whether it modifies the propertry name -or the type: - -```luau - type Vector2 = { read x : number, read y : number } - type Vector2 = { x read : number, y read : number } - type Vector2 = { x : read number, y : read number } - type Vector2 = { x : number read, y : number read } -``` - -The east-coast options are not easy-to-read with names, but are -easier with symbols, especially since `T?` is already postfix, for -example - -```luau - type Foo = { p: number?+ } -``` - -### How do we talk about properties with differing read- and write-types? - -One corner case is that type inference may deduce different read- and -write-types, which need to be presented to the user. For example the -read-type of `x` is `Animal` but its write-type is `Dog` in the principal type of: - -```luau - function f(x) - let a: Animal = x.pet - x.pet = Dog.new() - return a - end -``` - -If we are adding the modifier to the property name, we can repeat the name, for example - -```luau - x : { read pet : Animal, write pet : Dog } -``` - -If we are adding the modifier to the property type, we can give both types, for example: -```luau - x : { pet : read Animal + write Dog } -``` - -This syntax plays well with symbols for modifiers, for example -```luau - x : { pet : +Animal -Dog } -``` diff --git a/.cursor/rules/luau-rfcs/syntax-singleton-types.md b/.cursor/rules/luau-rfcs/syntax-singleton-types.md deleted file mode 100644 index 147d9f57..00000000 --- a/.cursor/rules/luau-rfcs/syntax-singleton-types.md +++ /dev/null @@ -1,91 +0,0 @@ -# Singleton types - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Introduce a new kind of type variable, called singleton types. They are just like normal types but has the capability to represent a constant runtime value as a type. - -## Motivation - -There are two primary drivers to add two kinds of singleton types: `string` and `boolean`. - -### `string` singleton types - -Luau type checker can get by mostly fine without constant string types, but it can shine at its best in user code. - -One popular pattern are the abstract data types, which could be supported: - -``` -type Ok = { type: "ok", value: T } -type Err = { type: "error", error: E } -type Result = Ok | Err - -local result: Result = ... -if result.type == "ok" then - -- result :: Ok - print(result.value) -else - -- result :: Err - error(result.error) -end -``` - -### `boolean` singleton types - -At the moment, Luau type checker is completely unable to discern the state of a boolean whatsoever, which makes it impossible to determine all the possible types of the expression from any variations of `a and b`, `a and b or c`, or `a or b`. - -## Design - -Both design components of singleton types should be intuitive for everyone by default. - -### Syntax - -A constant string token as well as a constant boolean token is now allowed to show up in type annotation context. - -``` -type Animals = "Dog" | "Cat" | "Bird" -type TrueOrNil = true? -``` - -Adding constant strings as type means that it is now legal to write -`{["foo"]:T}` as a table type. This should be parsed as a property, -not an indexer. For example: -```luau - type T = { - ["foo"]: number, - ["$$bar"]: string, - baz: boolean, - } -``` -The table type `T` is a table with three properties and no indexer. - -### Semantics - -You are allowed to provide a constant value to the generic primitive type. - -```luau -local foo: "Hello world" = "Hello world" -local bar: string = foo -- allowed - -local foo: true = true -local bar: boolean = foo -- also allowed -``` - -The inverse is not true, because you're trying to narrow any values to a specific value. - -```luau -local foo: string = "Hello world" -local bar: "Hello world" = foo -- not allowed - -local foo: boolean = true -local bar: true = foo -- not allowed -``` - -## Drawbacks - -This may increase the cost of type checking - since some types now need to carry a string literal value, it may need to be copied and compared. The cost can be mitigated through interning although this is not very trivial due to cross-module type checking and the need to be able to typecheck a module graph incrementally. - -This may make the type system a bit more complex to understand, as many programmers have a mental model of types that doesn't include being able to use literal values as a type, and having that be a subtype of a more general value type. diff --git a/.cursor/rules/luau-rfcs/syntax-string-interpolation.md b/.cursor/rules/luau-rfcs/syntax-string-interpolation.md deleted file mode 100644 index 00783370..00000000 --- a/.cursor/rules/luau-rfcs/syntax-string-interpolation.md +++ /dev/null @@ -1,175 +0,0 @@ -# String interpolation - -**Status**: Implemented - -## Summary - -New string interpolation syntax. - -## Motivation - -The problems with `string.format` are many. - -1. Must be exact about the types and its corresponding value. -2. Using `%d` is the idiomatic default for most people, but this loses precision. - * `%d` casts the number into `long long`, which has a lower max value than `double` and does not support decimals. - * `%f` by default will format to the millionths, e.g. `5.5` is `5.500000`. - * `%g` by default will format up to the hundred thousandths, e.g. `5.5` is `5.5` and `5.5312389` is `5.53123`. It will also convert the number to scientific notation when it encounters a number equal to or greater than 10^6. - * To not lose too much precision, you need to use `%s`, but even so the type checker assumes you actually wanted strings. -3. No support for `boolean`. You must use `%s` **and** call `tostring`. -4. No support for values implementing the `__tostring` metamethod. -5. Using `%` is in itself a dangerous operation within `string.format`. - * `"Your health is %d% so you need to heal up."` causes a runtime error because `% so` is actually parsed as `(%s)o` and now requires a corresponding string. -6. Having to use parentheses around string literals just to call a method of it. - -## Design - -To fix all of those issues, we need to do a few things. - -1. A new string interpolation expression (fixes #5, #6) -2. Extend `string.format` to accept values of arbitrary types (fixes #1, #2, #3, #4) - -Because we care about backward compatibility, we need some new syntax in order to not change the meaning of existing strings. There are a few components of this new expression: - -1. A string chunk (`` `...{ ``, `}...{`, and `` }...` ``) where `...` is a range of 0 to many characters. - * `\` escapes `` ` ``, `{`, and itself `\`. - * The pairs must be on the same line (unless a `\` escapes the newline) but expressions needn't be on the same line. -2. An expression between the braces. This is the value that will be interpolated into the string. -{% raw %} - * Restriction: we explicitly reject `{{` as it is considered an attempt to escape and get a single `{` character at runtime. -{% endraw %} -3. Formatting specification may follow after the expression, delimited by an unambiguous character. - * Restriction: the formatting specification must be constant at parse time. - * In the absence of an explicit formatting specification, the `%*` token will be used. - * For now, we explicitly reject any formatting specification syntax. A future extension may be introduced to extend the syntax with an optional specification. - -To put the above into formal EBNF grammar: - -``` -stringinterp ::= exp { exp} -``` - -Which, in actual Luau code, will look like the following: - -``` -local world = "world" -print(`Hello {world}!`) ---> Hello world! - -local combo = {5, 2, 8, 9} -print(`The lock combinations are: {table.concat(combo, ", ")}`) ---> The lock combinations are: 5, 2, 8, 9 - -local set1 = Set.new({0, 1, 3}) -local set2 = Set.new({0, 5, 4}) -print(`{set1} ∪ {set2} = {Set.union(set1, set2)}`) ---> {0, 1, 3} ∪ {0, 5, 4} = {0, 1, 3, 4, 5} - -print(`Some example escaping the braces \{like so}`) -print(`backslash \ that escapes the space is not a part of the string...`) -print(`backslash \\ will escape the second backslash...`) -print(`Some text that also includes \`...`) ---> Some example escaping the braces {like so} ---> backslash that escapes the space is not a part of the string... ---> backslash \ will escape the second backslash... ---> Some text that also includes `... -``` - -As for how newlines are handled, they are handled the same as other string literals. Any text between the `{}` delimiters are not considered part of the string, hence newlines are OK. The main thing is that one opening pair will scan until either a closing pair is encountered, or an unescaped newline. - -``` -local name = "Luau" - -print(`Welcome to { - name -}!`) ---> Welcome to Luau! - -print(`Welcome to \ -{name}!`) ---> Welcome to --- Luau! -``` - -We currently *prohibit* using interpolated strings in function calls without parentheses, this is illegal: - -``` -local name = "world" -print`Hello {name}` -``` - -> Note: This restriction is likely temporary while we work through string interpolation DSLs, an ability to pass individual components of interpolated strings to a function. - -{% raw %} -The restriction on `{{` exists solely for the people coming from languages e.g. C#, Rust, or Python which uses `{{` to escape and get the character `{` at runtime. We're also rejecting this at parse time too, since the proper way to escape it is `\{`, so: - -```luau -print(`{{1, 2, 3}} = {myCoolSet}`) -- parse error -``` -{% endraw %} - -If we did not apply this as a parse error, then the above would wind up printing as the following, which is obviously a gotcha we can and should avoid. - -``` ---> table: 0xSOMEADDRESS = {1, 2, 3} -``` - -Since the string interpolation expression is going to be lowered into a `string.format` call, we'll also need to extend `string.format`. The bare minimum to support the lowering is to add a new token whose definition is to perform a `tostring` call. `%*` is currently an invalid token, so this is a backward compatible extension. This RFC shall define `%*` to have the same behavior as if `tostring` was called. - -```luau -print(string.format("%* %*", 1, 2)) ---> 1 2 -``` - -The offset must always be within bound of the numbers of values passed to `string.format`. - -```luau -local function return_one_thing() return "hi" end -local function return_two_nils() return nil, nil end - -print(string.format("%*", return_one_thing())) ---> "hi" - -print(string.format("%*", Set.new({1, 2, 3}))) ---> {1, 2, 3} - -print(string.format("%* %*", return_two_nils())) ---> nil nil - -print(string.format("%* %* %*", return_two_nils())) ---> error: value #3 is missing, got 2 -``` - -It must be said that we are not allowing this style of string literals in type annotations at this time, regardless of zero or many interpolating expressions, so the following two type annotations below are illegal syntax: - -```luau -local foo: `foo` -local bar: `bar{baz}` -``` - -String interpolation syntax will also support escape sequences. Except `\u{...}`, there is no ambiguity with other escape sequences. If `\u{...}` occurs within a string interpolation literal, it takes priority. - -```luau -local foo = `foo\tbar` -- "foo bar" -local bar = `\u{0041} \u{42}` -- "A B" -``` - -## Drawbacks - -If we want to use backticks for other purposes, it may introduce some potential ambiguity. One option to solve that is to only ever produce string interpolation tokens from the context of an expression. This is messy but doable because the parser and the lexer are already implemented to work in tandem. The other option is to pick a different delimiter syntax to keep backticks available for use in the future. - -If we were to naively compile the expression into a `string.format` call, then implementation details would be observable if you write `` `Your health is {hp}% so you need to heal up.` ``. When lowering the expression, we would need to implicitly insert a `%` character anytime one shows up in a string interpolation token. Otherwise attempting to run this will produce a runtime error where the `%s` token is missing its corresponding string value. - -## Alternatives - -Rather than coming up with a new syntax (which doesn't help issue #5 and #6) and extending `string.format` to accept an extra token, we could just make `%s` call `tostring` and be done. However, doing so would cause programs to be more lenient and the type checker would have no way to infer strings from a `string.format` call. To preserve that, we would need a different token anyway. - -Language | Syntax | Conclusion -----------:|:----------------------|:----------- -Python | `f'Hello {name}'` | Rejected because it's ambiguous with function call syntax. -Swift | `"Hello \(name)"` | Rejected because it changes the meaning of existing strings. -Ruby | `"Hello #{name}"` | Rejected because it changes the meaning of existing strings. -JavaScript | `` `Hello ${name}` `` | Viable option as long as we don't intend to use backticks for other purposes. -C# | `$"Hello {name}"` | Viable option and guarantees no ambiguities with future syntax. - -This leaves us with only two syntax that already exists in other programming languages. The current proposal are for backticks, so the only backward compatible alternative are `$""` literals. We don't necessarily need to use `$` symbol here, but if we were to choose a different symbol, `#` cannot be used. I picked backticks because it doesn't require us to add a stack of closing delimiters in the lexer to make sure each nested string interpolation literals are correctly closed with its opening pair. You only have to count them. diff --git a/.cursor/rules/luau-rfcs/syntax-type-alias-type-packs.md b/.cursor/rules/luau-rfcs/syntax-type-alias-type-packs.md deleted file mode 100644 index 9f4279ed..00000000 --- a/.cursor/rules/luau-rfcs/syntax-type-alias-type-packs.md +++ /dev/null @@ -1,218 +0,0 @@ -# Type alias type packs - -**Status**: Implemented - -## Summary - -Provide semantics for referencing type packs inside the body of a type alias declaration - -## Motivation - -We now have an ability to declare a placeholder for a type pack in type alias declaration, but there is no support to reference this pack inside the body of the alias: -```luau -type X = () -> A... -- cannot reference A... as the return value pack - -type Y = X -- invalid number of arguments -``` - -Additionally, while a simple introduction of these generic type packs into the scope will provide an ability to reference them in function declarations, we want to be able to use them to instantiate other type aliases as well. - -Declaration syntax also supports multiple type packs, but we don't have defined semantics on instantiation of such type alias. - -## Design - -We currently support type packs at these locations: -```luau --- for variadic function parameter when type pack is generic -local function f(...: a...) - --- for multiple return values -local function f(): a... - --- as the tail item of function return value pack -local function f(): (number, a...) -``` - -We want to be able to use type packs for type alias instantiation: -```luau -type X = -- - -type A = X -- T... = (S...) -``` - -Similar to function calls, we want to be able to assign zero or more regular types to a single type pack: -```luau -type A = X<> -- T... = () -type B = X -- T... = (number) -type C = X -- T... = (number, string) -``` - -Definition of `A` doesn't parse right now, we would like to make it legal going forward. - -Variadic types can also be assigned to type alias type pack: -```luau -type D = X<...number> -- T... = (...number) -``` - -### Multiple type pack parameters - -We have to keep in mind that it is also possible to declare a type alias that takes multiple type pack parameters. - -Again, type parameters that haven't been matched with type arguments are combined together into the first type pack. -After the first type pack parameter was assigned, following type parameters are not allowed. -Type pack parameters after the first one have to be type packs: -```luau -type Y = -- - -type A = Y -- T... = S..., U... = S... -type B = Y<...string, S...> -- T... = (...string), U... = S... -type C = Y -- T... = (number, string), U... = S... -type D = Y<...number> -- error, T = (...number), but U... = undefined, not (...number) even though one infinite set is enough to fill two, we may have '...number' inside a type pack argument and we'll be unable to see its content -type E = Y -- error, type parameters are not allowed after a type pack - -type Z = -- - -type F = Z -- T = number, U... = S... -type G = Z -- error, not enough regular type arguments, can't split the front of S... into T - -type W = -- - -type H = W -- U... = S..., V... = R... -type I = W -- U... = (string), V... = S... -``` - -### Explicit type pack syntax - -To enable additional control for the content of a type pack, especially in cases where multiple type pack parameters are expected, we introduce an explicit type pack syntax for use in type alias instantiation. - -Similar to variadic types `...a` and generic type packs `T...`, explicit type packs can only be used at type pack positions: -```luau -type Y = (T...) -> (U...) - -type F1 = Y<(number, string), (boolean)> -- T... = (number, string), U... = (boolean) -type F2 = Y<(), ()> -- T... = (), U... = () -type F3 = Y -- T... = (string, number), U... = (number, S...) -``` - -In type parameter list, types inside the parentheses always produce a type pack. -This is in contrast to function return type pack annotation, where `() -> number` is the same as `() -> (number)`. - -However, to preserve backwards-compatibility with optional parenthesis around regular types, type alias instantiation is allowed to assign a non-variadic type pack parameter with a single element to a type argument: -```luau -type X = (T) -> U? -type A = X<(number), (string)> -- T = number, U = string -type A = X<(number), string> -- same - -type Y = (T...) -> () -type B = Y<(number), (string)> -- error: too many type pack parameters -``` - -Explicit type pack syntax is not available in other type pack annotation contexts. - -## Drawbacks - -### Type pack element extraction - -Because our type alias instantiations are not lazy, it's impossible to split of a single type from a type pack: -```luau -type Car = T - -type X = Car -- number -type Y = Car -- error, not enough regular type arguments -type Z = Y -- error, Y doesn't have a valid definition -``` - -With our immediate instantiation, at the point of `Car`, we only know that `S...` is a type pack, but contents are not known. - -Splitting off a single type is is a common pattern with variadic templates in C++, but we don't allow type alias overloads, so use cases are more limited. - -### Type alias can't result in a type pack - -We don't propose type aliases to generate type packs, which could have looked as: -```luau -type Car = T -type Cdr = U... -type Cons = (T, U...) - ---[[ - using type functions to operate on type packs as a list of types -]] -``` - -We wouldn't be able to differentiate if an instantiation results in a type or a type pack and our type system only allows variadic types as the type pack tail element. - -Support for variadic types in the middle of a type pack can be found in TypeScript's tuples. - -## Alternatives - -### Function return type syntax for explicit type packs - -Another option that was considered is to parse `(T)` as `T`, like we do for return type annotation. - -This option complicates the match ruleset since the typechecker will never know if the user has written `T` or `(T)` so each regular type could be a single element type pack and vice versa. -```luau -type X -type C = X -- T... = (number, number) -type D = X<(number), (number)> -- T... = (number, number) - -type Y - ---- two items that were enough to satisfy only a single T... in X are enough to satisfy two T..., U... in Y -type E = Y -- T... = (number), U... = (number) -``` - -### Special mark for single type type packs - -In the Rust language, there is a special disambiguation syntax for single element tuples and single element type packs using a trailing comma: -```rust -(Type,) -``` - -In Python, the same idea is used for single element tuple values: -```python -value = (1, ) -``` - -Since our current ruleset no longer has a problem with single element type tuples, I don't think we need syntax-directed disambiguation option like this one. - -### Only type pack arguments for type pack parameters - -One option that we have is to remove implicit pack assignment from a set of types and always require new explicit type pack syntax: - -```luau -type X = -- - -type B = X<> -- invalid -type C = X -- invalid -type D = X -- invalid - -type B = X<()> -- T... = () -type C = X<(number)> -- T... = (number) -type D = X<(number, string)> -- T... = (number, string) -``` - -But this doesn't allow users to define type aliases where they only care about a few types and use the rest as a 'tail': - -```luau -type X = (T, U, Rest...) -> Rest... - -type A = X -- forced to use a type pack when there are no tail elements -``` - -It also makes it harder to change the type parameter count without fixing up the instantiations. - -### Combining types together with the following type pack into a single argument - -Earlier version of the proposal allowed types to be combined together with a type pack as a tail: -```luau -type X = -- - -type A = X --- T... = (number, S...) -``` - -But this syntax resulted in some confusing behavior when multiple type pack arguments are expected: -```luau -type Y = -- - -type B = Y -- not enough type pack parameters -``` diff --git a/.cursor/rules/luau-rfcs/syntax-type-ascription-bidi.md b/.cursor/rules/luau-rfcs/syntax-type-ascription-bidi.md deleted file mode 100644 index a2381943..00000000 --- a/.cursor/rules/luau-rfcs/syntax-type-ascription-bidi.md +++ /dev/null @@ -1,36 +0,0 @@ -# Relaxing type assertions - -**Status**: Implemented - -## Summary - -The way `::` works today is really strange. The best solution we can come up with is to allow `::` to convert between any two related types. - -## Motivation - -Due to an accident of the implementation, the Luau `::` operator can only be used for downcasts and casts to `any`. - -Because of this property, `::` works as users expect in a great many cases, but doesn't actually make a whole lot of sense when scrutinized. - -```luau -local t = {x=0, y=0} - -local a = t :: {x: number, y: number, z: number} -- OK -local a = t :: {x: number} -- Error: This is an upcast! -``` - -Originally, we intended for type assertions to only be useful for upcasts. This would make it consistent with the way annotations work in OCaml and Haskell and would never break soundness. However, users have yet to report this oddity! It is working correctly for them! - -From this, we conclude that users are actually much more interested in having a convenient way to write a downcast. We should bless this use and clean up the rules so they make more sense. - -## Design - -I propose that we change the meaning of the `::` operator to permit conversions between any two types for which either is a subtype of the other. - -## Drawbacks - -`::` was originally envisioned to be a way for users to make the type inference engine work smarter and better for them. The fact of the matter is, though, that downcasts are useful to our users. We should be responsive to that. - -## Alternatives - -We initially discussed allowing `::` to coerce anything to anything else, acting as a full bypass of the type system. We are not doing this because it is really just not that hard to implement: All we need to do is to succeed if unification works between the two types in either direction. Additionally, requiring one type to be subtype of another catches mistakes when two types are completely unrelated, e.g. casting a `string` to a table will still produce an error when this proposal is in effect - this will make sure that `::` is as safe of a bypass as it can be in practice. diff --git a/.cursor/rules/luau-rfcs/syntax-type-ascription.md b/.cursor/rules/luau-rfcs/syntax-type-ascription.md deleted file mode 100644 index a56c5099..00000000 --- a/.cursor/rules/luau-rfcs/syntax-type-ascription.md +++ /dev/null @@ -1,68 +0,0 @@ -# Type ascriptions - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Implement syntax for type ascriptions using `::` - -## Motivation - -Luau would like to provide a mechanism for requiring a value to be of a specific type: - -```luau --- Asserts that the result of a + b is a number. --- Emits a type error if it isn't. -local foo = (a + b) as number -``` - -This syntax was proposed in the original Luau syntax proposal. Unfortunately, we discovered that there is a syntactical ambiguity with `as`: - -```luau --- Two function calls or a type assertion? -foo() as (bar) -``` - -## Design - -To provide this functionality without introducing syntactical confusion, we want to change this syntax to use the `::` symbol instead of `as`: - -```luau -local foo = (a + b) :: number -``` - -This syntax is borrowed from Haskell, where it performs the same function. - -The `::` operator will bind very tightly, like `as`: - -```luau --- type assertion applies to c, not (b + c). -local a = b + c :: number -``` - -Note that `::` can only cast a *single* value to a type - not a type pack (multiple values). This means that in the following context, `::` changes runtime behavior: - -```luau -foo(1, bar()) -- passes all values returned by bar() to foo() -foo(1, bar() :: any) -- passes just the first value returned by bar() to foo() -``` - -## Drawbacks - -It's somewhat unusual for Lua to use symbols as operators, with the exception of arithmetics (and `..`). Also a lot of Luau users may be familiar with TypeScript, where the equivalent concept uses `as`. - -`::` may make it more difficult for us to use Turbofish (`::<>`) in the future. - -## Alternatives - -We considered requiring `as` to be wrapped in parentheses, and then relaxing this restriction where there's no chance of syntactical ambiguity: - -```luau -local foo: SomeType = (fn() as SomeType) --- Parentheses not needed: unambiguous! -bar(foo as number) -``` - -We decided to not go with this due to concerns about the complexity of the grammar - it requires users to internalize knowledge of our parser to know when they need to surround an `as` expression with parentheses. The rules for when you can leave the parentheses out are somewhat nonintuitive. diff --git a/.cursor/rules/luau-rfcs/syntax-typed-variadics.md b/.cursor/rules/luau-rfcs/syntax-typed-variadics.md deleted file mode 100644 index 53372a4f..00000000 --- a/.cursor/rules/luau-rfcs/syntax-typed-variadics.md +++ /dev/null @@ -1,45 +0,0 @@ -# Typed variadics - -> Note: this RFC was adapted from an internal proposal that predates RFC process - -**Status**: Implemented - -## Summary - -Add syntax for ascribing a type to variadic pack (`...`). - -## Motivation - -Luau's type checker internally can represent a typed variadic: any number of values of the same type. Developers should be able to describe this construct in their own code, for cases where they have a function that accepts an arbitrary number of `string`s, for example. - -## Design - -We think that the postfix `...: T` syntax is the best balance of readability and simplicity. In function type annotations, we will use `...T`: - -```luau -function math.max(...: number): number -end - -type fn = (...string) -> string - -type fn2 = () -> ...string -``` - -This doesn't introduce syntactical ambiguity and should cover all cases where we need to represent this construct. Like `...` itself, this syntax is only legal as the last parameter to a function. - -Like all type annotations, the `...: T` syntax has no effect on runtime behavior versus an unannotated `...`. - -There are currently no plans to introduce named variadics, but this proposal leaves room to adopt them with the form `...name: Type` in function declarations in the future. - -## Drawbacks - -The mismatch between the type of `...` in function declaration (`number`) and type declaration (`...number`) is a bit awkward. This also gets more complicated when we introduce generic variadic packs. - -## Alternatives - -We considered several other syntaxes for this construct: - -* `...T`: leaves no room to introduce named variadics -* `...: T...`: redundant `...` -* `... : ...T`: feels redundant, same as above -* `...: T*`: potentially confusing for users with C knowledge, where `T*` is a pointer type diff --git a/.cursor/rules/luau-rfcs/type-ascription-by-inhabitance.md b/.cursor/rules/luau-rfcs/type-ascription-by-inhabitance.md deleted file mode 100644 index 5239dfbe..00000000 --- a/.cursor/rules/luau-rfcs/type-ascription-by-inhabitance.md +++ /dev/null @@ -1,71 +0,0 @@ -# Improved type checking rules of cast operator - -## Summary - -Replace the bivariance rule of the cast operator `::` by a rule of intersection inhabitance. - -## Motivation - -This [RFC](./syntax-type-ascription.md) proposed a rule such that the cast is legal if and only if it is an upcast, i.e. given a term `number`, you can upcast into `number | string`. An implementation error instead actually allowed _downcasts_ only, i.e. given a term `number | string`, you can downcast into `number` but not the other way. - -We relaxed it in this [RFC](./syntax-type-ascription-bidi.md) by making the cast operator _bivariant_, which is to test downcasts _or_ upcasts, so now you can cast from `number` to `number | string` and also `number | string` to `number`. - -The current rule almost works for some use cases, but not all. For instance, you cannot cast `string` into `"a"?` because neither `string <: "a"?` nor `"a"? <: string` holds true: - - Upcast: `string` is not a subtype of `"a"` - - Downcast: `"a"` is a subtype of `string`, but `nil` is not a subtype of `string`. - -The workaround currently is to have an intermediary `any` or `unknown` cast: `(e :: any) :: "a"?` where `e : string`. - -## Design - -We propose that cast operator should instead test for whether there exists a common type from the type of the expression and the type we wish to cast into. - -For example, `e :: T` will report an error if and only if `typeof(e) & T` is uninhabited, unless `typeof(e)` is already uninhabited. More concretely: - -```luau -local function noop(x) end - -local function f(e: number | string) - -- OK - noop(e :: string) -- (number | string) & string ~ string - noop(e :: number) -- (number | string) & number ~ number - noop(e :: string | boolean) -- (number | string) & (string | boolean) ~ string - - -- Not OK - noop(e :: boolean) -- (number | string) & boolean ~ never - noop(e :: never) -- (number | string) & never ~ never - - -- Special cases - noop(error("") :: string) -- OK -end -``` - -The reason why the special case oughtn't report an error is to support ad hoc typed holes pattern instead of having to hand-craft an expression that matches that type: - -```luau -local x = error("") :: string | number --- versus -local x = if math.random() > 0.5 then "hello" else 5 -``` - -We don't apply the same special case for `T`, otherwise we won't report an error when `e : string` and `T` is `never`. This would mean we get to support the exhaustive analysis use case: - -```luau -local function f(e: number | string) - if typeof(e) == "number" then - -- ... - elseif typeof(e) == "string" then - -- ... - else - noop(e :: never) -- Statically asserts that `e` is indeed `never` - end -end -``` - -## Drawbacks - -This does relax the rules of the cast operator significantly and despite that it's what users actually do with it, it's more likely to be error-prone than before, e.g. casting from `number | string` to `string | boolean` without `any` intermediary cast. - -## Alternatives - -Remove all the type checking rules and just let it run amok, such as casting `number` right into `string` with no type errors. diff --git a/.cursor/rules/luau-rfcs/type-byte-buffer.md b/.cursor/rules/luau-rfcs/type-byte-buffer.md deleted file mode 100644 index 335b35d7..00000000 --- a/.cursor/rules/luau-rfcs/type-byte-buffer.md +++ /dev/null @@ -1,187 +0,0 @@ -# Byte buffer type - -**Status**: Implemented - -## Summary - -A new built-in type to serve as a mutable array of bytes, with a library for reading and writing the contents. - -## Motivation - -The existing mechanisms for representing binary data in Luau can be insufficient for performance-oriented use cases. - -A binary blob may be represented as an array of numbers 0-255 (idiomatic and reasonably performant, but very space-inefficient: each element takes 16 bytes, and it's difficult to work with data that is wider than bytes) or a string (only works for read-only cases, data extraction is possible via `string.unpack` but not very efficient). Neither of the two options are optimal, especially when the use case is data encoding (as opposed to decoding). - -While the host can provide custom data types that close this gap using `userdata` with overridden `__index`/`__newindex` that provide byte storage, the resulting type would be memory-efficient but not performance-efficient due to the cost of metamethod dispatch for every access. Additionally, since every host has a different API, this would make it difficult to write portable Luau algorithms that require efficient binary access. - -With this type, we solve the use cases for binary format encoding and decoding. This opens the door for developers to work with file formats that might've been too large to represent with tables or to write to strings. It also allows for writing algorithms that deal with raw data often, such as compression or hashing. Web services that exchange data in packed formats could also benefit from this. The new type can also serve as a more efficient internal representation for libraries that provide higher level objects like images or geometry data. - -Other high-level languages support similar data structures, for example [Java ByteByffer](https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/nio/ByteBuffer.html) or [JavaScript ArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer). - -## Design - -This type will be called 'buffer' and will be implemented using a new built-in type (GCObject with new tag). - -By default, metatable is not set for this type and can only be modified using `lua_setmetatable` C API. - -Operations on this type will be exposed through a new Luau library called 'buffer`, with the following functions: - -`buffer.create(size: number): buffer` - -Instantiates the object with a fixed size. -Each byte is initialized to 0. - -'size' has to be an integer and it cannot be negative. Maximum size is defined by implementation, but it at least matches the maximum string size. - -`buffer.fromstring(str: string): buffer` - -Instantiates the object from a string. -The size of the buffer is fixed and equals to the length of the string. - -`buffer.tostring(b: buffer): string` - -Returns the buffer data as a string. - -`buffer.len(b: buffer): number` - -Returns the size of the buffer. - -`buffer.copy(target_buffer: buffer, target_offset: number, source_buffer: buffer, source_offset: number?, count: number?): ()` - -Copy 'count' bytes from 'source_buffer' starting at offset 'source_offset' into the 'target_buffer' at 'target_offset'. - -It is possible for 'source_buffer' and 'target_buffer' to be the same. -Copying an overlapping region inside the same buffer acts as if the source region is copied into a temporary buffer and then that buffer is copied over to the target. - -If 'source_offset' is nil or is omitted, it defaults to 0. -If 'count' is 'nil' or is omitted, the whole 'source_buffer' data starting from 'source_offset' is taken. - -`buffer.fill(b: buffer, offset: number, value: number, count: number?): ()` - -Set 'count' bytes in the buffer starting from specified offset to 'value'. - -'value' is converted to unsigned integer using `bit32` library semantics, lower 8 bits are taken from the resulting integer to use as the byte value. - -If 'count' is 'nil' or is omitted, all bytes after the specified offset are set. - -`buffer.readi8(b: buffer, offset: number): number` - -`buffer.readu8(b: buffer, offset: number): number` - -`buffer.readi16(b: buffer, offset: number): number` - -`buffer.readu16(b: buffer, offset: number): number` - -`buffer.readi32(b: buffer, offset: number): number` - -`buffer.readu32(b: buffer, offset: number): number` - -`buffer.readf32(b: buffer, offset: number): number` - -`buffer.readf64(b: buffer, offset: number): number` - -Used to read the data from the buffer by reinterpreting bytes at the offset as the type in the argument and converting it into a number. - -When reading the value of any NaN representation, implementation can (but not required to) replace it with a different quiet NaN representation. - -`buffer.writei8(b: buffer, offset: number, value: number): ()` - -`buffer.writeu8(b: buffer, offset: number, value: number): ()` - -`buffer.writei16(b: buffer, offset: number, value: number): ()` - -`buffer.writeu16(b: buffer, offset: number, value: number): ()` - -`buffer.writei32(b: buffer, offset: number, value: number): ()` - -`buffer.writeu32(b: buffer, offset: number, value: number): ()` - -`buffer.writef32(b: buffer, offset: number, value: number): ()` - -`buffer.writef64(b: buffer, offset: number, value: number): ()` - -Used to write data to the buffer by converting the number into the type specified by the argument and reinterpreting it as individual bytes. - -Conversion to integer numbers performs a truncation of the number value. Results of converting special number values (inf/nan) are platform-specific. -Conversion to unsigned numbers uses `bit32` library semantics. - -`buffer.readstring(b: buffer, offset: number, count: number): string` - -Used to read a string of length 'count' from the buffer at specified offset. - -`buffer.writestring(b: buffer, offset: number, value: string, count: number?): ()` - -Used to write data from a string into the buffer at specified offset. - -If an optional 'count' is specified, only 'count' bytes are taken from the string. 'count' cannot be larger than the string length. - ---- - -All offsets start at 0 (not to be confused with indices that start at 1 in Luau tables). -This choice is made for both performance reasons (no need to subtract 1) and for compatibility with data formats that often describe field positions using offsets. -While there is a way to solve the performance problem using luajit trick where table array part is allocated from index 0, this would mean that data in the buffer has 1 extra byte and this complicates the bounds checking. - -Offsets and 'count' numbers are cast to an integer in an implementation-defined way. - -Read and write operations for relevant types are little endian as it is the most common use case, and conversion is often trivial to do manually. - -Integer numbers are read and written using two's complement representation. - -Floating-point numbers are read and written using a format specified by IEEE 754. - -Additionally, unaligned offsets in all operations are valid and behave as expected. - -Unless otherwise specified, if a read or write operation would cause an access outside the data in the buffer, an error is thrown. - -### Public C API - -`void* lua_tobuffer(lua_State* L, int idx, size_t* len);` - -Used to fetch buffer data pointer and buffer size at specified location. - -If there is no buffer at the location, `NULL` is returned and `len` is not modified. - -`void* lua_newbuffer(lua_State* L, size_t l);` - -Pushes new buffer of size `l` onto the stack. - -`lua_isbuffer(L, n)` - -C macro helper to check if value at the specified location is a buffer. - -Simiar to `lua_istable`/`lua_isvector`/`lua_isthread` it's a simple wrapper over `lua_type` call and doesn't require internal coercions/internal field access like `lua_isnumber`/`lua_iscfunction`. - -`void* luaL_checkbuffer(lua_State* L, int narg, size_t* len);` - -Similar to `lua_tobuffer`, but throws a tag error if there is no buffer at specified location. - -`int luaopen_buffer(lua_State* L);` - -Registers the 'buffer' library. If `luaL_openlibs` is used, that includes the 'buffer' library. - -`LUA_BUFFERLIBNAME` - -Macro containing the 'buffer' library name. - -## Drawbacks - -This introduces 'buffer' as a class type in global typing context and adds new global 'buffer' table. -While class type might intersect with user-defined 'buffer' type, such type redefinitions are already allowed in Luau, so this should not cause new type errors. -The same goes for the global table, users can already override globals like 'string', so additional of a new global is backwards-compatible, but new table will not be accessible in such a case. - -This increases the complexity of the VM a little bit, since support for new tagged type is required in interpreter loop and GC. - -There is also a string buffer C API; by having functions talk about 'buffer' (like `luaL_extendbuffer`) and use `luaL_Buffer`, it might be a point of confusion for C API users. - -## Alternatives - -The workarounds without this feature are significantly inefficient: - -* Tables can, at most, represent 64 bits per slot using expensive `vector` packing. -* Tables with or without packing severely bloat memory, as each array entry is subject to Luau value size and alignment. -* Strings are immutable and can’t be used to efficiently construct binary data without exponential allocations. -* Built in `string.pack` and `string.unpack` can’t cover more complex schemas on their own or formats which are edited mid-creation. - -The proposed buffer object has no cursor/position as part of its state; while it would be possible to implement this along with a separate set of APIs like `pushTYPE` and `takeTYPE`, this addition is always possible to implement later and it makes the buffer structure more complicated; additionally, external offset management might be easier to optimize and is more orthogonal as we do not need to duplicate stateful and stateless functions. - -The proposed buffer object is not resizeable; this is possible to implement later using explicit `buffer.resize` call, however this may result in a performance impact for native implementation as the data will be read through a pointer redirection and will be more difficult to optimize; thus, this version of the RFC only proposes fixed length buffers. That said, if resizeable buffers are desired in the future, we would plan to enhance the current buffer type instead of making a parallel resizeable buffer type to reduce complexity. diff --git a/.cursor/rules/luau-rfcs/type-error-suppression.md b/.cursor/rules/luau-rfcs/type-error-suppression.md deleted file mode 100644 index 94d6f0b2..00000000 --- a/.cursor/rules/luau-rfcs/type-error-suppression.md +++ /dev/null @@ -1,132 +0,0 @@ -# Type Error Suppression - -**Status**: Implemented - -## Summary - -An alternative approach to type error suppression and the `any` type. - -## Motivation - -There are two reasons for this RFC: to make clearer how we're -approaching error suppression, and to remove the magic "both top and -bottom" behavior of the `any` type. - -### Error suppression - -Currently, we have ad hoc error suppression, where we try to avoid cascading errors, for example in -```luau - local x = t.p.q.r -``` - -if `t` is a table without a `p` field, we report a type error on -`t.p`, but we avoid cascading errors by assigning `t.p` an internal -`error` type, and suppressing errors in property access `M.p` when `M` -has type `error`. - -In this RFC, we clarify that error suppression occurs when the error -is caused by a type `T`, and `error` is a subtype of `T`. - -### The `any` type - -The `any` type is an outlier in the type system, in that currently it -is both a top type (`T` is a subtype of `any` for all types `T`) and a -bottom type (`any` is a subtype of `U` for all types `U`). This is -"consistent subtyping" (written `T ≾ U`) from Siek and Taha (2007), -which has the issue of not being transitive (if it were, then `T ≾ U` -for all types `T` and `U`, which is not a very useful definition of -subtyping). - -The solution used by Siek and Taha is to split consistent subtyping (`S ≾ U`) -into a *consistency relation* `S ~ T` and a *subtyping relation* (`T <: U`). -The role of the consistency relation is to allow `any` to stand in for any type -(`any ~ T` for all types `T`). - -We propose something different: performing *error suppression* on -failures of subtyping. We treat `any` as a top type, so `T <: any`, -but suppress type error messages caused by `any <: U` failing. - -## Design - -This design uses an `error` type (though adding user syntax for it is -out of scope of this RFC). - -Call a type: - - * shallowly safe when any uses of `error` or `any` are inside a table or function type, and - * deeply safe when it does not contain `error` or `any` anywhere. - -A type `T` is shallowly unsafe precisely when `error <: T`. - -We add a new subtyping relationship: - - * `any <: unknown | error` - -We keep the existing subtyping relationships: - - * `T <: any` for any type `T` - -We add a proviso to `unknown` being a top type: - - * `T <: unknown` for any *shallowly safe* type `T` - -Currently, we consider a subtype test to have failed when it generates -no errors. We separate out the result of the check from its errors, -and instead have a requirement: - - * If checking `T <: U` succeeds, it produces no errors. - -It is now possible for a subtyping test to fail, but produce no errors. -For example, `number <: any` succeeds (since `any` is the top type) -and `number <: string` fails with an error, but now `any <: string` fails -*but produces no errors*. - -For end users, who only care about errors being reported, this will not be -a noticable change (but see the discussion of breaking changes below). -Internally though, it helps us avoid footguns, since now subtyping -is transitive. - -The subtype testing algorithm changes: - - * Subtype checking returns a boolean. - * Replace all of the current tests of "errors are empty" by testing the return value. - * In the case of testing `any <: T`, return `true` with no errors. - * In the case of testing `T <: any`, return `false` with no errors. - * In the case of testing `T <: unknown`, check `T` for being a shallowly safe type. - -These changes are not huge, and can be implemented for both the current greedy unifier, -and future constraint solvers. - -Theses changes have been prototyped: https://github.com/luau-lang/agda-typeck/pull/4 - -## Drawbacks - -This is theoretically a breaking change but my word you have to work hard at it. -For just checking subtyping there is no difference: the new algorithm returns `true` precisely -when the old algorithm generates no errors. But it can result in different unifications. - -For example, if `Y` is a free type variable, then currently checking `(any & Y) <: number` -will not perform any unification, which makes a difference to the program: - -```luau - function f(x : any, y) -- introduces a new free type Y for y - if x == y then -- type refinement makes y have type (any & Y) - return math.abs(y) -- checks (any & Y) <: number - end - end -``` - -Currently we infer type `(any, a) -> number` for `f`. With the new -algorithm, checking `(any & Y) <: number` will succeed by unifying `Y` -with `number`, so `f` will be given the more accurate type -`(any, number) -> number`. - -So this is a breaking change, but results in a more accurate type. -In practice it is unlikely that this change will do anything but help find bugs. - -## Alternatives - -We could implement Siek and Taha's algorithm, but that only helps with -`any`, not with more general error supression. - -We could leave everything alone, and live with the weirdness of non-transitive subtyping. diff --git a/.cursor/rules/luau-rfcs/type-long-integer.md b/.cursor/rules/luau-rfcs/type-long-integer.md deleted file mode 100644 index de64d62c..00000000 --- a/.cursor/rules/luau-rfcs/type-long-integer.md +++ /dev/null @@ -1,393 +0,0 @@ -# 64-bit Integer Type - -## Summary - -A builtin 'integer' type to represent 64 bit integer numbers. - -## Motivation - -Current methods of representing 64-bit integers in Luau with the default environment are done with high-low pairs or by splitting them among vectors which leads to poor ergonomics and may not be sufficient for cases where performance is important. - -In the case of a high-low pair implementation, each individual number takes 16 bytes (or 24) and needs to be handled together which can be confusing. - -In the case of vector implementations, ergonomics are improved by storing the entire integer in one value. However you have the same issues of implementation complexity and lack of integration with the type system. - -In both cases, performance is lacking compared to what could be provided by a native implementation. - -As Luau grows, the restriction to doubles will be an increasing pain point for any use case which involves a 64-bit integer. -System support for 64-bit integers is ubiquitous and their use is widespread. - -Besides the above solutions in userland, runtimes are also able to define their own userdata for 64-bit integers. However, this requires each runtime to reimplement 64-bit integer support themselves, and carries with it the potential of significant differences in their semantics. Such an outcome would harm the ecosystem as a whole, requiring libraries to find a common API across all of their supported runtimes, or otherwise program around differences in their APIs. - -Further, representing 64-bit numbers as heap-allocated userdata is sufficient for correctness, but also adds a layer of indirection for something that could fit within the existing value size. In domains where the use of these numbers is more common, the performance characteristics of these varying implementation techniques could be problematic or even prohibitive. - -Userdata remains the right mechanism for complex or embedder-specific numeric types, but 64-bit integers have a sufficiently large problem domain to justify their inclusion as a core value type, and bring significant benefits for performance and interoperability in the overall Luau ecosystem. - -## Design - -This will be implemented with a new type called `integer`. - -An additional character may be specified at the end of numeric literals `i` which will signify an 64 bit integer literal. -64 bit integer literals will support separators, hex, and binary values: - -```luau -local a = 123i -local b = 1_000i -local c = 0xABABi -local d = 0b1000_1000i -``` - -Integer literal numbers have to be exactly representable, overflow is a parsing error. - -Operations performing a string formatting of an integer should format the number as signed by default. - -Integer values will have a built-in equality comparison, but will not have any other operators or metamethods defined. - -Integers are never automatically converted to numbers or strings, and vice-versa. -Passing an integer to a function expecting a number (or string) will result in a type error. - -While there are no arithmentic operators defined for integers in this RFC, it is still worth noting that operations between `number` and `integer` are also not supported. - -Functions for creating and manipulating this type will exist in a new library called 'integer`. - -### Library - -Unless otherwise specified, all operations interpret integer values as signed two's complement 64 bit numbers. -Operations that treat the value as unsigned are explicitly prefixed with 'u'. - -`function integer.create(n: number): integer?` - -Converts a number to an integer. - -Returns `nil` If the double number cannot be represented as an integer exactly, i.e. it has a fractional part, is out of range or is NaN. - -This behavior is chosen to closely match `math.tointeger` from Lua 5.4 and can have a relatively efficient implementation. - -`function integer.fromstring(str: string, base: number?): integer?` - -Converts a string representation of a number into an integer. - -Number inside the string has to be an integer. -String is allowed to have leading and trailing spaces and number can be preceded by a sign. -If base is not specified, number can have a `0x` or `0X` prefix to be converted in base 16, otherwise base 10 is used. - -When base is specified, it has to be in range between 2 and 36 inclusive. -In base 10 and base 16, numbers are allowed to have a `0x` or `0X` prefix. - -Returns `nil` if the string doesn't contain a number. - -This behavior is chosen to match `tonumber`, but excludes floating-point numbers. - -`function integer.tostring(n: integer): string` - -Converts an integer to a string representation. - -`function integer.tonumber(n: integer): number` - -Converts an integer to a double. - -If the value cannot be represented as a double exactly, round to nearest, tie to even rounding mode is used. - -`function integer.neg(a: integer): integer` - -Negates the value. -Overflow wraps around according to rules of two-complement arithmetic. - -`function integer.add(a: integer, b: integer): integer` - -Adds `a` to `b`. -Overflow wraps around according to rules of two-complement arithmetic. - -`function integer.sub(a: integer, b: integer): integer` - -Subtracts `b` from `a`. -Overflow wraps around according to rules of two-complement arithmetic. - -`function integer.mul(a: integer, b: integer): integer` - -Multiplies `a` and `b`. -Overflow wraps around according to rules of two-complement arithmetic. - -`function integer.div(a: integer, b: integer): integer` - -Performs signed truncated division of `a` by `b`. - -If `b` is 0, throws a division by zero error. - -If `a` is -2^63 and `b` is -1, throws an overflow error. - -`function integer.rem(a: integer, b: integer): integer` - -Computes remainder of the signed truncated division of `a` by `b`. - -If `b` is 0, throws a division by zero error. - -If `a` is -2^63 and `b` is -1, result is 0. - -`function integer.idiv(a: integer, b: integer): integer` - -Performs signed floored division of `a` by `b`. - -If `b` is 0, throws a division by zero error. - -If `a` is -2^63 and `b` is -1, throws an overflow error. - -`function integer.mod(a: integer, b: integer): integer` - -Performs signed floored modulus division of `a` by `b`. - -If `b` is 0, throws a division by zero error. - -If `a` is -2^63 and `b` is -1, result is 0. - -`function integer.udiv(a: integer, b: integer): integer` - -Performs unsigned division of `a` by `b`. - -If `b` is 0, throws an error. - -`function integer.urem(a: integer, b: integer): integer` - -Computes remainder of the unsigned division of `a` by `b`. - -If `b` is 0, throws an error. - -`function integer.min(a: integer, b: integer): integer` - -Returns the smallest of two integer numbers. - -`function integer.max(a: integer, b: integer): integer` - -Returns the largest of two integer numbers. - -`function integer.clamp(a: integer, min: integer, max: integer): integer` - -Returns `a` if the number is in `[min, max]` range; otherwise, returns `min` when `a < min`, and `max` otherwise. - -The function errors if `min > max`, consistent with `math.clamp`. - -`function integer.band(a: integer, b: integer): integer` - -Performs a bitwise and of `a` and `b`. - -`function integer.bor(a: integer, b: integer): integer` - -Performs a bitwise or of `a` and `b`. - -`function integer.bnot(a: integer): integer` - -Returns a bitwise negation of the input number. - -`function integer.bxor(a: integer, b: integer): integer` - -Performs a bitwise xor (exclusive or) of `a` and `b`. - -`function integer.lt(a: integer, b: integer): boolean` - -Compares signed less than (<) comparison of `a` and `b`. - -`function integer.le(a: integer, b: integer): boolean` - -Compares signed less than or equal (<=) comparison of `a` and `b`. - -`function integer.ult(a: integer, b: integer): boolean` - -Compares unsigned less than (<) comparison of `a` and `b`. - -`function integer.ule(a: integer, b: integer): boolean` - -Compares unsigned less than or equal (<=) comparison of `a` and `b`. - -`function integer.lshift(n: integer, i: integer): integer` - -Shifts `n` to the left by `i` bits (if `i` is negative, a right shift is performed instead). - -When `i` is outside of `[-63..63]` range, returns 0. - -`function integer.rshift(n: integer, i: integer): integer` - -Shifts `n` to the right by `i` bits (if `i` is negative, a left shift is performed instead). - -When `i` is outside of `[-63..63]` range, returns 0. - -`function integer.arshift(n: integer, i: integer): integer` - -Shifts `n` by `i` bits to the right (if `i` is negative, a left shift is performed instead). - -The most significant bit of `n` is propagated during the shift. - -When `i` is larger than 63, returns an integer with all bits set to the sign bit of `n`. - -When `i` is smaller than -63, 0 is returned. - -`function integer.lrotate(n: integer, i: integer): integer` - -Rotates `n` to the left by `i` bits (if `i` is negative, a right rotate is performed instead); the bits that are shifted past the bit width are shifted back from the right. - -`i` is interpreted modulo 64. - -`function integer.rrotate(n: integer, i: integer): integer` - -Rotates `n` to the right by `i` bits (if `i` is negative, a left rotate is performed instead); the bits that are shifted past the bit width are shifted back from the left. - -`i` is interpreted modulo 64. - -`function integer.extract(n: integer, f: integer, w: integer?): integer` - -Extracts bits of `n` at position `f` with a width of `w`. - -`w` defaults to 1, so a two-argument version of extract returns the bit value at position `f`. - -Bits are indexed starting at 0. -`f` cannot be negative. -`w` has to be positive (> 0). -`f + w` must be less than or equal to 64. - -`function integer.replace(n: integer, r: integer, f: integer, w: integer?): integer` - -Replaces bits of `n` at position `f` and width `w` with `w` least significant bits of `r`. - -`w` defaults to 1, so a three-argument version of replace changes one bit at position `f` to `r` and returns the result. - -Bits are indexed starting at 0. -`f` cannot be negative. -`w` has to be positive (> 0). -`f + w` must be less than or equal to 64. - -`function integer.btest(a: integer, b: integer): boolean` - -Perform a bitwise and `a` and `b` and returns true iff the result is not 0. - -`function integer.countrz(n: integer): integer` - -Returns the number of consecutive zero bits starting from the right-most (least significant) bit. -Returns 64 if `n` is zero. - -`function integer.countlz(n: integer): integer` - -Returns the number of consecutive zero bits starting from the left-most (most significant) bit. -Returns 64 if `n` is zero. - -`function integer.bswap(n: integer): integer` - -Returns `n` with the order of the bytes swapped. - -### Extensions to the buffer library - -Functions to read and write integer values are added. -Functions use `integer` in the name as opposed to `i64` to signify the difference of the result/argument type from that of `number`. - -`function buffer.readinteger(b: buffer, offset: number): integer` - -Reads an integer out of a buffer at the given offset. - -`function buffer.writeinteger(b: buffer, offset: number, value: integer): ()` - -Writes an integer to a buffer at the given offset. - -### Extensions to the math library - -For parity with Lua 5.3+, two additional constants are added to the math library. - -`math.maxinteger` - -Integer value representing 2^63-1 (`9_223_372_036_854_775_807i`) - -`math.mininteger` - -Integer value representing -2^63 (`-9_223_372_036_854_775_808i`) - -### Extensions to the string library - -`string.format` function is updated to support integer arguments. - -'d', 'i' and '*' format specifiers will format an integer as a signed 64 bit integer number. - -'o', 'u', 'x' and 'X' format specifiers will format an integer as an unsigned 64 bit integer number. - -### C API - -`int64_t lua_tointeger64(lua_State *L, int idx, int* isinteger)` - -Returns a value of an integer at `idx` or 0 on failure. - -If `isinteger` is not a null pointer, writes 1 if the value at `idx` was an integer value and 0 on failure. - -`void lua_pushinteger64(lua_State *L, int64_t n)` - -Pushes an integer value on top of the stack. - -`int lua_isinteger64(lua_State *L, int idx)` - -Determines if a value at `idx` is an integer. - -This function is implemented as a C macro. - -`int64_t luaL_checkinteger64(lua_State *L, int narg)` - -Returns a value of an integer at `narg` or throws an error on failure. - -`int64_t luaL_optinteger64(lua_State *L, int narg, int64_t def)` - -Returns a value of an integer at `narg` or `def` if there is no value. - -Throws an error if there is a value but it is not an integer. - -`luaopen_integer(lua_State *L)` - -Registers the `integer` library. -Included in `luaL_openlibs`. - -## Drawbacks - -This introduces a library with a large set of functions which will likely take a large number of fastcall slots. - -The lack of operator overloads causes code with integers to be more verbose, decreasing readability in complex expressions. - -Introduction of a new type will require updates to libraries (serialization, input/output) which try to handle all potential Luau values. - -The suffix 'i' is standard mathematical notation for imaginary numbers. -Adopting it for integers will likely block proposals for a built-in `complex` number type in the future. - -## Alternatives - -Do nothing, the workarounds exist and are in use but this will restrict the areas Luau can be used without implementation burden or reliance on an externally maintained implementation of 64-bit integers. - -### Operator overloads - -This proposal does not introduce overloaded operators aside from equality checks. -This omission is deliberate. - -While the lack of operators makes code more verbose, Luau's primary numeric type remains `number`. -The `integer` type is intended to cover specialized use cases, many of which will specifically prefer explicit library functions over operators for performance. - -Polymorphic overloaded operators present many challenges and can cause unexpected drops of performance. -This is already true when working with `vector` types without type annotations and given the focus of this proposal, we do not want to provide additional pitfalls. -Monomorphic library functions allow compiler and runtime to optimize more aggressively. - -Heavy uses of 64-bit integers often rely on bitwise operations. -Since Luau does not have bitwise operators in its syntax, even with a subset of overloaded operators in place, code will still end up using library functions. - -Integer division has multiple conflicting definitions (truncated vs. floored). -Operators like `/` and `%` would force a specific default behavior that might not match the specific rounding that the user intended. -Default behavior might also be less performant, causing developers to still rely on library methods. - -Having different library methods allows the developers to choose the specific operation semantics they require. - -### Separate signed and unsigned types - -It has been suggested to create two separate types for signed and unsigned integers or have it be a property of the value. -Having distinct types would provide the typechecker with the ability to highlight mixed operations and a runtime check could throw an error. - -As mentioned above, integers are already not expected to be the default value type to be chosen by developers to work with. -Unsigned integer use is even rarer and other programming languages followed the similar path of only supporting auxiliary operations on them. -Other languages with unsigned integer support like C++ recommend limiting their use in their guidelines. -Given this, we have rejected the idea of distinct signed and unsigned integer types. - -Having two distinct integer types increases the API and library surface area and implementation complexity significantly for little gain. - -In two's complement representation, a single data type with default signed interpretation covers many signed and unsigned operations in an identical way. -Only a limited subset of operations interpreting data as unsigned is added in this proposal to cover most needs for unsigned integer numbers. - -Having library methods instead of operators allows the developer to make an explicit choice of the interpretation required (e.g. `lt` vs `ult`). -Reinterpretation of a negative value as a positive unsigned value can be made deliberately by the choice of function, and is not as error-prone as using an operator. diff --git a/.cursor/rules/luau-rfcs/types-library-optional.md b/.cursor/rules/luau-rfcs/types-library-optional.md deleted file mode 100644 index 5a364923..00000000 --- a/.cursor/rules/luau-rfcs/types-library-optional.md +++ /dev/null @@ -1,21 +0,0 @@ -# types.optional - -**Status**: Implemented - -## Summary - -This RFC proposes adding a new method to the `types` library in type functions, that provides a shorthand for `types.unionof(type, types.singleton(nil))`. - -## Motivation - -Optional types occur very commonly, and it is annoying to have to always type `types.unionof(meow, types.singleton(nil))` to make a optional type, this leads to having the following appear in codebases that make use of optional types a lot in type functions: - -```luau -type function optional(type) - return types.unionof(type, types.singleton(nil)) -end -``` - -## Design - -As a solution, a new method to the `types` library should be added called `optional`. When called on a union, this will add `nil` to the components. Otherwise, this new method will act the same as `types.unionof(type, types.singleton(nil))`. diff --git a/.cursor/rules/luau-rfcs/udtf-is-extern.md b/.cursor/rules/luau-rfcs/udtf-is-extern.md deleted file mode 100644 index 3c2b0518..00000000 --- a/.cursor/rules/luau-rfcs/udtf-is-extern.md +++ /dev/null @@ -1,36 +0,0 @@ -# `extern` tag in User-Defined Type Functions. - -## Summary - -Currently, in user-defined type functions, the ``tag`` field for an external type is ``class``. This RFC proposes changing the value of the tag to ``extern``. - -## Motivation - -In the past, Luau type system internals played generally fast and loose with the terminology for types coming from our foreign function interface. We broadly referred to them -as class types because the types were known to be coming specifically from C++ in the context of Roblox, but Luau as a language supports embedding from C as well, and any -language that can speak a C ABI. To avoid confusion, especially for users curiously poking at some of the internals, we changed all the internal references from ``class`` to -"extern type" which is a more fitting name for what we actually know here: that the type describes some external or foreign data. The last remaining inconsistency here is -a user-facing one: we had mistakenly codified ``class`` as the name of the tag for extern types in user-defined type functions. We should correct this issue now, before -the New Type Solver moves into a released state and we are no longer able to change this for the sake of backwards compatibility. - -## Design - -The ``tag`` field of a type that is an external type will be ``"extern"`` instead of ``"class"``. To test a tag, you will write ``type:is("extern")`` instead of ``type:is("class")``. - -### Changes - -#### `type` Instance - -| Instance Properties | Type | -| ------------- | ------------- | -| `tag` | `"nil" \| "unknown" \| "never" \| "any" \| "boolean" \| "number" \| "string" \| "singleton" \| "negation" \| "union" \| "intersection" \| "table" \| "function" \| "extern"` ~~`"class"`~~ | - -## Drawbacks - -The primary drawback of this is that some existing code using user-defined type functions in the New Type Solver Beta may be relying on testing that the tag is ``"class"``. The hope is that the affected surface of code here is currently very little because the API of user-defined type functions today does not allow a lot of useful operations to be performed on extern types (beyond exactly what is possible for tables), and we'd like to correct the issue if possible before the New Type Solver leaves beta, which would likely make breaking backwards compatibility more expensive. - -## Alternatives - -### What is the impact of not doing this? - -The longer we wait to correct this, the harder it is to change, and we will have the persistent issue of user-defined type functions referring to "class types". Users will likely continue to be confused by this, and to continue to ask questions about how to employ these "class types" for object-oriented programming in Luau, which is not possible because they are actually foreign function interface types. This is the only place in user-facing syntax where Luau currently refers to "classes" at all as a concept, and without correcting this, we may run into issues down the line for any proposals that _do_ seek to add class-like constructs to the language in any capacity. diff --git a/.cursor/rules/luau-rfcs/unsealed-table-assign-optional-property.md b/.cursor/rules/luau-rfcs/unsealed-table-assign-optional-property.md deleted file mode 100644 index 3f1c6792..00000000 --- a/.cursor/rules/luau-rfcs/unsealed-table-assign-optional-property.md +++ /dev/null @@ -1,60 +0,0 @@ -# Unsealed table assignment creates an optional property - -**Status**: Implemented - -## Summary - -In Luau, tables have a state, which can, among others, be "unsealed". -An unsealed table is one that we are still constructing. Currently -assigning a table literal to an unsealed table does not introduce new -properties, so it is a type error if they are read. -We would like to change this so that assigning a table -literal to an unsealed table creates an optional property. - -## Motivation - -In lua-apps, there is testing code which (simplified) looks like: - -```luau -local t = { u = {} } -t = { u = { p = 37 } } -t = { u = { q = "hi" } } -local x: number? = t.u.p -local y: string? = t.u.q -``` - -Currently, this code doesn't typecheck, due to `p` and `q` being unknown properties of `t.u`. - -## Design - -In order to support this idiom, we propose that assigning a table -to an unsealed table should add an optional property. - -For example, before this change the type of `t` is `{ u: {} }`, -and after this change is `{ u: { p: number?, q: number? } }`. - -This is implemented by adding a case to unification where the supertype -is an unsealed table, and the subtype is a table with extra properties. -Currently the extra properties are ignored, but with this change we would -add the property to the unsealed table (making it optional if necessary). - -Since tables with optional properties of the same type are subtypes of -tables with indexers, this allows table literals to be used as dictionaries, -for example the type of `t` is a subtype of `{ u: { [string]: number } }`. - -Note that we need to add an optional property, otherwise the example above will not typecheck. -```luau -local t = { u = {} } -t = { u = { p = 37 } } -t = { u = { q = "hi" } } -- fails because there's no u.p -``` - -## Drawbacks - -The implementation of this proposal introduces optional types during unification, -and so needs access to an allocator. - -## Alternatives - -Rather than introducing optional properties, we could introduce an indexer. For example we could infer the type of -`t` as `{ u: { [string]: number } }`. diff --git a/.cursor/rules/luau-rfcs/unsealed-table-literals.md b/.cursor/rules/luau-rfcs/unsealed-table-literals.md deleted file mode 100644 index df0bc18e..00000000 --- a/.cursor/rules/luau-rfcs/unsealed-table-literals.md +++ /dev/null @@ -1,78 +0,0 @@ -# Unsealed table literals - -**Status**: Implemented - -## Summary - -Currently the only way to create an unsealed table is as an empty table literal `{}`. -This RFC proposes making all table literals unsealed. - -## Motivation - -Table types can be *sealed* or *unsealed*. These are different in that: - -* Unsealed table types are *precise*: if a table has unsealed type `{ p: number, q: string }` - then it is guaranteed to have only properties `p` and `q`. - -* Sealed tables support *width subtyping*: if a table has sealed type `{ p: number }` - then it is guaranteed to have at least property `p`, so we allow `{ p: number, q: string }` - to be treated as a subtype of `{ p: number }` - -* Unsealed tables can have properties added to them: if `t` has unsealed type - `{ p: number }` then after the assignment `t.q = "hi"`, `t`'s type is updated to be - `{ p: number, q: string }`. - -* Unsealed tables are subtypes of sealed tables. - -Currently the only way to create an unsealed table is using an empty table literal, so -```luau - local t = {} - t.p = 5 - t.q = "hi" -``` -typechecks, but -```luau - local t = { p = 5 } - t.q = "hi" -``` -does not. - -This causes problems in examples, in particular developers -may initialize properties but not methods: -```luau - local t = { p = 5 } - function t.f() return t.p end -``` - -## Design - -The proposed change is straightforward: make all table literals unsealed. - -## Drawbacks - -Making all table literals unsealed is a conservative change, it only removes type errors. - -It does encourage developers to add new properties to tables during initialization, which -may be considered poor style. - -It does mean that some spelling mistakes will not be caught, for example -```luau -local t = {x = 1, y = 2} -if foo then - t.z = 3 -- is z a typo or intentional 2-vs-3 choice? -end -``` - -In particular, we no longer warn about adding properties to array-like tables. -```luau -local a = {1,2,3} -a.p = 5 -``` - -## Alternatives - -We could introduce a new table state for unsealed-but-precise -tables. The trade-off is that that would be more precise, at the cost -of adding user-visible complexity to the type system. - -We could continue to treat array-like tables as sealed. diff --git a/.cursor/rules/luau-rfcs/unsealed-table-subtyping-strips-optional-properties.md b/.cursor/rules/luau-rfcs/unsealed-table-subtyping-strips-optional-properties.md deleted file mode 100644 index 6aef0671..00000000 --- a/.cursor/rules/luau-rfcs/unsealed-table-subtyping-strips-optional-properties.md +++ /dev/null @@ -1,67 +0,0 @@ -# Only strip optional properties from unsealed tables during subtyping - -**Status**: Implemented - -## Summary - -Currently subtyping allows optional properties to be stripped from table types during subtyping. -This RFC proposes only allowing that when the subtype is unsealed and the supertype is sealed. - -## Motivation - -Table types can be *sealed* or *unsealed*. These are different in that: - -* Unsealed table types are *precise*: if a table has unsealed type `{ p: number, q: string }` - then it is guaranteed to have only properties `p` and `q`. - -* Sealed tables support *width subtyping*: if a table has sealed type `{ p: number }` - then it is guaranteed to have at least property `p`, so we allow `{ p: number, q: string }` - to be treated as a subtype of `{ p: number }` - -* Unsealed tables can have properties added to them: if `t` has unsealed type - `{ p: number }` then after the assignment `t.q = "hi"`, `t`'s type is updated to be - `{ p: number, q: string }`. - -* Unsealed tables are subtypes of sealed tables. - -Currently we allow subtyping to strip away optional fields -as long as the supertype is sealed. -This is necessary for examples, for instance: -```luau - local t : { p: number, q: string? } = { p = 5, q = "hi" } - t = { p = 7 } -``` -typechecks because `{ p : number }` is a subtype of -`{ p : number, q : string? }`. Unfortunately this is not sound, -since sealed tables support width subtyping: -```luau - local t : { p: number, q: string? } = { p = 5, q = "hi" } - local u : { p: number } = { p = 5, q = false } - t = u -``` - -## Design - -The fix for this source of unsoundness is twofold: - -1. make all table literals unsealed, and -2. only allow stripping optional properties from when the - supertype is sealed and the subtype is unsealed. - -This RFC is for (2). There is a [separate RFC](unsealed-table-literals.md) for (1). - -## Drawbacks - -This introduces new type errors (it has to, since it is fixing a source of -unsoundness). This means that there are now false positives such as: -```luau - local t : { p: number, q: string? } = { p = 5, q = "hi" } - local u : { p: number } = { p = 5, q = "lo" } - t = u -``` -These false positives are so similar to sources of unsoundness -that it is difficult to see how to allow them soundly. - -## Alternatives - -We could just live with unsoundness. diff --git a/.cursor/rules/luau-rfcs/user-defined-type-functions.md b/.cursor/rules/luau-rfcs/user-defined-type-functions.md deleted file mode 100644 index db6482da..00000000 --- a/.cursor/rules/luau-rfcs/user-defined-type-functions.md +++ /dev/null @@ -1,238 +0,0 @@ -# User-Defined Type Functions - -**Status**: Implemented - -## Summary - -The new Luau type inference engine (or type solver, for short) adds support for a system of built-in type functions that compute result types from provided argument types. This system is already being used to power support for overloadable operators, and the broad design philosophy is to include built-in type functions that correspond to built-in runtime-level operations in the language. To further enhance the expressivity of the type system, this RFC extends that system with a proposed design for user-defined type functions, allowing developers to define their own type functions in ordinary Luau code. - -## Motivation - -The primary motivation for introducing user-defined type functions is to increase the expressiveness of the type system and empower developers to create more type-safe abstractions in their libraries. Current limitations of the type system prevent programmers from constructing types in relational ways, e.g. producing a new table where the types of every property have changed in some predictable way (like being made optional). These limitations can prevent developers from writing precisely-typed abstracts in their libraries, leading to less type-safe abstractions that rely on the use of `any` casting or less-than-desirable structural changes to their designed APIs. By adding support for user-defined type functions, we aim to: -- Enable more precise type definitions that can capture complex relations on types -- Facilitate the creation of type-safe, reusable and composable libraries -- Enhance Luau's support for type-level programming - -The expected outcome is a more versatile type system that can adapt to a wider range of programming patterns, improving the Luau developer experience. - -## Design - -Type functions will be defined with the following syntax: -```luau -type function f(...) - -- implementation of the type function -end -``` - -The bodies of these functions will consist of fundamentally entirely ordinary Luau code that can interact with types as runtime values. For instance, the built-in `rawget` type function could be written as: -```luau -type function rawget(tbl, key) - if not tbl:is("table") then - error("first parameter must be a table type!") - end - - for k, v in tbl:properties() do - if k == key then - if v.read ~= v.write then - error("mismatched read/write types found for the property") - end - - return v.read - end - end - - error("key not found!") -end - -type Person = { - name: string, - age: number -} - -type ty = rawget -- resolves to `ty` defined as `string` -``` - -This function takes `tbl`, a table type, and `key`, the type of a property key for the table (typically a string singleton type), and computes the corresponding value type for the property `key` in the table `tbl`. If `tbl` is not a table type, or `key` is not found in `tbl`, then the function raises an error. - -The scoping and shadowing rules of user-defined type functions will be made to match the existing rules for type aliases (i.e. `type Array = {T}`) which are, as it turns out, a sort of total form of type functions in the first place. This means that they are order-independent, and can refer to one another, as well as to type aliases. We do not intend to introduce an additional set of scoping rules, so ensuring they work the same as type aliases already do is a requirement for the design. - -### The type runtime - -To understand how type functions behave, we have to consider a split between stages: type analysis time and runtime. The full types of Luau's type system currently exist only during type analysis, and never during runtime. This RFC proposes changing Luau to include an additional stage, type runtime, that is part of the overall type analysis. During type analysis, when we encounter a user-defined type function, e.g. `rawget<...>` in the example above, we will serialize the type parameters of that call into a form that Luau can manipulate, and then execute the body of the type function in a Luau VM (this stage would be the "type runtime"), and reify its results (returning a value, erroring, etc.) back into type analysis. This means that the type solver will need to maintain a VM instance for evaluating user-defined type functions, and that each reference to a type function corresponds to evaluating a function call in that VM. - -The key to making this type runtime work is the introduction of a `type` userdata that Luau's types can be serialized into. For clarity in this RFC, `type` (in code block) always refers to the userdata and type (the unadorned string) refers to the ordinary meaning of the word in the context of Luau (i.e. the static type of a binding). An instance of the `type` userdata is a type runtime representation of a type within the program, and it provides a set of API calls that can be used to inspect and manipulate the type. As part of the _type runtime_, they are *only accessible within type functions* and are *not available during ordinary function runtimes*. Each type function can take an arbitrary number of `type` arguments, and can return exactly one `type` as a successful result during evaluation. Returning additional results will signal an error to the user for now, but a future RFC may revisit this to support user-defined type pack functions as well. We are currently excluding them since the scope of this RFC is already very large as-is, and even the built-in type function system has yet to find a compelling use for type pack functions. - -Because the name `type` clashes with the global function `type(...)`, unlike `string` (whose library is named `string`), the name of the library for constructing `type`s will be `types`. So, a programmer will be able to access the boolean type by writing `types.boolean` or the number type by writing `types.number`. Evaluating `typeof(...)` on a `type` userdata will give the string `"type"`, and any possible extensions to support typechecking will likely name the type of types `type` as well. We considered an alternative where we used the name `type` and set the `__call` metamethod will to the original `type(...)` function. This would allow us to gracefully preserve the behavior of the built-in `type` function if it is necessary for developers, while still choosing the best possible name for the datatype itself, but it would also require the type runtime to provide a duplicate implementation of the `type(...)` function which would have to be maintained separately. We also considered alternative names like `luautype` `typelib` or `ltype`, but they seem to feel broadly worse when used in speech and writing, and have a similar disadvantage of being dissimilar from the existing library names in Luau. - -Beyond `type`s, type functions will also reify any runtime errors that result from running their body into a type analysis error to report to the user. This means that developers can use the `error` and `assert` global functions to signal errors to consumers of their type function, and can provide detailed error messages that explain what went wrong. It also means that any "ordinary" runtime errors that arise from bad function calls or stack overflows will also become a user-facing error at the point that that type function is called. - -### A note about syntax - -Given this realization that type functions are, in fact, functions and their uses are function _calls_, one may wonder a couple things about the syntax that are helpful to clarify here. When programming types, all type functions (whether a user-defined type function, a type alias like `type Array = {T}`, or a built-in type function like `add`) are written with their parameters in angle brackets. At a call site, like `add` or `rawget` from above, the angle brackets indicate that the arguments to that call are _types_. By contrast, ordinary Luau functions are defined using parentheses for their parameters and function calls are similarly written with parentheses, e.g. `add(5, 6)`. For user-defined type functions, the arguments are types _serialized as runtime values for a Luau VM_, and so when we _declare_ a type function, we similarly use parentheses since they will be evaluated as functions in the _type runtime_. - -### The environment of type functions - -The type functions will run in a sandboxed VM instance with a limited scope of available libraries and globals. They will not be able to refer to statements defined in the scripts outer scope, nor to any runtime functions declared in the script. For the first iteration of this feature, we aim to be reasonably conservative in what we include to support writing type functions. The reason for this is that it is broadly much more feasible to _add_ new facilities to the language, than it is to take away features that are already in use. At the same time, we're attempting to balance this to ensure that programming type functions still feels like programming ordinary Luau code, so we wish to avoid having lots of "gotchas" or very unexpected exclusions. As such, we propose that the environment for type functions include only the following: - -- `assert`, `error`, and `print`, which will be used by type functions to provide error feedback to consumers of a type function -- `next`, `ipairs`, `pairs`, `select`, and `unpack`, which support basic iteration and interaction with tables and multiple return -- `getmetatable`, `setmetable`, `rawget`, `rawset`, `rawlen`, `rawequal`, `tonumber`, `tostring`, `type`, and `typeof`, which are builtin functions that are essentially operators in Luau -- the `math` library, where we note that `math.randomseed` will be reset automatically on type function entry -- the `table` library -- the `string` library -- the `bit32` library -- the `utf8` library -- the `buffer` library - -This list can be expanded in future RFCs if we learn of compelling usecases for additional libraries in type function contexts. - -### The halting problem - -In general, we'd like to be able to guarantee that type analysis will always terminate on all programs. Unfortunately, type inference for Luau's type system is already, in general, undecidable, and there are known edgecases where the type inference can be spun into exponential blowup or worse. Adding type functions seems like another space where this problem could be made worse, and so one might wish to try to detect when a type function will not terminate and error instead. Unfortunately, by [Rice's theorem](https://en.wikipedia.org/wiki/Rice%27s_theorem), all non-trivial semantic properties of programs are undecidable. - -We could attempt to get around this either by heavily limiting the language in type functions to avoid Turing-completeness or by introducing heuristics to try to detect infinite loops while the type function is running. We propose doing neither. In the former case, the restrictions to the language would be significant, heavily limiting the use of while loops, function calls, etc. This would mean that learning to program type functions would feel _very_ different from learning to program Luau in general. In the latter case, the implementation work is considerable, and it's not clear what kind of impact it might have on the VM itself. - -Instead, this RFC proposes that we accept that type functions, like the rest of Luau's type system, are already not guaranteed to terminate in general, and we should employ the same mitigations that we've already implemented for addressing that problem --- namely, Luau's analysis supports global limits that include an overall runtime limit on analysis and a user-requestable (really, embedder-requestable) cancellation system for analysis. This means that editors, language services, and other software embedding Luau's type analysis will continue to be able to use one simple, unified system for imposing limits on analysis. In an editor tooling context, we expect that it might be useful for us to grow the feedback provided by the cancellation to support editors providing more detailed feedback to the users. It's not hard to imagine a developer experience where your editor informs you that a particular type function call in a particular spot in your program is taking a long time to evaluate. This would actually be a better experience than what is available today when builtin pieces of Luau's type system are unable to complete in an acceptable amount of time, and we are unable to give any actionable feedback to the user. Extending such a system to support identifying problem areas in built-in components of the type system is likely a much harder effort that is out of scope for this RFC. - -### `types` API Reference - -This section details the initial programming interface we propose for `type`s when they are reflected into type function bodies. Each section is separated by headers (e.g. Singleton) and describe the methods available to that category of type. The "`type` Instance" section, describes the elements of the interface common to every category of type. All properties of newly-created `type`s are initialized with empty tables / arrays and `nil`. All arguments are passed by references. - -### `types` Library - -| Library Properties | Type | Description | -| ------------- | ------------- | ------------- | -| `unknown` | `type` | an immutable instance of the built-in type `unknown` | -| `never` | `type` | an immutable instance of the built-in type `never` | -| `any` | `type` | an immutable instance of the built-in type `any` | -| `boolean` | `type` | an immutable instance of the built-in type `boolean` | -| `number` | `type` | an immutable instance of the built-in type `number` | -| `string` | `type` | an immutable instance of the built-in type `string` | - -| Library Functions | Return Type | Description | -| ------------- | ------------- | ------------- | -| `singleton(arg: string \| boolean \| nil)` | `type` | returns an immutable instance of the argument as a singleton type | -| `negationof(arg: type)` | `type` | returns an immutable instance of the parameter as a negated type; the parameter cannot be a table or function type | -| `unionof(...: type)` | `type` | returns an immutable instance of an union type of the arguments; requires at least 2 parameters to be provided | -| `intersectionof(...: type)` | `type` | returns an immutable instance of an intersection type of the arguments; requires at least 2 parameters to be provided | -| `newtable(props: {[type]: type \| { read: type?, write: type? } }?, indexer: { index: type, readresult: type, writeresult: type }?, metatable: type?)` | `type` | returns a mutable instance of a table type; the keys of the table's property must be a singleton type; sets the table's metatable if one is provided | -| `newfunction(parameters: { head: {type}?, tail: type? }, returns: { head: {type}?, tail: type? })` | `type` | returns a mutable instance of a `function` type | -| `copy(arg: type)` | `type` | returns a deep copy of the given `type` | - -### `type` Instance - -| Instance Properties | Type | Description | -| ------------- | ------------- | ------------- | -| `tag` | `"nil" \| "unknown" \| "never" \| "any" \| "boolean" \| "number" \| "string" \| "singleton" \| "negation" \| "union" \| "intersection" \| "table" \| "function" \| "class"` | an immutable property holding this type's tag | - -| Instance Methods | Return Type | Description | -| ------------- | ------------- | ------------- | -| `__eq(arg: type)` | `boolean` | overrides the == operator to return true if self is syntactically equal to arg, note that semantically equivalent types like `true \| false` and `boolean` will _not_ compare equal | -| `is(arg: string)` | `boolean` | returns true if self has the same tag as the argument. List of available tags: "nil", "unknown", "never", "any", "boolean", "number", "string", "singleton", "negation", "union", "intersection", "table", "function", "class" | - -Depending on the particular `tag`, a `type` instance can have additional properties and methods available as described below. - -#### Negation `type` instance - -| Instance Methods | Type | Description | -| ------------- | ------------- | ------------- | -| `inner()` | `type` | returns the `type` being negated | - -#### Singleton `type` instance - -| Instance Methods | Return Type | Description | -| ------------- | ------------- | ------------- | -| `value()` | `string \| boolean \| nil` | returns the actual value of the singleton, i.e. a specific string, boolean, or `nil` | - -#### Table `type` instance - -| Instance Methods | Return Type | Description | -| ------------- | ------------- | ------------- | -| `setproperty(key: type, value: type?)` | `()` | adds / overrides (if same key exists) a key, value pair to the table's properties; if value is nil, removes the key, value pair; if the key does not exist and the value is nil, nothing happens; equivalent to calling `setreadproperty` and `setwriteproperty` with the same parameters | -| `setreadproperty(key: type, value: type?)` | `()` | adds / overrides (if same key exists) a key, value pair to the table's properties; if value is nil, removes the key, value pair; if the key does not exist and the value is nil, nothing happens | -| `setwriteproperty(key: type, value: type?)` | `()` | adds / overrides (if same key exists) a key, value pair to the table's properties; if value is nil, removes the key, value pair; if the key does not exist and the value is nil, nothing happens | -| `readproperty(key: type)` | `type?` | returns the type used for _reading_ values to this property in the table; if the key does not exist, returns nil | -| `writeproperty(key: type)` | `type?` | returns the type used for _writing_ values to this property in the table; if the key does not exist, returns nil | -| `properties()` | `{[type]: { read: type?, write: type? } }` | returns a table mapping property keys to a table with their respective read and write types | -| `setindexer(index: type, result: type)` | `()` | sets the table's indexer with the index type as the first parameter, and the result as the second parameter; equivalent to calling `setreadindexer` and `setwriteindexer` with the same parameters | -| `setreadindexer(index: type, result: type)` | `()` | sets the table's indexer with the index type as the first parameter, and the resulting read type as the second parameter | -| `setwriteindexer(index: type, result: type)` | `()` | sets the table's indexer with the index type as the first parameter, and the resulting write type as the second parameter | -| `indexer()` | `{ index: type, readresult: type, writeresult: type }?` | returns the table's indexer as a table; if the indexer does not exist, returns nil | -| `readindexer()` | `{ index: type, result: type }?` | returns the table's indexer as a table using the read type of the result; if the indexer does not exist, returns nil | -| `writeindexer()` | `{ index: type, result: type }?` | returns the table's indexer as a table using the write type of the result; if the indexer does not exist, returns nil | -| `setmetatable(arg: type)` | `()` | sets the table's metatable to the argument | -| `metatable()` | `type?` | returns the table's metatable; if the metatable does not exist, returns nil | - -#### Function `type` instance - -| Instance Methods | Return Type | Description | -| ------------- | ------------- | ------------- | -| `setparameters(head: {type}?, tail: type?)` | `()` | sets the function's parameter types to the given arguments | -| `parameters()` | `{ head: {type}?, tail: type? }` | returns the function's parameter list as an array of ordered parameter types and optionally a variadic tail | -| `setreturns(head: {type}?, tail: type?)` | `()` | sets the function's return types to the given arguments | -| `returns()` | `{ head: {type}?, tail: type? }` | returns the function's return types as an array of types and optionally a variadic tail | - -#### Union `type` instance - -| Instance Methods | Return Type | Description | -| ------------- | ------------- | ------------- | -| `components()` | `{type}` | returns an array of `types` being unioned | - -#### Intersection `type` instance - -| Instance Methods | Return Type | Description | -| ------------- | ------------- | ------------- | -| `components()` | `{type}` | returns an array of `types` being intersected | - -#### Class `type` instance - -| Instance Methods | Return Type | Description | -| ------------- | ------------- | ------------- | -| `properties()` | `{[type]: { read: type, write: type } }` | returns a table mapping class' property keys to a table with their respective read and write types | -| `readparent()` | `type?` | returns the read type of class' parent class; if the parent class does not exist, returns nil | -| `writeparent()` | `type?` | returns the write type class' parent class; if the parent class does not exist, returns nil | -| `metatable()` | `type?` | returns the class' metatable; if the metatable does not exists, returns nil | -| `indexer()` | `{ index: type, readresult: type, writeresult: type }?` | returns the class' indexer as a table; if the indexer does not exist, returns nil | -| `readindexer()` | `{ index: type, result: type }?` | returns the class' indexer as a table using the read type of the result; if the indexer does not exist, returns nil | -| `writeindexer()` | `{ index: type, result: type }?` | returns the class' indexer as a table using the write type of the result; if the indexer does not exist, returns nil | - -## Drawback - -The main drawback to the proposed design, particularly the use of the standard Luau VM for execution, is that it makes analysis explicitly depend on the Luau runtime in order to evaluate type functions. This has been historically discouraged for the purpose of maintaining a clear separation of concerns for different parts of Luau's implementation and to minimize side effects across different phases of the program execution. We believe this concern is mitigated since we still retaining a separation between the type runtime and its evaluation of type functions versus the overall runtime and its evaluation of ordinary functions. Further, the ability to use the same VM for both ensures that the runtime semantics of code in type function bodies is _always_ consistent with the runtime semantics of ordinary Luau code. This is not the case for some alternatives, like implementing a separate interpreter. - -## Alternatives - -### Table Runtime Representation - -Instead of serializing types into `type`, we can serialize them into tables with a predefined structure. For instance, the representation for a string singleton `"abc"` could be `{type = "singleton", value = "abc"}`. So, instead of writing: -```luau -type function issingleton(t) - if t:is("singleton") then - return t - end -end -``` -developers could write: -```luau -type function issingleton(t) - if t.type == "singleton" then - return t - end -end -``` - -This is a reasonable design in its own right, and was used in the initial prototype of user-defined type functions because of its relative ease of implementation. We decided against continuing with it, however, because it makes it more difficult to apply basic well-formedness restrictions to the interface of type functions. For instance, we want all union types to have at least two elements to them (i.e. to be a non-trivial union), which would be harder to enforce with the table design since developers could just write `{type = "union", components = {{type = "string"}}}`. More generally, this design makes the creation of new types at runtime messier and more prone to errors since there's a greater surface for minor typos and misplaced braces to impact the program. - -### Compile-Time Interpreter - -Many languages implement an additional interpreter for evaluating expressions at compile-time. This approach has its benefits, such as allowing us to completely isolate analysis and runtime and allowing developers to write type functions in a syntax that potentially deviates from Luau's runtime syntax (e.g. supporting constructing intersection and union types using `&` and `|`). This has two main downsides: (1) the implementation required is higher complexity and carries a greater maintenance burden, and (2) the design against one of the stated goals for type functions. We want the experience of writing type functions to feel intrinsically familiar to developers and for the semantics to be the same as ordinary Luau code. Since Luau is already designed around being embeddable, we prefer to use the existing VM and add a new userdata instead. - -### More Built-In Type Functions - -Another alternative is to create more built-in type functions that cover a wider range of programming patterns. This approach clearly lacks the flexibility of fully user-defined type functions because type manipulation would still be limited to the predefined set of type functions designed by the Luau team. Furthermore, continuously expanding the set of built-in type functions leads to bloat and complexity within the language, making it harder to keep in your head, harder to maintain, and ultimately running against Luau's core philosophy of simple, general-purpose primitives and a small standard library. - -## Future Work - -In the future, we may consider adding type checking for user-defined type functions. In other advanced type systems, this is typically called _kind checking_ (where a _kind_ is what we'd call the type of a type). So, for instance, the type `number` has the kind `type`, but a type alias like `type Array = {T}` has the kind `(T: type) -> type`, i.e. `Array` is a type function that when applied to a type `T` gives you a type. However, there's additional complexity in building this out in a way where we can reuse the existing type system machinery to implement typing. Since we expect type functions to largely be fairly small and the developer experience is inherently _very_ interactive since they will execute live in your IDE as you write code, we believe that working with dynamically-typed type functions will feel very pleasant, and so taking on the additional complexity is not yet justified. - -Other areas of future work may include expanding the set of libraries available in type function environments to enable more expressive type functions, such as those manipulating generic types or named parameters for function types. We also want to investigate making type aliases (which are themselves a sort of _total_ type function) available as part of the type function environment to make type function programming feel even more like conventional Luau programming. diff --git a/.cursor/rules/luau-rfcs/vector-library-vector2-constructor.md b/.cursor/rules/luau-rfcs/vector-library-vector2-constructor.md deleted file mode 100644 index 86b7ada8..00000000 --- a/.cursor/rules/luau-rfcs/vector-library-vector2-constructor.md +++ /dev/null @@ -1,33 +0,0 @@ -# 2-component vector constructor - -**Status**: Implemented - -## Summary - -Add a constructor for initializing vectors from two components. - -## Motivation - -Currently the vector constructor supports only initializing vectors with three components (and optionally four if 4-wide vectors are enabled). However, there are problem domains such 2D graphics and graphical user interfaces which would benefit from a two component constructor. The benefits are twofold: it would improve code ergonomics because the third component does not need to be given when it is irrelevant or implicitly zero. Secondly, it would improve the performance of vector creation because there is one less argument to pass in the 2D case. - -Existing vector library functions such as `vector.dot`, `vector.angle`, `vector.normalize`, `vector.min`, `vector.max`, `vector.abs` and `vector.clamp` already work out of the box in 2D as long as the unused components are zeroes. The functions also retain zeroes allowing function calls to be chained without issues. Out of the current functions, only `vector.cross` is not meaningful in 2D. - -The constructor in 4-wide mode already sets the fourth component to zero when unspecified. Therefore, the 2-component constructor working identically for the unused components can be treated as a natural extension. - -Game engines that use a Z up coordinate system would also benefit from this change because the new constructor could be used for topographical positions in the world by providing X and Y only. - -## Design - -A new vector constructor `vector.create(x: number, y: number): vector` will be added. The third component, and fourth component with 4-wide vectors, will be zero initialized. - -## Drawbacks - -Accidentally omitting the third component becomes a possibility because the vector constructor would no longer raise an error when only two components are provided. However, the benefits seem to outweight this small inconvenience. - -## Alternatives - -An alternative would be to add a new constructor with a different name (for example, `vector.create2`). - -Another considerably more complex alternative is to add a new, separate vector type for 2D vectors. This would add significant bloat to the C API and type system in general, so it is unfeasible in practice. - -Finally, an option is to not add the new constructor. In this case applications working in 2D would not get the ergonomic and performance benefits discussed above. \ No newline at end of file diff --git a/.cursor/rules/luau-rfcs/vector-library.md b/.cursor/rules/luau-rfcs/vector-library.md deleted file mode 100644 index 0b0a985e..00000000 --- a/.cursor/rules/luau-rfcs/vector-library.md +++ /dev/null @@ -1,136 +0,0 @@ -# Vector library - -**Status**: Implemented - -## Summary - -Implement a standard library that provides functionality for the vector type. - -## Motivation - -Currently, vectors are a primitive type implemented internally. All of the heavy work to implement vectors is done, but there is no runtime-agnostic way to use vectors in Luau code. Individual Luau runtimes, such as [Lune](https://github.com/lune-org/lune) or Roblox, must provide their own distinct libraries to work with native vectors which may be inconsistent. In cross-runtime code, this results in performance drawbacks & difficulty utilizing native vectors. - -## Design - -The default metatable for vectors should now be the `vector` library. While buffers and coroutines do not have this, vectors likely should for ergonomics. - -Luau VM can be configured in two different vector value modes. -Default configuration uses vectors with 3 components (`xyz`) and if the `LUA_VECTOR_SIZE` configuration option is set to 4, vector values get an additional fourth `w` component. -This mode will be referred to as '4-wide mode' in this proposal. - -### Library functions & constants - -This RFC proposes the following basic functions and constants. - -`vector.create(x: number, y: number, z: number): vector` - -Creates a new vector with the given components. In 4-wide mode, the fourth `w` component value is set to 0.0. - -`vector.create(x: number, y: number, z: number, w: number): vector` - -Additional constructor available in 4-wide mode. Creates a new vector with the given components. - -`vector.magnitude(vec: vector): number` - -Calculates the magnitude of a given vector. When in 4-wide mode, this includes the fourth component. - -`vector.normalize(vec: vector): vector` - -Returns the normalized version (aka unit vector) of a given vector. When in 4-wide mode, this includes the fourth component. - -`vector.cross(vec1: vector, vec2: vector): vector` - -Returns the cross product of two vectors. If 4-wide vectors are enabled, this function will ignore the fourth component and return the 3-dimensional cross product. - -`vector.dot(vec1: vector, vec2: vector): number` - -Returns the dot product of two vectors. Uses all components, even in 4-wide mode. - -`vector.angle(vec1: vector, vec2: vector, axis: vector?): number` - -Returns the angle between two vectors in radians. The axis, if specified, is used to determine the sign of the angle. If 4-wide vectors are enabled, this function will ignore the fourth component and return the 3-dimensional angle. - -`vector.floor(vec: vector): vector` - -Applies `math.floor` component-wise for each vector. Equivalent of: `vector.create(math.floor(vec.x), etc)`. - -`vector.ceil(vec: vector): vector` - -Applies `math.ceil` component-wise for each vector. Equivalent of: `vector.create(math.ceil(vec.x), etc)`. - -`vector.abs(vec: vector): vector` - -Applies `math.abs` component-wise for each vector. Equivalent of: `vector.create(math.abs(vec.x), etc)`. - -`vector.sign(vec: vector): vector` - -Applies `math.sign` component-wise for each vector. Equivalent of: `vector.create(math.sign(vec.x), etc)`. - -`vector.clamp(vec: vector, min: vector, max: vector): vector` - -Applies `math.clamp` component-wise for each vector. Equivalent of: `vector.create(math.clamp(vec.x, min.x, max.x), etc)`. - -`vector.max(...: vector): vector` - -Applies `math.max` component-wise for each vector. Equivalent of: `vector.create(math.max((...).x), etc)`. - -`vector.min(...: vector): vector` - -Applies `math.min` component-wise for each vector. Equivalent of: `vector.create(math.min((...).x), etc)`. - ---- - -`vector.zero` - -Vector where `x=0, y=0, z=0, w?=0`. - -`vector.one` - -Vector where `x=1, y=1, z=1, w?=1`. - ---- - -### Arithmetic operations - -Primitive operators for vectors are already implemented, so this RFC doesn't concern vector arithmetic. - -### Component access - -Component access is already supported in the VM using the fields 'x', 'y', 'z', 'X', 'Y' and 'Z' (plus 'w' and 'W' in 4-wide mode). -Note that writes to a single component are not supported as the vector value is immutable. -This RFC doesn't define any changes to this behavior. - - -### Compiler options - -Currently, there are 2 compiler options relating to vectors, `vectorLib` & `vectorCtor`. This poses an interesting problem: a builtin library would remove the _requirement_ for such compiler options, however these options still need to be supported. The intuitive solution to this is to leave both compiler options working and maintained, but provide the built-in vector library by default, allowing two vector libraries and two vector constructors. - -### Typechecking - -A new primitive `vector` type should be added to the type system. - -## Future Work - -A better vector constructor with new syntax, such as `` or `(x, y, z)` or `|x, y, z|` or `vector(x, y, z)` or `[x, y, z]` could be implemented. This would make code that does stuff with vectors much less verbose. - -The buffer library could include functions to work with vectors, such as `buffer.writevector2`, `buffer.writevector3`, and in 4-wide mode, `buffer.writevector4`. The corresponding read functions would of course be included. - -## Drawbacks - -As per all additional globals, this creates a new global `vector`. This is a commonly used variable name, and many style guides will advise to avoid using `vector` as a variable name due to the global being added. - -Introducing a vector library means introducing more globals. Due to the presence of vectors in performance-intensive code, it can be assumed that the built-in functions will have fastcalls. This means more fastcall slots will be used. - -Existing code won't get any improvements from a built-in library. Developers will have to switch over to the built-in library in order to gain any benefit. - -## Alternatives - -Do nothing; vectors have an internal constructor, which lets the runtime implement vectors, and subsequently a library for vector math. - -### Alternative implementations - -The function `vector.create` could be skipped entirely in favor of syntax for creating vectors. This should not be done because a function for creating vectors will be nice to have no matter what. - -Instead of `vector.magnitude`, the magnitude could be derived from the vector's coordinates themselves, and be accessed by a property instead of a function. There is a downside to this: all current properties of vectors are hard-coded to the VM, so any new property to vectors requires a lot of additional complexity & changes to the VM to allow for this. A library function, however, would be trivial. An easy and quick workaround to the verbosity would be at the runtime/C API level. It's trivial to set the metatable of vectors to be the vector library: this allows for `vec:magnitude()` without much issue. - -Instead of ignoring the 4th dimension in `vector.cross`, the function could be disabled when four-dimensional vectors are enabled. diff --git a/.cursor/rules/luau.mdc b/.cursor/rules/luau.mdc deleted file mode 100644 index e6712788..00000000 --- a/.cursor/rules/luau.mdc +++ /dev/null @@ -1,809 +0,0 @@ ---- -alwaysApply: true ---- -# Luau Language Rules - -**Default context: Roblox Luau.** Unless otherwise stated, assume we are programming in Roblox Studio. Standard Luau differences are noted where relevant. - -## Finding Documentation - -- `.cursor/rules/roblox/en-us/luau/` - Roblox-specific Luau documentation (types, Roblox classes/enums, Studio integration) -- `.cursor/rules/luau/` - Official Luau language documentation (type system, standard library, syntax, guides) -- `.cursor/rules/luau-rfcs/` - RFC documents detailing every language feature and design decision - -## Single-Threaded Execution Model - -**Luau is completely single-threaded.** This is the most misunderstood aspect of the language. - -### Key Facts - -- Code in one script **cannot** run simultaneously with another script -- Execution only switches when code **yields** (`task.wait()`, `:Wait()`, `coroutine.yield()`, async APIs) -- **No yield = no other code runs.** Infinite loops without yields freeze the game. - -### Practical Implications - -```luau --- SAFE: No yield between read/write, guaranteed atomic -local value = data.Value -data.Value = value + 1 - --- UNSAFE: Yield allows other code to modify data.Value -local value = data.Value -task.wait(0.1) -- Other code can run here! -data.Value = value + 1 -- May not be what you expect -``` - -### Common Misconceptions - -1. **"Multiple scripts run in parallel"** - False. They switch only at yield points. -2. **"I need mutexes/locks"** - Not in pure Luau. No yield = exclusive access. -3. **"`task.spawn` runs code in parallel"** - False. It schedules for later. - -## Luau-Specific Syntax - -### Arrays Are 1-Indexed - -**Critical:** Unlike most languages, Luau arrays start at index 1, not 0. - -```luau -local arr = {"first", "second", "third"} -print(arr[1]) -- "first" (NOT arr[0]) -print(arr[0]) -- nil - -for i = 1, #arr do -- Start at 1 - print(arr[i]) -end -``` - -### Generic Instantiation Uses `<>` - -This is unique to Luau and easy to forget: - -```luau --- Correct: Double angle brackets -local binding = React.createBinding<>() -local result = someFunc<>() - --- WRONG: Single angle brackets (won't work) --- local binding = React.createBinding() -``` - -### Type Ascription Uses `::` - -```luau -local x = someValue :: string -local y = (a + b) :: number -``` - -### String Interpolation Uses Backticks - -```luau -local name = "world" -print(`Hello {name}!`) -- Hello world! -print(`Result: {1 + 2}`) -- Result: 3 - --- Escape with backslash -print(`Literal braces: \{not interpolated}`) -``` - -### String Literal Escapes - -Beyond standard escapes, Luau supports: - -```luau -"\xAB" -- Hex escape: inserts byte 0xAB -"\u{1F600}" -- Unicode escape: inserts UTF-8 for U+1F600 (braces required) -"long\z - string" -- \z skips following whitespace/newlines: "longstring" -``` - -Backtick strings (interpolated) use `\` to escape `` ` ``, `{`, `\`, and newlines. `{{` is a parse error (use `\{` to get a literal brace). - -### If Expressions (Ternary) - -```luau -local x = if condition then value else alternative -local size = if x > 10 then "big" elseif x > 5 then "medium" else "small" -``` - -### Continue Statement - -```luau -for i = 1, 10 do - if i % 2 == 0 then continue end - print(i) -end -``` - -### Compound Assignment - -```luau -a += b -- a = a + b -x //= 2 -- Floor division -str ..= "suffix" -``` - -### Floor Division - -```luau -local half = width // 2 -- More efficient than math.floor(width / 2) -``` - -### Number Literals - -Luau has a single number type (64-bit IEEE 754 double, integers exact up to 2^53). - -```luau -local hex = 0xFF -- Hexadecimal -local bin = 0b10101010 -- Binary -local big = 1_048_576 -- Decimal separators for readability -local hexSep = 0xFFFF_FFFF -local binSep = 0b_0101_0101 -``` - -## Type System Essentials - -### Type Modes - -- `--!strict`: Full type checking (recommended) -- `--!nonstrict`: Reduced checking -- `--!nocheck`: Disabled - -### Primitive Types - -The Luau VM has 10 primitive types: `nil`, `string`, `number`, `boolean`, `table`, `function`, `thread`, `userdata`, `vector`, `buffer`. - -```luau -local x: number -local s: string -local b: boolean -local co: thread = coroutine.running() -local buf: buffer = buffer.create(256) -``` - -Note: `table` and `function` use dedicated syntax (not written by name). `vector` is not representable by name in type annotations. `userdata` is represented by concrete host types. - -### `unknown`, `any`, and `never` - -```luau -local u: unknown = anything -- Top type: accepts all values, but cannot be used without refinement -local a: any = anything -- Escape hatch: opts out of type checking entirely -local n: never -- Bottom type: no value inhabits this type -``` - -- `unknown` requires type refinement (e.g., `typeof(x) == "string"`) before use -- `any` silently allows all operations -- use sparingly -- `never` is useful for exhaustiveness checking and impossible branches - -### Core Type Syntax - -```luau -local arr: {string} -- Array shorthand (equivalent to {[number]: string}) -local map: {[string]: number} -- Dictionary with indexer -local obj: { x: number, y: number } -- Table with named properties - -local maybe: string? -- Optional: string | nil - --- Union / Intersection (leading | and & are allowed for formatting) -type Result = "ok" | "error" -type Action - = { type: "add", value: number } - | { type: "remove", id: string } -type Combined = TypeA & TypeB - -type NotNil = ~nil -- Negation type - --- Singleton (literal) types -- strings and booleans only, not numbers -type Direction = "up" | "down" | "left" | "right" -type Truthy = true - --- Function types with optional named parameters -type Callback = (number, string) -> boolean -type Named = (errorCode: number, errorText: string) -> () -type Generic = (T) -> T -type Multi = (number, string) -> (boolean, string) -- Multiple returns -``` - -### Generics with Defaults - -Type aliases support default type parameters (functions do not): - -```luau -type Pair = { first: T, second: T } -type PairWithDefault = Pair - -local p: PairWithDefault = { first = "hello", second = "world" } -- T defaults to string -``` - -### Read-Only Properties - -```luau -type ReadOnly = { read x: number } -type WriteOnly = { write x: number } -``` - -### Tagged Unions (Discriminated Unions) - -Common pattern for type-safe variants: - -```luau -type Action = - | { type: "increment" } - | { type: "decrement" } - | { type: "set", value: number } - -function reducer(state: number, action: Action): number - if action.type == "increment" then - return state + 1 - elseif action.type == "decrement" then - return state - 1 - elseif action.type == "set" then - return action.value - else - error(`Unknown action`) - end -end -``` - -### Built-in Type Functions - -```luau -type Keys = keyof -- Union of all property names -type RawKeys = rawkeyof -- Keys without __index -type PropType = index -- Property type lookup -type RawProp = rawget -- Property lookup without __index -``` - -### Variadic Type Packs - -For variadic functions, use `...type` in type definitions: - -```luau --- Function definition -local function addNumbers(...: number) - -- implementation -end - --- Type definition -type AddNumbers = (...number) -> number - --- Generic type packs (advanced) -type Fields = { - call: (self, P...) -> R... -} -``` - -### Type Exports - -Share types across modules with `export type`: - -```luau --- In Types.luau -export type Player = { - name: string, - score: number -} - --- In another module -local Types = require(ReplicatedStorage.Types) -local player: Types.Player = {name = "Alice", score = 100} -``` - -### Inferred Types with `typeof` - -Use `typeof` to infer types from values: - -```luau -local config = { - maxRetries = 3, - timeout = 30 -} -type Config = typeof(config) -- Infers {maxRetries: number, timeout: number} - --- Useful for metatable types -type Vector = typeof(setmetatable({}::{ - x: number, - y: number -}, {}::{ - __add: (Vector, Vector) -> Vector -})) -``` - -### Type Refinements - -The type checker narrows types based on control flow: - -```luau -local x: string | number = getValue() - --- Type guard with type() or typeof() -if type(x) == "string" then - local s: string = x -- ok, narrowed to string -end - --- Truthy test -local maybe: string? = getMaybe() -if maybe then - local s: string = maybe -- ok, nil ruled out -end - --- Equality narrowing to singleton -local s: string = getStr() -if s == "hello" then - local h: "hello" = s -- ok, narrowed to literal -end - --- Compose with and/or/not -if (type(x) == "string" or type(x) == "number") and x ~= nil then - -- x: string | number -end - --- assert() also refines -assert(type(x) == "string") -local s: string = x -- ok after assert -``` - -### Sealed vs Unsealed Tables - -Tables have different mutability rules depending on how they are created: - -**Unsealed** (table literals without annotation) -- can add new properties until scope exits: - -```luau -local t = { x = 1 } -- unsealed: {x: number} -t.y = 2 -- ok, adds y: {x: number, y: number} -t.z = 3 -- ok - -local u: { x: number, y: number? } = t -- ok, y is optional -``` - -**Sealed** (annotated or returned from function) -- locked, supports width subtyping: - -```luau -local t: { x: number } = { x = 1 } -t.y = 2 -- NOT ok, table is sealed - -type Point2D = { x: number, y: number } -type Point1D = { x: number } -local p: Point2D = { x = 5, y = 37 } -local q: Point1D = p -- ok, Point2D is a subtype (has extra properties) -``` - -Once an unsealed table leaves its defining scope (e.g., returned from a function), it becomes sealed. - -### User-Defined Type Functions - -Type functions run at analysis time and operate on types using the `types` library: - -```luau -type function simple_keyof(ty) - if not ty:is("table") then - error("Can only call keyof on tables.") - end - - local union = nil - for property in ty:properties() do - union = if union then types.unionof(union, property) else property - end - return if union then union else types.singleton(nil) -end - -type Person = { name: string, age: number } -type Keys = simple_keyof -- "age" | "name" -``` - -Available in type function environment: `types` library, `assert`, `error`, `print`, `next`, `pairs`, `ipairs`, `select`, `unpack`, `tostring`, `tonumber`, `type`, `typeof`, `math`, `table`, `string`, `bit32`, `utf8`, `buffer` libraries. - -## Roblox-Specific - -For full Roblox Luau documentation, see `.cursor/rules/roblox/en-us/luau/`. - -### Roblox Types in Annotations - -All Roblox classes, data types, and enums are valid type annotations: - -```luau -local part: Part = Instance.new("Part") -local color: BrickColor = part.BrickColor -local material: Enum.Material = part.Material -local pos: Vector3 = part.Position -local cf: CFrame = part.CFrame -``` - -### Use Vector3, Not vector - -The `vector` primitive exists but is not compatible with Roblox APIs. Always use `Vector3`: - -```luau -local pos = Vector3.new(1, 2, 3) --- NOT: vector.create(1, 2, 3) -``` - -### Native Code Generation (Server Only) - -In Roblox, `--!native` compiles **server-side scripts** to machine code. There is a limit on total natively compiled code per experience. Use `@native` on individual hot functions to stay within budget. - -## Module Require Semantics - -### Roblox Luau (Default) - -In Roblox, use instance-path requires. This is the preferred style: - -```luau -local ReplicatedStorage = game:GetService("ReplicatedStorage") -local MyModule = require(ReplicatedStorage.Modules.MyModule) -local Types = require(ReplicatedStorage.Shared.Types) - --- Common pattern: services at top of file -local Players = game:GetService("Players") -local RunService = game:GetService("RunService") -local ServerStorage = game:GetService("ServerStorage") -``` - -### Standalone Luau (String Requires) - -Outside Roblox (e.g., Lune, standalone tooling), requires use explicit string paths with mandatory prefixes: - -```luau -local sibling = require("./sibling") -- Relative to current file -local parent = require("../parent") -- Parent directory -local lib = require("@lune/net") -- Alias (configured in .luaurc) -``` - -All paths must start with `./`, `../`, or `@` -- bare names like `require("foo")` are not allowed. Aliases are configured in `.luaurc`: - -```json -{ - "aliases": { - "lune": "packages/lune", - "shared": "src/shared" - } -} -``` - -### Cyclic Dependencies - -Require paths must be statically resolvable. To break cyclic module dependencies, cast to `any`: - -```luau -local myModule = require(MyModule) :: any -``` - -## Deprecated Functions - -**Never use these:** - -- `getfenv`/`setfenv`: Breaks optimizations and type checking -- `table.getn`: Use `#` or `rawlen` -- `table.foreach`/`table.foreachi`: Use `for..in` loops -- `wait()`: Use `task.wait()` - -## Common Gotchas - -### Raw Table Functions - -When working with metatables, use `rawget`/`rawset`/`rawequal` to bypass metamethods: - -```luau -local t = setmetatable({}, { - __index = function(self, key) - rawset(self, key, key * 10) -- Avoid triggering __newindex - return self[key] - end -}) - --- rawget: Get without triggering __index -local val = rawget(t, "key") - --- rawset: Set without triggering __newindex -rawset(t, "key", "value") - --- rawequal: Compare without triggering __eq -if rawequal(a, b) then end -``` - -### Metamethod Differences from Lua - -- `__eq` always called, even for rawequal objects -- `__len` works on tables (not just userdata) -- `__iter` enables custom iteration - -### No Bitwise Shift Operators - -`<<` and `>>` don't exist (conflicts with generic syntax). Use `bit32.lshift`/`bit32.rshift`. - -### Table Iteration - -Tables can be iterated directly without `pairs`/`ipairs`: - -```luau -for k, v in myTable do - -- Works directly -end -``` - -### Spreading Arrays with `unpack` - -Use `unpack()` to spread array values: - -```luau -local args = {1, 2, 3} -print(unpack(args)) -- 1 2 3 - -local function add(a, b, c) - return a + b + c -end -print(add(unpack(args))) -- 6 -``` - -### Function Attributes - -```luau -@native -function hotFunction() - -- Compiled to native code -end - -@deprecated -function oldFunction() -end -``` - -Note: `@inline` is NOT supported. Compiler handles inlining automatically. - -## OOP Pattern - -Separate the data type from the class type using `typeof(setmetatable(...))`. Annotate `self` explicitly on methods -- this is **required** for the type checker to share `self` types across methods. - -```luau -local Point = {} -Point.__index = Point - -type PointData = { - x: number, - y: number, -} - -export type Point = typeof(setmetatable({} :: PointData, Point)) - -function Point.new(x: number, y: number): Point - return setmetatable({ x = x, y = y }, Point) -end - -function Point.move(self: Point, dx: number, dy: number) - self.x += dx - self.y += dy -end - -function Point.magnitude(self: Point): number - return math.sqrt(self.x * self.x + self.y * self.y) -end - -local p = Point.new(3, 4) -p:move(1, 2) -- Callers still use : syntax -print(p:magnitude()) -- 5.385... -``` - -Key points: -- Define methods with `.` syntax and explicit `self: ClassName` parameter -- Callers still invoke with `:` syntax -- Return type annotation on the constructor ensures compatibility with methods -- The `typeof(setmetatable(...))` trick gives full autocomplete on `self` - -## Performance Tips - -1. **Preallocate tables**: `table.create(count)` for known sizes -2. **Reuse tables**: `table.clear()` instead of creating new -3. **Floor division**: `//` is faster than `math.floor(a / b)` -4. **Avoid yields in hot paths**: Remember the single-threaded model - -### Native Code Generation - -Use `--!native` to compile server scripts to machine code for ~2-10x speedup: - -```luau ---!native ---!strict - --- Best for: computation-heavy code, math operations, buffer manipulation --- Avoid: getfenv/setfenv, non-numeric args to math functions -``` - -Or use `@native` for individual functions: - -```luau -@native -local function calculatePhysics(dt: number) - -- Heavy computation here -end -``` - -**When to use:** -- Functions with heavy math/loops called frequently -- `buffer` operations -- Avoid for API-heavy code (gains are minimal) - -**Annotate `Vector3` parameters** for best results: - -```luau --- Slow: "v" assumed to be table -local function magnitude(v) - return math.sqrt(v.X * v.X + v.Y * v.Y + v.Z * v.Z) -end - --- Fast: compiler generates optimized vector code -local function magnitude(v: Vector3) - return math.sqrt(v.X * v.X + v.Y * v.Y + v.Z * v.Z) -end -``` - -## Module Exports with Types - -```luau ---!strict - -export type MyType = { field: string } - -local Module = {} - -function Module.create(): MyType - return { field = "value" } -end - -return Module -``` - -## Exhaustiveness Checking - -Use `never` type to ensure all cases are handled: - -```luau -function handle(x: "a" | "b") - if x == "a" then - return 1 - elseif x == "b" then - return 2 - else - local _: never = x -- Type error if not exhaustive - end -end -``` - -## Standard Library Additions - -Luau extends Lua 5.1's standard library with many functions. Below are the most important additions not covered elsewhere. - -### Math Library Extensions - -```luau -math.clamp(n, min, max) -- Clamp n to [min, max] range -math.sign(n) -- Returns -1, 0, or 1 -math.round(n) -- Round to nearest integer (halfway rounds away from 0) -math.lerp(a, b, t) -- Linear interpolation: a + (b - a) * t, exact at t=1 -math.map(x, inmin, inmax, outmin, outmax) -- Map x from input range to output range -math.noise(x, y?, z?) -- 3D Perlin noise, returns [-1, 1] -``` - -Also available: `math.log(n, base?)` (optional base), `math.random()` uses PCG RNG. - -### String Library Extensions - -```luau --- string.split: splits string into array (default separator: ",") -local parts = string.split("a,b,c", ",") -- {"a", "b", "c"} -local chars = string.split("hello", "") -- {"h", "e", "l", "l", "o"} - --- string.pack/unpack/packsize: binary data encoding (Lua 5.3 format strings) --- Fixed sizes: short=16bit, long=64bit, int=32bit, size_t=32bit -local packed = string.pack("i4f", 42, 3.14) -local int, float = string.unpack("i4f", packed) -local size = string.packsize("i4f") -- 8 bytes -``` - -### bit32 Library Extensions - -```luau -bit32.countlz(n) -- Count leading zeros (returns 32 if n is 0) -bit32.countrz(n) -- Count trailing zeros (returns 32 if n is 0) -bit32.byteswap(n) -- Swap byte order (endianness) -``` - -### coroutine.close - -```luau -coroutine.close(co) -- Puts suspended/dead coroutine into dead state, frees stack --- Returns (true) on success, (false, error) if coroutine was in error state -``` - -## Immutable Tables - -```luau -local config = table.freeze({ - maxRetries = 3, - timeout = 30 -}) - --- Clone before modifying -local newConfig = table.clone(config) -newConfig.maxRetries = 5 -``` - -## Buffer Library - -Buffers are fixed-size mutable byte arrays. All offsets are 0-based. Reads/writes outside bounds throw errors. Uses little-endian byte order. - -```luau -local buf = buffer.create(1024) -- All bytes initialized to 0 -local buf2 = buffer.fromstring("hello") -- From string contents -local str = buffer.tostring(buf2) -- Back to string -local len = buffer.len(buf) -- Size in bytes - --- Typed reads/writes (i=signed, u=unsigned, f=float) -buffer.writei32(buf, 0, 42) -- Write signed 32-bit int at offset 0 -local n = buffer.readi32(buf, 0) -- Read it back -buffer.writef64(buf, 4, 3.14159) -- Write 64-bit float at offset 4 -local f = buffer.readf64(buf, 4) - --- Available: readi8/u8/i16/u16/i32/u32/f32/f64 and matching write variants - --- String read/write -buffer.writestring(buf, 0, "hello", 5) -- Write 5 bytes from string -local s = buffer.readstring(buf, 0, 5) -- Read 5 bytes as string - --- Bit-level access -buffer.writebits(buf, 0, 4, 0b1010) -- Write 4 bits at bit offset 0 -local bits = buffer.readbits(buf, 0, 4) -- Read 4 bits (returns unsigned int) - --- Bulk operations -buffer.copy(target, tOff, source, sOff?, count?) -- Copy between buffers (or within same) -buffer.fill(buf, offset, value, count?) -- Fill bytes with value -``` - -## Vector Library - -The `vector` primitive is a 3-component (or 4-component in 4-wide mode) immutable value type. Components are accessed via `.x`/`.y`/`.z` (and `.w` in 4-wide mode) but cannot be written individually. - -```luau --- Construction and constants -local v = vector.create(1, 2, 3) -local zero = vector.zero -- (0, 0, 0) -local one = vector.one -- (1, 1, 1) - --- Arithmetic: +, -, *, /, //, unary - all work component-wise -local sum = v + vector.create(4, 5, 6) - --- Geometric operations -vector.magnitude(v) -- Length of vector -vector.normalize(v) -- Unit vector -vector.dot(v1, v2) -- Dot product (returns number) -vector.cross(v1, v2) -- Cross product (3D only) -vector.angle(v1, v2, axis?) -- Angle in radians (axis for signed angle) -vector.lerp(v1, v2, t) -- Linear interpolation - --- Component-wise math -vector.abs(v) -- math.abs per component -vector.sign(v) -- math.sign per component -vector.floor(v) / vector.ceil(v) -- Rounding per component -vector.clamp(v, min, max) -- Clamp per component -vector.max(v1, v2, ...) / vector.min(v1, v2, ...) -``` - -**Note:** In Roblox, prefer `Vector3` over `vector` -- `Vector3` integrates with all Roblox APIs. The `vector` library is for standalone Luau or performance-critical native code. - -## Differences from Lua - -Luau is based on Lua 5.1 with selective features from 5.2-5.4 and its own additions: - -- `_VERSION` is `"Luau"` (not `"Lua 5.1"`) -- Single number type: 64-bit double (no separate integer type) -- No tail call optimization (simplifies debugging and stack traces) -- `__eq` metamethod is always called, even when objects are rawequal -- No `goto` statement -- No bitwise operators (`<<`, `>>`, `&`, `|`, `~`) -- use `bit32` library -- No `__gc` metamethod (sandboxing constraint) -- No `io`, `os.execute`, `package`, or full `debug` library (sandboxing) -- `loadstring` cannot load bytecode, `string.dump` not available -- Table assignment order in literals follows program order (Lua 5.x may reorder) -- `function()` expressions may reuse closures when all captured upvalues are identical -- `os.time` with table argument returns UTC (not local time) diff --git a/.cursor/rules/luau/getting-started/compatibility.md b/.cursor/rules/luau/getting-started/compatibility.md deleted file mode 100644 index b48489bc..00000000 --- a/.cursor/rules/luau/getting-started/compatibility.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -slug: compatibility -title: Compatibility with Lua -toc: true ---- - -Luau is based on Lua 5.1, and as such incorporates all features of 5.1, except for ones that had to be taken out due to sandboxing limitations. Because of backwards compatibility constraints, we don't remove features deprecated by later versions (e.g. we still support `getfenv`/`setfenv`). Later Lua versions introduce new features into the language and new libraries/functions. - -Our overall goal is to incorporate features from the later versions of Lua when it makes sense for us to do so - the motivations behind some newer features are unclear or don't apply to the domain Luau is used in, and many features carry costs that don't always make sense to pay. The rest of this document describes the status of all features of Lua 5.2 and beyond, with the following classification: - -- ✔️ - the feature is available in Luau -- ❌ - the feature is not available in Luau because we don't believe it makes sense to include it -- 😞 - the feature is not available in Luau because of compatibility/sandboxing concerns -- 🔜 - the feature is not available in Luau yet but we'd like to include it and are possibly working on it -- 🤷‍♀️ - the feature is not available in Luau yet; we don't have strong opinions on it so it might make it at some point - -Please note that all of these decisions are not final, they are just our current stance. In some cases evolution of our VM may make a feature that was previously impractical to support due to performance complications feasible. In some cases a feature that didn't have a strong use case gains one, so we can implement it. - -## Implementation limits - -Luau has certain limitations around the number of local variables, registers, upvalues, constants and instructions. These limits are often different from the limits imposed by various versions of Lua, and are documented here without promising that future versions will adhere to these. Note that writing code that is close to any of these limits is dangerous because this code may become invalid as our codegen evolves. - -- Local variables: 200 per function (same as all versions of Lua, this includes function arguments) -- Upvalues: 200 per function (up from 60 in Lua 5.1) -- Registers: 255 per function (same as all versions of Lua, this includes local variables and function arguments) -- Constants: 2^23 per function (up from 2^18 in Lua 5.1) -- Instructions: 2^23 per function (up from 2^17 in Lua 5.1, although in both cases the limit only applies to control flow) -- Nested functions: 2^15 per function (down from 2^18 in Lua 5.1) -- Stack depth: 20000 Lua calls per Lua thread, 200 C calls per C thread (e.g. `coroutine.resume`/`pcall` nesting is limited to 200) - -Note that Lua 5.3 has a larger upvalue limit (255) and a larger constant limit (2^26); existing Luau limits are likely sufficient for reasonable use cases. - -## Lua 5.1 - -Since several features were removed from Lua 5.1 for sandboxing reasons, this table lists them for completeness. - -| feature | notes | -|---------|------| -| `io`, `os`, `package` and `debug` library | note that some functions in `os`/`debug` are still present | -| `loadfile`, `dofile` | removed for sandboxing, no direct file access | -| `loadstring` bytecode and `string.dump` | exposing bytecode is dangerous for sandboxing reasons | -| `newproxy` can only be called with nil or boolean | extra flexibility removed for sandboxing | - -Sandboxing challenges are [covered in the dedicated section](../sandbox). - -## Lua 5.2 - -| feature | status | notes | -|---------|--------|------| -| yieldable pcall/xpcall | ✔️ | | -| yieldable xpcall error handler | ❌ | no strong use cases, VM complexity and performance implications | -| yieldable metamethods | ❌ | significant performance implications | -| ephemeron tables | ❌ | this complicates and slows down the garbage collector esp. for large weak tables | -| emergency garbage collector | 🤷‍ | Luau runs in environments where handling memory exhaustion in emergency situations is not tenable | -| goto statement | ❌ | this complicates the compiler, makes control flow unstructured and doesn't address a significant need | -| finalizers for tables | ❌ | no `__gc` support due to sandboxing and performance/complexity | -| no more fenv for threads or functions | 😞 | we love this, but it breaks compatibility | -| tables honor the `__len` metamethod | ✔️ | | -| hex and `\z` escapes in strings | ✔️ | | -| support for hexadecimal floats | 🤷‍♀️ | no strong use cases | -| order metamethods (`__lt`/`__le`) are called for unrelated metatables | ❌ | no strong use cases and more complicated semantics, compatibility and performance implications | -| empty statement | 🤷‍♀️ | less useful in Lua than in JS/C#/C/C++ | -| `break` statement may appear in the middle of a block | 🤷‍♀️ | we'd like to do it consistently for `break`/`return`/`continue` but there be dragons | -| arguments for function called through `xpcall` | ✔️ | | -| optional base in `math.log` | ✔️ | | -| optional separator in `string.rep` | 🤷‍♀️ | no strong use cases | -| new metamethods `__pairs` and `__ipairs` | ❌ | superseded by `__iter` | -| frontier patterns | ✔️ | | -| `%g` in patterns | ✔️ | | -| `\0` in patterns | ✔️ | | -| `bit32` library | ✔️ | | -| `string.gsub` is stricter about using `%` on special characters only | ✔️ | | -| light C functions | 😞 | this changes semantics of fenv on C functions and has complex implications wrt runtime performance | -| NaN keys are supported for tables with `__newindex` | ✔️ | | - -Two things that are important to call out here are various new metamethods for tables and yielding in metamethods. In both cases, there are performance implications to supporting this - our implementation is *very* highly tuned for performance, so any changes that affect the core fundamentals of how Lua works have a price. To support yielding in metamethods we'd need to make the core of the VM more involved, since almost every single "interesting" opcode would need to learn how to be resumable - which also complicates future JIT/AOT story. Metamethods in general are important for extensibility, but very challenging to deal with in implementation, so we err on the side of not supporting any new metamethods unless a strong need arises. - -For `__pairs`/`__ipairs`, we felt that extending library functions to enable custom containers wasn't the right choice. Instead we revisited iteration design to allow for self-iterating objects via `__iter` metamethod, which results in a cleaner iteration design that also makes it easier to iterate over tables. As such, we have no plans to support `__pairs`/`__ipairs` as all use cases for it can now be solved by `__iter`. - -Ephemeron tables may be implemented at some point since they do have valid uses and they make weak tables semantically cleaner, however the cleanup mechanism for these is expensive and complicated, and as such this can only be considered after the pending GC rework is complete. - -## Lua 5.3 - -| feature | status | notes | -|---------|--------|------| -| `\u` escapes in strings | ✔️ | | -| integers (64-bit by default) | ❌ | backwards compatibility and performance implications | -| bitwise operators | ❌ | `bit32` library covers this in absence of 64-bit integers | -| basic utf-8 support | ✔️ | we include `utf8` library and other UTF8 features | -| functions for packing and unpacking values (string.pack/unpack/packsize) | ✔️ | | -| floor division | ✔️ | | -| `ipairs` and the `table` library respect metamethods | ❌ | no strong use cases, performance implications | -| new function `table.move` | ✔️ | | -| `collectgarbage("count")` now returns only one result | ✔️ | | -| `coroutine.isyieldable` | ✔️ | | -| stricter error checking for `table.insert`/`table.remove` | 😞 | we love this, but it breaks compatibility | -| `__eq` metamethod is called for unrelated metatables | ❌ | backwards compatibility and typechecking implications | - -It's important to highlight integer support and bitwise operators. For Luau, it's rare that a full 64-bit integer type is necessary - double-precision types support integers up to 2^53 (in Lua which is used in embedded space, integers may be more appealing in environments without a native 64-bit FPU). However, there's a *lot* of value in having a single number type, both from performance perspective and for consistency. Notably, Lua doesn't handle integer overflow properly, so using integers also carries compatibility implications. - -If integers are taken out of the equation, bitwise operators make less sense, as integers aren't a first class feature; additionally, `bit32` library is more fully featured (includes commonly used operations such as rotates and arithmetic shift; bit extraction/replacement is also more readable). Adding operators along with metamethods for all of them increases complexity, which means this feature isn't worth it on the balance. Common arguments for this include a more familiar syntax, which, while true, gets more nuanced as `^` isn't available as a xor operator, and arithmetic right shift isn't expressible without yet another operator, and performance, which in Luau is substantially better than in Lua because `bit32` library uses VM builtins instead of expensive function calls. - -## Lua 5.4 - -| feature | status | notes | -|--|--|--| -| new generational mode for garbage collection | 🔜 | we're working on gc optimizations and generational mode is on our radar -| to-be-closed variables | ❌ | the syntax is inconsistent with how we'd like to do attributes long-term; no strong use cases in our domain | -| const variables | ❌ | while there's some demand for const variables, we'd never adopt this syntax | -| new implementation for math.random | ✔️ | our RNG is based on PCG, unlike Lua 5.4 which uses Xoroshiro | -| optional `init` argument to `string.gmatch` | 🤷‍♀️ | no strong use cases | -| new functions `lua_resetthread` and `coroutine.close` | ✔️ || -| coercions string-to-number moved to the string library | 😞 | we love this, but it breaks compatibility | -| new format `%p` in `string.format` | 🤷‍♀️ | no strong use cases | -| `utf8` library accepts codepoints up to 2^31 | 🤷‍♀️ | no strong use cases | -| The use of the `__lt` metamethod to emulate `__le` has been removed | ❌ | breaks compatibility and complicates comparison overloading story | -| When finalizing objects, Lua will call `__gc` metamethods that are not functions | ❌ | no `__gc` support due to sandboxing and performance/complexity | -| function `print` calls `__tostring` instead of `tostring` to format its arguments | ✔️ | | -| decoding functions in the utf8 library do not accept surrogates | ✔️ | | - -Taking syntax aside (which doesn't feel idiomatic or beautiful), `` isn't very useful in Luau - its dominant use case is for code that works with external resources like files or sockets, but we don't provide such APIs - and has a very large complexity cost, evidences by a lot of bug fixes since the initial implementation in 5.4 work versions. `` in Luau doesn't matter for performance - our multi-pass compiler is already able to analyze the usage of the variable to know if it's modified or not and extract all performance gains from it - so the only use here is for code readability, where the `` syntax is... suboptimal. - -If we do end up introducing const variables, it would be through a `const var = value` syntax, which is backwards compatible through a context-sensitive keyword similar to `type`. That said, there's ambiguity wrt whether `const` should simply behave like a read-only variable, ala JavaScript, or if it should represent a stronger contract, for example by limiting the expressions on the right hand side to ones compiler can evaluate ahead of time, or by freezing table values and thus guaranteeing immutability. - -## Differences from Lua - -We have a few behavior deviations from Lua 5.x that come from either a different implementation, or our desire to clean up small inconsistencies in the language/libraries: - -* Tail calls are not supported to simplify implementation, make debugging/stack traces more predictable and allow deep validation of caller identity for security -* Order of table assignment in table literals follows program order in mixed tables (Lua 5.x assigns array elements first in some cases) -* Equality comparisons call `__eq` metamethod even when objects are rawequal (which matches other metamethods like `<=` and facilitates NaN checking) -* `function()` expressions may reuse a previously created closure in certain scenarios (when all upvalues captured are the same) for efficiency, which changes object identity but doesn't change call semantics -- this is different from Lua 5.1 but similar to Lua 5.2/5.3 -* `os.time` returns UTC timestamp when called with a table for consistency diff --git a/.cursor/rules/luau/getting-started/intro.md b/.cursor/rules/luau/getting-started/intro.md deleted file mode 100644 index 6e713cb0..00000000 --- a/.cursor/rules/luau/getting-started/intro.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -slug: getting-started -title: An introduction to Luau -sidebar: - order: 1 ---- - -Luau is a fast, small, safe, gradually typed embeddable scripting language derived from Lua 5.1. Luau ships as a command line tool for running, analyzing, and linting your Luau scripts, and is also integrated with Roblox Studio. Roblox developers should also visit our [Creator Docs Luau Section](https://create.roblox.com/docs/luau). - -To get started with Luau, you can use the `luau` command line binary to run your code and `luau-analyze` to run static analysis (including type checking and linting). You can download these from [a recent release](https://github.com/luau-lang/luau/releases). - -## Creating a script - -To create your own testing script, create a new file with `.luau` as the extension: - -```luau ---!hidden mode=nonstrict -function ispositive(x) - return x > 0 -end - -print(ispositive(1)) -print(ispositive("2")) - -function isfoo(a) - return a == "foo" -end - -print(isfoo("bar")) -print(isfoo(1)) -``` - -You can now run the file using `luau test.luau` and analyze it using `luau-analyze test.luau`. - -Note that there are no warnings about calling ``ispositive()`` with a string, or calling ``isfoo()`` with a number. This is because Luau's type checking uses non-strict mode by default, which only reports errors if it's certain a program will error at runtime. - -## Type checking - -Now modify the script to include ``--!strict`` at the top: - -```luau ---!strict - -function ispositive(x) - return x > 0 -end - -print(ispositive(1)) -print(ispositive("2")) -``` - -We just mentioned ``nonstrict`` mode, where we only report errors if we can prove that a program will error at runtime. We also have ``strict`` mode, which will report errors if a program might error at runtime. - -In this case, Luau will use the ``return x > 0`` statement to infer that ``ispositive()`` is a function taking a number and returning a boolean. Note that in this case, we were able to determine the type of `ispositive` without the presence of any explicit type annotations. - -Based on Luau's type inference, the analysis tool will now flag the incorrect call to ``ispositive()``: - -``` -$ luau-analyze test.luau -test.luau(7,18): TypeError: Type 'string' could not be converted into 'number' -``` - -## Annotations - -You can add annotations to locals, arguments, and function return types. Among other things, annotations can help enforce that you don't accidentally do something silly. Here's how we would add annotations to ``ispositive()``: - -```luau ---!strict - -function ispositive(x : number) : boolean - return x > 0 -end - -local result : boolean -result = ispositive(1) - -``` - -Now we've explicitly told Luau that ``ispositive()`` accepts a number and returns a boolean. This wasn't strictly (pun intended) necessary in this case, because Luau's inference was able to deduce this already. But even in this case, there are advantages to explicit annotations. Imagine that later we decide to change ``ispositive()`` to return a string value: - -```luau ---!strict - -function ispositive(x : number) : boolean - if x > 0 then - return "yes" - else - return "no" - end -end - -local result : boolean -result = ispositive(1) -``` - -Oops -- we're returning string values, but we forgot to update the function return type. Since we've told Luau that ``ispositive()`` returns a boolean (and that's how we're using it), the call site isn't flagged as an error. But because the annotation doesn't match our code, we get a warning in the function body itself: - -``` -$ luau-analyze test.luau -test.luau(5,9): TypeError: Type 'string' could not be converted into 'boolean' -test.luau(7,9): TypeError: Type 'string' could not be converted into 'boolean' -``` - -The fix is simple; just change the annotation to declare the return type as a string: - -```luau ---!strict - -function ispositive(x : number) : string - if x > 0 then - return "yes" - else - return "no" - end -end - -local result : boolean -result = ispositive(1) -``` - -Well, almost - since we declared ``result`` as a boolean, the call site is now flagged: - -``` -$ luau-analyze test.luau -test.luau(12,10): TypeError: Type 'string' could not be converted into 'boolean' -``` - -If we update the type of the local variable, everything is good. Note that we could also just let Luau infer the type of ``result`` by changing it to the single line version ``local result = ispositive(1)``. - -```luau ---!strict - -function ispositive(x : number) : string - if x > 0 then - return "yes" - else - return "no" - end -end - -local result : string -result = ispositive(1) -``` - -## Conclusions - -This has been a brief tour of the basic functionality of Luau, but there's lots more to explore. If you're interested in reading more, check out our main reference pages for [syntax](/syntax) and [typechecking](/types). diff --git a/.cursor/rules/luau/getting-started/lint.md b/.cursor/rules/luau/getting-started/lint.md deleted file mode 100644 index c9cfcbc8..00000000 --- a/.cursor/rules/luau/getting-started/lint.md +++ /dev/null @@ -1,387 +0,0 @@ ---- -slug: lint -title: Luau's linter -sidebar: - order: 4 ---- - -Luau comes with a set of linting passes, that help make sure that the code is correct and consistent. Unlike the type checker, that models the behavior of the code thoroughly and points toward type mismatches that are likely to result in runtime errors, the linter is more opinionated and produces warnings that can often be safely ignored, although it's recommended to keep the code clean of the warnings. - -Linter produces many different types of warnings; many of these are enabled by default, and can be suppressed by declaring `--!nolint NAME` at the top of the file. In dire situations `--!nolint` at the top of the file can be used to completely disable all warnings (note that the type checker is still active, and requires a separate `--!nocheck` declaration). - -The rest of this page documents all warnings produced by the linter; each warning has a name and a numeric code, the latter is used when displaying warnings. Note that the in-browser version of Luau on this website does not currently use the linter. - -## UnknownGlobal (1) - -By default, variables in Luau are global (this is inherited from Lua 5.x and can't be changed because of backwards compatibility). This means that typos in identifiers are invisible to the parser, and often break at runtime. For this reason, the linter considers all globals that aren't part of the builtin global table and aren't explicitly defined in the script "unknown": - -```luau ---!hidden mode=nocheck -local displayName = "Roblox" - --- Unknown global 'displaName' -print(displaName) -``` - -Note that injecting globals via `setfenv` can produce this warning in correct code; global injection is incompatible with type checking and has performance implications so we recommend against it and in favor of using `require` with correctly scoped identifiers. - -## DeprecatedGlobal (2) - -Some global names exist for compatibility but their use is discouraged. This mostly affects globals introduced by Roblox, and since they can have problematic behavior or can break in the future, this warning highlights their uses: - -```luau ---!hidden mode=nocheck --- Global 'ypcall' is deprecated, use 'pcall' instead -ypcall(function() - print("hello") -end) -``` - -## GlobalUsedAsLocal (3) - -The UnknownGlobal lint can catch typos in globals that are read, but can't catch them in globals that are assigned to. Because of this, and to discourage the use of globals in general, linter detects cases when a global is only used in one function and can be safely converted to a local variable. Note that in some cases this requires declaring the local variable in the beginning of the function instead of where it's being assigned to. - -```luau ---!hidden mode=nocheck -local function testFunc(a) - if a < 5 then - -- Global 'b' is only used in the enclosing function; consider changing it to local - b = 1 - else - b = 2 - end - print(b) -end -``` - -## LocalShadow (4) - -In Luau, it is valid to shadow locals and globals with a local variable, including doing it in the same function. This can result in subtle bugs, since the shadowing may not be obvious to the reader. This warning detects cases where local variables shadow other local variables in the same function, or global variables used in the script. - -```luau ---!hidden mode=nocheck -local function foo() - for i=1,10 do - -- Variable 'i' shadows previous declaration at line 2 - for i=1,10 do - print(i) - end - end -end -``` - -## SameLineStatement (5) - -Luau doesn't require the use of semicolons and doesn't automatically insert them at line breaks. When used wisely this results in code that is easy to read and understand, however it can cause subtle issues and hard to understand code when abused by using many different statements on the same line. This warning highlights cases where code should either be broken into multiple lines, or use `;` as a visual guide. - -```luau ---!hidden mode=nocheck --- A new statement is on the same line; add semi-colon on previous statement to silence -if b < 0 then local a = b + 1 print(a, b) end -``` - -## MultiLineStatement (6) - -An opposite problem is having statements that span multiple lines. This is good for readability when the code is indented properly, but when it's not it results in code that's hard to understand, as its easy to confuse the next line for a separate statement. - -```luau ---!hidden mode=nocheck --- Statement spans multiple lines; use indentation to silence -print(math.max(1, -math.min(2, 3))) -``` - -## LocalUnused (7) - -This warning is one of the few warnings that highlight unused variables. Local variable declarations that aren't used may indicate a bug in the code (for example, there could be a typo in the code that uses the wrong variable) or redundant code that is no longer necessary (for example, calling a function to get its result and never using this result). This warning warns about locals that aren't used; if the locals are not used intentionally they can be prefixed with `_` to silence the warning: - -```luau ---!hidden mode=nocheck -local x = 1 --- Variable 'y' is never used; prefix with '_' to silence -local y = 2 -print(x, x) -``` - -## FunctionUnused (8) - -While unused local variables could be useful for debugging, unused functions usually contain dead code that was meant to be removed. Unused functions clutter code, can be a result of typos similar to local variables, and can mislead the reader into thinking that some functionality is supported. - -```luau ---!hidden mode=nocheck --- Function 'bar' is never used; prefix with '_' to silence -local function bar() -end - -local function foo() -end - -return foo() -``` - -## ImportUnused (9) - -In Luau, there's no first-class module system that's part of the syntax, but `require` function acts as an import statement. When a local is initialized with a `require` result, and the local is unused, this is classified as "unused import". Removing unused imports improves code quality because it makes it obvious what the dependencies of the code are: - -```luau ---!hidden mode=nocheck --- Import 'Roact' is never used; prefix with '_' to silence -local Roact = require("@game/Packages/Roact") -``` - -## BuiltinGlobalWrite (10) - -While the sandboxing model of Luau prevents overwriting built-in globals such as `table` for the entire program, it's still valid to reassign these globals - this results in "global shadowing", where the script's global table contains a custom version of `table` after writing to it. This is problematic because it disables some optimizations, and can result in misleading code. When shadowing built-in globals, use locals instead. - -```luau --- Built-in global 'math' is overwritten here; consider using a local or changing the name -math = {} -``` - -## PlaceholderRead (11) - -`_` variable name is commonly used as a placeholder to discard function results. The linter follows this convention and doesn't warn about the use of `_` in various cases where a different name would cause a warning otherwise. To make sure the placeholder is only used to write values to it, this warning detects the cases where it's read instead: - -```luau -local _ = 5 --- Placeholder value '_' is read here; consider using a named variable -return _ -``` - -## UnreachableCode (12) - -In some cases the linter can detect code that is never executed, because all execution paths through the function exit the function or the loop before reaching it. Such code is misleading because it's not always obvious to the reader that it never runs, and as such it should be removed. - -```luau -function cbrt(v) - if v >= 0 then - return v ^ (1/3) - else - error('cbrt expects a non-negative argument') - end - -- Unreachable code (previous statement always returns) - return 0 -end -``` - -## UnknownType (13) - -Luau provides several functions to get the value type as a string (`type`, `typeof`), and some Roblox APIs expose class names through string arguments (`Instance.new`). This warning detects incorrect use of the type names by checking the string literals used in type comparisons and function calls. - -```luau ---!hidden mode=nocheck --- Unknown type 'String' (expected primitive type) -if type(v) == "String" then - print("v is a string") -end -``` - -## ForRange (14) - -When using a numeric for, it's possible to make various mistakes when specifying the for bounds. For example, to iterate through the table backwards, it's important to specify the negative step size. This warning detects several cases where the numeric for only runs for 0 or 1 iterations, or when the step doesn't divide the size of the range evenly. - -```luau ---!hidden mode=nocheck --- For loop should iterate backwards; did you forget to specify -1 as step? -for i=#t,1 do -end -``` - -## UnbalancedAssignment (15) - -Assignment statements and local variable declarations in Luau support multiple variables on the left side and multiple values on the right side. The number of values doesn't need to match; when the right side has more values, the extra values are discarded, and then the left side has more variables the extra variables are set to `nil`. However, this can result in subtle bugs where a value is omitted mistakenly. This warning warns about cases like this; if the last expression on the right hand side returns multiple values, the warning is not emitted. - -```luau --- Assigning 2 values to 3 variables initializes extra variables with nil; add 'nil' to value list to silence -local x, y, z = 1, 2 -``` - -## ImplicitReturn (16) - -In Luau, there's a subtle difference between returning no values from a function and returning `nil`. In many contexts these are equivalent, but when the results are passed to a variadic function (perhaps implicitly), the difference can be observed - for example, `print(foo())` prints nothing if `foo` returns no values, and `nil` if it returns `nil`. - -To help write code that has consistent behavior, linter warns about cases when a function implicitly returns no values, if there are cases when it explicitly returns a result. For code like this it's recommended to use explicit `return` or `return nil` at the end of the function (these have different semantics, so the correct version to use depends on the function): - -```luau ---!hidden mode=nocheck -local function find(t, expected) - for k,v in pairs(t) do - if k == expected then - return v - end - end - -- Function 'find' can implicitly return no values even though there's an explicit return at line 4; add explicit return to silence -end -``` - -## DuplicateLocal (17) - -Luau syntax allows to use the same name for different parameters of a function as well as different local variables declared in the same statement. This is error prone, even if it's occasionally useful, so a warning is emitted in cases like this, unless the duplicate name is the placeholder `_`: - -```luau ---!hidden mode=nocheck -function foo(a, b, a) -- Function parameter 'a' already defined on column 14 -end - -function obj:method(self) -- Function parameter 'self' already defined implicitly -end - -local x, y, x = v:GetComponents() -- Variable 'x' already defined on column 7 -``` - -## FormatString (18) - -Luau has several library functions that expect a format string that specifies the behavior for the function. These format strings follow a specific syntax that depends on the question; mistakes in these strings can lead to runtime errors or unexpected behavior of the code. - -To help make sure that the strings used for these functions are correct, linter checks calls to `string.format`, `string.pack`, `string.packsize`, `string.unpack`, `string.match`, `string.gmatch`, `string.find`, `string.gsub` and `os.date` and issues warnings when the call uses a literal string with an incorrect format: - -```luau ---!hidden mode=nocheck --- Invalid match pattern: invalid capture reference, must refer to a closed capture -local cap = string.match(s, "(%d)%2") - --- Invalid format string: unfinished format specifier -local str = ("%d %"):format(1, 2) -``` - - Note that with the exception of `string.format` this only works when the function is called via the library, not via the method call (so prefer `string.match(s, "pattern")` to `s:match("pattern")`). - -## TableLiteral (19) - -Table literals are often used in Luau to create objects or specify data. The syntax for table literals is rich but invites mistakes, for example it allows duplicate keys or redundant index specification for values already present in the list form. This warning is emitted for cases where some entries in the table literal are ignored at runtime as they're duplicate: - -```luau -print({ - first = 1, - second = 2, - first = 3, -- Table field 'first' is a duplicate; previously defined at line 2 -}) -``` - -## UninitializedLocal (20) - -It's easy to forget to initialize a local variable and then proceed to use it regardless. This can happen due to a typo, or sometimes it can happen because the original variable definition is shadowed. When a local variable doesn't have an initial value and is used without ever being assigned to, this warning is emitted: - -```luau -local foo - -if foo then -- Variable 'foo' defined at line 1 is never initialized or assigned; initialize with 'nil' to silence - print(foo) -end -``` - -## DuplicateFunction (21) - -This warning is emitted when a script defines two functions with the same name in the same scope. - -The warning is not produced when the functions are defined in different scopes because this is much more likely to be intentional. - -```luau ---!hidden mode=nocheck -function foo() end -function foo() end -- Duplicate function definition: 'foo' also defined on line 1 - --- OK: the functions are not defined in the same scope. -if x then - function bar() end -else - function bar() end -end -``` - -## DeprecatedApi (22) - -This warning is emitted when a script accesses a method or field that is marked as deprecated. Use of deprecated APIs is discouraged since they may have performance or correctness issues, may result in unexpected behavior, and could be removed in the future. - -```luau ---!hidden mode=nocheck -function getSize(i: Instance) - return i.DataCost -- Member 'Instance.DataCost' is deprecated -end -``` - -## TableOperations (23) - -To manipulate array-like tables, Luau provides a set of functions as part of the standard `table` library. To help use these functions correctly, this warning is emitted when one of these functions is used incorrectly or can be adjusted to be more performant. - -```luau -local t = {} - -table.insert(t, 0, 42) -- table.insert uses index 0 but arrays are 1-based; did you mean 1 instead? -table.insert(t, #t+1, 42) -- table.insert will append the value to the table; consider removing the second argument for efficiency -``` - -In addition, when type information is present, this warning will be emitted when `#` or `ipairs` is used on a table that has no numeric keys or indexers. This helps avoid common bugs like using `#t == 0` to check if a dictionary is empty. - -```luau -local message = { data = { 1, 2, 3 } } - -if #message == 0 then -- Using '#' on a table without an array part is likely a bug -end -``` - -## DuplicateCondition (24) - -When checking multiple conditions via `and/or` or `if/elseif`, a copy & paste error may result in checking the same condition redundantly. This almost always indicates a bug, so a warning is emitted when use of a duplicate condition is detected. - -```luau ---!hidden mode=nocheck -assert(self._adorns[normID1] and self._adorns[normID1]) -- Condition has already been checked on column 8 -``` - -## MisleadingAndOr (25) - -In Lua, there is no first-class ternary operator but it can be emulated via `a and b or c` pattern. However, due to how boolean evaluation works, if `b` is `false` or `nil`, the resulting expression evaluates to `c` regardless of the value of `a`. Luau solves this problem with the `if a then b else c` expression; a warning is emitted for and-or expressions where the first alternative is `false` or `nil` because it's almost always a bug. - -```luau ---!hidden mode=nocheck --- The and-or expression always evaluates to the second alternative because the first alternative is false; consider using if-then-else expression instead -local x = flag and false or true -``` - -The code above can be rewritten as follows to avoid the warning and the associated bug: - -```luau ---!hidden mode=nocheck -local x = if flag then false else true -``` - -## CommentDirective (26) - -Luau uses comments that start from `!` to control certain aspects of analysis, for example setting type checking mode via `--!strict` or disabling individual lints with `--!nolint`. Unknown directives are ignored, for example `--!nostrict` doesn't have any effect on the type checking process as the correct spelling is `--!nonstrict`. This warning flags comment directives that are ignored during processing: - -```luau ---!nostrict --- Unknown comment directive 'nostrict'; did you mean 'nonstrict'?" -``` - -## IntegerParsing (27) - -Luau parses hexadecimal and binary literals as 64-bit integers before converting them to Luau numbers. As a result, numbers that exceed 2^64 are silently truncated to 2^64, which can result in unexpected program behavior. This warning flags literals that are truncated: - -```luau --- Hexadecimal number literal exceeded available precision and was truncated to 2^64 -local x = 0x1111111111111111111111111111111111111 -``` - -Luau numbers are represented as double precision IEEE754 floating point numbers; they can represent integers up to 2^53 exactly, but larger integers may lose precision. This warning also flags literals that are parsed with a precision loss: - -```luau --- Number literal exceeded available precision and was truncated to closest representable number -local x = 9007199254740993 -``` - -## ComparisonPrecedence (28) - -Because of operator precedence rules, not X == Y parses as (not X) == Y; however, often the intent was to invert the result of the comparison. This warning flags erroneous conditions like that, as well as flagging cases where two comparisons happen in a row without any parentheses: - -```luau ---!hidden mode=nocheck --- not X == Y is equivalent to (not X) == Y; consider using X ~= Y, or wrap one of the expressions in parentheses to silence -if not x == 5 then -end - --- X <= Y <= Z is equivalent to (X <= Y) <= Z; wrap one of the expressions in parentheses to silence -if 1 <= x <= 3 then -end -``` diff --git a/.cursor/rules/luau/getting-started/syntax.md b/.cursor/rules/luau/getting-started/syntax.md deleted file mode 100644 index 75019cac..00000000 --- a/.cursor/rules/luau/getting-started/syntax.md +++ /dev/null @@ -1,318 +0,0 @@ ---- -slug: syntax -title: Luau syntax by example -description: An informal reference for Luau's syntax by example. -sidebar: - order: 3 ---- - -Luau uses the baseline [syntax of Lua 5.1](https://www.lua.org/manual/5.1/manual.html#2). For detailed documentation, please refer to the Lua manual, this is an example: - -```luau -local function tree_insert(tree, x) - local lower, equal, greater = split(tree.root, x) - if not equal then - equal = { - x = x, - y = math.random(0, 2^31-1), - left = nil, - right = nil - } - end - tree.root = merge3(lower, equal, greater) -end -``` - -Note that future versions of Lua extend the Lua 5.1 syntax with more features; Luau does support string literal extensions but does not support other 5.x additions; for details please refer to [compatibility section](../compatibility). - -The rest of this document documents additional syntax used in Luau. - -## String literals - -Luau implements support for hexadecimal (`\x`), Unicode (`\u`) and `\z` escapes for string literals. This syntax follows [Lua 5.3 syntax](https://www.lua.org/manual/5.3/manual.html#3.1): - -- `\xAB` inserts a character with the code 0xAB into the string -- `\u{ABC}` inserts a UTF8 byte sequence that encodes U+0ABC character into the string (note that braces are mandatory) -- `\z` at the end of the line inside a string literal ignores all following whitespace including newlines, which can be helpful for breaking long literals into multiple lines. - -## Number literals - -In addition to basic integer and floating-point decimal numbers, Luau supports: - -- Hexadecimal integer literals, `0xABC` or `0XABC` -- Binary integer literals, `0b01010101` or `0B01010101` -- Decimal separators in all integer literals, using `_` for readability: `1_048_576`, `0xFFFF_FFFF`, `0b_0101_0101` - -Note that Luau only has a single number type, a 64-bit IEEE754 double precision number (which can represent integers up to 2^53 exactly), and larger integer literals are stored with precision loss. - -## Continue statement - -In addition to `break` in all loops, Luau supports `continue` statement. Similar to `break`, `continue` must be the last statement in the block. - -Note that unlike `break`, `continue` is not a keyword. This is required to preserve backwards compatibility with existing code; so this is a `continue` statement: - -```luau ---!hidden mode=nocheck -if x < 0 then - continue -end -``` - -Whereas this is a function call: - -```luau ---!hidden mode=nocheck -if x < 0 then - continue() -end -``` - -When used in `repeat..until` loops, `continue` can not skip the declaration of a local variable if that local variable is used in the loop condition; code like this is invalid and won't compile: - -```luau -repeat - do continue end - local a = 5 -until a > 0 -``` - -## Compound assignments - -Luau supports compound assignments with the following operators: `+=`, `-=`, `*=`, `/=`, `//=`, `%=`, `^=`, `..=`. Just like regular assignments, compound assignments are statements, not expressions: - -```luau -local a = 5 - --- this works -a += 1 - --- this doesn't work -print(a += 1) -``` - -Compound assignments only support a single value on the left and right hand side; additionally, the function calls on the left hand side are only evaluated once: - -```luau -function foo() return 2 end -local a = { 1, 2, 3 } - --- calls foo() twice -a[foo()] = a[foo()] + 1 - --- calls foo() once -a[foo()] += 1 -``` - -Compound assignments call the arithmetic metamethods (`__add` et al) and table indexing metamethods (`__index` and `__newindex`) as needed - for custom types no extra effort is necessary to support them. - -## Type annotations - -To support gradual typing, Luau supports optional type annotations for variables and functions, as well as declaring type aliases. - -Types can be declared for local variables, function arguments and function return types using `:` as a separator: - -```luau -function foo(x: number, y: string): boolean - local k: string = y:rep(x) - return k == "a" -end -``` - -In addition, the type of any expression can be overridden using a type cast `::`: - -```luau -function foo(x: number, y: unknown): boolean - local k = (y :: string):rep(x) - return k == "a" -end -``` - -There are several simple builtin types: `any` (represents inability of the type checker to reason about the type), `nil`, `boolean`, `number`, `string` and `thread`. - -Function types are specified using the arguments and return types, separated with `->`: - -```luau -local foo: (number, string) -> boolean -``` - -To return no values or more than one, you need to wrap the return type position with parentheses, and then list your types there. - -```luau -local no_returns: (number, string) -> () -local returns_boolean_and_string: (number, string) -> (boolean, string) - -function foo(x: number, y: number): (number, string) - return x + y, tostring(x) .. tostring(y) -end -``` - -Note that function types are specified without the argument names in the examples above, but it's also possible to specify the names (that are not semantically significant but can show up in documentation and autocomplete): - -```luau -local callback: (errorCode: number, errorText: string) -> () -``` - -Table types are specified using the table literal syntax, using `:` to separate keys from values: - -```luau -local array: { [number] : string } -local object: { x: number, y: string } -``` - -When the table consists of values keyed by numbers, it's called an array-like table and has a special short-hand syntax, `{T}` (e.g. `{string}`). - -Additionally, the type syntax supports type intersections (`((number) -> string) & ((boolean) -> string)`) and unions (`(number | boolean) -> string`). An intersection represents a type with values that conform to both sides at the same time, which is useful for overloaded functions; a union represents a type that can store values of either type - `any` is technically a union of all possible types. - -It's common in Lua for function arguments or other values to store either a value of a given type or `nil`; this is represented as a union (`number | nil`), but can be specified using `?` as a shorthand syntax (`number?`). - -In addition to declaring types for a given value, Luau supports declaring type aliases via `type` syntax: - -```luau -type Point = { x: number, y: number } -type Array = { [number]: T } -type Something = typeof(string.gmatch("", "%d")) -``` - -The right hand side of the type alias can be a type definition or a `typeof` expression; `typeof` expression doesn't evaluate its argument at runtime. - -By default type aliases are local to the file they are declared in. To be able to use type aliases in other modules using `require`, they need to be exported: - -```luau -export type Point = { x: number, y: number } -``` - -An exported type can be used in another module by prefixing its name with the require alias that you used to import the module. - -```luau ---!file main.luau -local M = require("./other") - -local a: M.Point = {x=5, y=6} - ---!file other.luau -export type Point = { x: number, y: number } - -return {} -``` - -For more information please refer to [typechecking documentation](../types). - -## If-then-else expressions - -In addition to supporting standard if *statements*, Luau adds support for if *expressions*. Syntactically, `if-then-else` expressions look very similar to if statements. However instead of conditionally executing blocks of code, if expressions conditionally evaluate expressions and return the value produced as a result. Also, unlike if statements, if expressions do not terminate with the `end` keyword. - -Here is a simple example of an `if-then-else` expression: -```luau -local a, b = 6, 7 -local maxValue = if a > b then a else b -``` - -`if-then-else` expressions may occur in any place a regular expression is used. The `if-then-else` expression must match `if then else `; it can also contain an arbitrary number of `elseif` clauses, like `if then elseif then else `. Note that in either case, `else` is mandatory. - -Here's is an example demonstrating `elseif`: -```luau -local x = -21 -local sign = if x < 0 then -1 elseif x > 0 then 1 else 0 -``` - -**Note:** In Luau, the `if-then-else` expression is preferred vs the standard Lua idiom of writing `a and b or c` (which roughly simulates a ternary operator). However, the Lua idiom may return an unexpected result if `b` evaluates to false. The `if-then-else` expression will behave as expected in all situations. - -## Generalized iteration - -Luau uses the standard Lua syntax for iterating through containers, `for vars in values`, but extends the semantics with support for generalized iteration. In Lua, to iterate over a table you need to use an iterator like `next` or a function that returns one like `pairs` or `ipairs`. In Luau, you can simply iterate over a table: - -```luau -for k, v in {1, 4, 9} do - assert(k * k == v) -end -``` - -Further, iteration can be extended for tables or userdata by implementing the `__iter` metamethod which is called before the iteration begins, and should return an iterator function like `next` (or a custom one): - -```luau -local obj = { items = {1, 4, 9} } -setmetatable(obj, { __iter = function(o) return next, o.items end }) - -for k, v in obj do - assert(k * k == v) -end -``` - -The default iteration order for tables is specified to be consecutive for elements `1..#t` and unordered after that, visiting every element; similarly to iteration using `pairs`, modifying the table entries for keys other than the current one results in unspecified behavior. - -## String interpolation - -Luau adds an additional way to define string values that allows you to place runtime expressions directly inside specific spots of the literal. - -This is a more ergonomic alternative over using `string.format` or `("literal"):format`. - -To use string interpolation, use a backtick string literal: - -```luau -local count = 3 -print(`Bob has {count} apple(s)!`) ---> Bob has 3 apple(s)! -``` - -Any expression can be used inside `{}`: - -```luau -local combos = {2, 7, 1, 8, 5} -print(`The lock combination is {table.concat(combos)}.`) ---> The lock combination is 27185. -``` - -Inside backtick string literal, `\` is used to escape `` ` ``, `{`, `\` itself and a newline: - -```luau -print(`Some example escaping the braces \{like so}`) ---> Some example escaping the braces {like so} - -print(`Backslash \ that escapes the space is not a part of the string...`) ---> Backslash that escapes the space is not a part of the string... - -print(`Backslash \\ will escape the second backslash...`) ---> Backslash \ will escape the second backslash... - -print(`Some text that also includes \`...`) ---> Some text that also includes `... - -local name = "Luau" - -print(`Welcome to { - name -}!`) ---> Welcome to Luau! -``` - -### Restrictions and limitations - -The sequence of two opening braces {{"`{{`"}} is rejected with a parse error. -This restriction is made to prevent developers using other programming languages with a similar feature from trying to attempt that as a way to escape a single `{` and getting unexpected results in Luau. - -Luau currently does not support backtick string literals in type annotations, therefore `` type Foo = `Foo` `` is invalid syntax. - -Unlike single and double-quoted string literals, backtick string literals must always be wrapped in parentheses for function calls: -```luau -print "hello" -- valid -print`hello` -- invalid syntax -print(`hello`) -- valid -``` - -## Floor division (`//`) - -Luau supports floor division, including its operator (`//`), its compound assignment operator (`//=`), and overloading metamethod (`__idiv`), as an ergonomic alternative to `math.floor`. - -For numbers, `a // b` is equal to `math.floor(a / b)`: -```luau -local n = 6.72 -print(n // 2) --> 3 -n //= 3 -print(n) --> 2 -``` - -Note that it's possible to get `inf`, `-inf`, or `NaN` with floor division; when `b` is `0`, `a // b` results in positive or negative infinity, and when both `a` and `b` are `0`, `a // b` results in NaN. - -For native vectors, `c // d` applies `math.floor` to each component of the vector `c`. Therefore `c // d` is equivalent to `vector.create(math.floor(c.x / d), math.floor(c.y / b), math.floor(c.z / b))`. - -Floor division syntax and semantics follow from [Lua 5.3](https://www.lua.org/manual/5.3/manual.html#3.4.1) where applicable. diff --git a/.cursor/rules/luau/getting-started/why.md b/.cursor/rules/luau/getting-started/why.md deleted file mode 100644 index 752d7828..00000000 --- a/.cursor/rules/luau/getting-started/why.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -slug: why -title: Why Luau? -sidebar: - order: 2 ---- - -Around 2006, [Roblox](https://www.roblox.com) started using Lua 5.1 as a scripting language for games. Over the years the runtime had to be tweaked to provide a safe, secure sandboxed environment; we gradually started accumulating small library changes and tweaks. - -Over the course of the last few years, instead of using Web-based stack for our player-facing application, Lua-based in-game UI and Qt-based editor UI, we've started consolidating a lot of the efforts and developing all of these using Roblox engine and Lua as a scripting language. - -Having grown a substantial internal codebase that needed to be correct and performant, and with the focus shifting a bit from novice game developers to professional studios building games on Roblox and our own teams of engineers building applications, there was a need to improve performance and quality of the code we were writing. - -Unlike mainline Lua, we also could not afford to do major breaking changes to the language (hence the 5.1 language baseline that remained unchanged for more than a decade). While faster implementations of Lua 5.1 like LuaJIT were available, they didn't meet our needs in terms of portability, ease of change and they didn't address the problem of developing robust code at scale. - -All of these motivated us to start reshaping Lua 5.1 that we started from into a new, derivative language that we call Luau. Our focus is on making the language more performant and feature-rich, and make it easier to write robust code through a combination of linting and type checking using a gradual type system. - -## Complete rewrite? - -A very large part of Luau codebase is written from scratch. We needed a set of tools to be able to write language analysis tools; Lua has a parser that is integrated with the bytecode compiler, which makes it unsuitable for complex semantic analysis. For bytecode compilation, while a single pass compiler can deliver better compilation throughput and be simpler than a full frontend/backend, it significantly limits the optimizations that can be done at the bytecode level. - -Luau compiler and analysis tools are thus written from scratch, closely following the syntax and semantics of Lua. Our compiler is not single-pass, and instead relies on a set of analysis passes that run over the AST to produce efficient bytecode, followed by some post-process optimizations. - -As for the runtime, we had to rewrite the interpreter from scratch to get substantially faster performance; using a combination of techniques pioneered by LuaJIT and custom optimizations that are able to improve performance by taking control over the entire stack (language, compiler, interpreter, virtual machine), we're able to get close to LuaJIT interpreter performance while using C as an implementation language. - -The garbage collector and the core libraries represent more of an incremental change, where we used Lua 5.1 as a baseline but we're continuing to rewrite these as well with performance in mind. - -While Luau initially didn't include a JIT/AOT, native code generation has since been implemented for x64/arm64 platform as an optional component. diff --git a/.cursor/rules/luau/guides/performance.md b/.cursor/rules/luau/guides/performance.md deleted file mode 100644 index 76c86a48..00000000 --- a/.cursor/rules/luau/guides/performance.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -slug: performance -title: How we make Luau fast -sidebar: - order: 1 ---- - -One of main goals of Luau is to enable high performance code, with gameplay code being the main use case. This can be viewed as two separate goals: - -- Make idiomatic code that wasn't tuned faster -- Enable even higher performance through careful tuning - -Both of these goals are important - it's insufficient to just focus on the highly tuned code, and all things being equal we prefer to raise all boats by implementing general optimizations. However, in some cases it's important to be aware of optimizations that Luau does and doesn't do. - -Worth noting is that Luau is focused on, first and foremost, stable high performance code in interpreted context. This is because JIT compilation is not available on many platforms Luau runs on, and AOT compilation would only work for code that Roblox ships (and even that does not always work). This is in stark contrast with LuaJIT that, while providing an excellent interpreter as well, focuses a lot of the attention on JIT (with many optimizations unavailable in the interpreter). - -Having said that, Luau has been updated to include an optional JIT component for x64 and arm64 platforms. This component can compile a selected set of functions, including limiting compilation to functions or modules marked explicitly by the user. While functions can be compiled at any time, automated JIT compilation decisions based on statistics/tracing are not performed. Luau JIT takes into account the type annotations present in the source code to specialize code paths and at this time, doesn't include runtime analysis of the types/values flowing through the program. - -The rest of this document goes into some optimizations that Luau employs and how to best leverage them when writing code. The document is not complete - a lot of optimizations are transparent to the user and involve detailed low-level tuning of various parts that is not described here - and all of this is subject to change without notice, as it doesn't affect the semantics of valid code. - -## Fast bytecode interpreter - -Luau features a very highly tuned portable bytecode interpreter. It's similar to Lua interpreter in that it's written in C, but it's highly tuned to yield efficient assembly when compiled with Clang and latest versions of MSVC. On some workloads it can match the performance of LuaJIT interpreter which is written in highly specialized assembly. We are continuing to tune the interpreter and the bytecode format over time; while extra performance can be extracted by rewriting the interpreter in assembly, we're unlikely to ever do that as the extra gains at this point are marginal, and we gain a lot from C in terms of portability and being able to quickly implement new optimizations. - -Of course the interpreter isn't typical C code - it uses many tricks to achieve extreme levels of performance and to coerce the compiler to produce efficient assembly. Due to a better bytecode design and more efficient dispatch loop it's noticeably faster than Lua 5.x (including Lua 5.4 which made some of the changes similar to Luau, but doesn't come close). The bytecode design was partially inspired by excellent LuaJIT interpreter. Most computationally intensive scripts only use the interpreter core loop and builtins, which on x64 compiles into \~16 KB, thus leaving half of the instruction cache for other infrequently called code. - -## Optimizing compiler - -Unlike Lua and LuaJIT, Luau uses a multi-pass compiler with a frontend that parses source into an AST and a backend that generates bytecode from it. This carries a small penalty in terms of compilation time, but results in more flexible code and, crucially, makes it easier to optimize the generated bytecode. - -> Note: Compilation throughput isn't the main focus in Luau, but our compiler is reasonably fast; with all currently implemented optimizations enabled, it compiles 950K lines of Luau code in 1 second on a single core of a desktop Ryzen 5900X CPU, producing bytecode and debug information. - -While bytecode optimizations are limited due to the flexibility of Luau code (e.g. `a * 1` may not be equivalent to `a` if `*` is overloaded through metatables), even in absence of type information Luau compiler can perform some optimizations such as "deep" constant folding across functions and local variables, perform upvalue optimizations for upvalues that aren't mutated, do analysis of builtin function usage, optimize the instruction sequences for multiple variable assignments, and some peephole optimizations on the resulting bytecode. The compiler can also be instructed to use more aggressive optimizations by enabling optimization level 2 (`-O2` in CLI tools), some of which are documented further on this page. - -Most bytecode optimizations are performed on individual statements or functions, however the compiler also does a limited amount of interprocedural optimizations; notably, calls to local functions can be optimized with the knowledge of the argument count or number of return values involved. Interprocedural optimizations are limited to a single module due to the compilation model. - -Luau compiler is also able to use type information to do further optimizations. Because we control the entire stack (unlike e.g. TypeScript where the type information is discarded completely before reaching the VM), we have more flexibility there and can make some tradeoffs during codegen even if the type system isn't completely sound. For example, it might be reasonable to assume that in presence of known types, we can infer absence of side effects for arithmetic operations and builtins - if the runtime types mismatch due to intentional violation of the type safety through global injection, the code will still be safely sandboxed. Type information is currently limited to small peephole optimizations, but it has a potential to unlock optimizations such as common subexpression elimination and allocation hoisting in the future, without having to rely on a JIT. These future optimizations opportunities are speculative pending further research. - -## Epsilon-overhead debugger - -It's important for Luau to have stable and predictable performance. Something that comes up in Lua-based environments often is the use of line hooks to implement debugging (both for breakpoints and for stepping). This is problematic because the support for hooks is typically not free in general, but importantly once the hook is enabled, calling the hook has a considerable overhead, and the hook itself may be very costly to evaluate since it will need to associate the script:line pair with the breakpoint information. - -Luau does not support hooks at all, and relies on first-class support for breakpoints (using bytecode patching) and single-stepping (using a custom interpreter loop) to implement debugging. As a result, the presence of breakpoints doesn't slow the script execution down - the only noticeable discrepancy between running code under a debugger and without a debugger should be in cases where breakpoints are evaluated and skipped based on breakpoint conditions, or when stepping over long-running fragments of code. - -## Inline caching for table and global access - -Table access for field lookup is optimized in Luau using a mechanism that blends inline caching (classically used in Java/JavaScript VMs) and HREFs (implemented in LuaJIT). Compiler can predict the hash slot used by field lookup, and the VM can correct this prediction dynamically. - -As a result, field access can be very fast in Luau, provided that: - -- The field name is known at compile time. To make sure this is the case, `table.field` notation is recommended, although the compiler will also optimize `table["field"]` when the expression is known to be a constant string. -- The field access doesn't use metatables. The fastest way to work with tables in Luau is to store fields directly inside the table, and store methods in the metatable (see below); access to "static" fields in classic OOP designs is best done through `Class.StaticField` instead of `object.StaticField`. -- The object structure is usually uniform. While it's possible to use the same function to access tables of different shape - e.g. `function getX(obj) return obj.x end` can be used on any table that has a field `"x"` - it's best to not vary the keys used in the tables too much, as it defeats this optimization. - -The same optimization is applied to the custom globals declared in the script, although it's best to avoid these altogether by using locals instead. Still, this means that the difference between `function` and `local function` is less pronounced in Luau. - -## Importing global access chains - -While global access for library functions can be optimized in a similar way, this optimization breaks down when the global table is using sandboxing through metatables, and even when globals aren't sandboxed, `math.max` still requires two table accesses. - -It's always possible to "localize" the global accesses by using `local max = math.max`, but this is cumbersome - in practice it's easy to forget to apply this optimization. To avoid relying on programmers remembering to do this, Luau implements a special optimization called "imports", where most global chains such as `math.max` are resolved when the script is loaded instead of when the script is executed. - -This optimization relies on being able to predict the shape of the environment table for a given function; this is possible due to global sandboxing, however this optimization is invalid in some cases: - -- `loadstring` can load additional code that runs in context of the caller's environment -- `getfenv`/`setfenv` can directly modify the environment of any function - -The use of any of these functions performs a dynamic deoptimization, marking the affected environment as "impure". The optimizations are only in effect on functions with "pure" environments - because of this, the use of `loadstring`/`getfenv`/`setfenv` is not recommended. Note that `getfenv` deoptimizes the environment even if it's only used to read values from the environment. - -> Note: Luau still supports these functions as part of our backwards compatibility promise, although we'd love to switch to Lua 5.2's `_ENV` as that mechanism is cleaner and doesn't require costly dynamic deoptimization. - -## Fast method calls - -Luau specializes method calls to improve their performance through a combination of compiler, VM and binding optimizations. Compiler emits a specialized instruction sequence when methods are called through `obj:Method` syntax (while this isn't idiomatic anyway, you should avoid `obj.Method(obj)`). When the object in question is a Lua table, VM performs some voodoo magic based on inline caching to try to quickly discover the implementation of this method through the metatable. - -For this to be effective, it's crucial that `__index` in a metatable points to a table directly. For performance reasons it's strongly recommended to avoid `__index` functions as well as deep `__index` chains; an ideal object in Luau is a table with a metatable that points to itself through `__index`. - -When the object in question is a reflected userdata, a special mechanism called "namecall" is used to minimize the interop cost. In classical Lua binding model, `obj:Method` is called in two steps, retrieving the function object (`obj.Method`) and calling it; both steps are often implemented in C++, and the method retrieval needs to use a method object cache - all of this makes method calls slow. - -Luau can directly call the method by name using the "namecall" extension, and an optimized reflection layer can retrieve the correct method quickly through more voodoo magic based on string interning and custom Luau features that aren't exposed through Luau scripts. - -As a result of both optimizations, common Lua tricks of caching the method in a local variable aren't very productive in Luau and aren't recommended either. - -## Specialized builtin function calls - -Due to global sandboxing and the ability to dynamically deoptimize code running in impure environments, in pure environments we go beyond optimizing the interpreter and optimize many built-in functions through a "fastcall" mechanism. - -For this mechanism to work, function call must be "obvious" to the compiler - it needs to call a builtin function directly, e.g. `math.max(x, 1)`, although it also works if the function is "localized" (`local max = math.max`); this mechanism doesn't work for indirect function calls unless they were inlined during compilation, and doesn't work for method calls (so calling `string.byte` is more efficient than `s:byte`). - -The mechanism works by directly invoking a highly specialized and optimized implementation of a builtin function from the interpreter core loop without setting up a stack frame and omitting other work; additionally, some fastcall specializations are partial in that they don't support all types of arguments, for example all `math` library builtins are only specialized for numeric arguments, so calling `math.abs` with a string argument will fall back to the slower implementation that will do string->number coercion. - -As a result, builtin calls are very fast in Luau - they are still slightly slower than core instructions such as arithmetic operations, but only slightly so. The set of fastcall builtins is slowly expanding over time and as of this writing contains `assert`, `type`, `typeof`, `rawget`/`rawset`/`rawequal`, `getmetatable`/`setmetatable`, `tonumber`/`tostring`, all functions from `math` (except `noise` and `random`/`randomseed`) and `bit32`, and some functions from `string` and `table` library. - -Some builtin functions have partial specializations that reduce the cost of the common case further. Notably: - -- `assert` is specialized for cases when the assertion return value is not used and the condition is truthy; this helps reduce the runtime cost of assertions to the extent possible -- `bit32.extract` is optimized further when field and width selectors are constant -- `select` is optimized when the second argument is `...`; in particular, `select(x, ...)` is O(1) when using the builtin dispatch mechanism even though it's normally O(N) in variadic argument count. - -Some functions from `math` library like `math.floor` can additionally take advantage of advanced SIMD instruction sets like SSE4.1 when available. - -In addition to runtime optimizations for builtin calls, many builtin calls, as well as constants like `math.pi`/`math.huge`, can also be constant-folded by the bytecode compiler when using aggressive optimizations (level 2); this currently applies to most builtin calls with constant arguments and a single return value. For builtin calls that can not be constant folded, compiler assumes knowledge of argument/return count (level 2) to produce more efficient bytecode instructions. - -## Optimized table iteration - -Luau implements a fully generic iteration protocol; however, for iteration through tables in addition to generalized iteration (`for .. in t`) it recognizes three common idioms (`for .. in ipairs(t)`, `for .. in pairs(t)` and `for .. in next, t`) and emits specialized bytecode that is carefully optimized using custom internal iterators. - -As a result, iteration through tables typically doesn't result in function calls for every iteration; the performance of iteration using generalized iteration, `pairs` and `ipairs` is comparable, so generalized iteration (without the use of `pairs`/`ipairs`) is recommended unless the code needs to be compatible with vanilla Lua or the specific semantics of `ipairs` (which stops at the first `nil` element) is required. Additionally, using generalized iteration avoids calling `pairs` when the loop starts which can be noticeable when the table is very short. - -Iterating through array-like tables using `for i=1,#t` tends to be slightly slower because of extra cost incurred when reading elements from the table. - -## Optimized table length - -Luau tables use a hybrid array/hash storage, like in Lua; in some sense "arrays" don't truly exist and are an internal optimization, but some operations, notably `#t` and functions that depend on it, like `table.insert`, are defined by the Luau/Lua language to allow internal optimizations. Luau takes advantage of that fact. - -Unlike Lua, Luau guarantees that the element at index `#t` is stored in the array part of the table. This can accelerate various table operations that use indices limited by `#t`, and this makes `#t` worst-case complexity O(logN), unlike Lua where the worst case complexity is O(N). This also accelerates computation of this value for small tables like `{ [1] = 1 }` since we never need to look at the hash part. - -The "default" implementation of `#t` in both Lua and Luau is a binary search. Luau uses a special branch-free (depending on the compiler...) implementation of the binary search which results in 50+% faster computation of table length when it needs to be computed from scratch. - -Additionally, Luau can cache the length of the table and adjust it following operations like `table.insert`/`table.remove`; this means that in practice, `#t` is almost always a constant time operation. - -## Creating and modifying tables - -Luau implements several optimizations for table creation. When creating object-like tables, it's recommended to use table literals (`{ ... }`) and to specify all table fields in the literal in one go instead of assigning fields later; this triggers an optimization inspired by LuaJIT's "table templates" and results in higher performance when creating objects. When creating array-like tables, if the maximum size of the table is known up front, it's recommended to use `table.create` function which can create an empty table with preallocated storage, and optionally fill it with a given value. - -When the exact table shape isn't known, Luau compiler can still predict the table capacity required in case the table is initialized with an empty literal (`{}`) and filled with fields subsequently. For example, the following code creates a correctly sized table implicitly: - -```luau -local v = {} -v.x = 1 -v.y = 2 -v.z = 3 -return v -``` - -When appending elements to tables, it's recommended to use `table.insert` (which is the fastest method to append an element to a table if the table size is not known). In cases when a table is filled sequentially, however, it can be more efficient to use a known index for insertion - together with preallocating tables using `table.create` this can result in much faster code, for example this is the fastest way to build a table of squares: - -```luau -local t = table.create(N) - -for i=1,N do - t[i] = i * i -end -``` - -## Native vector math - -Luau uses tagged value storage - each value contains a type tag and the data that represents the value of a given type. Because of the need to store 64-bit double precision numbers *and* 64-bit pointers, we don't use NaN tagging and have to pay the cost of 16 bytes per value. - -We take advantage of this to provide a native value type that can store a 32-bit floating point vector with 3 components. This type is fundamental to game computations and as such it's important to optimize the storage and the operations with that type - our VM implements first class support for all math operations and component manipulation, which essentially means we have native 3-wide SIMD support. For code that uses many vector values this results in significantly smaller GC pressure and significantly faster execution, and gives programmers a mechanism to hand-vectorize numeric code if need be. - -## Optimized upvalue storage - -Lua implements upvalues as garbage collected objects that can point directly at the thread's stack or, when the value leaves the stack frame (and is "closed"), store the value inside the object. This representation is necessary when upvalues are mutated, but inefficient when they aren't - and 90% or more of upvalues aren't mutated in typical Lua code. Luau takes advantage of this by reworking upvalue storage to prioritize immutable upvalues - capturing upvalues that don't change doesn't require extra allocations or upvalue closing, resulting in faster closure allocation, faster execution, faster garbage collection and faster upvalue access due to better memory locality. - -Note that "immutable" in this case only refers to the variable itself - if the variable isn't assigned to it can be captured by value, even if it's a table that has its contents change. - -When upvalues are mutable, they do require an extra allocated object; we carefully optimize the memory consumption and access cost for mutable upvalues to reduce the associated overhead. - -## Closure caching - -With optimized upvalue storage, creating new closures (function objects) is more efficient but still requires allocating a new object every time. This can be problematic for cases when functions are passed to algorithms like `table.sort` or functions like `pcall`, as it results in excessive allocation traffic which then leads to more work for garbage collector. - -To make closure creation cheaper, Luau compiler implements closure caching - when multiple executions of the same function expression are guaranteed to result in the function object that is semantically identical, the compiler may cache the closure and always return the same object. This changes the function identity which may affect code that uses function objects as table keys, but preserves the calling semantics - compiler will only do this if calling the original (cached) function behaves the same way as a newly created function would. The heuristics used for this optimization are subject to change; currently, the compiler will cache closures that have no upvalues, or all upvalues are immutable (see previous section) and are declared at the module scope, as the module scope is (almost always) evaluated only once. - -## Fast memory allocator - -Similarly to LuaJIT, but unlike vanilla Lua, Luau implements a custom allocator that is highly specialized and tuned to the common allocation workloads we see. The allocator design is inspired by classic pool allocators as well as the excellent `mimalloc`, but through careful domain-specific tuning it beats all general purpose allocators we've tested, including `rpmalloc`, `mimalloc`, `jemalloc`, `ptmalloc` and `tcmalloc`. - -This doesn't mean that memory allocation in Luau is free - it's carefully optimized, but it still carries a cost, and a high rate of allocations requires more work from the garbage collector. The garbage collector is incremental, so short of some edge cases this rarely results in visible GC pauses, but can impact the throughput since scripts will interrupt to perform "GC assists" (helping clean up the garbage). Thus for high performance Luau code it's recommended to avoid allocating memory in tight loops, by avoiding temporary table and userdata creation. - -In addition to a fast allocator, all frequently used structures in Luau have been optimized for memory consumption, especially on 64-bit platforms, compared to Lua 5.1 baseline. This helps to reduce heap memory footprint and improve performance in some cases by reducing the memory bandwidth impact of garbage collection. - -## Optimized libraries - -While the best performing code in Luau spends most of the time in the interpreter, performance of the standard library functions is critical to some applications. In addition to specializing many small and simple functions using the builtin call mechanism, we spend extra care on optimizing all library functions and providing additional functions beyond the Lua standard library that help achieve good performance with idiomatic code. - -Functions from the `table` library like `insert`, `remove` and `move` have been tuned for performance on array-like tables, achieving 3x and more performance compared to un-tuned versions, and Luau provides additional functions like `table.create` and `table.find` to achieve further speedup when applicable. Our implementation of `table.sort` is using `introsort` algorithm which results in guaranteed worst case `NlogN` complexity regardless of the input, and, together with the array-like specializations, helps achieve ~4x speedup on average. - -For `string` library, we use a carefully tuned dynamic string buffer implementation; it is optimized for smaller strings to reduce garbage created during string manipulation, and for larger strings it allows to produce a large string without extra copies, especially in cases where the resulting size is known ahead of time. Additionally, functions like `format` have been tuned to avoid the overhead of `sprintf` where possible, resulting in further speedups. - -## Improved garbage collector pacing - -Luau uses an incremental garbage collector which does a little bit of work every so often, and at no point does it stop the world to traverse the entire heap. The runtime will make sure that the collector runs interspersed with the program execution as the program allocates additional memory, which is known as "garbage collection assists", and can also run in response to explicit garbage collection invocation via `lua_gc`. In interactive environments such as video game engines it's possible, and even desirable, to request garbage collection every frame to make sure assists are minimized, since that allows scheduling the garbage collection to run concurrently with other engine processing that doesn't involve script execution. - -Inspired by excellent work by Austin Clements on Go's garbage collector pacer, we've implemented a pacing algorithm that uses a proportional–integral–derivative controller to estimate internal garbage collector tunables to reach a target heap size, defined as a percentage of the live heap data (which is more intuitive and actionable than Lua 5.x "GC pause" setting). Luau runtime also estimates the allocation rate making it easy (given uniform allocation rates) to adjust the per-frame garbage collection requests to do most of the required GC work outside of script execution. - -## Reduced garbage collector pauses - -While Luau uses an incremental garbage collector, once per each collector cycle it runs a so-called "atomic" step. While all other GC steps can do very little work by only looking at a few objects at a given time, which means that the collector can have arbitrarily short pauses, the "atomic" step needs to traverse some amount of data that, in some cases, may scale with the application heap. Since atomic step is indivisible, it can result in occasional pauses on the order of tens of milliseconds, which is problematic for interactive applications. We've implemented a series of optimizations to help reduce the atomic step. - -Normally objects that have been modified after the GC marked them in an incremental mark phase need to be rescanned during atomic phase, so frequent modifications of existing tables may result in a slow atomic step. To address this, we run a "remark" step where we traverse objects that have been modified after being marked once more (incrementally); additionally, the write barrier that triggers for object modifications changes the transition logic during remark phase to reduce the probability that the object will need to be rescanned. - -Another source of scalability challenges is coroutines. Writes to coroutine stacks don't use a write barrier, since that's prohibitively expensive as they are too frequent. This means that coroutine stacks need to be traversed during atomic step, so applications with many coroutines suffer large atomic pauses. To address this, we implement incremental marking of coroutines: marking a coroutine makes it "inactive" and resuming a coroutine (or pushing extra objects on the coroutine stack via C API) makes it "active". Atomic step only needs to traverse active coroutines again, which reduces the cost of atomic step by effectively making coroutine collection incremental as well. - -While large tables can be a problem for incremental GC in general since currently marking a single object is indivisible, large weak tables are a unique challenge because they also need to be processed during atomic phase, and the main use case for weak tables - object caches - may result in tables with large capacity but few live objects in long-running applications that exhibit bursts of activity. To address this, weak tables in Luau can be marked as "shrinkable" by including `s` as part of `__mode` string, which results in weak tables being resized to the optimal capacity during GC. This option may result in missing keys during table iteration if the table is resized while iteration is in progress and as such is only recommended for use in specific circumstances. - -## Optimized garbage collector sweeping - -The incremental garbage collector in Luau runs three phases for each cycle: mark, atomic and sweep. Mark incrementally traverses all live objects, atomic finishes various operations that need to happen without mutator intervention (see previous section), and sweep traverses all objects in the heap, reclaiming memory used by dead objects and performing minor fixup for live objects. While objects allocated during the mark phase are traversed in the same cycle and thus may get reclaimed, objects allocated during the sweep phase are considered live. Because of this, the faster the sweep phase completes, the less garbage will accumulate; and, of course, the less time sweeping takes the less overhead there is from this phase of garbage collection on the process. - -Since sweeping traverses the whole heap, we maximize the efficiency of this traversal by allocating garbage-collected objects of the same size in 16 KB pages, and traversing each page at a time, which is otherwise known as a paged sweeper. This ensures good locality of reference as consecutively swept objects are contiguous in memory, and allows us to spend no memory for each object on sweep-related data or allocation metadata, since paged sweeper doesn't need to be able to free objects without knowing which page they are in. Compared to linked list based sweeping that Lua/LuaJIT implement, paged sweeper is 2-3x faster, and saves 16 bytes per object on 64-bit platforms. - -## Function inlining and loop unrolling - -By default, the bytecode compiler performs a series of optimizations that result in faster execution of the code, but they preserve both execution semantics and debuggability. For example, a function call is compiled as a function call, which may be observable via `debug.traceback`; a loop is compiled as a loop, which may be observable via `lua_getlocal`. To help improve performance in cases where these restrictions can be relaxed, the bytecode compiler implements additional optimizations when optimization level 2 is enabled (which requires using `-O2` switch when using Luau CLI), namely function inlining and loop unrolling. - -Only loops with loop bounds known at compile time, such as `for i=1,4 do`, can be unrolled. The loop body must be simple enough for the optimization to be profitable; compiler uses heuristics to estimate the performance benefit and automatically decide if unrolling should be performed. - -Only local functions (defined either as `local function foo` or `local foo = function`) can be inlined. The function body must be simple enough for the optimization to be profitable; compiler uses heuristics to estimate the performance benefit and automatically decide if each call to the function should be inlined instead. Additionally recursive invocations of a function can’t be inlined at this time, and inlining is completely disabled for modules that use `getfenv`/`setfenv` functions. - -In both cases, in addition to removing the overhead associated with function calls or loop iteration, these optimizations can additionally benefit by enabling additional optimizations, such as constant folding of expressions dependent on loop iteration variable or constant function arguments, or using more efficient instructions for certain expressions when the inputs to these instructions are constants. diff --git a/.cursor/rules/luau/guides/profile.md b/.cursor/rules/luau/guides/profile.md deleted file mode 100644 index 3d69ecdb..00000000 --- a/.cursor/rules/luau/guides/profile.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -permalink: /profile -title: Profiling your Luau code -sidebar: - order: 3 ---- - -One of main goals of Luau is to enable high performance code. To help with that goal, we are relentlessly optimizing the compiler and runtime - but ultimately, performance of their -code is in developers' hands, and is a combination of good algorithm design and implementation that adheres to the strengths of the language. To help write efficient code, Luau -provides a built-in profiler that samples the execution of the program and outputs a profiler dump that can be converted to an interactive flamegraph. - -To run the profiler, make sure you have an optimized build of the interpreter (otherwise profiling results are going to be very skewed) and run it with `--profile` argument: - -``` -$ luau --profile tests/chess.lua -OK 8902 rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 -OK 2039 r3k2r/p1ppqpb1/bn2pnp1/3PN3/1p2P3/2N2Q1p/PPPBBPPP/R3K2R w KQkq - 0 0 -OK 2812 8/2p5/3p4/KP5r/1R3p1k/8/4P1P1/8 w - - 0 0 -OK 9467 r3k2r/Pppp1ppp/1b3nbN/nP6/BBP1P3/q4N2/Pp1P2PP/R2Q1RK1 w kq - 0 1 -OK 1486 rnbq1k1r/pp1Pbppp/2p5/8/2B5/8/PPP1NnPP/RNBQK2R w KQ - 1 8 -OK 2079 r4rk1/1pp1qppp/p1np1n2/2b1p1B1/2B1P1b1/P1NP1N2/1PP1QPPP/R4RK1 w - - 0 10 -Profiler dump written to profile.out (total runtime 2.034 seconds, 20344 samples, 374 stacks) -GC: 0.378 seconds (18.58%), mark 46.80%, remark 3.33%, atomic 1.93%, sweepstring 6.77%, sweep 41.16% -``` - -The resulting `profile.out` file can be converted to an SVG file by running `perfgraph.py` script that is part of Luau repository: - -``` -$ python tools/perfgraph.py profile.out >profile.svg -``` - -This produces an SVG file that can be opened in a browser (the image below is clickable): - -[![profile.svg](/images/chess-profile.svg)](/images/chess-profile.svg) - -In a flame graph visualization, the individual bars represent function calls, the width represents how much of the total program runtime they execute, and the nesting matches the call stack encountered during program execution. This is a fantastic visualization technique that allows you to hone in on the specific bottlenecks affecting -your program performance, optimize those exact bottlenecks, and then re-generate the profile data and visualizer, and look for the next set of true bottlenecks (if any). - -Hovering your mouse cursor over individual sections will display detailed function information in the status bar and in a tooltip. If you want to Search for a specific named -function, use the Search field in the upper right, or press Ctrl+F. - -Notice that some of the bars in the screenshot don't have any text. In some cases, there isn't enough room in the size of the bar to display the name. -You can hover your mouse over those bars to see the name and source location of the function in the tool tip, or double-click to zoom in on that part of the flame graph. - -Some tooltips will have a source location for the function you're hovering over, but no name. Those are anonymous functions, or functions that were not declared in a way that -allows Luau compiler to track the name. To fill in more names, you may want to make these changes to your code: - -`local myFunc = function() --[[ work ]] end` -> `local function myFunc() --[[ work ]] end` - -Even without these changes, you can hover over a given bar with no visible name and see it's source location. - -As any sampling profiler, this profiler relies on gathering enough information for the resulting output to be statistically meaningful. It may miss short functions if they -aren't called often enough. By default the profiler runs at 10 kHz, this can be customized by passing a different parameter to `--profile=`. Note that higher -frequencies result in higher profiling overhead and longer program execution, potentially skewing the results. - -This profiler doesn't track leaf C functions and instead attributes the time spent there to calling Luau functions. As a result, when thinking about why a given function is -slow, consider not just the work it does immediately but also the library functions it calls. - -This profiler tracks time consumed by Luau thread stacks; when a thread calls another thread via `coroutine.resume`, the time spent is not attributed to the parent thread that's -waiting for resume results. This limitation will be removed in the future. diff --git a/.cursor/rules/luau/guides/sandbox.md b/.cursor/rules/luau/guides/sandbox.md deleted file mode 100644 index 86734050..00000000 --- a/.cursor/rules/luau/guides/sandbox.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -slug: sandbox -title: Embedding a sandboxed Luau virtual machine -sidebar: - order: 2 ---- - -Luau is safe to embed. Broadly speaking, this means that even in the face of untrusted (and in Roblox case, actively malicious) code, the language and the standard library don't allow unsafe access to the underlying system, and don't have known bugs that allow escaping out of the sandbox (e.g. to gain native code execution through ROP gadgets et al). Additionally, the VM provides extra features to implement isolation of privileged code from unprivileged code and protect one from the other; this is important if the embedding environment decides to expose some APIs that may not be safe to call from untrusted code, for example because they do provide controlled access to the underlying system or risk PII exposure through fingerprinting etc. - -This safety is achieved through a combination of removing features from the standard library that are unsafe, adding features to the VM that make it possible to implement sandboxing and isolation, and making sure the implementation is safe from memory safety issues using fuzzing. - -Of course, since the entire stack is implemented in C++, the sandboxing isn't formally proven - in theory, compiler or the standard library can have exploitable vulnerabilities. In practice these are very rare and usually found and fixed quickly. While implementing the stack in a safer language such as Rust would make it easier to provide these guarantees, to our knowledge (based on prior art) this would make it difficult to reach the level of performance required. - -## Library - -Parts of the Lua 5.x standard library are unsafe. Some of the functions provide access to the host operating system, including process execution and file reads. Some functions lack sufficient memory safety checks. Some functions are safe if all code is untrusted, but can break the isolation barrier between trusted and untrusted code. - -The following libraries and global functions have been removed as a result: - -- `io.` library has been removed entirely, as it gives access to files and allows running processes -- `package.` library has been removed entirely, as it gives access to files and allows loading native modules -- `os.` library has been cleaned up from file and environment access functions (`execute`, `exit`, etc.). The only supported functions in the library are `clock`, `date`, `difftime` and `time`. -- `debug.` library has been removed to a large extent, as it has functions that aren't memory safe and other functions break isolation; the only supported functions are `traceback` and `info` (which is similar to `debug.getinfo` but has a slightly different interface). -- `dofile` and `loadfile` allowed access to file system and have been removed. - -To achieve memory safety, access to function bytecode has been removed. Bytecode is hard to validate and using untrusted bytecode may lead to exploits. Thus, `loadstring` doesn't work with bytecode inputs, and `string.dump`/`load` have been removed as they aren't necessary anymore. When embedding Luau, bytecode should be encrypted/signed to prevent MITM attacks as well, as the VM assumes that the bytecode was generated by the Luau compiler (which never produces invalid/unsafe bytecode). - -Finally, to make isolation possible within the same VM, the following global functions have reduced functionality: - -- `collectgarbage` only works with `"count"` argument, as modifying the state of GC can interfere with the expectations of other code running in the process. As such, `collectgarbage()` became an inferior version of `gcinfo()` and is deprecated. -- `newproxy` only works with `true`/`false`/`nil` arguments. -- `module` allowed overriding global packages and was removed as a result. - -> Note: `getfenv`/`setfenv` result in additional isolation challenges, as they allow injecting globals into scripts on the call stack. Ideally, these should be disabled as well, but unfortunately Roblox community relies on these for various reasons. This can be mitigated by limiting interaction between trusted and untrusted code, and/or using separate VMs. - -## Environment - -The modification to the library functions are sufficient to make embedding safe, but aren't sufficient to provide isolation within the same VM. It should be noted that to achieve guaranteed isolation, it's advisable to load trusted and untrusted code into separate VMs; however, even within the same VM Luau provides additional safety features to make isolation cheaper. - -When initializing the default globals table, the tables are protected from modification: - -- All libraries (`string`, `math`, etc.) are marked as readonly -- The string metatable is marked as readonly -- The global table itself is marked as readonly - -This is using the VM feature that is not accessible from scripts, that prevents all writes to the table, including assignments, `rawset` and `setmetatable`. This makes sure that globals can't be monkey-patched in place, and can only be substituted through `setfenv`. - -By itself this would mean that code that runs in Luau can't use globals at all, since assigning globals would fail. While this is feasible, in Roblox we solve this by creating a new global table for each script, that uses `__index` to point to the builtin global table. This safely sandboxes the builtin globals while still allowing writing globals from each script. This also means that short of exposing special shared globals from the host, all scripts are isolated from each other. - -## `__gc` - -Lua 5.1 exposes a `__gc` metamethod for userdata, which can be used on proxies (`newproxy`) to hook into garbage collector. Later versions of Lua extend this mechanism to work on tables. - -This mechanism is bad for performance, memory safety and isolation: - -- In Lua 5.1, `__gc` support requires traversing userdata lists redundantly during garbage collection to filter out finalizable objects -- In later versions of Lua, userdata that implement `__gc` are split into separate lists; however, finalization prolongs the lifetime of the finalized objects which results in less prompt memory reclamation, and two-step destruction results in extra cache misses for userdata -- `__gc` runs during garbage collection in context of an arbitrary thread which makes the thread identity mechanism used in Roblox to support trusted Luau code invalid -- Objects can be removed from weak tables *after* being finalized, which means that accessing these objects can result in memory safety bugs, unless all exposed userdata methods guard against use-after-gc. -- If `__gc` method ever leaks to scripts, they can call it directly on an object and use any method exposed by that object after that. This means that `__gc` and all other exposed methods must support memory safety when called on a destroyed object. - -Because of these issues, Luau does not support `__gc`. Instead it uses tag-based destructors that can perform additional memory cleanup during userdata destruction; crucially, these are only available to the host (so they can never be invoked manually), and they run right before freeing the userdata memory block which is both optimal for performance, and guaranteed to be memory safe. - -For monitoring garbage collector behavior the recommendation is to use weak tables instead. - -## Interrupts - -In addition to preventing API access, it can be important for isolation to limit the memory and CPU usage of code that runs inside the VM. - -By default, no memory limits are imposed on the running code, so it's possible to exhaust the address space of the host; this is easy to configure from the host for Luau allocations, but of course with a rich API surface exposed by the host it's hard to eliminate this as a possibility. Memory exhaustion doesn't result in memory safety issues or any particular risk to the system that's running the host process, other than the host process getting terminated by the OS. - -Limiting CPU usage can be equally challenging with a rich API. However, Luau does provide a VM-level feature to try to contain runaway scripts which makes it possible to terminate any script externally. This works through a global interrupt mechanism, where the host can setup an interrupt handler at any point, and any Luau code is guaranteed to call this handler "eventually" (in practice this can happen at any function call or at any loop iteration). This still leaves the possibility of a very long running script open if the script manages to find a way to call a single C function that takes a lot of time, but short of that the interruption is very prompt. - -Roblox sets up the interrupt handler using a watchdog that: - -- Limits the runtime of any script in Studio to 10 seconds (configurable through Studio settings) -- Upon client shutdown, interrupts execution of every running script 1 second after shutdown diff --git a/.cursor/rules/luau/index.mdx b/.cursor/rules/luau/index.mdx deleted file mode 100644 index a1da377d..00000000 --- a/.cursor/rules/luau/index.mdx +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Luau -description: Luau is a small, fast, and embeddable programming language based on Lua with a gradual type system. -template: splash -hero: - tagline: > - Luau (lowercase u, /ˈlu.aʊ/) is a small, fast, and embeddable programming language based on Lua with a gradual type system. - image: - file: ../../../public/images/mascot.png - alt: Hina, a Hawaiian monk seal and the official mascot of the Luau language - actions: - - text: Get Started - link: /getting-started/ - - text: News - link: /news/ - variant: secondary - - text: Try Luau online - link: https://play.luau.org - icon: right-caret - variant: minimal ---- - -import { Card, CardGrid } from '@astrojs/starlight/components'; -import ColoredCard from '../../components/ColoredCard.astro'; -import LuauPlayground from '../../components/LuauPlayground.astro'; - -# Try Luau! - - - -# Why Luau? - - - - Luau is a high-performance managed language with a fast bytecode compiler and interpreter, and an optimized, incremental garbage collector. Its optional JIT compiler runs on x64 and arm64, and supports plugins that extend native code generation to any embedder-defined types. - - - Luau has a state-of-the-art gradual type system with features like [type refinements](./types/type-refinements) and [type functions](./types/type-functions). This system is powered by an ambitious and powerful type inference engine that aims to both rule out program errors, _and_ provide autocomplete with minimal annotations. - - - Luau is designed to be easy-to-learn, and easy-to-use over time. The syntax of the language is small and easy to pick up, and the semantics of the language should be broadly unsurprising to most programmers, with recursive functions, conventional loops and branching, and so forth. - - - Luau aims to be pleasant and productive to use, and to make programming as fun as it can be! Besides the language itself, we're building a full suite of developer tools: package management, linting, code transformation, documentation generation, and servers for editing and debugging code. - - - Luau, like Lua before it, is designed with embedding in mind. The language features an extended version of Lua's C API with better support for coroutines and yielding, code coverage, and more performant, tagged userdata. We've also carefully sandboxed Luau, limiting the exposed API surface by default and enabling embedders to safely support executing untrusted code from their users. - - - Whenever possible, Luau aims to be backwards-compatible with Lua 5.1 and at the same time to incorporate features from later revisions of Lua. However, Luau is not a full superset of later versions of Lua - we do not always agree with Lua design decisions, and have different use cases and constraints. All post-5.1 Lua features, along with their support status in Luau, [are documented here](compatibility). - - diff --git a/.cursor/rules/luau/reference/grammar.md b/.cursor/rules/luau/reference/grammar.md deleted file mode 100644 index c3a783fe..00000000 --- a/.cursor/rules/luau/reference/grammar.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -slug: grammar -title: Syntax Grammar -sidebar: - order: 3 ---- - -This is the complete syntax grammar for Luau in EBNF. More information about the terminal nodes STRING and NUMBER -is available in the [syntax section](../syntax). - -```ebnf -chunk ::= block -block ::= {stat [';']} [laststat [';']] -stat ::= varlist '=' explist | - var compoundop exp | - functioncall | - 'do' block 'end' | - 'while' exp 'do' block 'end' | - 'repeat' block 'until' exp | - 'if' exp 'then' block {'elseif' exp 'then' block} ['else' block] 'end' | - 'for' binding '=' exp ',' exp [',' exp] 'do' block 'end' | - 'for' bindinglist 'in' explist 'do' block 'end' | - attributes 'function' funcname funcbody | - attributes 'local' 'function' NAME funcbody | - 'local' bindinglist ['=' explist] | - ['export'] 'type' NAME ['<' GenericTypeListWithDefaults '>'] '=' Type | - ['export'] 'type' 'function' NAME funcbody - -laststat ::= 'return' [explist] | 'break' | 'continue' - -funcname ::= NAME {'.' NAME} [':' NAME] -funcbody ::= ['<' GenericTypeList '>'] '(' [parlist] ')' [':' ReturnType] block 'end' -parlist ::= bindinglist [',' '...' [':' (GenericTypePack | Type)]] | '...' [':' (GenericTypePack | Type)] - -explist ::= {exp ','} exp - -binding ::= NAME [':' Type] -bindinglist ::= binding [',' bindinglist] (* equivalent of Lua 5.1 'namelist', except with optional type annotations *) - -var ::= NAME | prefixexp '[' exp ']' | prefixexp '.' NAME -varlist ::= var {',' var} -prefixexp ::= var | functioncall | '(' exp ')' -functioncall ::= prefixexp funcargs | prefixexp ':' NAME funcargs - -exp ::= asexp { binop exp } | unop exp { binop exp } -ifelseexp ::= 'if' exp 'then' exp {'elseif' exp 'then' exp} 'else' exp -asexp ::= simpleexp ['::' Type] -stringinterp ::= INTERP_BEGIN exp { INTERP_MID exp } INTERP_END -simpleexp ::= NUMBER | STRING | 'nil' | 'true' | 'false' | '...' | tableconstructor | attributes 'function' funcbody | prefixexp | ifelseexp | stringinterp -funcargs ::= '(' [explist] ')' | tableconstructor | STRING - -tableconstructor ::= '{' [fieldlist] '}' -fieldlist ::= field {fieldsep field} [fieldsep] -field ::= '[' exp ']' '=' exp | NAME '=' exp | exp -fieldsep ::= ',' | ';' - -compoundop ::= '+=' | '-=' | '*=' | '/=' | '//=' | '%=' | '^=' | '..=' -binop ::= '+' | '-' | '*' | '/' | '//' | '^' | '%' | '..' | '<' | '<=' | '>' | '>=' | '==' | '~=' | 'and' | 'or' -unop ::= '-' | 'not' | '#' - -littable ::= '{' [litfieldlist] '}' -litfieldlist ::= litfield {fieldsep litfield} [fieldsep] -litfield ::= [NAME '='] literal - -literal ::= 'nil' | 'false' | 'true' | NUMBER | STRING | littable -litlist ::= literal {',' literal} - -pars ::= '(' [litlist] ')' | littable | STRING -parattr ::= NAME [pars] -attribute ::= '@' NAME | '@[' parattr {',' parattr} ']' -attributes ::= {attribute} - -SimpleType ::= - 'nil' | - SingletonType | - NAME ['.' NAME] [ '<' [TypeParams] '>' ] | - 'typeof' '(' exp ')' | - TableType | - FunctionType | - '(' Type ')' - -SingletonType ::= STRING | 'true' | 'false' - -Union ::= [SimpleType {'?'}] {'|' SimpleType {'?'}} -Intersection ::= [SimpleType] {'&' SimpleType} -Type ::= Union | Intersection - -GenericTypePackParameter ::= NAME '...' -GenericTypeList ::= NAME [',' GenericTypeList] | GenericTypePackParameter {',' GenericTypePackParameter} - -GenericTypePackParameterWithDefault ::= NAME '...' '=' (TypePack | VariadicTypePack | GenericTypePack) -GenericTypeListWithDefaults ::= - NAME ['=' Type] [',' GenericTypeListWithDefaults] | - GenericTypePackParameterWithDefault {',' GenericTypePackParameterWithDefault} - -TypeList ::= Type [',' TypeList] | '...' Type -BoundTypeList ::= [NAME ':'] Type [',' BoundTypeList] | GenericTypePack | VariadicTypePack -TypeParams ::= (Type | TypePack | VariadicTypePack | GenericTypePack) [',' TypeParams] -TypePack ::= '(' [TypeList] ')' -GenericTypePack ::= NAME '...' -VariadicTypePack ::= '...' Type -ReturnType ::= Type | TypePack | GenericTypePack | VariadicTypePack -TableIndexer ::= ['read' | 'write'] '[' Type ']' ':' Type -TableProp ::= ['read' | 'write'] NAME ':' Type -PropList ::= TableProp [fieldsep PropList] | TableIndexer {fieldsep TableProp} - -TableType ::= '{' Type '}' | '{' [PropList] '}' -FunctionType ::= ['<' GenericTypeList '>'] '(' [BoundTypeList] ')' '->' ReturnType -``` diff --git a/.cursor/rules/luau/reference/library.md b/.cursor/rules/luau/reference/library.md deleted file mode 100644 index 36d61af9..00000000 --- a/.cursor/rules/luau/reference/library.md +++ /dev/null @@ -1,1097 +0,0 @@ ---- -slug: library -title: Standard Library -description: The official reference for Luau's standard library. -sidebar: - order: 1 ---- - -Luau comes equipped with a standard library of functions designed to manipulate the built-in data types. Note that the library is relatively minimal and doesn't expose ways for -scripts to interact with the host environment - it's expected that embedding applications provide extra functionality on top of this and limit or sandbox the system access -appropriately, if necessary. For example, Roblox provides [a rich API to interact with the 3D environment and limited APIs to interact with external services](https://developer.roblox.com/en-us/api-reference). - -This page documents the available builtin libraries and functions. All of these are accessible by default by any script, assuming the host environment exposes them (which is usually a safe assumption outside of extremely constrained environments). - -## Global functions - -While most library functions are provided as part of a library like `table`, a few global functions are exposed without extra namespacing. - -``` -function assert(value: T, message: string?): T -``` - -`assert` checks if the value is truthy; if it's not (which means it's `false` or `nil`), it raises an error. The error message can be customized with an optional parameter. -Upon success the function returns the `value` argument. - -``` -function error(obj: any, level: number?) -``` - -`error` raises an error with the specified object. Note that errors don't have to be strings, although they often are by convention; various error handling mechanisms like `pcall` -preserve the error type. When `level` is specified, the error raised is turned into a string that contains call frame information for the caller at level `level`, where `1` refers -to the function that called `error`. This can be useful to attribute the errors to callers, for example `error("Expected a valid object", 2)` highlights the caller of the function -that called `error` instead of the function itself in the callstack. - -``` -function gcinfo(): number -``` - -`gcinfo` returns the total heap size in kilobytes, which includes bytecode objects, global tables as well as the script-allocated objects. Note that Luau uses an incremental -garbage collector, and as such at any given point in time the heap may contain both reachable and unreachable objects. The number returned by `gcinfo` reflects the current heap -consumption from the operating system perspective and can fluctuate over time as garbage collector frees objects. - -``` -function getfenv(target: (function | number)?): table -``` - -Returns the environment table for target function; when `target` is not a function, it must be a number corresponding to the caller stack index, where 1 means the function that calls `getfenv`, and the environment table is returned for the corresponding function from the call stack. When `target` is omitted it defaults to `1`, so `getfenv()` returns the environment table for the calling function. - -``` -function getmetatable(obj: any): table? -``` - -Returns the metatable for the specified object; when object is not a table or a userdata, the returned metatable is shared between all objects of the same type. Note that when metatable is protected (has a `__metatable` key), the value corresponding to that key is returned instead and may not be a table. - -``` -function next(t: { [K]: V }, i: K?): (K, V)? -``` - -Given the table `t`, returns the next key-value pair after `i` in the table traversal order, or nothing if `i` is the last key. When `i` is `nil`, returns the first key-value pair instead. - -``` -function newproxy(mt: boolean?): userdata -``` - -Creates a new untyped userdata object; when `mt` is true, the new object has an empty metatable that can be modified using `getmetatable`. - -``` -function print(args: ...any) -``` - -Prints all arguments to the standard output, using Tab as a separator. - -``` -function rawequal(a: any, b: any): boolean -``` - -Returns true iff `a` and `b` have the same type and point to the same object (for garbage collected types) or are equal (for value types). - -``` -function rawget(t: { [K]: V }, k: K): V? -``` - -Performs a table lookup with index `k` and returns the resulting value, if present in the table, or nil. This operation bypasses metatables/`__index`. - -``` -function rawlen(t: { [K]: V } | string): number -``` - -Returns the raw length of the table or string. If it is a string, this operation is identical to `#str` or `string.len(str)`. This operation bypasses metatables/`__len`. - -``` -function rawset(t: { [K] : V }, k: K, v: V) -``` - -Assigns table field `k` to the value `v`. This operation bypasses metatables/`__newindex`. - -``` -function select(i: string, args: ...T): number -function select(i: number, args: ...T): ...T -``` - -When called with `'#'` as the first argument, returns the number of remaining parameters passed. Otherwise, returns the subset of parameters starting with the specified index. -Index can be specified from the start of the arguments (using 1 as the first argument), or from the end (using -1 as the last argument). - -``` -function setfenv(target: function | number, env: table) -``` - -Changes the environment table for target function to `env`; when `target` is not a function, it must be a number corresponding to the caller stack index, where 1 means the function that calls `setfenv`, and the environment table is returned for the corresponding function from the call stack. - -``` -function setmetatable(t: table, mt: table?) -``` - -Changes metatable for the given table. Note that unlike `getmetatable`, this function only works on tables. If the table already has a protected metatable (has a `__metatable` field), this function errors. - -``` -function tonumber(s: string, base: number?): number? -``` - -Converts the input string to the number in base `base` (default 10) and returns the resulting number. If the conversion fails (that is, if the input string doesn't represent a valid number in the specified base), returns `nil` instead. - -``` -function tostring(obj: any): string -``` - -Converts the input object to string and returns the result. If the object has a metatable with `__tostring` field, that method is called to perform the conversion. - -``` -function type(obj: any): string -``` - -Returns the type of the object, which is one of `"nil"`, `"boolean"`, `"number"`, `"vector"`, `"string"`, `"table"`, `"function"`, `"userdata"`, `"thread"`, or `"buffer"`. - -``` -function typeof(obj: any): string -``` - -Returns the type of the object; for userdata objects that have a metatable with the `__type` field *and* are defined by the host (not `newproxy`), returns the value for that key. -For custom userdata objects, such as ones returned by `newproxy`, this function returns `"userdata"` to make sure host-defined types can not be spoofed. - -``` -function ipairs(t: table): -``` - -Returns the triple (generator, state, nil) that can be used to traverse the table using a `for` loop. The traversal results in key-value pairs for the numeric portion of the table; key starts from 1 and increases by 1 on each iteration. The traversal terminates when reaching the first `nil` value (so `ipairs` can't be used to traverse array-like tables with holes). - -``` -function pairs(t: table): -``` - -Returns the triple (generator, state, nil) that can be used to traverse the table using a `for` loop. The traversal results in key-value pairs for all keys in the table, numeric and otherwise, but doesn't have a defined order. - -``` -function pcall(f: function, args: ...any): (boolean, ...any) -``` - -Calls function `f` with parameters `args`. If the function succeeds, returns `true` followed by all return values of `f`. If the function raises an error, returns `false` followed by the error object. -Note that `f` can yield, which results in the entire coroutine yielding as well. - -``` -function xpcall(f: function, e: function, args: ...any): (boolean, ...any) -``` - -Calls function `f` with parameters `args`. If the function succeeds, returns `true` followed by all return values of `f`. If the function raises an error, calls `e` with the error object as an argument, and returns `false` followed by the first return value of `e`. -Note that `f` can yield, which results in the entire coroutine yielding as well. -`e` can neither yield nor error - if it does raise an error, `xpcall` returns with `false` followed by a special error message. - -``` -function unpack(a: {V}, f: number?, t: number?): ...V -``` - -Returns all values of `a` with indices in `[f..t]` range. `f` defaults to 1 and `t` defaults to `#a`. Note that this is equivalent to `table.unpack`. - -## math library - -``` -function math.abs(n: number): number -``` - -Returns the absolute value of `n`. Returns NaN if the input is NaN. - -``` -function math.acos(n: number): number -``` - -Returns the arc cosine of `n`, expressed in radians. Returns a value in `[0, pi]` range. Returns NaN if the input is not in `[-1, +1]` range. - -``` -function math.asin(n: number): number -``` - -Returns the arc sine of `n`, expressed in radians. Returns a value in `[-pi/2, +pi/2]` range. Returns NaN if the input is not in `[-1, +1]` range. - -``` -function math.atan2(y: number, x: number): number -``` - -Returns the arc tangent of `y/x`, expressed in radians. The function takes into account the sign of both arguments in order to determine the quadrant. Returns a value in `[-pi, pi]` range. - -``` -function math.atan(n: number): number -``` - -Returns the arc tangent of `n`, expressed in radians. Returns a value in `[-pi/2, pi-2]` range. - -``` -function math.ceil(n: number): number -``` - -Rounds `n` upwards to the next integer boundary. - -``` -function math.cosh(n: number): number -``` - -Returns the hyperbolic cosine of `n`. - -``` -function math.cos(n: number): number -``` - -Returns the cosine of `n`, which is an angle in radians. Returns a value in `[0, 1]` range. - -``` -function math.deg(n: number): number -``` - -Converts `n` from radians to degrees and returns the result. - -``` -function math.exp(n: number): number -``` - -Returns the base-e exponent of `n`, that is `e^n`. - -``` -function math.floor(n: number): number -``` - -Rounds `n` downwards to previous integer boundary. - -``` -function math.fmod(x: number, y: number): number -``` - -Returns the remainder of `x` modulo `y`, rounded towards zero. Returns NaN if `y` is zero. - -``` -function math.frexp(n: number): (number, number) -``` - -Splits the number into a significand (a number in `[-1, +1]` range) and binary exponent such that `n = s * 2^e`, and returns `s, e`. - -``` -function math.ldexp(s: number, e: number): number -``` - -Given the significand and a binary exponent, returns a number `s * 2^e`. - -``` -function math.lerp(a: number, b: number, t: number): number -``` - -Linearly interpolated between number value `a` and `b` using factor `t`, generally returning the result of `a + (b - a) * t`. -When `t` is exactly `1`, the value of `b` will be returned instead to ensure that when `t` is on the interval `[0, 1]`, the result of `lerp` will be on the interval `[a, b]`. - -``` -math.map(x: number, inmin: number, inmax: number, outmin: number, outmax: number): number -``` - -Returns a value that represents `x` mapped linearly from the input range (`inmin` to `inmax`) to the output range (`outmin` to `outmax`). - -``` -function math.log10(n: number): number -``` - -Returns base-10 logarithm of the input number. Returns NaN if the input is negative, and negative infinity if the input is 0. -Equivalent to `math.log(n, 10)`. - -``` -function math.log(n: number, base: number?): number -``` - -Returns logarithm of the input number in the specified base; base defaults to `e`. Returns NaN if the input is negative, and negative infinity if the input is 0. - -``` -function math.max(list: ...number): number -``` - -Returns the maximum number of the input arguments. The function requires at least one input and will error if zero parameters are passed. If one of the inputs is a NaN, the result may or may not be a NaN. - -``` -function math.min(list: ...number): number -``` - -Returns the minimum number of the input arguments. The function requires at least one input and will error if zero parameters are passed. If one of the inputs is a NaN, the result may or may not be a NaN. - -``` -function math.modf(n: number): (number, number) -``` - -Returns the integer and fractional part of the input number. Both the integer and fractional part have the same sign as the input number, e.g. `math.modf(-1.5)` returns `-1, -0.5`. - -``` -function math.pow(x: number, y: number): number -``` - -Returns `x` raised to the power of `y`. - -``` -function math.rad(n: number): number -``` - -Converts `n` from degrees to radians and returns the result. - -``` -function math.random(): number -function math.random(n: number): number -function math.random(min: number, max: number): number -``` - -Returns a random number using the global random number generator. A zero-argument version returns a number in `[0, 1]` range. A one-argument version returns a number in `[1, n]` range. A two-argument version returns a number in `[min, max]` range. The input arguments are truncated to integers, so `math.random(1.5)` always returns 1. - -``` -function math.randomseed(seed: number) -``` - -Reseeds the global random number generator; subsequent calls to `math.random` will generate a deterministic sequence of numbers that only depends on `seed`. - -``` -function math.sinh(n: number): number -``` - -Returns a hyperbolic sine of `n`. - -``` -function math.sin(n: number): number -``` - -Returns the sine of `n`, which is an angle in radians. Returns a value in `[0, 1]` range. - -``` -function math.sqrt(n: number): number -``` - -Returns the square root of `n`. Returns NaN if the input is negative. - -``` -function math.tanh(n: number): number -``` - -Returns the hyperbolic tangent of `n`. - -``` -function math.tan(n: number): number -``` - -Returns the tangent of `n`, which is an angle in radians. - -``` -function math.noise(x: number, y: number?, z: number?): number -``` - -Returns 3D Perlin noise value for the point `(x, y, z)` (`y` and `z` default to zero if absent). Returns a value in `[-1, 1]` range. - -``` -function math.clamp(n: number, min: number, max: number): number -``` - -Returns `n` if the number is in `[min, max]` range; otherwise, returns `min` when `n < min`, and `max` otherwise. If `n` is NaN, may or may not return NaN. -The function errors if `min > max`. - -``` -function math.sign(n: number): number -``` - -Returns `-1` if `n` is negative, `1` if `n` is positive, and `0` if `n` is zero or NaN. - -``` -function math.round(n: number): number -``` - -Rounds `n` to the nearest integer boundary. If `n` is exactly halfway between two integers, rounds `n` away from 0. - -## table library - -``` -function table.concat(a: {string}, sep: string?, f: number?, t: number?): string -``` - -Concatenate all elements of `a` with indices in range `[f..t]` together, using `sep` as a separator if present. `f` defaults to 1 and `t` defaults to `#a`. - -``` -function table.foreach(t: { [K]: V }, f: (K, V) -> R?): R? -``` - -Iterates over all elements of the table in unspecified order; for each key-value pair, calls `f` and returns the result of `f` if it's non-nil. If all invocations of `f` returned `nil`, returns no values. This function has been deprecated and is not recommended for use in new code; use `for` loop instead. - -``` -function table.foreachi(t: {V}, f: (number, V) -> R?): R? -``` - -Iterates over numeric keys of the table in `[1..#t]` range in order; for each key-value pair, calls `f` and returns the result of `f` if it's non-nil. If all invocations of `f` returned `nil`, returns no values. This function has been deprecated and is not recommended for use in new code; use `for` loop instead. - -``` -function table.getn(t: {V}): number -``` - -Returns the length of table `t`. This function has been deprecated and is not recommended for use in new code; use `#t` instead. - -``` -function table.maxn(t: {V}): number -``` - -Returns the maximum numeric key of table `t`, or zero if the table doesn't have numeric keys. - -``` -function table.insert(t: {V}, v: V) -function table.insert(t: {V}, i: number, v: V) -``` - -When using a two-argument version, appends the value to the array portion of the table (equivalent to `t[#t+1] = v`). -When using a three-argument version, inserts the value at index `i` and shifts values at indices after that by 1. `i` should be in `[1..#t]` range. - -``` -function table.remove(t: {V}, i: number?): V? -``` - -Removes element `i` from the table and shifts values at indices after that by 1. If `i` is not specified, removes the last element of the table. -`i` should be in `[1..#t]` range. -Returns the value of the removed element, or `nil` if no element was removed (e.g. table was empty). - -``` -function table.sort(t: {V}, f: ((V, V) -> boolean)?) -``` - -Sorts the table `t` in ascending order, using `f` as a comparison predicate: `f` should return `true` iff the first parameter should be before the second parameter in the resulting table. When `f` is not specified, builtin less-than comparison is used instead. -The comparison predicate must establish a strict weak ordering - sort results are undefined otherwise. - -``` -function table.pack(args: ...V): { [number]: V, n: number } -``` - -Returns a table that consists of all input arguments as array elements, and `n` field that is set to the number of inputs. - -``` -function table.unpack(a: {V}, f: number?, t: number?): ...V -``` - -Returns all values of `a` with indices in `[f..t]` range. `f` defaults to 1 and `t` defaults to `#a`. -Note that if you want to unpack varargs packed with `table.pack` you have to specify the index fields because `table.unpack` doesn't automatically use the `n` field that `table.pack` creates. Example usage for packed varargs: `table.unpack(args, 1, args.n)` - -``` -function table.move(a: {V}, f: number, t: number, d: number, tt: {V}?) -``` - -Copies elements in range `[f..t]` from table `a` to table `tt` if specified and `a` otherwise, starting from the index `d`. - -``` -function table.create(n: number, v: V?): {V} -``` - -Creates a table with `n` elements; all of them (range `[1..n]`) are set to `v`. When `v` is nil or omitted, the returned table is empty but has preallocated space for `n` elements which can make subsequent insertions faster. -Note that preallocation is only performed for the array portion of the table - using `table.create` on dictionaries is counter-productive. - -``` -function table.find(t: {V}, v: V, init: number?): number? -``` - -Find the first element in the table that is equal to `v` and returns its index; the traversal stops at the first `nil`. If the element is not found, `nil` is returned instead. The traversal starts at index `init` if specified, otherwise 1. - -``` -function table.clear(t: table) -``` - -Removes all elements from the table while preserving the table capacity, so future assignments don't need to reallocate space. - -``` -function table.freeze(t: table): table -``` - -Given a non-frozen table, freezes it such that all subsequent attempts to modify the table or assign its metatable raise an error. If the input table is already frozen or has a protected metatable, the function raises an error; otherwise it returns the input table. -Note that the table is frozen in-place and is not being copied. Additionally, only `t` is frozen, and keys/values/metatable of `t` don't change their state and need to be frozen separately if desired. - -``` -function table.isfrozen(t: table): boolean -``` - -Returns `true` iff the input table is frozen. - -``` -function table.clone(t: table): table -``` - -Returns a copy of the input table that has the same metatable, same keys and values, and is not frozen even if `t` was. -The copy is shallow: implementing a deep recursive copy automatically is challenging, and often only certain keys need to be cloned recursively which can be done after the initial clone by modifying the resulting table. - -## string library - -``` -function string.byte(s: string, f: number?, t: number?): ...number -``` - -Returns the numeric code of every byte in the input string with indices in range `[f..t]`. `f` defaults to 1 and `t` defaults to `f`, so a two-argument version of this function returns a single number. If the function is called with a single argument and the argument is out of range, the function returns no values. - -``` -function string.char(args: ...number): string -``` - -Returns the string that contains a byte for every input number; all inputs must be integers in `[0..255]` range. - -``` -function string.find(s: string, p: string, init: number?, plain: boolean?): (number?, number?, ...string) -``` - -Tries to find an instance of pattern `p` in the string `s`, starting from position `init` (defaults to 1). When `plain` is true, the search is using raw (case-sensitive) string equality, otherwise `p` should be a [string pattern](https://www.lua.org/manual/5.3/manual.html#6.4.1). If a match is found, returns the position of the match and the length of the match, followed by the pattern captures; otherwise returns `nil`. - -``` -function string.format(s: string, args: ...any): string -``` - -Returns a formatted version of the input arguments using a [printf-style format string](https://en.cppreference.com/w/c/io/fprintf) `s`. The following format characters are supported: - -- `c`: expects an integer number and produces a character with the corresponding character code -- `d`, `i`, `u`: expects an integer number and produces the decimal representation of that number -- `o`: expects an integer number and produces the octal representation of that number -- `x`, `X`: expects an integer number and produces the hexadecimal representation of that number, using lower case or upper case hexadecimal characters -- `e`, `E`, `f`, `g`, `G`: expects a number and produces the floating point representation of that number, using scientific or decimal representation -- `q`: expects a string and produces the same string quoted using double quotation marks, with escaped special characters if necessary -- `s`: expects a string and produces the same string verbatim - -The formats support modifiers `-`, `+`, space, `#` and `0`, as well as field width and precision modifiers - with the exception of `*`. - -``` -function string.gmatch(s: string, p: string): -``` - -Produces an iterator function that, when called repeatedly explicitly or via `for` loop, produces matches of string `s` with [string pattern](https://www.lua.org/manual/5.3/manual.html#6.4.1) `p`. For every match, the captures within the pattern are returned if present (if a pattern has no captures, the entire matching substring is returned instead). - -``` -function string.gsub(s: string, p: string, f: function | table | string, maxs: number?): (string, number) -``` - -For every match of [string pattern](https://www.lua.org/manual/5.3/manual.html#6.4.1) `p` in `s`, replace the match according to `f`. The substitutions stop after the limit of `maxs`, and the function returns the resulting string followed by the number of substitutions. - -When `f` is a string, the substitution uses the string as a replacement. When `f` is a table, the substitution uses the table element with key corresponding to the first pattern capture, if present, and entire match otherwise. Finally, when `f` is a function, the substitution uses the result of calling `f` with call pattern captures, or entire matching substring if no captures are present. - -``` -function string.len(s: string): number -``` - -Returns the number of bytes in the string (equivalent to `#s`). - -``` -function string.lower(s: string): string -``` - -Returns a string where each byte corresponds to the lower-case ASCII version of the input byte in the source string. - -``` -function string.match(s: string, p: string, init: number?): ...string? -``` - -Tries to find an instance of pattern `p` in the string `s`, starting from position `init` (defaults to 1). `p` should be a [string pattern](https://www.lua.org/manual/5.3/manual.html#6.4.1). If a match is found, returns all pattern captures, or entire matching substring if no captures are present, otherwise returns `nil`. - -``` -function string.rep(s: string, n: number): string -``` - -Returns the input string `s` repeated `n` times. Returns an empty string if `n` is zero or negative. - -``` -function string.reverse(s: string): string -``` - -Returns the string with the order of bytes reversed compared to the original. Note that this only works if the input is a binary or ASCII string. - -``` -function string.sub(s: string, f: number, t: number?): string -``` - -Returns a substring of the input string with the byte range `[f..t]`; `t` defaults to `#s`, so a two-argument version returns a string suffix. - -``` -function string.upper(s: string): string -``` - -Returns a string where each byte corresponds to the upper-case ASCII version of the input byte in the source string. - -``` -function string.split(s: string, sep: string?): {string} -``` - -Splits the input string using `sep` as a separator (defaults to `","`) and returns the resulting substrings. If separator is empty, the input string is split into separate one-byte strings. - -``` -function string.pack(f: string, args: ...any): string -``` - -Given a [pack format string](https://www.lua.org/manual/5.3/manual.html#6.4.2), encodes all input parameters according to the packing format and returns the resulting string. Note that Luau uses fixed sizes for all types that have platform-dependent size in Lua 5.x: short is 16 bit, long is 64 bit, integer is 32-bit and size_t is 32 bit for the purpose of string packing. - -``` -function string.packsize(f: string): number -``` - -Given a [pack format string](https://www.lua.org/manual/5.3/manual.html#6.4.2), returns the size of the resulting packed representation. The pack format can't use variable-length format specifiers. Note that Luau uses fixed sizes for all types that have platform-dependent size in Lua 5.x: short is 16 bit, long is 64 bit, integer is 32-bit and size_t is 32 bit for the purpose of string packing. - -``` -function string.unpack(f: string, s: string): ...any -``` - -Given a [pack format string](https://www.lua.org/manual/5.3/manual.html#6.4.2), decodes the input string according to the packing format and returns all resulting values. Note that Luau uses fixed sizes for all types that have platform-dependent size in Lua 5.x: short is 16 bit, long is 64 bit, integer is 32-bit and size_t is 32 bit for the purpose of string packing. - -## coroutine library - -``` -function coroutine.create(f: function): thread -``` - -Returns a new coroutine that, when resumed, will run function `f`. - -``` -function coroutine.running(): thread? -``` - -Returns the currently running coroutine, or `nil` if the code is running in the main coroutine (depending on the host environment setup, main coroutine may never be used for running code). - -``` -function coroutine.status(co: thread): string -``` - -Returns the status of the coroutine, which can be `"running"`, `"suspended"`, `"normal"` or `"dead"`. Dead coroutines have finished their execution and can not be resumed, but their state can still be inspected as they are not dead from the garbage collector point of view. - -``` -function coroutine.wrap(f: function): function -``` - -Creates a new coroutine and returns a function that, when called, resumes the coroutine and passes all arguments along to the suspension point. When the coroutine yields or finishes, the wrapped function returns with all values returned at the suspension point. - -``` -function coroutine.yield(args: ...any): ...any -``` - -Yields the currently running coroutine and passes all arguments along to the code that resumed the coroutine. The coroutine becomes suspended; when the coroutine is resumed again, the resumption arguments will be forwarded to `yield` which will behave as if it returned all of them. - -``` -function coroutine.isyieldable(): boolean -``` - -Returns `true` iff the currently running coroutine can yield. Yielding is prohibited when running inside metamethods like `__index` or C functions like `table.foreach` callback, with the exception of `pcall`/`xpcall`. - -``` -function coroutine.resume(co: thread, args: ...any): (boolean, ...any) -``` - -Resumes the coroutine and passes the arguments along to the suspension point. When the coroutine yields or finishes, returns `true` and all values returned at the suspension point. If an error is raised during coroutine resumption, this function returns `false` and the error object, similarly to `pcall`. - -``` -function coroutine.close(co: thread): (boolean, any?) -``` - -Closes the coroutine which puts coroutine in the dead state. The coroutine must be dead or suspended - in particular it can't be currently running. If the coroutine that's being closed was in an error state, returns `false` along with an error object; otherwise returns `true`. After closing, the coroutine can't be resumed and the coroutine stack becomes empty. - -## bit32 library - -All functions in the `bit32` library treat input numbers as 32-bit unsigned integers in `[0..4294967295]` range. The bit positions start at 0 where 0 corresponds to the least significant bit. - -``` -function bit32.arshift(n: number, i: number): number -``` - -Shifts `n` by `i` bits to the right (if `i` is negative, a left shift is performed instead). The most significant bit of `n` is propagated during the shift. When `i` is larger than 31, returns an integer with all bits set to the sign bit of `n`. When `i` is smaller than `-31`, 0 is returned. - -``` -function bit32.band(args: ...number): number -``` - -Performs a bitwise `and` of all input numbers and returns the result. If the function is called with no arguments, an integer with all bits set to 1 is returned. - -``` -function bit32.bnot(n: number): number -``` - -Returns a bitwise negation of the input number. - -``` -function bit32.bor(args: ...number): number -``` - -Performs a bitwise `or` of all input numbers and returns the result. If the function is called with no arguments, zero is returned. - -``` -function bit32.bxor(args: ...number): number -``` - -Performs a bitwise `xor` (exclusive or) of all input numbers and returns the result. If the function is called with no arguments, zero is returned. - -``` -function bit32.btest(args: ...number): boolean -``` - -Perform a bitwise `and` of all input numbers, and return `true` iff the result is not 0. If the function is called with no arguments, `true` is returned. - -``` -function bit32.extract(n: number, f: number, w: number?): number -``` - -Extracts bits of `n` at position `f` with a width of `w`, and returns the resulting integer. `w` defaults to `1`, so a two-argument version of `extract` returns the bit value at position `f`. Bits are indexed starting at 0. Errors if `f` and `f+w-1` are not between 0 and 31. - -``` -function bit32.lrotate(n: number, i: number): number -``` - -Rotates `n` to the left by `i` bits (if `i` is negative, a right rotate is performed instead); the bits that are shifted past the bit width are shifted back from the right. - -``` -function bit32.lshift(n: number, i: number): number -``` - -Shifts `n` to the left by `i` bits (if `i` is negative, a right shift is performed instead). When `i` is outside of `[-31..31]` range, returns 0. - -``` -function bit32.replace(n: number, r: number, f: number, w: number?): number -``` - -Replaces bits of `n` at position `f` and width `w` with `r`, and returns the resulting integer. `w` defaults to `1`, so a three-argument version of `replace` changes one bit at position `f` to `r` (which should be 0 or 1) and returns the result. Bits are indexed starting at 0. Errors if `f` and `f+w-1` are not between 0 and 31. - -``` -function bit32.rrotate(n: number, i: number): number -``` - -Rotates `n` to the right by `i` bits (if `i` is negative, a left rotate is performed instead); the bits that are shifted past the bit width are shifted back from the left. - -``` -function bit32.rshift(n: number, i: number): number -``` - -Shifts `n` to the right by `i` bits (if `i` is negative, a left shift is performed instead). When `i` is outside of `[-31..31]` range, returns 0. - -``` -function bit32.countlz(n: number): number -``` - -Returns the number of consecutive zero bits in the 32-bit representation of `n` starting from the left-most (most significant) bit. Returns 32 if `n` is zero. - -``` -function bit32.countrz(n: number): number -``` - -Returns the number of consecutive zero bits in the 32-bit representation of `n` starting from the right-most (least significant) bit. Returns 32 if `n` is zero. - -``` -function bit32.byteswap(n: number): number -``` - -Returns `n` with the order of the bytes swapped. - -## utf8 library - -Strings in Luau can contain arbitrary bytes; however, in many applications strings representing text contain UTF8 encoded data by convention, that can be inspected and manipulated using `utf8` library. - -``` -function utf8.offset(s: string, n: number, i: number?): number? -``` - -Returns the byte offset of the Unicode codepoint number `n` in the string, starting from the byte position `i`. When the character is not found, returns `nil` instead. - -``` -function utf8.codepoint(s: string, i: number?, j: number?): ...number -``` - -Returns a number for each Unicode codepoint in the string with the starting byte offset in `[i..j]` range. `i` defaults to 1 and `j` defaults to `i`, so a two-argument version of this function returns the Unicode codepoint that starts at byte offset `i`. - -``` -function utf8.char(args: ...number): string -``` - -Creates a string by concatenating Unicode codepoints for each input number. - -``` -function utf8.len(s: string, i: number?, j: number?): number? -``` - -Returns the number of Unicode codepoints with the starting byte offset in `[i..j]` range, or `nil` followed by the first invalid byte position if the input string is malformed. -`i` defaults to 1 and `j` defaults to `#s`, so `utf8.len(s)` returns the number of Unicode codepoints in string `s` or `nil` if the string is malformed. - -``` -function utf8.codes(s: string): -``` - -Returns an iterator that, when used in `for` loop, produces the byte offset and the codepoint for each Unicode codepoints that `s` consists of. - -## os library - -``` -function os.clock(): number -``` - -Returns a high-precision timestamp (in seconds) that doesn't have a defined baseline, but can be used to measure duration with sub-microsecond precision. - -``` -function os.date(s: string?, t: number?): table | string -``` - -Returns the table or string representation of the time specified as `t` (defaults to current time) according to `s` format string. - -When `s` starts with `!`, the result uses UTC, otherwise it uses the current timezone. - -If `s` is equal to `*t` (or `!*t`), a table representation of the date is returned, with keys `sec`/`min`/`hour` for the time (using 24-hour clock), `day`/`month`/`year` for the date, `wday` for week day (1..7), `yday` for year day (1..366) and `isdst` indicating whether the timezone is currently using daylight savings. - -Otherwise, `s` is interpreted as a [date format string](https://www.cplusplus.com/reference/ctime/strftime/), with the valid specifiers including any of `aAbBcdHIjmMpSUwWxXyYzZ` or `%`. `s` defaults to `"%c"` so `os.date()` returns the human-readable representation of the current date in local timezone. - -``` -function os.difftime(a: number, b: number): number -``` - -Calculates the difference in seconds between `a` and `b`; provided for compatibility only. Please use `a - b` instead. - -``` -function os.time(t: table?): number -``` - -When called without arguments, returns the current date/time as a Unix timestamp. When called with an argument, expects it to be a table that contains `sec`/`min`/`hour`/`day`/`month`/`year` keys and returns the Unix timestamp of the specified date/time in UTC. - -## debug library - -``` -function debug.info(co: thread, level: number, s: string): ...any -function debug.info(level: number, s: string): ...any -function debug.info(f: function, s: string): ...any -``` - -Given a stack frame or a function, and a string that specifies the requested information, returns the information about the stack frame or function. - -Each character of `s` results in additional values being returned in the same order as the characters appear in the string: - -- `s` returns source path for the function -- `l` returns the line number for the stack frame or the line where the function is defined when inspecting a function object -- `n` returns the name of the function, or an empty string if the name is not known -- `f` returns the function object itself -- `a` returns the number of arguments that the function expects followed by a boolean indicating whether the function is variadic or not - -For example, `debug.info(2, "sln")` returns source file, current line and function name for the caller of the current function. - -``` -function debug.traceback(co: thread, msg: string?, level: number?): string -function debug.traceback(msg: string?, level: number?): string -``` - -Produces a stringified callstack of the given thread, or the current thread, starting with level `level`. If `msg` is specified, then the resulting callstack includes the string before the callstack output, separated with a newline. The format of the callstack is human-readable and subject to change. - -## buffer library - -Buffer is an object that represents a fixed-size mutable block of memory. - -All operations on a buffer are provided using the 'buffer' library functions. - -Many of the functions accept an offset in bytes from the start of the buffer. -Offset of 0 from the start of the buffer memory block accesses the first byte. - -All offsets, counts and sizes should be non-negative integer numbers. - -If the bytes that are accessed by any read or write operation are outside the buffer memory, an error is thrown. - -``` -function buffer.create(size: number): buffer -``` - -Creates a buffer of the requested size with all bytes initialized to 0. - -Size limit is 1GB or 1,073,741,824 bytes. - -``` -function buffer.fromstring(str: string): buffer -``` - -Creates a buffer initialized to the contents of the string. - -The size of the buffer equals to the length of the string. - - -``` -function buffer.tostring(b: buffer): string -``` - -Returns the buffer data as a string. - -``` -function buffer.len(b: buffer): number -``` - -Returns the size of the buffer in bytes. - -``` -function buffer.readi8(b: buffer, offset: number): number -function buffer.readu8(b: buffer, offset: number): number -function buffer.readi16(b: buffer, offset: number): number -function buffer.readu16(b: buffer, offset: number): number -function buffer.readi32(b: buffer, offset: number): number -function buffer.readu32(b: buffer, offset: number): number -function buffer.readf32(b: buffer, offset: number): number -function buffer.readf64(b: buffer, offset: number): number -``` - -Used to read the data from the buffer by reinterpreting bytes at the offset as the type in the argument and converting it into a number. - -Available types: - -Function | Type | Range | ----------|------|-------| -readi8 | signed 8-bit integer | [-128, 127] -readu8 | unsigned 8-bit integer | [0, 255] -readi16 | signed 16-bit integer | [-32,768, 32,767] -readu16 | unsigned 16-bit integer | [0, 65,535] -readi32 | signed 32-bit integer | [-2,147,483,648, 2,147,483,647] -readu32 | unsigned 32-bit integer | [0, 4,294,967,295] -readf32 | 32-bit floating-point number | Single-precision IEEE 754 number -readf64 | 64-bit floating-point number | Double-precision IEEE 754 number - -Floating-point numbers are read and written using a format specified by IEEE 754. - -If a floating-point value matches any of bit patterns that represent a NaN (not a number), returned value might be converted to a different quiet NaN representation. - -Read and write operations use the little endian byte order. - -Integer numbers are read and written using two's complement representation. - -``` -function buffer.writei8(b: buffer, offset: number, value: number): () -function buffer.writeu8(b: buffer, offset: number, value: number): () -function buffer.writei16(b: buffer, offset: number, value: number): () -function buffer.writeu16(b: buffer, offset: number, value: number): () -function buffer.writei32(b: buffer, offset: number, value: number): () -function buffer.writeu32(b: buffer, offset: number, value: number): () -function buffer.writef32(b: buffer, offset: number, value: number): () -function buffer.writef64(b: buffer, offset: number, value: number): () -``` - -Used to write data to the buffer by converting the number into the type in the argument and reinterpreting it as individual bytes. - -Ranges of acceptable values can be seen in the table above. - -When writing integers, the number is converted using `bit32` library rules. - -Values that are out-of-range will take less significant bits of the full number. -For example, writing 43,981 (0xabcd) using writei8 function will take 0xcd and interpret it as an 8-bit signed number -51. -It is still recommended to keep all numbers in range of the target type. - -Results of converting special number values (inf/nan) to integers are platform-specific. - -``` -function buffer.readstring(b: buffer, offset: number, count: number): string -``` - -Used to read a string of length 'count' from the buffer at specified offset. - -``` -function buffer.writestring(b: buffer, offset: number, value: string, count: number?): () -``` - -Used to write data from a string into the buffer at a specified offset. - -If an optional 'count' is specified, only 'count' bytes are taken from the string. - -Count cannot be larger than the string length. - -``` -buffer.readbits(b: buffer, bitOffset: number, bitCount: number): number -``` - -Used to read a range of `bitCount` bits from the buffer, at specified offset `bitOffset`, into an unsigned integer. - -`bitCount` must be in `[0, 32]` range. - -``` -buffer.writebits(b: buffer, bitOffset: number, bitCount: number, value: number): () -``` - -Used to write `bitCount` bits from `value` into the buffer at specified offset `bitOffset`. - -`bitCount` must be in `[0, 32]` range. - -``` -function buffer.copy(target: buffer, targetOffset: number, source: buffer, sourceOffset: number?, count: number?): () -``` - -Copy 'count' bytes from 'source' starting at offset 'sourceOffset' into the 'target' at 'targetOffset'. - -It is possible for 'source' and 'target' to be the same. Copying an overlapping region inside the same buffer acts as if the source region is copied into a temporary buffer and then that buffer is copied over to the target. - -If 'sourceOffset' is nil or is omitted, it defaults to 0. - -If 'count' is 'nil' or is omitted, the whole 'source' data starting from 'sourceOffset' is copied. - -``` -function buffer.fill(b: buffer, offset: number, value: number, count: number?): () -``` - -Sets the 'count' bytes in the buffer starting at the specified 'offset' to the 'value'. - -If 'count' is 'nil' or is omitted, all bytes from the specified offset until the end of the buffer are set. - -## vector library - -This library implements functionality for the vector type in addition to the built-in primitive operator support. -Default configuration uses vectors with 3 components (`x`, `y`, and `z`). -If the _4-wide mode_ is enabled by setting the `LUA_VECTOR_SIZE` VM configuration to 4, vectors get an additional `w` component. - -Individual vector components can be accessed using the fields `x` or `X`, `y` or `Y`, `z` or `Z`, and `w` or `W` in 4-wide mode. -Since vector values are immutable, writes to individual components are not supported. - -``` -vector.zero -vector.one -``` - -Constant vectors with all components set to 0 and 1 respectively. Includes the fourth component in _4-wide mode_. - -``` -vector.create(x: number, y: number, z: number): vector -vector.create(x: number, y: number, z: number, w: number): vector -``` - -Creates a new vector with the given component values. The first constructor sets the fourth (`w`) component to 0.0 in _4-wide mode_. - -``` -vector.magnitude(vec: vector): number -``` - -Calculates the magnitude of a given vector. Includes the fourth component in _4-wide mode_. - -``` -vector.normalize(vec: vector): vector -``` - -Computes the normalized version (unit vector) of a given vector. Includes the fourth component in _4-wide mode_. - -``` -vector.cross(vec1: vector, vec2: vector): vector -``` - -Computes the cross product of two vectors. Ignores the fourth component in _4-wide mode_ and returns the 3-dimensional cross product. - -``` -vector.dot(vec1: vector, vec2: vector): number -``` - -Computes the dot product of two vectors. Includes the fourth component in _4-wide mode_. - -``` -vector.angle(vec1: vector, vec2: vector, axis: vector?): number -``` - -Computes the angle between two vectors in radians. The axis, if specified, is used to determine the sign of the angle. Ignores the fourth component in _4-wide mode_ and returns the 3-dimensional angle. - -``` -vector.floor(vec: vector): vector -``` - -Applies `math.floor` to every component of the input vector. Includes the fourth component in _4-wide mode_. - -``` -vector.ceil(vec: vector): vector -``` - -Applies `math.ceil` to every component of the input vector. Includes the fourth component in _4-wide mode_. - -``` -vector.abs(vec: vector): vector -``` - -Applies `math.abs` to every component of the input vector. Includes the fourth component in _4-wide mode_. - -``` -vector.sign(vec: vector): vector -``` - -Applies `math.sign` to every component of the input vector. Includes the fourth component in _4-wide mode_. - -``` -vector.clamp(vec: vector, min: vector, max: vector): vector -``` - -Applies `math.clamp` to every component of the input vector. Includes the fourth component in _4-wide mode_. - -``` -vector.max(...: vector): vector -``` - -Applies `math.max` to the corresponding components of the input vectors. Includes the fourth component in _4-wide mode_. Equivalent to `vector.create(math.max((...).x), math.max((...).y), math.max((...).z), math.max((...).w))`. - -``` -vector.min(...: vector): vector -``` - -Applies `math.min` to the corresponding components of the input vectors. Includes the fourth component in _4-wide mode_. Equivalent to `vector.create(math.min((...).x), math.min((...).y), math.min((...).z), math.min((...).w))`. diff --git a/.cursor/rules/luau/reference/types-library.md b/.cursor/rules/luau/reference/types-library.md deleted file mode 100644 index b3dcacd8..00000000 --- a/.cursor/rules/luau/reference/types-library.md +++ /dev/null @@ -1,368 +0,0 @@ ---- -slug: types-library -title: Type Function Library -sidebar: - order: 2 ---- - -The `types` library is used to create and transform types, and can only be used within [type functions](../types/type-functions). - -### `types` library properties - -``` -types.any -``` - -The [any](../types/basic-types#any-type) `type`. - -``` -types.unknown -``` - -The [unknown](../types/basic-types#unknown-type) `type`. - -``` -types.never -``` - -The [never](../types/basic-types#never-type) `type`. - -``` -types.boolean -``` - -The boolean `type`. - -``` -types.buffer -``` - -The [buffer](../library#buffer-library) `type`. - -``` -types.number -``` - -The number `type`. - -``` -types.string -``` - -The string `type`. - -``` -types.thread -``` - -The thread `type`. - -## `types` library functions - -``` -types.singleton(arg: string | boolean | nil): type -``` - -Returns the [singleton](../types/basic-types#singleton-types-aka-literal-types) type of the argument. - -``` -types.negationof(arg: type): type -``` - -Returns an immutable negation of the argument type. - -``` -types.optional(arg: type): type -``` - -Returns a version of the given type that is now optional. - -- If the given type is a [union type](../types/unions-and-intersections#union-types), `nil` will be added unconditionally as a component. -- Otherwise, the result will be a union of the given type and the `nil` type. - -``` -types.unionof(first: type, second: type, ...: type): type -``` - -Returns an immutable [union](../types/unions-and-intersections#union-types) of two or more arguments. - -``` -types.intersectionof(first: type, second: type, ...: type): type -``` - -Returns an immutable [intersection](../types/unions-and-intersections#intersection-types) of two or more arguments. - -``` -types.newtable(props: { [type]: type | { read: type?, write: type? } }?, indexer: { index: type, readresult: type, writeresult: type? }?, metatable: type?): type -``` - -Returns a fresh, mutable table `type`. Property keys must be string singleton `type`s. The table's metatable is set if one is provided. - -``` -types.newfunction(parameters: { head: {type}?, tail: type? }, returns: { head: {type}?, tail: type? }?, generics: {type}?): type -``` - -Returns a fresh, mutable function `type`, using the ordered parameters of `head` and the variadic tail of `tail`. - -``` -types.copy(arg: type): type -``` - -Returns a deep copy of the argument type. - -``` -types.generic(name: string?, ispack: boolean?): type -``` - -Creates a [generic](../types/generics#generic-functions) named `name`. If `ispack` is `true`, the result is a [generic pack](../types/basic-types#type-packs). - -### `type` instance - -`type` instances can have extra properties and methods described in subsections depending on its tag. - -``` -type.tag: "nil" | "unknown" | "never" | "any" | "boolean" | "number" | "string" | "singleton" | "negation" | "union" | "intersection" | "table" | "function" | "class" | "thread" | "buffer" -``` - -An immutable property holding the type's tag. - -``` -__eq(arg: type): boolean -``` - -Overrides the `==` operator to return `true` if `self` is syntactically equal to `arg`. This excludes semantically equivalent types, `true | false` is unequal to `boolean`. - -``` -type:is(arg: "nil" | "unknown" | "never" | "any" | "boolean" | "number" | "string" | "singleton" | "negation" | "union" | "intersection" | "table" | "function" | "class" | "thread" | "buffer") -``` - -Returns `true` if `self` has the argument as its tag. - -### Singleton `type` instance - -``` -singletontype:value(): boolean | nil | "string" -``` - -Returns the singleton's actual value, like `true` for `types.singleton(true)`. - -### Generic `type` instance - -``` -generictype:name(): string? -``` - -Returns the name of the [generic](../types/generics#generic-functions) or `nil` if it has no name. - -``` -generictype:ispack(): boolean -``` - -Returns `true` if the [generic](../types/generics#generic-functions) is a [pack](../types/basic-types#type-packs), or `false` otherwise. - -### Table `type` instance - -``` -tabletype:setproperty(key: type, value: type?) -``` - -Sets the type of the property for the given `key`, using the same type for both reading from and writing to the table. - -- `key` is expected to be a string singleton type, naming the property. -- `value` will be set as both the `read type` and `write type` of the property. -- If `value` is `nil`, the property is removed. - -``` -tabletype:setreadproperty(key: type, value: type?) -``` - -Sets the type for reading from the property named by `key`, leaving the type for writing this property as-is. - -- `key` is expected to be a string singleton type, naming the property. -- `value` will be set as the `read type`, the `write type` will be unchanged. -- If `key` is not already present, only a `read type` will be set, making the property read-only. -- If `value` is `nil`, the property is removed. - -``` -tabletype:setwriteproperty(key: type, value: type?) -``` - - -Sets the type for writing to the property named by `key`, leaving the type for reading this property as-is. - -- `key` is expected to be a string singleton type, naming the property. -- `value` will be set as the `write type`, the `read type` will be unchanged. -- If `key` is not already present, only a `write type` will be set, making the property write-only. -- If `value` is `nil`, the property is removed. - -``` -tabletype:readproperty(key: type): type? -``` - -Returns the type used for reading values from this property, or `nil` if the property doesn't exist. - -``` -tabletype:writeproperty(key: type): type? -``` - -Returns the type used for writing values to this property, or `nil` if the property doesn't exist. - -``` -tabletype:properties(): { [type]: { read: type?, write: type? } } -``` - -Returns a table mapping property keys to their read and write types. - -``` -tabletype:setindexer(index: type, result: type) -``` - -Sets the table's indexer, using the same type for reads and writes. - -``` -tabletype:setreadindexer(index: type, result: type) -``` - -Sets the type resulting from reading from this table via indexing. - -``` -tabletype:setwriteindexer(index: type, result: type) -``` - -Sets the type for writing to this table via indexing. - -``` -tabletype:indexer(): { index: type, readresult: type, writeresult: type } -``` - -Returns the table's indexer as a table, or `nil` if it doesn't exist. - -``` -tabletype:readindexer(): { index: type, result: type }? -``` - -Returns the table's indexer using the result's read type, or `nil` if it doesn't exist. - -``` -tabletype:writeindexer() -``` - -Returns the table's indexer using the result's write type, or `nil` if it doesn't exist. - -``` -tabletype:setmetatable(arg: type) -``` - -Sets the table's metatable. - -``` -tabletype:metatable(): type? -``` - -Gets the table's metatable, or `nil` if it doesn't exist. - -### Function `type` instance - -``` -functiontype:setparameters(head: {type}?, tail: type?) -``` - -Sets the function's parameters, with the ordered parameters in `head` and the variadic tail in `tail`. - -``` -functiontype:parameters(): { head: {type}?, tail: type? } -``` - -Returns the function's parameters, with the ordered parameters in `head` and the variadic tail in `tail`. - -``` -functiontype:setreturns(head: {type}?, tail: type?) -``` - -Sets the function's return types, with the ordered parameters in `head` and the variadic tail in `tail`. - -``` -functiontype:returns(): { head: {type}?, tail: type? } -``` - -Returns the function's return types, with the ordered parameters in `head` and the variadic tail in `tail`. - -``` -functiontype:generics(): {type} -``` - -Returns an array of the function's [generic](../types/generics#generic-functions) `type`s. - -``` -functiontype:setgenerics(generics: {type}?) -``` - -Sets the function's [generic](../types/generics#generic-functions) `type`s. - -### Negation `type` instance - -``` -type:inner(): type -``` - -Returns the `type` being negated. - -### Union `type` instance - -``` -uniontype:components(): {type} -``` - -Returns an array of the [unioned](../types/unions-and-intersections#union-types) types. - -### Intersection `type` instance - -``` -intersectiontype:components() -``` - -Returns an array of the [intersected](../types/unions-and-intersections#intersection-types) types. - -### Class `type` instance - -``` -classtype:properties(): { [type]: { read: type?, write: type? } } -``` - -Returns the properties of the class with their respective `read` and `write` types. - -``` -classtype:readparent(): type? -``` - -Returns the type of reading this class' parent, or returns `nil` if the parent class doesn't exist. - -``` -classtype:writeparent(): type? -``` - -Returns the type for writing to this class' parent, or returns `nil` if the parent class doesn't exist. - -``` -classtype:metatable(): type? -``` - -Returns the class' metatable, or `nil` if it doesn't exist. - -``` -classtype:indexer(): { index: type, readresult: type, writeresult: type }? -``` - -Returns the class' indexer, or `nil` if it doesn't exist. - -``` -classtype:readindexer(): { index: type, result: type }? -``` - -Returns result type of reading from the class via indexing, or `nil` if it doesn't exist. - -``` -classtype:writeindexer(): { index: type, result: type }? -``` - -Returns the type for writing to the class via indexing, or `nil` if it doesn't exist. diff --git a/.cursor/rules/luau/types/basic-types.md b/.cursor/rules/luau/types/basic-types.md deleted file mode 100644 index 2e65c804..00000000 --- a/.cursor/rules/luau/types/basic-types.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -slug: types/basic-types -title: Primitives and Simple Types -sidebar: - order: 2 ---- - -## Builtin types - -The Luau VM supports 10 primitive types: - -1. `nil` -2. `string` -3. `number` -4. `boolean` -5. `table` -6. `function` -7. `thread` -8. `userdata` -9. `vector` -10. `buffer` - -Most of these can be specified by their name and written directly in type annotations: - -```luau -local message: string = "Hello" -local count: number = 42 -local isReady: boolean = true -local co: thread = coroutine.running() -``` - -Some types have special syntax: -* `table` and `function` are not represented by name, but have their dedicated syntax as covered in this [syntax document](../../syntax) -* `userdata` is represented by [concrete types](../roblox-types), and -* `vector` is not representable by name at all - -The type checker also provides the builtin types [`unknown`](#unknown-type), [`never`](#never-type), and [`any`](#any-type). - -```luau -local s = "foo" -local n = 1 -local b = true -local t = coroutine.running() - -local a: any = 1 -print(a.x) -- Type checker believes this to be ok, but crashes at runtime. -``` - -#### Special behavior with `nil` - -There's a special case where we intentionally avoid inferring `nil` for local variables. This allows you to declare variables first and assign values to them later — if we inferred `nil`, you wouldn't be able to assign other types to these variables. - -```luau -local a -local b = nil -``` - -### `unknown` type - -`unknown` is also said to be the _top_ type, that is it's a union of all types. - -```luau -local a: unknown = "hello world!" -local b: unknown = 5 -local c: unknown = function() return 5 end -``` - -Unlike `any`, `unknown` will not allow itself to be used as a different type! - -```luau -local function unknown(): unknown - return if math.random() > 0.5 then "hello world!" else 5 -end - -local a: string = unknown() -- not ok -local b: number = unknown() -- not ok -local c: string | number = unknown() -- not ok -``` - -In order to turn a variable of type `unknown` into a different type, you must apply [type refinements](../types/refinements.md) on that variable. - -```luau -local function unknown(): unknown return 5 end -local x = unknown() -if typeof(x) == "number" then - print(x) -- x : number -end -``` - -### `never` type - -`never` is also said to be the _bottom_ type, meaning there doesn't exist a value that inhabits the type `never`. In fact, it is the _dual_ of `unknown`. `never` is useful in many scenarios, and one such use case is when type refinements proves it impossible: - -```luau -local function unknown(): unknown return 5 end -local x = unknown() -if typeof(x) == "number" and typeof(x) == "string" then - print(x) -- x : never -end -``` - -### `any` type - -`any` is just like `unknown`, except that it allows itself to be used as an arbitrary type without further checks or annotations. Essentially, it's an opt-out from the type system entirely. - -```luau -local x: any = 5 -local y: string = x -- no type errors here! -``` - -## Function types - -Let's start with something simple. - -```luau -local function f(x) return x end - -local a: number = f(1) -- ok -local b: string = f("foo") -- ok -local c: string = f(true) -- not ok -``` - -In strict mode, the inferred type of this function `f` is `(A) -> A` (take a look at [generics](../generics)), whereas in nonstrict we infer `(any) -> any`. We know this is true because `f` can take anything and then return that. If we used `x` with another concrete type, then we would end up inferring that. - -Similarly, we can infer the types of the parameters with ease. By passing a parameter into *anything* that also has a type, we are saying "this and that has the same type." - -```luau -local function greetingsHelper(name: string) - return "Hello, " .. name -end - -local function greetings(name) - return greetingsHelper(name) -end - -print(greetings("Alexander")) -- ok -print(greetings({name = "Alexander"})) -- not ok -``` - -## Variadic types - -Luau permits assigning a type to the `...` variadic symbol like any other parameter: - -```luau -local function f(...: number) -end - -f(1, 2, 3) -- ok -f(1, "string") -- not ok -``` - -`f` accepts any number of `number` values. - -In type annotations, this is written as `...T`: - -```luau -type F = (...number) -> ...string -``` - -## Type packs - -Multiple function return values as well as the function variadic parameter use a type pack to represent a list of types. - -When a type alias is defined, generic type pack parameters can be used after the type parameters: - -```luau -type Signal = { f: (T, U...) -> (), data: T } -``` - -> Keep in mind that `...T` is a variadic type pack (many elements of the same type `T`), while `U...` is a generic type pack that can contain zero or more types and they don't have to be the same. - -It is also possible for a generic function to reference a generic type pack from the generics list: - -```luau -type Signal = { f: (T, U...) -> (), data: T } - -local function call(s: Signal, ...: U...) - s.f(s.data, ...) -end -``` - -Generic types with type packs can be instantiated by providing a type pack: - -```luau -type Signal = { f: (T, U...) -> (), data: T } -local function call(s: Signal, ...: U...) end - -local signal: Signal = {} :: any - -call(signal, 1, 2, false) -``` - -There are also other ways to instantiate types with generic type pack parameters: - -```luau -type A = (T) -> U... - -type B = A -- with a variadic type pack -type C = A -- with a generic type pack -type D = A -- with an empty type pack -``` - -Trailing type pack argument can also be provided without parentheses by specifying variadic type arguments: - -```luau -type List = (Head, Rest...) -> () - -type B = List -- Rest... is () -type C = List -- Rest is (string, boolean) - -type Returns = () -> T... - --- When there are no type parameters, the list can be left empty -type D = Returns<> -- T... is () -``` - -Type pack parameters are not limited to a single one, as many as required can be specified: - -```luau -type Callback = { f: (Args...) -> Rets... } - -type A = Callback<(number, string), ...number> -``` - -## Singleton types (aka literal types) - -Luau's type system also supports singleton types, which means it's a type that represents one single value at runtime. At this time, both string and booleans are representable in types. - -> We do not currently support numbers as types. For now, this is intentional. - -```luau -local foo: "Foo" = "Foo" -- ok -local bar: "Bar" = foo -- not ok -local baz: string = foo -- ok - -local t: true = true -- ok -local f: false = false -- ok -``` - -This happens all the time, especially through [type refinements](../type-refinements) and is also incredibly useful when you want to enforce program invariants in the type system! See [tagged unions](../unions-and-intersections/#tagged-unions) for more information. diff --git a/.cursor/rules/luau/types/considerations.md b/.cursor/rules/luau/types/considerations.md deleted file mode 100644 index 33c01b3d..00000000 --- a/.cursor/rules/luau/types/considerations.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -slug: types/considerations -title: Additional Considerations -sidebar: - order: 10 ---- - -## Module interactions - -Let's say that we have two modules, `Foo` and `Bar`. Luau will try to resolve the paths if it can find any `require` in any scripts. In this case, when you say `./bar`, Luau will resolve it as: relative to this script, go to my sibling script named Bar. - -```luau ---!file foo.luau -local Bar = require("./bar") - -local baz1: Bar.Baz = 1 -- not ok -local baz2: Bar.Baz = "foo" -- ok - -print(Bar.Quux) -- ok -print(Bar.FakeProperty) -- not ok - -Bar.NewProperty = true -- not ok - ---!file bar.luau -export type Baz = string - -local module = {} - -module.Quux = "Hello, world!" - -return module -``` - -There are some caveats here though. For instance, the require path must be resolvable statically, otherwise Luau cannot accurately type check it. - -### Cyclic module dependencies - -Cyclic module dependencies can cause problems for the type checker. In order to break a module dependency cycle a typecast of the module to `any` may be used: -```luau ---!hidden mode=nocheck -local myModule = require(MyModule) :: any -``` diff --git a/.cursor/rules/luau/types/generics.md b/.cursor/rules/luau/types/generics.md deleted file mode 100644 index 0adb651d..00000000 --- a/.cursor/rules/luau/types/generics.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -slug: types/generics -title: Generics and Polymorphism -sidebar: - order: 5 ---- - -The type inference engine was built from the ground up to recognize generics. A generic is simply a type parameter in which another type could be slotted in. It's extremely useful because it allows the type inference engine to remember what the type actually is, unlike `any`. - -```luau -type Pair = {first: T, second: T } --- generics can also have defaults! -type PairWithDefault = Pair - -local strings: Pair = { first="Hello", second="World" } -local numbers: Pair = { first=1, second=2 } --- can just treat PairWithDefault as a type that doesnt have generics because it has all of its generics assigned a default! -local more_strings: PairWithDefault = { first = "meow", second = "mrrp" } -``` - -## Generic functions - -As well as generic type aliases like `Pair`, Luau supports generic functions. These are functions that, as well as their regular data parameters, take type parameters. For example, a function which reverses an array is: -```luau -function reverse(a) - local result = {} - for i = #a, 1, -1 do - table.insert(result, a[i]) - end - return result -end -``` -The type of this function is that it can reverse an array, and return an array of the same type. Luau can infer this type, but if you want to be explicit, you can declare the type parameter `T`, for example: -```luau -function reverse(a: {T}): {T} - local result: {T} = {} - for i = #a, 1, -1 do - table.insert(result, a[i]) - end - return result -end -``` -When a generic function is called, Luau infers type arguments, for example -```luau ---!file main.luau -local reverse = require("./reverse") -local x: {number} = reverse({1, 2, 3}) -local y: {string} = reverse({"a", "b", "c"}) - ---!file reverse.luau -function reverse(a: {T}): {T} - local result: {T} = {} - for i = #a, 1, -1 do - table.insert(result, a[i]) - end - return result -end - -return reverse -``` -Generic types are used for built-in functions as well as user functions, -for example the type of two-argument `table.insert` is: -``` -({T}, T) -> () -``` -Note: Functions don't support having defaults assigned to generics, meaning the following is invalid -```luau -function meow(mrrp: T) - print(mrrp .. " :3") -end -``` diff --git a/.cursor/rules/luau/types/object-oriented-programs.md b/.cursor/rules/luau/types/object-oriented-programs.md deleted file mode 100644 index d749c667..00000000 --- a/.cursor/rules/luau/types/object-oriented-programs.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -slug: types/object-oriented-programs -title: Object-Oriented Programming -sidebar: - order: 7 ---- - -## Adding types for faux object oriented programs - -One common pattern we see with existing Lua/Luau code is the following object-oriented code. While Luau is capable of inferring a decent chunk of this code, it cannot pin down on the types of `self` when it spans multiple methods. - -```luau -local Account = {} -Account.__index = Account - -function Account.new(name, balance) - local self = {} - self.name = name - self.balance = balance - - return setmetatable(self, Account) -end - --- The `self` type is different from the type returned by `Account.new` -function Account:deposit(credit) - self.balance += credit -end - --- The `self` type is different from the type returned by `Account.new` -function Account:withdraw(debit) - self.balance -= debit -end - -local account = Account.new("Alexander", 500) -``` - -For example, the type of `Account.new` is `(name: a, balance: b) -> { ..., name: a, balance: b, ... }` (snipping out the metatable). For better or worse, this means you are allowed to call `Account.new(5, "hello")` as well as `Account.new({}, {})`. In this case, this is quite unfortunate, so your first attempt may be to add type annotations to the parameters `name` and `balance`. - -There's the next problem: the type of `self` is not shared across methods of `Account`, this is because you are allowed to explicitly opt for a different value to pass as `self` by writing `account.deposit(another_account, 50)`. As a result, the type of `Account:deposit` is `(self: { balance: a }, credit: b) -> ()`. Consequently, Luau cannot infer the result of the `+` operation from `a` and `b`, so a type error is reported. - -We can see there's a lot of problems happening here. This is a case where you'll have to provide some guidance to Luau in the form of annotations today, but the process is straightforward and without repetition. You first specify the type of _data_ you want your class to have, and then you define the class type separately with `setmetatable` (either via `typeof`, or in the New Type Solver, the `setmetatable` type function). -From then on, you can explicitly annotate the `self` type of each method with your class type! Note that while the definition is written e.g. `Account.deposit`, you can still call it as `account:deposit(...)`. - -```luau -local Account = {} -Account.__index = Account - -type AccountData = { - name: string, - balance: number, -} - -export type Account = typeof(setmetatable({} :: AccountData, Account)) --- or alternatively, in the new type solver... --- export type Account = setmetatable - - --- this return annotation is not required, but ensures that you cannot --- accidentally make the constructor incompatible with the methods -function Account.new(name, balance): Account - local self = {} - self.name = name - self.balance = balance - - return setmetatable(self, Account) -end - --- this annotation on `self` is currently a _required_ annotation. -function Account.deposit(self: Account, credit: number) - -- autocomplete on `self` works here! - self.balance += credit -end - --- this annotation on `self` is currently a _required_ annotation. -function Account.withdraw(self: Account, debit: number) - -- autocomplete on `self` works here! - self.balance -= debit -end - -local account = Account.new("Hina", 500) -account:deposit(20) -- this still works, and we had autocomplete after hitting `:`! -``` - -Based on feedback, we plan to restrict the types of all functions defined with `:` syntax to [share their self types](https://rfcs.luau.org/shared-self-types.html). This will enable future versions of this code to work without any explicit `self` annotations because it amounts to having type inference make precisely the assumptions we are encoding with annotations here --- namely, that the type of the constructors and the method definitions is intended by the developer to be the same. diff --git a/.cursor/rules/luau/types/overview.md b/.cursor/rules/luau/types/overview.md deleted file mode 100644 index 3d4226ba..00000000 --- a/.cursor/rules/luau/types/overview.md +++ /dev/null @@ -1,160 +0,0 @@ ---- -slug: types -title: An introduction to Luau types -sidebar: - order: 1 ---- - -Luau supports a gradual type system through the use of type annotations and type inference. These types are used to provide warnings, errors, and suggestions for our developers. Type checking helps you find bugs early - while you're writing code - rather than discovering when your program crashes at runtime. - -## Type inference modes - -Luau offers three different modes that control how strictly it checks your types. You can set the mode by adding one of the following to the top of your file: - -* `--!nocheck`, -* `--!nonstrict` (default), and -* `--!strict` - -##### `--!nocheck` - -`nocheck` mode completely disables the type inference engine for the file. - -With this mode enabled, we don't provide any feedback on the types, so scripts with errors (like following example that tries to add a `string` and a `number`) will not raise a typecheck error, even though the program errors when executed. - -Try pressing the `Check` and `Run` buttons to try out this snippet: - -```luau ---!nocheck - -local foo = 1 -local x = "hello " + foo -- No error, type checking is disabled -print(foo) -``` - -If, instead, you want to catch these kinds of errors before running your code, you can enable type checking with the `--!nonstrict` or `--!strict` modes. Both of these modes analyze your types and provide helpful feedback, but they differ slightly in how strictly they enforce type safety. - -##### `--!nonstrict` - -In `nonstrict` mode, the type checker is more forgiving: if we can't figure out what type something is early on, we infer the type could be anything (the `any` type) and let you proceed without errors. - -This means that if we define a variable without initializing it or specifying its type: - -```luau ---!nonstrict - -local foo -foo = 1 -foo = "hello " + foo -- Still no error, foo is 'any' -``` - -The type checker can't tell what type `foo` should be when it's first declared, so in `nonstrict` mode it infers `any` - allowing the addition to proceed without warnings, even though it will error at runtime. - -##### `--!strict` - -In `strict` mode, Luau is smarter about tracking types across statements. Given the previous example now in `strict` mode: - -```luau ---!strict - -local foo -foo = 1 -foo = "hello " + foo -``` - -We see an error! The type checker sees `foo = 1` on line 4 and infers that `foo` must be a `number`. Then, when you try to add `"hello "` and `foo`, `strict` mode catches our error of trying to add a `string` and a `number`, which isn't allowed. (tip: hover over the erroneous lines to see the error message!) - -## Structural type system - -Luau's type system is structural by default, which is to say that we inspect the shape of two tables to see if they are similar enough. This was chosen because Lua 5.1 is inherently structural. - -Take, for example, these two tables `A` and `B`: - -```luau ---!hidden FIXME(LUAU): there's a bug in the new type solver unfortunately ---!hidden solver=old -type A = {x: number, y: number, z: number?} -type B = {x: number, y: number, z: number} - -local a1: A = {x = 1, y = 2} -- ok -local b1: B = {x = 1, y = 2, z = 3} -- ok - -local a2: A = b1 -- ok -local b2: B = a1 -- not ok -``` - -## Type annotations - -While Luau's type system can infer many types, you can also annotate types using a colon (`:`) followed by the type: - -```luau --- Variable annotations -local age: number = 25 -local names: {string} = {"Alice", "Bob"} - --- Function annotations -function greet(name: string): string - return "Hello, " .. name -end - --- Table type annotations -type Person = { - name: string, - age: number, - email: string? -} - -local user: Person = { - name = "Alice", - age = 30 -} - -print(greet(user.name)) -``` - -## Type casts - -Sometimes, you might want to specify the type of an expression when the automatically inferred type is too generic. In these cases, you can use a type cast with the `::` operator to tell Luau what type something should be. - -For example, consider the following table constructor where the intent is to store a table of names: - -```luau -local myTable = {names = {}} -table.insert(myTable.names, 42) -``` - -Inserting a number into `names` ought to cause a type error, but doesn't. - -In order to specify the type of the `names` table, we can use a typecast: - -```luau -local myTable = {names = {} :: {string}} -table.insert(myTable.names, 42) -``` - -Now, inserting a number raises a type error, informing the user that there is an `invalid 'number' to 'string' conversion`. - -### Type cast rules - -Type casts themselves are also type checked to ensure that one of the conversion operands is the subtype of the other or `any`: - -```luau -local numericValue = 1 -local value = numericValue :: any -- ok, all expressions may be cast to 'any' -local flag = numericValue :: boolean -- not ok, invalid 'number' to 'boolean' conversion -``` - -This prevents unsafe casts between incompatible types. - -#### Type casts with multiple return values - -When typecasting a variadic or the result of a function with multiple returns, only the first value will be preserved, and the rest discarded: - -```luau -function returnsMultiple(...): (number, number, number) - print(... :: string) -- "x" - return 1, 2, 3 -end - -print(returnsMultiple("x", "y", "z")) -- 1, 2, 3 -print(returnsMultiple("x", "y", "z") :: number) -- 1 -``` diff --git a/.cursor/rules/luau/types/refinements.md b/.cursor/rules/luau/types/refinements.md deleted file mode 100644 index 66e755e0..00000000 --- a/.cursor/rules/luau/types/refinements.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -slug: types/type-refinements -title: Type Refinements -sidebar: - order: 6 ---- - -When we check the type of any lvalue (a global, a local, or a property), what we're doing is we're refining the type, hence "type refinement." The support for this is arbitrarily complex, so go at it! - -Here are all the ways you can refine: -1. Truthy test: `if x then` will refine `x` to be truthy. -2. Type guards: `if type(x) == "number" then` will refine `x` to be `number`. -3. Equality: `if x == "hello" then` will refine `x` to be a singleton type `"hello"`. - -And they can be composed with many of `and`/`or`/`not`. `not`, just like `~=`, will flip the resulting refinements, that is `not x` will refine `x` to be falsy. - -The `assert(..)` function may also be used to refine types instead of `if/then`. - -Using truthy test: -```luau -local maybeString: string? = nil - -if maybeString then - local onlyString: string = maybeString -- ok - local onlyNil: nil = maybeString -- not ok -end - -if not maybeString then - local onlyString: string = maybeString -- not ok - local onlyNil: nil = maybeString -- ok -end -``` - -Using `type` test: -```luau -local stringOrNumber: string | number = "foo" - -if type(stringOrNumber) == "string" then - local onlyString: string = stringOrNumber -- ok - local onlyNumber: number = stringOrNumber -- not ok -end - -if type(stringOrNumber) ~= "string" then - local onlyString: string = stringOrNumber -- not ok - local onlyNumber: number = stringOrNumber -- ok -end -``` - -Using equality test: -```luau -function f() return "meow" end -local myString: string = f() - -if myString == "hello" then - local hello: "hello" = myString -- ok because it is absolutely "hello"! - local copy: string = myString -- ok -end -``` - -And as said earlier, we can compose as many of `and`/`or`/`not` as we wish with these refinements: -```luau -local function f(x: any, y: any) - if (x == "hello" or x == "bye") and type(y) == "string" then - -- x is of type "hello" | "bye" - -- y is of type string - end - - if not (x ~= "hi") then - -- x is of type "hi" - end -end -``` - -`assert` can also be used to refine in all the same ways: -```luau -local stringOrNumber: string | number = "foo" - -assert(type(stringOrNumber) == "string") - -local onlyString: string = stringOrNumber -- ok -local onlyNumber: number = stringOrNumber -- not ok -``` diff --git a/.cursor/rules/luau/types/roblox-types.md b/.cursor/rules/luau/types/roblox-types.md deleted file mode 100644 index 3430d618..00000000 --- a/.cursor/rules/luau/types/roblox-types.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -slug: types/roblox-types -title: Foreign Types from the Embedder -sidebar: - order: 9 ---- - -Roblox supports a rich set of classes and data types, [documented here](https://developer.roblox.com/en-us/api-reference). All of them are readily available for the type checker to use by their name (e.g. `Part` or `RaycastResult`). - -When one type inherits from another type, the type checker models this relationship and allows to cast a subclass to the parent class implicitly, so you can pass a `Part` to a function that expects an `Instance`. - -All enums are also available to use by their name as part of the `Enum` type library, e.g. `local m: Enum.Material = part.Material`. - -We can automatically deduce what calls like `Instance.new` and `game:GetService` are supposed to return: - -```luau ---!hidden mode=nocheck -local part = Instance.new("Part") -local basePart: BasePart = part -``` - -Finally, Roblox types can be refined using `IsA`: - -```luau ---!hidden mode=nocheck -local function getText(x : Instance) : string - if x:IsA("TextLabel") or x:IsA("TextButton") or x:IsA("TextBox") then - return child.Text - end - return "" -end -``` - -Note that many of these types provide some properties and methods in both lowerCase and UpperCase; the lowerCase variants are deprecated, and the type system will ask you to use the UpperCase variants instead. diff --git a/.cursor/rules/luau/types/tables.md b/.cursor/rules/luau/types/tables.md deleted file mode 100644 index 11aa8b36..00000000 --- a/.cursor/rules/luau/types/tables.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -slug: types/tables -title: Table Types -sidebar: - order: 3 ---- - -From the type checker perspective, each table can be in one of three states. They are: `unsealed table`, `sealed table`, and `generic table`. This is intended to represent how the table's type is allowed to change. - -### Unsealed tables - -An unsealed table is a table which supports adding new properties, which updates the tables type. Unsealed tables are created using table literals. This is one way to accumulate knowledge of the shape of this table. - -```luau -local t = {x = 1} -- {x: number} -t.y = 2 -- {x: number, y: number} -t.z = 3 -- {x: number, y: number, z: number} -``` - -However, if this local were written as `local t: { x: number } = { x = 1 }`, it ends up sealing the table, so the two assignments henceforth will not be ok. - -Furthermore, once we exit the scope where this unsealed table was created in, we seal it. - -```luau -local function vec2(x, y) - local t = {} - t.x = x - t.y = y - return t -end - -local v2 = vec2(1, 2) -v2.z = 3 -- not ok -``` - -Unsealed tables are *exact* in that any property of the table must be named by the type. Since Luau treats missing properties as having value `nil`, this means that we can treat an unsealed table which does not mention a property as if it mentioned the property, as long as that property is optional. - -```luau -local t = {x = 1} -local u : { x : number, y : number? } = t -- ok because y is optional -local v : { x : number, z : number } = t -- not ok because z is not optional -``` - -### Sealed tables - -A sealed table is a table that is now locked down. This occurs when the table type is spelled out explicitly via a type annotation, or if it is returned from a function. - -```luau -local t : { x: number } = {x = 1} -t.y = 2 -- not ok -``` - -Sealed tables are *inexact* in that the table may have properties which are not mentioned in the type. -As a result, sealed tables support *width subtyping*, which allows a table with more properties to be used as a table with fewer properties. - -```luau -type Point1D = { x : number } -type Point2D = { x : number, y : number } -local p : Point2D = { x = 5, y = 37 } -local q : Point1D = p -- ok because Point2D has more properties than Point1D -``` - -### Generic tables - -This typically occurs when the symbol does not have any annotated types or were not inferred anything concrete. In this case, when you index on a parameter, you're requesting that there is a table with a matching interface. - -```luau -local function f(t) - return t.x + t.y - --^ --^ {x: _, y: _} -end - -f({x = 1, y = 2}) -- ok -f({x = 1, y = 2, z = 3}) -- ok -f({x = 1}) -- not ok -``` - -## Table indexers - -These are particularly useful for when your table is used similarly to an array. - -```luau -local t = {"Hello", "world!"} -- {[number]: string} -print(table.concat(t, ", ")) -``` - -Luau supports a concise declaration for array-like tables, `{T}` (for example, `{string}` is equivalent to `{[number]: string}`); the more explicit definition of an indexer is still useful when the key isn't a number, or when the table has other fields like `{ [number]: string, n: number }`. diff --git a/.cursor/rules/luau/types/type-functions.md b/.cursor/rules/luau/types/type-functions.md deleted file mode 100644 index 3da01d23..00000000 --- a/.cursor/rules/luau/types/type-functions.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -slug: types/type-functions -title: Type Functions -sidebar: - order: 8 ---- - -Type functions are functions that run during analysis time and operate on types, instead of runtime values. They can use the [types](../../types-library) library to transform existing types or create new ones. - - -Here's a simplified implementation of the builtin type function `keyof`. It takes a table type and returns its property names as a [union](../unions-and-intersections#union-types) of [singletons](../basic-types#singleton-types-aka-literal-types). - -```luau -type function simple_keyof(ty) - -- Ignoring unions or intersections of tables for simplicity. - if not ty:is("table") then - error("Can only call keyof on tables.") - end - - local union = nil - - for property in ty:properties() do - union = if union then types.unionof(union, property) else property - end - - return if union then union else types.singleton(nil) -end - -type person = { - name: string, - age: number, -} ---- keys = "age" | "name" -type keys = simple_keyof -``` - -### Type function environment - -In addition to the [types](../../types-library) library, type functions have access to: - -* `assert`, `error`, `print` -* `next`, `ipairs`, `pairs` -* `select`, `unpack` -* `getmetatable`, `setmetatable` -* `rawget`, `rawset`, `rawlen`, `raweq` -* `tonumber`, `tostring` -* `type`, `typeof` -* `math` library -* `table` library -* `string` library -* `bit32` library -* `utf8` library -* `buffer` library diff --git a/.cursor/rules/luau/types/unions-and-intersections.md b/.cursor/rules/luau/types/unions-and-intersections.md deleted file mode 100644 index 22bef3c5..00000000 --- a/.cursor/rules/luau/types/unions-and-intersections.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -slug: types/unions-and-intersections -title: Union and Intersection Types -sidebar: - order: 4 ---- - -## Union types - -A union type represents *one of* the types in this set. If you try to pass a union onto another thing that expects a *more specific* type, it will fail. - -For example, what if this `string | number` was passed into something that expects `number`, but the passed in value was actually a `string`? - -```luau -local stringOrNumber: string | number = "foo" - -local onlyString: string = stringOrNumber -- not ok -local onlyNumber: number = stringOrNumber -- not ok -``` - -Note: it's impossible to be able to call a function if there are two or more function types in this union. - -### Tagged unions - -Tagged unions are just union types! In particular, they're union types of tables where they have at least _some_ common properties but the structure of the tables are different enough. Here's one example: - -```luau -type Ok = { type: "ok", value: T } -type Err = { type: "err", error: E } -type Result = Ok | Err -``` - -This `Result` type can be discriminated by using type refinements on the property `type`, like so: - -```luau ---!file main.luau -local res = require("./result") -local result: res.Result = res.something() - -if result.type == "ok" then - -- result is known to be Ok - -- and attempting to index for error here will fail - print(result.value) -elseif result.type == "err" then - -- result is known to be Err - -- and attempting to index for value here will fail - print(result.error) -end - ---!file result.luau -export type Ok = { type: "ok", value: T } -export type Err = { type: "err", error: E } -export type Result = Ok | Err - -return { - something = function(): any return {} end -} -``` - -Which works out because `value: T` exists only when `type` is in actual fact `"ok"`, and `error: E` exists only when `type` is in actual fact `"err"`. - - -## Intersection types - -An intersection type represents *all of* the types in this set. It's useful for two main things: to join multiple tables together, or to specify overloadable functions. - -```luau -type XCoord = {x: number} -type YCoord = {y: number} -type ZCoord = {z: number} - -type Vector2 = XCoord & YCoord -type Vector3 = XCoord & YCoord & ZCoord - -local vec2: Vector2 = {x = 1, y = 2} -- ok -local vec3: Vector3 = {x = 1, y = 2, z = 3} -- ok -``` - -```luau -type SimpleOverloadedFunction = ((string) -> number) & ((number) -> string) - -local f: SimpleOverloadedFunction - -local r1: number = f("foo") -- ok -local r2: number = f(12345) -- not ok -local r3: string = f("foo") -- not ok -local r4: string = f(12345) -- ok -``` - -Note: it's impossible to create an intersection type of some primitive types, e.g. `string & number`, or `string & boolean`, or other variations thereof. - -Note: Luau still does not support user-defined overloaded functions. Some of Roblox and Lua 5.1 functions have different function signature, so inherently requires overloaded functions. diff --git a/.cursor/rules/persona.mdc b/.cursor/rules/persona.mdc deleted file mode 100644 index f667ceee..00000000 --- a/.cursor/rules/persona.mdc +++ /dev/null @@ -1,41 +0,0 @@ ---- -alwaysApply: true ---- - -# Agent Behavior - -## Greeting -Always begin responses with "Yes Sir". - -## Scope Discipline -- Do not refactor or fix typos in existing code unless specifically asked -- Do not rename variables, functions, or files unless asked -- Do not "clean up" imports, formatting, or whitespace unless asked -- Do not fix line length in existing code unless specifically asked -- Do not add comments, logging, or "improvements" beyond the request - -When making changes, consider: -1. **Impact on Codebase** - How will changes affect the rest of the code? -2. **Relevance** - Is this code related to the request? If not, don't touch it. -3. **Scope** - Only change what's directly relevant. Adding a feature? Don't alter unrelated UI. -4. **Unnecessary Changes** - If tempted to make extras, stop and explain why to the user. - -## Code Preservation -- Never remove code you don't understand -- Never replace code blocks with placeholders like `-- rest of code here...` - -## Communication -- Ask clarifying questions before making assumptions on ambiguous requests -- Admit uncertainty rather than guessing - say "I don't know" when uncertain -- Do not ask for confirmation after changes are already made -- Allowed to disagree and seek clarification if requirements are unclear -- Be ultra-concise by default, comprehensive when explaining -- Support claims by quoting available documents exactly - -## Technical Accuracy -- Do not use outdated patterns from training data when current docs are available - -## Implementation -- Write only what's needed, clean up unnecessary code -- When implementing new features, be relentless - finish completely -- Avoid imperative code; ensure proper error handling diff --git a/.cursor/rules/python.mdc b/.cursor/rules/python.mdc deleted file mode 100644 index d35b54e7..00000000 --- a/.cursor/rules/python.mdc +++ /dev/null @@ -1,46 +0,0 @@ ---- -globs: **/*.py -alwaysApply: false ---- - -# Python Code Style - -## Formatting -- 2-space indentation -- Double quotes for strings -- f-strings for formatting -- Max line width ~100 chars -- Break long function declarations/calls across multiple lines - -## Types -- Type declarations on function parameters and return types only -- Don't add types where inference is obvious (constants, assignments) - -## Code Organization -- Use `pathlib` for file paths -- Prefer built-in Python libraries when suitable -- Blank lines between functions; condensed within functions -- Use blank lines meaningfully to separate logical sections - -## Comments & Debugging -- Minimal comments - let types and names speak -- No docstring comments for parameters/return values -- No scattered print statements for debugging - -## Dependencies -- Modern, maintained packages only -- Up-to-date practices - -## User-Facing Messages -- Descriptive error messages for input/output issues -- Keep internal error strings minimal - -## UI/Styling -- Dark mode preferred -- Modern, clean UI/text - -## Restrictions (unless specifically asked) -- Never create python tools or test scripts -- Don't modify JSON configs -- Don't run test commands -- Don't generate READMEs diff --git a/.cursor/rules/roblox-api/Full-API-Dump.json b/.cursor/rules/roblox-api/Full-API-Dump.json deleted file mode 100644 index 944afce8..00000000 --- a/.cursor/rules/roblox-api/Full-API-Dump.json +++ /dev/null @@ -1,206475 +0,0 @@ -{ - "Classes": [ - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ClassName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "className", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "ClassName", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "GetPropertyChangedSignal", - "Parameters": [ - { - "Name": "property", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsA", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "isA", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "IsA", - "ThreadSafety": "Safe" - }, - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "property", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Object", - "Superclass": "<<>>", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "AnimationNode", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Capture" - ], - "Write": [ - "Capture" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "CaptureTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "DateTime" - } - }, - { - "Capabilities": { - "Read": [ - "Capture" - ], - "Write": [ - "Capture" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "CaptureType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CaptureType" - } - }, - { - "Capabilities": { - "Read": [ - "Capture" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "FilePathString", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Capture" - ], - "Write": [ - "Capture" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "LocalId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Capture" - ], - "Write": [ - "Capture" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "SourcePlaceId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Capture" - ], - "Write": [ - "Capture" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "SourceUniverseId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Capture", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ScreenshotCapture", - "Superclass": "Capture", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Capture" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "FilePath", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Capture" - ], - "Write": [ - "Capture" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "TimeLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "MemoryCategory": "Instances", - "Name": "VideoCapture", - "Superclass": "Capture", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Error", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ConfigSnapshotErrorState" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Outdated", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetValueChangedSignal", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Refresh", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "UpdateAvailable", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ConfigSnapshot", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DynamicGeneration" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "ImageData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "DynamicGeneration" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "IsReplicatedCopy", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "DynamicGeneration" - ], - "Write": [ - "DynamicGeneration" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "Destroy", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "DrawCircle", - "Parameters": [ - { - "Name": "center", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "color", - "Type": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Name": "transparency", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "combineType", - "Type": { - "Category": "Enum", - "Name": "ImageCombineType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "DrawImage", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "image", - "Type": { - "Category": "Class", - "Name": "EditableImage" - } - }, - { - "Name": "combineType", - "Type": { - "Category": "Enum", - "Name": "ImageCombineType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "DrawImageProjected", - "Parameters": [ - { - "Name": "mesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "projection", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "brushConfig", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "DrawImageTransformed", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "scale", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "rotation", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "image", - "Type": { - "Category": "Class", - "Name": "EditableImage" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "DrawLine", - "Parameters": [ - { - "Name": "p1", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "p2", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "color", - "Type": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Name": "transparency", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "combineType", - "Type": { - "Category": "Enum", - "Name": "ImageCombineType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "DrawRectangle", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "color", - "Type": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Name": "transparency", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "combineType", - "Type": { - "Category": "Enum", - "Name": "ImageCombineType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "DrawTriangle", - "Parameters": [ - { - "Name": "p1", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "p2", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "p3", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "color", - "Type": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Name": "transparency", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "ReadPixelsBuffer", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "buffer" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "WritePixelsBuffer", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "buffer", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "EditableImage", - "Superclass": "Object", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DynamicGeneration" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "FixedSize", - "Security": { - "Read": "None", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "DynamicGeneration" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "IsReplicatedCopy", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "DynamicGeneration" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MeshData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Capabilities": { - "Read": [ - "DynamicGeneration" - ], - "Write": [ - "DynamicGeneration" - ] - }, - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "SkinningEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "AddBone", - "Parameters": [ - { - "Name": "boneProperties", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "AddColor", - "Parameters": [ - { - "Name": "color", - "Type": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Name": "alpha", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "AddFace", - "Parameters": [ - { - "Name": "vertexIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "AddNormal", - "Parameters": [ - { - "Name": "normal", - "Type": { - "Category": "DataType", - "Name": "Vector3?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "AddTriangle", - "Parameters": [ - { - "Name": "vertexId0", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "vertexId1", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "vertexId2", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "AddUV", - "Parameters": [ - { - "Name": "uv", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "AddVertex", - "Parameters": [ - { - "Name": "p", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "Destroy", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "FindClosestPointOnSurface", - "Parameters": [ - { - "Name": "point", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "FindClosestVertex", - "Parameters": [ - { - "Name": "toThisPoint", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "FindVerticesWithinSphere", - "Parameters": [ - { - "Name": "center", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetAdjacentFaces", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetAdjacentVertices", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetBoneByName", - "Parameters": [ - { - "Name": "boneName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetBoneCFrame", - "Parameters": [ - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetBoneIsVirtual", - "Parameters": [ - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetBoneName", - "Parameters": [ - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetBoneParent", - "Parameters": [ - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetBones", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetCenter", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetColor", - "Parameters": [ - { - "Name": "colorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Color3?" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetColorAlpha", - "Parameters": [ - { - "Name": "colorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float?" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetColors", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFaceColors", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFaceNormals", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFaceUVs", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFaceVertices", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFaces", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFacesWithAttribute", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFacesWithColor", - "Parameters": [ - { - "Name": "colorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFacesWithNormal", - "Parameters": [ - { - "Name": "normalId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFacesWithUV", - "Parameters": [ - { - "Name": "uvId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFacsCorrectivePose", - "Parameters": [ - { - "Name": "actions", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFacsCorrectivePoses", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFacsPose", - "Parameters": [ - { - "Name": "action", - "Type": { - "Category": "Enum", - "Name": "FacsActionUnit" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetFacsPoses", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetNormal", - "Parameters": [ - { - "Name": "normalId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3?" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetNormals", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetPosition", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetSize", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetUV", - "Parameters": [ - { - "Name": "uvId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2?" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetUVs", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertexBoneWeights", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertexBones", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertexColors", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertexFaceColor", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertexFaceNormal", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertexFaceUV", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertexFaces", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertexNormals", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertexUVs", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVertices", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVerticesWithAttribute", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVerticesWithColor", - "Parameters": [ - { - "Name": "colorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVerticesWithNormal", - "Parameters": [ - { - "Name": "normalId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GetVerticesWithUV", - "Parameters": [ - { - "Name": "uvId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "IdDebugString", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "MergeVertices", - "Parameters": [ - { - "Name": "mergeTolerance", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Map" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "RaycastLocal", - "Parameters": [ - { - "Name": "origin", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "direction", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "RemoveBone", - "Parameters": [ - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "RemoveFace", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "RemoveUnused", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "ResetNormal", - "Parameters": [ - { - "Name": "normalId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetBoneCFrame", - "Parameters": [ - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetBoneIsVirtual", - "Parameters": [ - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "virtual", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetBoneName", - "Parameters": [ - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetBoneParent", - "Parameters": [ - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "parentBoneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetColor", - "Parameters": [ - { - "Name": "colorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "color", - "Type": { - "Category": "DataType", - "Name": "Color3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetColorAlpha", - "Parameters": [ - { - "Name": "colorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "alpha", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetFaceColors", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "ids", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetFaceNormals", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "ids", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetFaceUVs", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "ids", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetFaceVertices", - "Parameters": [ - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "ids", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetFacsBonePose", - "Parameters": [ - { - "Name": "action", - "Type": { - "Category": "Enum", - "Name": "FacsActionUnit" - } - }, - { - "Name": "boneId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetFacsCorrectivePose", - "Parameters": [ - { - "Name": "actions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "boneIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "cframes", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetFacsPose", - "Parameters": [ - { - "Name": "action", - "Type": { - "Category": "Enum", - "Name": "FacsActionUnit" - } - }, - { - "Name": "boneIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "cframes", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetNormal", - "Parameters": [ - { - "Name": "normalId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "normal", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetPosition", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "p", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetUV", - "Parameters": [ - { - "Name": "uvId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "uv", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetVertexBoneWeights", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "boneWeights", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetVertexBones", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "boneIDs", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetVertexFaceColor", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "colorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetVertexFaceNormal", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "normalId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "SetVertexFaceUV", - "Parameters": [ - { - "Name": "vertexId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "faceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "uvId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "Triangulate", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "EditableMesh", - "Superclass": "Object", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "RunMoreCode", - "Parameters": [ - { - "Name": "code", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendUpdate", - "Parameters": [ - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Stop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ReceivedUpdate", - "Parameters": [ - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ExecutedRemoteCommand", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Archivable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Attributes", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AttributesReplicate", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AttributesSerialize", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "CapabilityControl" - ], - "Write": [ - "CapabilityControl" - ] - }, - "Category": "Permissions", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Capabilities", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SecurityCapabilities" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DataCost", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Permissions", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DefinesCapabilities", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HistoryId", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UniqueId" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Name", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Parent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PredictionMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PredictionMode" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PropertyStatusStudio", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PropertyStatus" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RobloxLocked", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "CapabilityControl" - ], - "Write": [ - "CapabilityControl" - ] - }, - "Category": "Permissions", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Sandboxed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SourceAssetId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Tags", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UniqueId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UniqueId" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "archivable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Archivable", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "numExpectedDirectChildren", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "AddTag", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ClearAllChildren", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CreateInstances" - ], - "MemberType": "Function", - "Name": "Clone", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Destroy", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FindFirstAncestor", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "FindFirstAncestorOfClass", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "FindFirstAncestorWhichIsA", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "FindFirstChild", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "false", - "Name": "recursive", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "FindFirstChildOfClass", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "FindFirstChildWhichIsA", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "false", - "Name": "recursive", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "FindFirstDescendant", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetActor", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Actor" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetAttribute", - "Parameters": [ - { - "Name": "attribute", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetAttributeChangedSignal", - "Parameters": [ - { - "Name": "attribute", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAttributes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetChildren", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetDebugId", - "Parameters": [ - { - "Default": "4", - "Name": "scopeLength", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "PluginSecurity", - "Tags": [ - "NotBrowsable" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDescendants", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetFullName", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetStyled", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "selector", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStyledPropertyChangedSignal", - "Parameters": [ - { - "Name": "property", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTags", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "HasTag", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "IsAncestorOf", - "Parameters": [ - { - "Name": "descendant", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "IsDescendantOf", - "Parameters": [ - { - "Name": "ancestor", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "IsPropertyModified", - "Parameters": [ - { - "Name": "property", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "QueryDescendants", - "Parameters": [ - { - "Name": "selector", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Remove", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveTag", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResetPropertyToDefault", - "Parameters": [ - { - "Name": "property", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetAttribute", - "Parameters": [ - { - "Name": "attribute", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "WaitForChild", - "Parameters": [ - { - "Name": "childName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "timeOut", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "CustomLuaState", - "CanYield" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "children", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetChildren", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CreateInstances" - ], - "MemberType": "Function", - "Name": "clone", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Clone", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "destroy", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Destroy", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "findFirstChild", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "false", - "Name": "recursive", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "FindFirstChild", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getChildren", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetChildren", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "isDescendantOf", - "Parameters": [ - { - "Name": "ancestor", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "IsDescendantOf", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "remove", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Remove", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AncestryChanged", - "Parameters": [ - { - "Name": "child", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "parent", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AttributeChanged", - "Parameters": [ - { - "Name": "attribute", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ChildAdded", - "Parameters": [ - { - "Name": "child", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ChildRemoved", - "Parameters": [ - { - "Name": "child", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DescendantAdded", - "Parameters": [ - { - "Name": "descendant", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DescendantRemoving", - "Parameters": [ - { - "Name": "descendant", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Destroying", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StyledPropertiesChanged", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "childAdded", - "Parameters": [ - { - "Name": "child", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "ChildAdded", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Instance", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "Unknown", - "MemberType": "Property", - "Name": "AccessoryType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AccessoryType" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "AssetId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Instance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsLayered", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Order", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Puffiness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Rotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Scale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetAppliedInstance", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AccessoryDescription", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "DeviceAccessTokenAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DeviceIntegrityAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDeviceIntegrityToken", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "MagicLogin", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCredentialsHeaders", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDeviceAccessToken", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDeviceIntegrityTokenYield", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "MagicLoginEvent", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AccountService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Transform", - "Default": "-0, -0, -1", - "MemberType": "Property", - "Name": "AttachmentForward", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Transform", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "AttachmentPoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Transform", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "AttachmentPos", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Transform", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "AttachmentRight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Transform", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "AttachmentUp", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "BackendAccoutrementState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "ServerEquipAccoutrement", - "Parameters": [ - { - "Name": "character", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "ServerUnequipAccoutrement", - "Parameters": [ - { - "Name": "oldCharacter", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Accoutrement", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "Unknown", - "MemberType": "Property", - "Name": "AccessoryType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AccessoryType" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Accessory", - "Superclass": "Accoutrement" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "Hat", - "Superclass": "Accoutrement", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "IsAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GrantAchievement", - "Parameters": [ - { - "Name": "achievementName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HasAchieved", - "Parameters": [ - { - "Name": "achievementName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AchievementService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "WriteActivityHistoryEventFromStudio", - "Parameters": [ - { - "Name": "eventType", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "resourceId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ActivityHistoryEventService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Monetization" - ], - "Write": [ - "Monetization" - ] - }, - "Category": "State", - "Default": "", - "MemberType": "Property", - "Name": "PortalInvalidReason", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Monetization" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "PortalVersion", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Monetization" - ], - "Write": [ - "Monetization" - ] - }, - "Category": "Behavior", - "Default": "Inactive", - "MemberType": "Property", - "Name": "Status", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AdUnitStatus" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AdPortal", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "CreateAdRewardFromDevProductId", - "Parameters": [ - { - "Name": "devProductId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "AdReward" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "GetAdTeleportInfo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "GetReportAdInfo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "HandleWhyThisAdClicked", - "Parameters": [ - { - "Name": "advertiserName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "payerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "HideEudsaDisclosure", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "OnDemandVideoCompleteFromUI", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "ShowAdResult" - } - }, - { - "Name": "encryptedAdTrackingData", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "encryptionMetadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "rewardDetails", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "ReturnToPublisherExperience", - "Parameters": [ - { - "Name": "adTeleportMethod", - "Type": { - "Category": "Enum", - "Name": "AdTeleportMethod" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "SetAdGuiInteractivityHandlerInitialized", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "ShowVideoAd", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "SubmitAdNotification", - "Parameters": [ - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "isShowAdSuccessful", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "earnedReward", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "rewardProductName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "rewardProductImageAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "UnregisterAdOpportunity", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "GetAdAvailabilityNowAsync", - "Parameters": [ - { - "Name": "adFormat", - "Type": { - "Category": "Enum", - "Name": "AdFormat" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "GetAdAvailabilityNowForUniverseAsync", - "Parameters": [ - { - "Name": "adFormat", - "Type": { - "Category": "Enum", - "Name": "AdFormat" - } - }, - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "isUniversalAppDM", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "RegisterAdOpportunityAsync", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "placementId", - "Type": { - "Category": "Primitive", - "Name": "int64?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Monetization" - ], - "MemberType": "Function", - "Name": "ShowRewardedVideoAdAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "reward", - "Type": { - "Category": "DataType", - "Name": "AdReward" - } - }, - { - "Name": "placementId", - "Type": { - "Category": "Primitive", - "Name": "int64?" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "ShowAdResult" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "ShowRewardedVideoAdAtClientAsync", - "Parameters": [ - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "ShowAdResult" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "AdTeleportEnded", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "AdTeleportInitiated", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "ReportImpressionSignal", - "Parameters": [ - { - "Name": "ad_instance_name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "encrypted_ad_tracking_data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "encryption_metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "ReportTeleportSignal", - "Parameters": [ - { - "Name": "ad_instance_name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "encrypted_ad_tracking_data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "encryption_metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "teleport_type", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "teleport_source_universe_id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "teleport_source_place_id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "teleport_dest_place_id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "RewardedVideoAdEnded", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "RewardedVideoAdStarted", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "ServeAdResponseSignal", - "Parameters": [ - { - "Name": "uuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "response", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "isError", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "ServeAdSignal", - "Parameters": [ - { - "Name": "uuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "request", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "ShowDynamicEudsaDisclosure", - "Parameters": [ - { - "Name": "advertiserName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "payerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "ShowReportAdPopup", - "Parameters": [ - { - "Name": "adInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "VideoAdClosed", - "Parameters": [ - { - "Name": "adShown", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "adGuiRegisterUI", - "Parameters": [ - { - "Name": "adGui", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "rewardedVideoAdPlayServerToClient", - "Parameters": [ - { - "Name": "rewardDetails", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "rewardedVideoAdPlayServerToClientWithPlacement", - "Parameters": [ - { - "Name": "rewardDetails", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "placementId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "rewardedVideoAdResultClientToServer", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "ShowAdResult" - } - }, - { - "Name": "encryptedAdTrackingData", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "encryptionMetadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Callback", - "Name": "onDemandVideoPlayInUI", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "VideoFrame" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AdService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "AdvancedDragger", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ApiKey", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FireCustomEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "eventCategory", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "customData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FireEvent", - "Parameters": [ - { - "Name": "category", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FireInGameEconomyEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "itemName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "economyAction", - "Type": { - "Category": "Enum", - "Name": "AnalyticsEconomyAction" - } - }, - { - "Name": "itemCategory", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "amount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "currency", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "location", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "customData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FireLogEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "logLevel", - "Type": { - "Category": "Enum", - "Name": "AnalyticsLogLevel" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "debugInfo", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "customData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FirePlayerProgressionEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "category", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "progressionStatus", - "Type": { - "Category": "Enum", - "Name": "AnalyticsProgressionStatus" - } - }, - { - "Name": "location", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "statistics", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "customData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "InternalTest" - ], - "MemberType": "Function", - "Name": "GetDurationLoggerTimestamp", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "LogCustomEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "1", - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Default": "nil", - "Name": "customFields", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "LogEconomyEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "flowType", - "Type": { - "Category": "Enum", - "Name": "AnalyticsEconomyFlowType" - } - }, - { - "Name": "currencyType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "amount", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "endingBalance", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "transactionType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "itemSku", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "customFields", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "LogFunnelStepEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "funnelName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "funnelSessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "1", - "Name": "step", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "", - "Name": "stepName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "customFields", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "LogOnboardingFunnelStepEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "step", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "", - "Name": "stepName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "customFields", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "LogProgressionCompleteEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "progressionPathName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "level", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "", - "Name": "levelName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "customFields", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "LogProgressionEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "progressionPathName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "AnalyticsProgressionType" - } - }, - { - "Name": "level", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "", - "Name": "levelName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "customFields", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "LogProgressionFailEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "progressionPathName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "level", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "", - "Name": "levelName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "customFields", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "LogProgressionStartEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "progressionPathName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "level", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "", - "Name": "levelName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "customFields", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AnalyticsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "AnimationId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Animation", - "Name": "Animation", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Guid", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "GuidBinaryString", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Loop", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Priority", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AnimationClip", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "AnimationGraphDefinition", - "Superclass": "AnimationClip" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CurveAnimation", - "Superclass": "AnimationClip" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "2", - "MemberType": "Property", - "Name": "AuthoredHipHeight", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "AddKeyframe", - "Parameters": [ - { - "Name": "keyframe", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetKeyframes", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RemoveKeyframe", - "Parameters": [ - { - "Name": "keyframe", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "KeyframeSequence", - "Superclass": "AnimationClip" - }, - { - "Members": [ - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetAnimationClip", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationClip" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetAnimationClipAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetAnimationClipById", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "useCache", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationClip" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetAnimationClipAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetAnimationNodeDefinition", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Enum", - "Name": "AnimationNodeType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetAnimationNodeTypes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetMemStats", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RegisterActiveAnimationClip", - "Parameters": [ - { - "Name": "animationClip", - "Type": { - "Category": "Class", - "Name": "AnimationClip" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "ContentId" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RegisterAnimationClip", - "Parameters": [ - { - "Name": "animationClip", - "Type": { - "Category": "Class", - "Name": "AnimationClip" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "ContentId" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetAnimationClipAsync", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationClip" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetAnimations", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetAnimationsAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetAnimationsAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetClipEvaluatorAsync", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "ClipEvaluator" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "AnimationClipProvider", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetPlayingAnimationTracks", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPlayingAnimationTracks", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "LoadAnimation", - "Parameters": [ - { - "Name": "animation", - "Type": { - "Category": "Class", - "Name": "Animation" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationTrack" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "LoadAnimation", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "AnimationPlayed", - "Parameters": [ - { - "Name": "animationTrack", - "Type": { - "Category": "Class", - "Name": "AnimationTrack" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "AnimationPlayed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "AnimationController", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CreateJob", - "Parameters": [ - { - "Name": "filePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DownloadJobResult", - "Parameters": [ - { - "Name": "jobId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "outputFilePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FullProcess", - "Parameters": [ - { - "Name": "videoFilePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "progressCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetJobStatus", - "Parameters": [ - { - "Name": "jobId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AnimationFromVideoCreatorService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "IsAgeRestricted", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateAnimationByUploadingVideo", - "Parameters": [ - { - "Name": "progressCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ImportVideoWithPrompt", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AnimationFromVideoCreatorStudioService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "\u0001", - "MemberType": "Property", - "Name": "InputPinData", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "NodeId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Animation", - "Default": "InvalidNode", - "MemberType": "Property", - "Name": "NodeType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationNodeType" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "AddInputPin", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetOrderedInputPinNames", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RemoveInputPin", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetOrderedInputPinNames", - "Parameters": [ - { - "Name": "pins", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "InputPinsChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AnimationNodeDefinition", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "animation", - "Default": "\u0001", - "MemberType": "Property", - "Name": "label", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "animation", - "Default": "\u0001", - "MemberType": "Property", - "Name": "name", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "animation", - "Default": "\u0001", - "MemberType": "Property", - "Name": "parent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "animation", - "Default": "\u0001", - "MemberType": "Property", - "Name": "postTransform", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "animation", - "Default": "\u0001", - "MemberType": "Property", - "Name": "preTransform", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "animation", - "Default": "\u0001", - "MemberType": "Property", - "Name": "transform", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetLabels", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetNames", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetParents", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetPostTransforms", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetPreTransforms", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetTransforms", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "IsValidR15", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "LoadFromHumanoid", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "LoadFromModel", - "Parameters": [ - { - "Name": "model", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AnimationRigData", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Animation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "TrackerStreamAnimation" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FACSDataLod", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FACSDataLod" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsPlaying", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Priority", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "WeightCurrent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "WeightTarget", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "MemberType": "Function", - "Name": "AdjustWeight", - "Parameters": [ - { - "Default": "1", - "Name": "weight", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "0.100000001", - "Name": "fadeTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetActive", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTrackerData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Play", - "Parameters": [ - { - "Default": "0.100000001", - "Name": "fadeTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "1", - "Name": "weight", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Stop", - "Parameters": [ - { - "Default": "0.100000001", - "Name": "fadeTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TogglePause", - "Parameters": [ - { - "Name": "paused", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Stopped", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "AnimationStreamTrack", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Animation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Animation" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsPlaying", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Length", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Looped", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Priority", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Speed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TimePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "WeightCurrent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "WeightTarget", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "AdjustSpeed", - "Parameters": [ - { - "Default": "1", - "Name": "speed", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "AdjustWeight", - "Parameters": [ - { - "Default": "1", - "Name": "weight", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "0.100000001", - "Name": "fadeTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetDebugData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetMarkerReachedSignal", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetParameter", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetParameterDefaults", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetTargetInstance", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetTargetNames", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetTimeOfKeyframe", - "Parameters": [ - { - "Name": "keyframeName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "Play", - "Parameters": [ - { - "Default": "0.100000001", - "Name": "fadeTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "1", - "Name": "weight", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "1", - "Name": "speed", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetParameter", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetTargetInstance", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "Stop", - "Parameters": [ - { - "Default": "0.100000001", - "Name": "fadeTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "DidLoop", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "Ended", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "KeyframeReached", - "Parameters": [ - { - "Name": "keyframeName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "Stopped", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "AnimationTrack", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "AnimationId0", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "AnimationId1", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "AnimationId2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "AnimationId3", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "AnimationId4", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "AnimationId5", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "AnimationId6", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "AnimationId7", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "EvaluationThrottled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Safe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Control", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FacsReplicationData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "FacsReplicationData" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "FadeTime0", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "FadeTime1", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "FadeTime2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "FadeTime3", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "FadeTime4", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "FadeTime5", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "FadeTime6", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "FadeTime7", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying0", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying1", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying3", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying4", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying5", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying6", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying7", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Looped0", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Looped1", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Looped2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Looped3", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Looped4", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Looped5", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Looped6", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Looped7", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "PlaybackSpeed0", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "PlaybackSpeed1", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "PlaybackSpeed2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "PlaybackSpeed3", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "PlaybackSpeed4", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "PlaybackSpeed5", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "PlaybackSpeed6", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "PlaybackSpeed7", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "PreferLodEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "Core", - "MemberType": "Property", - "Name": "Priority0", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "Core", - "MemberType": "Property", - "Name": "Priority1", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "Core", - "MemberType": "Property", - "Name": "Priority2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "Core", - "MemberType": "Property", - "Name": "Priority3", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "Core", - "MemberType": "Property", - "Name": "Priority4", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "Core", - "MemberType": "Property", - "Name": "Priority5", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "Core", - "MemberType": "Property", - "Name": "Priority6", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "Core", - "MemberType": "Property", - "Name": "Priority7", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RootMotion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotBrowsable" - ], - "ThreadSafety": "Safe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "0", - "MemberType": "Property", - "Name": "RootMotionWeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotBrowsable" - ], - "ThreadSafety": "Safe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition0", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition1", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition3", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition4", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition5", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition6", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition7", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightCurrent0", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightCurrent1", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightCurrent2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightCurrent3", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightCurrent4", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightCurrent5", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightCurrent6", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightCurrent7", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightTarget0", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightTarget1", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightTarget2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightTarget3", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightTarget4", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightTarget5", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightTarget6", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "WeightTarget7", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "ApplyJointVelocities", - "Parameters": [ - { - "Name": "motors", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetPlayingAnimationTracks", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetPlayingAnimationTracksCoreScript", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "LoadAnimation", - "Parameters": [ - { - "Name": "animation", - "Type": { - "Category": "Class", - "Name": "Animation" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationTrack" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "LoadAnimationCoreScript", - "Parameters": [ - { - "Name": "animation", - "Type": { - "Category": "Class", - "Name": "Animation" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationTrack" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "LoadStreamAnimation", - "Parameters": [ - { - "Name": "animation", - "Type": { - "Category": "Class", - "Name": "TrackerStreamAnimation" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationStreamTrack" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "LoadStreamAnimationForSelfieView_deprecated", - "Parameters": [ - { - "Name": "animation", - "Type": { - "Category": "Class", - "Name": "TrackerStreamAnimation" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationStreamTrack" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "LoadStreamAnimationV2", - "Parameters": [ - { - "Name": "animation", - "Type": { - "Category": "Class", - "Name": "TrackerStreamAnimation" - } - }, - { - "Default": "nil", - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Default": "true", - "Name": "shouldLookupPlayer", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "true", - "Name": "shouldReplicate", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationStreamTrack" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RegisterEvaluationParallelCallback", - "Parameters": [ - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "StepAnimations", - "Parameters": [ - { - "Name": "deltaTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "StepAnimationsInternal", - "Parameters": [ - { - "Name": "deltaTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SynchronizeWith", - "Parameters": [ - { - "Name": "otherAnimator", - "Type": { - "Category": "Class", - "Name": "Animator" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "AnimationPlayed", - "Parameters": [ - { - "Name": "animationTrack", - "Type": { - "Category": "Class", - "Name": "AnimationTrack" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "AnimationPlayedCoreScript", - "Parameters": [ - { - "Name": "animationTrack", - "Type": { - "Category": "Class", - "Name": "AnimationTrack" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "AnimationStreamTrackPlayed", - "Parameters": [ - { - "Name": "animationTrack", - "Type": { - "Category": "Class", - "Name": "AnimationStreamTrack" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "OnCombinedUpdate", - "Parameters": [ - { - "Name": "animation", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "playState", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "fadeTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "weight", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "speed", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "timePosition", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "priority", - "Type": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Name": "looping", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "valuesUpdated", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "OnStreamingUpdated2", - "Parameters": [ - { - "Name": "fadeTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "weight", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "priority", - "Type": { - "Category": "Enum", - "Name": "AnimationPriority" - } - }, - { - "Name": "maskEnabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "valuesUpdated", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "StreamSyncRequest", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Animator", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "AuthorColor3", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "AuthorId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ChannelId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Contents", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CreationTimeUnix", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "LastModifiedTimeUnix", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "LoadingReplies", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "MessageId", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "ReplyCount", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Resolved", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "TaggedUsers", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "GetRequests", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStringUniqueId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsThreadParent", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RequestCompleted", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "requestType", - "Type": { - "Category": "Enum", - "Name": "AnnotationRequestType" - } - }, - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "AnnotationRequestStatus" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RequestInitiated", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "requestType", - "Type": { - "Category": "Enum", - "Name": "AnnotationRequestType" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Annotation", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Adornee", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "PVInstance" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "AdorneeOffset", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "MemberType": "Function", - "Name": "GetAbsolutePosition", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetAdorneeOffsetFromAbsolutePosition", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "WorkspaceAnnotation", - "Superclass": "Annotation" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "Loading", - "MemberType": "Property", - "Name": "AnnotationsLoadingStatus", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnnotationRequestStatus" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "AnnotationsVisible", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Hovered", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Annotation" - } - }, - { - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "Mode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnnotationEditingMode" - } - }, - { - "Category": "Data", - "Default": "Loading", - "MemberType": "Property", - "Name": "ResolvedLoadingStatus", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnnotationRequestStatus" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Selected", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Annotation" - } - }, - { - "MemberType": "Function", - "Name": "CreateAnnotation", - "Parameters": [ - { - "Name": "annotation", - "Type": { - "Category": "Class", - "Name": "Annotation" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateOrUpdatePlacePreference", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "placeContentPreference", - "Type": { - "Category": "Enum", - "Name": "PlaceContentPreference" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DeleteAnnotation", - "Parameters": [ - { - "Name": "annotation", - "Type": { - "Category": "Class", - "Name": "Annotation" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "EditAnnotation", - "Parameters": [ - { - "Name": "uniqueId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "contents", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "taggedUsers", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAnnotationThreads", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPlacePreference", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "PlaceContentPreference" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LoadAnnotationReplies", - "Parameters": [ - { - "Name": "annotation", - "Type": { - "Category": "Class", - "Name": "Annotation" - } - }, - { - "Name": "reverseOrder", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "loadAll", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LoadAnnotations", - "Parameters": [ - { - "Name": "resolved", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LoadResolvedAnnotations", - "Parameters": [ - { - "Name": "count", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResolveAnnotation", - "Parameters": [ - { - "Name": "annotation", - "Type": { - "Category": "Class", - "Name": "Annotation" - } - }, - { - "Name": "resolved", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateOrUpdateChannelPreferenceAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "channelId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "channelContentPreference", - "Type": { - "Category": "Enum", - "Name": "AnnotationChannelContentPreference" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateOrUpdatePlacePreferenceAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "placeContentPreference", - "Type": { - "Category": "Enum", - "Name": "AnnotationPlaceContentPreference" - } - }, - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetChannelPreferenceAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "channelId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "AnnotationChannelContentPreference" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPlacePreferenceAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "AnnotationPlaceContentPreference" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AnnotationAdded", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "annotation", - "Type": { - "Category": "Class", - "Name": "Annotation" - } - }, - { - "Name": "channelId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AnnotationDeleted", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "annotation", - "Type": { - "Category": "Class", - "Name": "Annotation" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AnnotationEdited", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "uniqueId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "contents", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "taggedUsers", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AnnotationResolved", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "annotation", - "Type": { - "Category": "Class", - "Name": "Annotation" - } - }, - { - "Name": "resolved", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ServerLoadAnnotationReplies", - "Parameters": [ - { - "Name": "annotation", - "Type": { - "Category": "Class", - "Name": "Annotation" - } - }, - { - "Name": "reverseOrder", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "loadAll", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ServerLoadAnnotations", - "Parameters": [ - { - "Name": "resolved", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ServerLoadResolvedAnnotations", - "Parameters": [ - { - "Name": "count", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AnnotationsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetCurrentState", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "AppLifecycleManagerState" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsDidDetachSupported", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TriggerOnLandingPageMount", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TriggerOnLuaAppInteractive", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnBecomeActive", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnDetach", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnHide", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnResignActive", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnStart", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnUnhide", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AppLifecycleObserverService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "isAppRatingPromptAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "showAppRatingPrompt", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnGameLeft", - "Parameters": [ - { - "Name": "gameTime", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AppRatingPromptService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CanPerformBinaryUpdate", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CheckForUpdate", - "Parameters": [ - { - "Default": "nil", - "Name": "handler", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformManagedUpdate", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AppUpdateService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "AssetCounterService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Interface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Port", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "StartServer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AssetDeliveryProxy", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetAllPresets", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPreset", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemovePreset", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SavePreset", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "preset", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartSessionWithPath", - "Parameters": [ - { - "Name": "filePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AssetImportSession" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFilesInDirAsync", - "Parameters": [ - { - "Name": "path", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PickFileWithPromptAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PickImageFileWithPrompt", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PickMeshFileWithPrompt", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PickMultipleFilesWithPrompt", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartSessionWithPathAsync", - "Parameters": [ - { - "Name": "filePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AssetImportSession" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UploadAssetFromContentAsync", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "createAssetRequest", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UploadAssetFromPathAsync", - "Parameters": [ - { - "Name": "filepath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "createAssetRequest", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StartSingleMeshImport", - "Parameters": [ - { - "Name": "fileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AssetImportService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetMeshIdFromAliasName", - "Parameters": [ - { - "Name": "aliasName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMeshIdFromAssetId", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTextureIdFromAliasName", - "Parameters": [ - { - "Name": "aliasName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTextureIdFromAssetId", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InsertAudio", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "assetName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InsertImage", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InsertImages", - "Parameters": [ - { - "Name": "assetIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InsertMesh", - "Parameters": [ - { - "Name": "aliasName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "insertWithLocation", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "sourceAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InsertMeshesWithLocation", - "Parameters": [ - { - "Name": "aliasNames", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "meshIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InsertModel", - "Parameters": [ - { - "Name": "modelId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InsertPackage", - "Parameters": [ - { - "Name": "packageId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InsertVideo", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "assetName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenPlace", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowPackageDetails", - "Parameters": [ - { - "Name": "packageId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdateAllPackages", - "Parameters": [ - { - "Name": "packageId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ViewPackageOnWebsite", - "Parameters": [ - { - "Name": "packageId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AddNewPlace", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateAlias", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "aliasName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DeleteAlias", - "Parameters": [ - { - "Name": "aliasName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemovePlace", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RenameAlias", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "oldAliasName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newAliasName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RenameModel", - "Parameters": [ - { - "Name": "modelId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "newName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RenamePlace", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "newName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AssetImportedSignal", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AssetType" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "assetName", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ImportSessionFinished", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ImportSessionStarted", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AssetManagerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ContentId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "OutputPath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PatchId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AssetPatchSettings", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "FetchAssetQualitySummaryFromGltfAsync", - "Parameters": [ - { - "Name": "gltfData", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "desiredQualityChecks", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FetchAssetQualityVisualizationDataFromUrlAsync", - "Parameters": [ - { - "Name": "visualizationUrl", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GenerateAssetQualityGltfFromInstanceAsync", - "Parameters": [ - { - "Name": "uploadModel", - "Type": { - "Category": "Class", - "Name": "Model" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AssetQualityService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AllowInsertFreeAssets", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "CreateEditableImage", - "Parameters": [ - { - "Name": "editableImageOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "EditableImage" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "CreateEditableMesh", - "Parameters": [ - { - "Name": "editableMeshOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "EditableMesh" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DeserializeInstance", - "Parameters": [ - { - "Name": "serializedInstance", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetOpaqueContentMetadataMap", - "Parameters": [ - { - "Name": "opaqueContent", - "Type": { - "Category": "DataType", - "Name": "Content" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CachePartOperationsAsync", - "Parameters": [ - { - "Name": "partOperations", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CanEditAssetAsync", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "DataType", - "Name": "Content" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ComposeDecalAsync", - "Parameters": [ - { - "Name": "decal", - "Type": { - "Category": "Class", - "Name": "Decal" - } - }, - { - "Name": "layers", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetCreateUpdate" - ], - "MemberType": "Function", - "Name": "CreateAssetAsync", - "Parameters": [ - { - "Name": "object", - "Type": { - "Category": "Class", - "Name": "Object" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AssetType" - } - }, - { - "Default": "nil", - "Name": "requestParameters", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetCreateUpdate" - ], - "MemberType": "Function", - "Name": "CreateAssetVersionAsync", - "Parameters": [ - { - "Name": "object", - "Type": { - "Category": "Class", - "Name": "Object" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AssetType" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "nil", - "Name": "requestParameters", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "CreateEditableImageAsync", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Name": "editableImageOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "EditableImage" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "CreateEditableMeshAsync", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Name": "editableMeshOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "EditableMesh" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "CreateMeshPartAsync", - "Parameters": [ - { - "Name": "meshContent", - "Type": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MeshPart" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetCreateUpdate" - ], - "MemberType": "Function", - "Name": "CreatePlaceAsync", - "Parameters": [ - { - "Name": "placeName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "templatePlaceID", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "", - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetCreateUpdate" - ], - "MemberType": "Function", - "Name": "CreatePlaceInPlayerInventoryAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "placeName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "templatePlaceID", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "", - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "CreateSurfaceAppearanceAsync", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "SurfaceAppearance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetAssetIdsForPackage", - "Parameters": [ - { - "Name": "packageAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetAssetIdsForPackageAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetAssetIdsForPackageAsync", - "Parameters": [ - { - "Name": "packageAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetAudioMetadataAsync", - "Parameters": [ - { - "Name": "idList", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetBundleDetailsAsync", - "Parameters": [ - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCreatorAssetID", - "Parameters": [ - { - "Name": "creationID", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetProductInfo", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetGamePlacesAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRequire" - ], - "MemberType": "Function", - "Name": "LoadAssetAsync", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetCreateUpdate" - ], - "MemberType": "Function", - "Name": "PromptCreateAssetAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AssetType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "PromptImportAnimationClipFromVideoAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "progressCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetCreateUpdate" - ], - "MemberType": "Function", - "Name": "SavePlaceAsync", - "Parameters": [ - { - "Name": "requestParameters", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "SearchAudio", - "Parameters": [ - { - "Name": "searchParameters", - "Type": { - "Category": "Class", - "Name": "AudioSearchParams" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AudioPages" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "SearchAudioAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "SearchAudioAsync", - "Parameters": [ - { - "Name": "searchParameters", - "Type": { - "Category": "Class", - "Name": "AudioSearchParams" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AudioPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AudioMetadataFailedResponse", - "Parameters": [ - { - "Name": "requestid", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AudioMetadataRequest", - "Parameters": [ - { - "Name": "requestid", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "request", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AudioMetadataResponse", - "Parameters": [ - { - "Name": "requestid", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "response", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenCreateResultModal", - "Parameters": [ - { - "Name": "resultType", - "Type": { - "Category": "Enum", - "Name": "PromptCreateAssetResult" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenPublishResultModal", - "Parameters": [ - { - "Name": "resultType", - "Type": { - "Category": "Enum", - "Name": "PromptPublishAssetResult" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AssetService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0.7843, 0.6667, 0.4235", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0.3608, 0.2353, 0.0549", - "MemberType": "Property", - "Name": "Decay", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.395000011", - "MemberType": "Property", - "Name": "Density", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "Glare", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "Haze", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "Offset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Atmosphere", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Derived Data", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "Axis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Transform", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "CFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Transform", - "Default": "-0, 0, 0", - "MemberType": "Property", - "Name": "Orientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Transform", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Transform", - "Default": "-0, 0, -0", - "MemberType": "Property", - "Name": "Rotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Orientation", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Derived Data", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "SecondaryAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "Visible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Derived World Data", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "WorldAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Derived World Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "WorldCFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Derived World Data", - "Default": "-0, 0, 0", - "MemberType": "Property", - "Name": "WorldOrientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Derived World Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "WorldPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Derived World Data", - "Default": "-0, 0, -0", - "MemberType": "Property", - "Name": "WorldRotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "WorldOrientation", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Derived World Data", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "WorldSecondaryAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetAxis", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Axis", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetConstraints", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetSecondaryAxis", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SecondaryAxis", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetAxis", - "Parameters": [ - { - "Name": "axis", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Axis", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetSecondaryAxis", - "Parameters": [ - { - "Name": "axis", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SecondaryAxis", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Attachment", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "Animation" - ] - }, - "Category": "Transform", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Transform", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Animation" - ] - }, - "Category": "Derived Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "TransformedCFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Animation" - ] - }, - "Category": "Derived World Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "TransformedWorldCFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Bone", - "Superclass": "Attachment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Metering", - "Default": "0", - "MemberType": "Property", - "Name": "PeakLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Metering", - "Default": "0", - "MemberType": "Property", - "Name": "RmsLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Metering", - "Default": "true", - "MemberType": "Property", - "Name": "SpectrumEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "Medium", - "MemberType": "Property", - "Name": "WindowSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioWindowSize" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetSpectrum", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioAnalyzer", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "Stereo", - "MemberType": "Property", - "Name": "Layout", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioChannelLayout" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioChannelMixer", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "Stereo", - "MemberType": "Property", - "Name": "Layout", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioChannelLayout" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioChannelSplitter", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.449999988", - "MemberType": "Property", - "Name": "Depth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.850000024", - "MemberType": "Property", - "Name": "Mix", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "5", - "MemberType": "Property", - "Name": "Rate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioChorus", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.100000001", - "MemberType": "Property", - "Name": "Attack", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State Editing", - "Default": "false", - "MemberType": "Property", - "Name": "Editor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "MakeupGain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "40", - "MemberType": "Property", - "Name": "Ratio", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.100000001", - "MemberType": "Property", - "Name": "Release", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "-40", - "MemberType": "Property", - "Name": "Threshold", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioCompressor", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio", - "Input" - ] - }, - "Category": "Permissions", - "Default": "", - "MemberType": "Property", - "Name": "AccessList", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Input" - ] - }, - "Category": "Permissions", - "Default": "Deny", - "MemberType": "Property", - "Name": "AccessType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AccessModifierType" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Input" - ] - }, - "Category": "Recording", - "Default": "true", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Input" - ] - }, - "Category": "Recording", - "Default": "false", - "MemberType": "Property", - "Name": "IsReady", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Input" - ] - }, - "Category": "Recording", - "Default": "false", - "MemberType": "Property", - "Name": "Muted", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Input" - ] - }, - "Category": "Recording", - "Default": "false", - "MemberType": "Property", - "Name": "MutedByLocalUser", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Input", - "Players" - ], - "Write": [ - "Audio", - "Players" - ] - }, - "Category": "Recording", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Player", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Input" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Volume", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio", - "Input" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Input" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Input" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Input" - ], - "MemberType": "Function", - "Name": "GetUserIdAccessList", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Input" - ], - "MemberType": "Function", - "Name": "SetUserIdAccessList", - "Parameters": [ - { - "Name": "userIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Input" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioDeviceInput", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Player", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioDeviceOutput", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.5", - "MemberType": "Property", - "Name": "Level", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioDistortion", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "DelayTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "DryLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.5", - "MemberType": "Property", - "Name": "Feedback", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "RampTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "WetLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Reset", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioEcho", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Simulation", - "Default": "true", - "MemberType": "Property", - "Name": "AcousticSimulationEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Emission", - "Default": "", - "MemberType": "Property", - "Name": "AngleAttenuation", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Interactions", - "Default": "", - "MemberType": "Property", - "Name": "AudioInteractionGroup", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Emission", - "Default": "", - "MemberType": "Property", - "Name": "DistanceAttenuation", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "PositionOverride", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Simulation", - "Default": "Automatic", - "MemberType": "Property", - "Name": "SimulationFidelity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "AcousticSimulationEnabled", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioSimulationFidelity" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetAngleAttenuation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetAudibilityFor", - "Parameters": [ - { - "Name": "listener", - "Type": { - "Category": "Class", - "Name": "AudioListener" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetDistanceAttenuation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInteractingListeners", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetAngleAttenuation", - "Parameters": [ - { - "Name": "curve", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetDistanceAttenuation", - "Parameters": [ - { - "Name": "curve", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioEmitter", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State Editing", - "Default": "false", - "MemberType": "Property", - "Name": "Editor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "HighGain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "LowGain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "MidGain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "400 4000 ", - "MemberType": "Property", - "Name": "MidRange", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioEqualizer", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Volume", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioFader", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State Editing", - "Default": "false", - "MemberType": "Property", - "Name": "Editor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "Peak", - "MemberType": "Property", - "Name": "FilterType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioFilterType" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "2000", - "MemberType": "Property", - "Name": "Frequency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "Gain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.707000017", - "MemberType": "Property", - "Name": "Q", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetGainAt", - "Parameters": [ - { - "Name": "frequency", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioFilter", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.449999988", - "MemberType": "Property", - "Name": "Depth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.850000024", - "MemberType": "Property", - "Name": "Mix", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "5", - "MemberType": "Property", - "Name": "Rate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioFlanger", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "AcquireFocus", - "Parameters": [ - { - "Name": "contextId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFocusedContextId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRegisteredContexts", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterContextIdFromLua", - "Parameters": [ - { - "Name": "contextId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RequestFocus", - "Parameters": [ - { - "Name": "contextId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnContextRegistered", - "Parameters": [ - { - "Name": "contextId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnContextUnregistered", - "Parameters": [ - { - "Name": "contextId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnDeafenVoiceAudio", - "Parameters": [ - { - "Name": "contextId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnUndeafenVoiceAudio", - "Parameters": [ - { - "Name": "contextId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AudioFocusService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.00999999978", - "MemberType": "Property", - "Name": "Attack", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.100000001", - "MemberType": "Property", - "Name": "Release", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "-36 -24 ", - "MemberType": "Property", - "Name": "Threshold", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Reset", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioGate", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State Editing", - "Default": "false", - "MemberType": "Property", - "Name": "Editor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "MaxLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.00999999978", - "MemberType": "Property", - "Name": "Release", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioLimiter", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Simulation", - "Default": "true", - "MemberType": "Property", - "Name": "AcousticSimulationEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Listening", - "Default": "", - "MemberType": "Property", - "Name": "AngleAttenuation", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Interactions", - "Default": "", - "MemberType": "Property", - "Name": "AudioInteractionGroup", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Listening", - "Default": "", - "MemberType": "Property", - "Name": "DistanceAttenuation", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "PositionOverride", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Simulation", - "Default": "Automatic", - "MemberType": "Property", - "Name": "SimulationFidelity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "AcousticSimulationEnabled", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioSimulationFidelity" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetAngleAttenuation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetAudibilityFor", - "Parameters": [ - { - "Name": "emitter", - "Type": { - "Category": "Class", - "Name": "AudioEmitter" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetDistanceAttenuation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInteractingEmitters", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Reset", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetAngleAttenuation", - "Parameters": [ - { - "Name": "curve", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetDistanceAttenuation", - "Parameters": [ - { - "Name": "curve", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioListener", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "1.25", - "MemberType": "Property", - "Name": "Pitch", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "Medium", - "MemberType": "Property", - "Name": "WindowSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioWindowSize" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioPitchShifter", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "", - "MemberType": "Property", - "Name": "Asset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "", - "MemberType": "Property", - "Name": "AssetId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Asset", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "AudioContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "true", - "MemberType": "Property", - "Name": "AutoLoad", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "AutoPlay", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsMutedForCapture", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying", - "Security": { - "Read": "None", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "false", - "MemberType": "Property", - "Name": "IsReady", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Regions", - "Default": "0 60000 ", - "MemberType": "Property", - "Name": "LoopRegion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "Looping", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Regions", - "Default": "0 60000 ", - "MemberType": "Property", - "Name": "PlaybackRegion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Playback", - "Default": "1", - "MemberType": "Property", - "Name": "PlaybackSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "0", - "MemberType": "Property", - "Name": "TimeLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Playback", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Volume", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Play", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Stop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetWaveformAsync", - "Parameters": [ - { - "Name": "timeRange", - "Type": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Name": "samples", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "Ended", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "Looped", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioPlayer", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "IsRecording", - "Security": { - "Read": "None", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimeLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Clear", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetTemporaryContent", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Content" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Stop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "CanRecordAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetUnrecordableInstancesAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "RecordAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioRecorder", - "Superclass": "Instance", - "Tags": [ - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.5", - "MemberType": "Property", - "Name": "DecayRatio", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "1.5", - "MemberType": "Property", - "Name": "DecayTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Density", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Diffusion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "DryLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.0199999996", - "MemberType": "Property", - "Name": "EarlyDelayTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "20000", - "MemberType": "Property", - "Name": "HighCutFrequency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.0399999991", - "MemberType": "Property", - "Name": "LateDelayTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "250", - "MemberType": "Property", - "Name": "LowShelfFrequency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "LowShelfGain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "5000", - "MemberType": "Property", - "Name": "ReferenceFrequency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "-6", - "MemberType": "Property", - "Name": "WetLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Reset", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioReverb", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Album", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Artist", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "Music", - "MemberType": "Property", - "Name": "AudioSubType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioSubType" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "Music", - "MemberType": "Property", - "Name": "AudioSubtype", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "AudioSubType", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioSubType" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "2147483647", - "MemberType": "Property", - "Name": "MaxDuration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MinDuration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "SearchKeyword", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Tag", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Title", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AudioSearchParams", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "VoiceDetected", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioSpeechToText", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "false", - "MemberType": "Property", - "Name": "IsLoaded", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying", - "Security": { - "Read": "None", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "Looping", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "0", - "MemberType": "Property", - "Name": "Pitch", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Playback", - "Default": "1", - "MemberType": "Property", - "Name": "PlaybackSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "1", - "MemberType": "Property", - "Name": "Speed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "0", - "MemberType": "Property", - "Name": "TimeLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Playback", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Asset", - "Default": "", - "MemberType": "Property", - "Name": "VoiceId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Volume", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Pause", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Play", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "Unload", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetWaveformAsync", - "Parameters": [ - { - "Name": "timeRange", - "Type": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Name": "samples", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "LoadAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "AssetFetchStatus" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "Ended", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "Looped", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioTextToSpeech", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Bypass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Depth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0.5", - "MemberType": "Property", - "Name": "Duty", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "5", - "MemberType": "Property", - "Name": "Frequency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "Shape", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "Skew", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "Square", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AudioTremolo", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "BehaviorWeak", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "AuroraScript" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "BoundInstanceWeak", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "FrameId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LODLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MaxFrequency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PriorFrameInvoked", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "GetCurrentState", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "SetStateFieldValue", - "Parameters": [ - { - "Name": "fieldName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - } - ], - "MemoryCategory": "Instances", - "Name": "AuroraScriptObject", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FindBinding", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "scriptName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Object" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FindBindings", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetLocalFrameId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SendMessage", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "behaviorName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "functionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "getBehaviorObjects", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "getBehaviors", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "getBehaviorsForInstance", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "getInstancesForBehavior", - "Parameters": [ - { - "Name": "behavior", - "Type": { - "Category": "Class", - "Name": "AuroraScript" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AuroraScriptService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "Deprecated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BufferFullInputCount", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HashRoundingPoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IgnoreRotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InputDropRate", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LockStepIdOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "OutOfOrderInputCount", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RCCHeartbeatFPS", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RollbackOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TooOldInputCount", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "GetPredictedInstances", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRemoteWorldStepId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetServerView", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetWorldStepId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsInstancePredicted", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PlayInputRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetIncomingReplicationLag", - "Parameters": [ - { - "Name": "seconds", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowDebugVisualizer", - "Parameters": [ - { - "Name": "state", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartInputRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartPrediction", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StepPhysics", - "Parameters": [ - { - "Name": "worldSteps", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "{}", - "Name": "parts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StopInputRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StopPrediction", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdateProperties", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "FixedRateTick", - "Parameters": [ - { - "Name": "deltaTime", - "Type": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Name": "worldStepId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Misprediction", - "Parameters": [ - { - "Name": "remoteWorldStepId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "mispredictedInstances", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Rollback", - "Parameters": [ - { - "Name": "worldStepId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Step", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AuroraService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "Deprecated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "PlayerChoice", - "MemberType": "Property", - "Name": "AccessoryMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsAccessoryMode" - } - }, - { - "Category": "Data", - "Default": "PlayerChoice", - "MemberType": "Property", - "Name": "CustomAccessoryMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsCustomAccessoryMode" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomBackAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomBackAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomFaceAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomFaceAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomFrontAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomFrontAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomHairAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomHairAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomHeadAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomHeadAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomNeckAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomNeckAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomShoulderAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomShoulderAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomWaistAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomWaistAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "EnableSound", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "EnableVFX", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LimitBounds", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Data", - "Default": "Remove", - "MemberType": "Property", - "Name": "LimitMethod", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsAccessoryLimitMethod" - } - }, - { - "MemberType": "Function", - "Name": "willRemoveAccessory", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Humanoid" - } - }, - { - "Name": "accessory", - "Type": { - "Category": "Class", - "Name": "Accoutrement" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarAccessoryRules", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "PlayerChoice", - "MemberType": "Property", - "Name": "AnimationClipsMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsAnimationClipsMode" - } - }, - { - "Category": "Data", - "Default": "PlayerChoice", - "MemberType": "Property", - "Name": "AnimationPacksMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsAnimationPacksMode" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomClimbAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomClimbAnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomFallAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomFallAnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomIdleAlt1AnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomIdleAlt1AnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomIdleAlt2AnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomIdleAlt2AnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomIdleAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomIdleAnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomJumpAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomJumpAnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomRunAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomRunAnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomSwimAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomSwimAnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomSwimIdleAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomSwimIdleAnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomWalkAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomWalkAnimationId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarAnimationRules", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "PlayerChoice", - "MemberType": "Property", - "Name": "AppearanceMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsAppearanceMode" - } - }, - { - "Category": "Data", - "Default": "PlayerChoice", - "MemberType": "Property", - "Name": "BuildMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsBuildMode" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomBodyBundleId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "AvatarReference", - "MemberType": "Property", - "Name": "CustomBodyType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsCustomBodyType" - } - }, - { - "Category": "Data", - "Default": "0 1 ", - "MemberType": "Property", - "Name": "CustomBodyTypeScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomEyebrowEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomEyebrowId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomEyelashEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomEyelashId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomFaceEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomFaceId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomHeadEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomHeadId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0.95 1 ", - "MemberType": "Property", - "Name": "CustomHeadScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Category": "Data", - "Default": "5.5 5.5 ", - "MemberType": "Property", - "Name": "CustomHeight", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Category": "Data", - "Default": "0.9 1.05 ", - "MemberType": "Property", - "Name": "CustomHeightScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomLeftArmEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomLeftArmId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomLeftLegEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomLeftLegId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomMoodEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomMoodId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0 1 ", - "MemberType": "Property", - "Name": "CustomProportionsScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomRightArmEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomRightArmId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomRightLegEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomRightLegId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomTorsoEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomTorsoId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0.7 1 ", - "MemberType": "Property", - "Name": "CustomWidthScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "KeepPlayerHead", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "PlayerChoice", - "MemberType": "Property", - "Name": "ScaleMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsScaleMode" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarBodyRules", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "ClientFeatures", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "ClientFeaturesInitialized", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "ServerFeatures", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "DebugCounterGet", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "EnableVoice", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsEnabled", - "Parameters": [ - { - "Name": "mask", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "feature", - "Type": { - "Category": "Enum", - "Name": "AvatarChatServiceFeature" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsPlaceEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsUniverseEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PollClientFeatures", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PollServerFeatures", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "deviceMeetsRequirementsForFeature", - "Parameters": [ - { - "Name": "feature", - "Type": { - "Category": "Enum", - "Name": "DeviceFeatureType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetClientFeaturesAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetServerFeaturesAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnClientFeatures", - "Parameters": [ - { - "Name": "features", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RefreshClientFeatures", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarChatService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "PlayerChoice", - "MemberType": "Property", - "Name": "ClothingMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsClothingMode" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomClassicPantsAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomClassicPantsAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomClassicShirtsAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomClassicShirtsAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomClassicTShirtsAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomClassicTShirtsAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "PlayerChoice", - "MemberType": "Property", - "Name": "CustomClothingMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsCustomClothingMode" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomDressSkirtAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomDressSkirtAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomJacketAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomJacketAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomLeftShoesAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomLeftShoesAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomPantsAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomPantsAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomRightShoesAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomRightShoesAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomShirtAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomShirtAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomShortsAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomShortsAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomSweaterAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomSweaterAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CustomTShirtAccessoryEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CustomTShirtAccessoryId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LimitBounds", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarClothingRules", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "CollisionMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsCollisionMode" - } - }, - { - "Category": "Data", - "Default": "UseParts", - "MemberType": "Property", - "Name": "HitAndTouchDetectionMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsHitAndTouchDetectionMode" - } - }, - { - "Category": "Data", - "Default": "InnerBoxColliders", - "MemberType": "Property", - "Name": "LegacyCollisionMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarSettingsLegacyCollisionMode" - } - }, - { - "Category": "Data", - "Default": "2, 3, 1", - "MemberType": "Property", - "Name": "SingleColliderSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarCollisionRules", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "DeserializeAvatarModel", - "Parameters": [ - { - "Name": "serializedModel", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetValidationRules", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HandleSelfieConsentResult", - "Parameters": [ - { - "Name": "consentAccepted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HandleSelfieQRResult", - "Parameters": [ - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "resultString", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "AutoSetupAvatarAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "autoSetupParams", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "progressCallback", - "Type": { - "Category": "DataType", - "Name": "Function?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GenerateAvatar2DPreviewAsync", - "Parameters": [ - { - "Name": "avatarGeneration2dPreviewParams", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GenerateAvatarAsync", - "Parameters": [ - { - "Name": "avatarGenerationParams", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "GetBatchTokenDetailsAsync", - "Parameters": [ - { - "Name": "tokenIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "LoadAvatar2DPreviewAsync", - "Parameters": [ - { - "Name": "previewId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "EditableImage" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "LoadGeneratedAvatarAsync", - "Parameters": [ - { - "Name": "generationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "PrepareAvatarForPreviewAsync", - "Parameters": [ - { - "Name": "humanoidModel", - "Type": { - "Category": "Class", - "Name": "Model" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptCreateAvatarAssetAsync", - "Parameters": [ - { - "Name": "tokenId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "assetInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AvatarAssetType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetCreateUpdate", - "Monetization" - ], - "MemberType": "Function", - "Name": "PromptCreateAvatarAsync", - "Parameters": [ - { - "Name": "tokenId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "SensitiveInput" - ], - "MemberType": "Function", - "Name": "PromptSelectAvatarGenerationImageAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "RequestAvatarGenerationSessionAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateUGCAccessoryAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "accessory", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "accessoryType", - "Type": { - "Category": "Enum", - "Name": "AccessoryType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateUGCBodyPartAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "bodyPart", - "Type": { - "Category": "Enum", - "Name": "BodyPart" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateUGCFullBodyAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Event", - "Name": "AvatarAssetModerationCompleted", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "moderationStatus", - "Type": { - "Category": "Enum", - "Name": "ModerationStatus" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Event", - "Name": "AvatarModerationCompleted", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "moderationStatus", - "Type": { - "Category": "Enum", - "Name": "ModerationStatus" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenSelfieConsent", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenSelfieQRCode", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "jobId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ReplicateAvatarGenerationImageId", - "Parameters": [ - { - "Name": "fileId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "error", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ReplicateAvatarModel", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "serializedModel", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "bufferTable", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ReplicateAvatarPreviewUrl", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "downloadUrl", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RequestAvatarGenerationImage", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RequestAvatarModel", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RequestAvatarPreviewUrl", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UgcValidationFailure", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UgcValidationSuccess", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "serializedModel", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "price", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarCreationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetAccessoryType", - "Parameters": [ - { - "Name": "avatarAssetType", - "Type": { - "Category": "Enum", - "Name": "AvatarAssetType" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "AccessoryType" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "NoPromptCreateOutfit", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "0", - "Name": "gearAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "NoPromptDeleteOutfit", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "NoPromptRenameOutfit", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "NoPromptSaveAvatar", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - }, - { - "Name": "saveDict", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Default": "0", - "Name": "gearAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "NoPromptSaveAvatarThumbnailCustomization", - "Parameters": [ - { - "Name": "thumbnailType", - "Type": { - "Category": "Enum", - "Name": "AvatarThumbnailCustomizationType" - } - }, - { - "Name": "emoteAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "cameraDistanceScale", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "yRotDeg", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "0", - "Name": "fieldOfViewDeg", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "NoPromptSetFavorite", - "Parameters": [ - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "itemType", - "Type": { - "Category": "Enum", - "Name": "AvatarItemType" - } - }, - { - "Name": "shouldFavorite", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "NoPromptUpdateOutfit", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - }, - { - "Default": "0", - "Name": "gearAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformCreateOutfitWithDescription", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformDeleteOutfit", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformRenameOutfit", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformSaveAvatarWithDescription", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "addedAssets", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "removedAssets", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformSetFavorite", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformUpdateOutfit", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "AssetRead" - ], - "MemberType": "Function", - "Name": "PromptAllowInventoryReadAccess", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Function", - "Name": "PromptCreateOutfit", - "Parameters": [ - { - "Name": "outfit", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Function", - "Name": "PromptDeleteOutfit", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Function", - "Name": "PromptRenameOutfit", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Function", - "Name": "PromptSaveAvatar", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Function", - "Name": "PromptSetFavorite", - "Parameters": [ - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "itemType", - "Type": { - "Category": "Enum", - "Name": "AvatarItemType" - } - }, - { - "Name": "shouldFavorite", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Function", - "Name": "PromptUpdateOutfit", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "updatedOutfit", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetAllowInventoryReadAccess", - "Parameters": [ - { - "Name": "inventoryReadAccessGranted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalCreateOutfitFailed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalCreateOutfitPermissionDenied", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalDeleteOutfitFailed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalDeleteOutfitPermissionDenied", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalRenameOutfitFailed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalRenameOutfitPermissionDenied", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalSaveAvatarFailed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalSaveAvatarPermissionDenied", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalSetFavoriteFailed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalSetFavoritePermissionDenied", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalUpdateOutfitFailed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalUpdateOutfitPermissionDenied", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "refreshAvatarThumbnails", - "Parameters": [ - { - "Name": "thumbnailTypes", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "CheckApplyDefaultClothing", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "CheckApplyDefaultClothingAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "CheckApplyDefaultClothingAsync", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ConformToAvatarRules", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "ConformToAvatarRulesAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ConformToAvatarRulesAsync", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAvatarRules", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetAvatarRulesAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAvatarRulesAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetBatchItemDetails", - "Parameters": [ - { - "Name": "itemIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "itemType", - "Type": { - "Category": "Enum", - "Name": "AvatarItemType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetBatchItemDetailsAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetBatchItemDetailsAsync", - "Parameters": [ - { - "Name": "itemIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "itemType", - "Type": { - "Category": "Enum", - "Name": "AvatarItemType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetFavorite", - "Parameters": [ - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "itemType", - "Type": { - "Category": "Enum", - "Name": "AvatarItemType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetFavoriteAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetFavoriteAsync", - "Parameters": [ - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "itemType", - "Type": { - "Category": "Enum", - "Name": "AvatarItemType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetHeadShapesAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetInventory", - "Parameters": [ - { - "Name": "assetTypes", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "InventoryPages" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetInventoryAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetInventoryAsync", - "Parameters": [ - { - "Name": "assetTypes", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "InventoryPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetItemDetails", - "Parameters": [ - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "itemType", - "Type": { - "Category": "Enum", - "Name": "AvatarItemType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetItemDetailsAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetItemDetailsAsync", - "Parameters": [ - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "itemType", - "Type": { - "Category": "Enum", - "Name": "AvatarItemType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetOutfitDetails", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetOutfitDetailsAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetOutfitDetailsAsync", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetOutfits", - "Parameters": [ - { - "Default": "All", - "Name": "outfitSource", - "Type": { - "Category": "Enum", - "Name": "OutfitSource" - } - }, - { - "Default": "All", - "Name": "outfitType", - "Type": { - "Category": "Enum", - "Name": "OutfitType" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "OutfitPages" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetOutfitsAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetOutfitsAsync", - "Parameters": [ - { - "Default": "All", - "Name": "outfitSource", - "Type": { - "Category": "Enum", - "Name": "OutfitSource" - } - }, - { - "Default": "All", - "Name": "outfitType", - "Type": { - "Category": "Enum", - "Name": "OutfitType" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "OutfitPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetRecommendedAssets", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AvatarAssetType" - } - }, - { - "Default": "0", - "Name": "contextAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetRecommendedAssetsAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetRecommendedAssetsAsync", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AvatarAssetType" - } - }, - { - "Default": "0", - "Name": "contextAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetRecommendedBundles", - "Parameters": [ - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetRecommendedBundlesAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetRecommendedBundlesAsync", - "Parameters": [ - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "SearchCatalog", - "Parameters": [ - { - "Name": "searchParameters", - "Type": { - "Category": "DataType", - "Name": "CatalogSearchParams" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "CatalogPages" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "SearchCatalogAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "SearchCatalogAsync", - "Parameters": [ - { - "Name": "searchParameters", - "Type": { - "Category": "DataType", - "Name": "CatalogSearchParams" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "CatalogPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenAllowInventoryReadAccess", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenPromptCreateOufit", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenPromptDeleteOutfit", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenPromptRenameOutfit", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenPromptSaveAvatar", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenPromptSetFavorite", - "Parameters": [ - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "itemType", - "Type": { - "Category": "Enum", - "Name": "AvatarItemType" - } - }, - { - "Name": "shouldFavorite", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenPromptUpdateOutfit", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "AssetRead" - ], - "MemberType": "Event", - "Name": "PromptAllowInventoryReadAccessCompleted", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "AvatarPromptResult" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Event", - "Name": "PromptCreateOutfitCompleted", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "AvatarPromptResult" - } - }, - { - "Name": "failureType", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Event", - "Name": "PromptDeleteOutfitCompleted", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "AvatarPromptResult" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Event", - "Name": "PromptRenameOutfitCompleted", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "AvatarPromptResult" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Event", - "Name": "PromptSaveAvatarCompleted", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "AvatarPromptResult" - } - }, - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptSaveAvatarThumbnailCustomizationCompleted", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "AvatarPromptResult" - } - }, - { - "Name": "failureType", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Event", - "Name": "PromptSetFavoriteCompleted", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "AvatarPromptResult" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "PlatformAvatarEditing" - ], - "MemberType": "Event", - "Name": "PromptUpdateOutfitCompleted", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "AvatarPromptResult" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarEditorService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ImportFBXAnimationFromFilePathUserMayChooseModel", - "Parameters": [ - { - "Name": "fbxFilePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "selectedRig", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "userChooseModelThenImportCB", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ImportFBXAnimationUserMayChooseModel", - "Parameters": [ - { - "Name": "selectedRig", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "userChooseModelThenImportCB", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ImportFbxRigWithoutSceneLoad", - "Parameters": [ - { - "Default": "true", - "Name": "isR15", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ImportLoadedFBXAnimation", - "Parameters": [ - { - "Name": "useFBXModel", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LoadRigAndDetectType", - "Parameters": [ - { - "Name": "promptR15Callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarImportService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "R15", - "MemberType": "Property", - "Name": "AvatarType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "GameAvatarType" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarRules", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Loaded", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "Discard", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Publish", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DiscardRequested", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RefreshPluginState", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AvatarSettings", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "Backpack", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "AwardBadge", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "AwardBadgeAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "AwardBadgeAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "CheckUserBadgesAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "badgeIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "GetBadgeInfoAsync", - "Parameters": [ - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "IsDisabled", - "Parameters": [ - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "IsLegal", - "Parameters": [ - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "UserHasBadge", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "UserHasBadgeAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Event", - "Name": "BadgeAwarded", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Event", - "Name": "OnBadgeAwarded", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "creatorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BadgeService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BaseCoreGuiConfiguration", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Open", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "CapturesViewConfiguration", - "Superclass": "BaseCoreGuiConfiguration", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "true", - "MemberType": "Property", - "Name": "Open", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerListConfiguration", - "Superclass": "BaseCoreGuiConfiguration", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Open", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SelfViewConfiguration", - "Superclass": "BaseCoreGuiConfiguration", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Id", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ImportName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ShouldImport", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "CreatePresetFromData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPreview", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStatuses", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StatusRemoved", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StatusReported", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BaseImportData", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "AnimationImportData", - "Superclass": "BaseImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "FacsImportData", - "Superclass": "BaseImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Anchored", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ImportAsModelAsset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InsertInWorkspace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "GroupImportData", - "Superclass": "BaseImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "JointImportData", - "Superclass": "BaseImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DiffuseFilePath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "EmissiveFilePath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsPbr", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MetalnessFilePath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NormalFilePath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RoughnessFilePath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "MaterialImportData", - "Superclass": "BaseImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Anchored", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageManifold", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageMeshIntersectedPreview", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageMeshNotIntersected", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageNoOverlappingVertices", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageNonManifoldPreview", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageOverlappingVerticesPreview", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageUVMatched", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageUVMisMatchedPreview", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Dimensions", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DoubleSided", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IgnoreVertexColors", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IrrelevantCageModifiedPreview", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MeshHoleDetectedPreview", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MeshNoHoleDetected", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NoIrrelevantCageModified", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NoOuterCageFarExtendedFromMesh", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "OuterCageFarExtendedFromMeshPreview", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PolygonCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UseImportedPivot", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "MeshImportData", - "Superclass": "BaseImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AddModelToInventory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Anchored", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AnimationIdForRestPose", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ExistingPackageId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FileDimensions", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ImportAsModelAsset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ImportAsPackage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InsertInWorkspace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InsertWithScenePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InvertNegativeFaces", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "KeepZeroInfluenceBones", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MergeMeshes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PolygonCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PreferredUploadId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RestPose", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RestPose" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RigScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RigScale" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RigType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RigType" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RigVisualization", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ScaleUnit", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MeshScaleUnit" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UseSceneOriginAsPivot", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UsesCages", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ValidateUgcBody", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "WorldForward", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "WorldUp", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "RootImportData", - "Superclass": "BaseImportData", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetGuiObjectsAtPosition", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetGuiObjectsInCircle", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BasePlayerGui", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionImageObject", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Version", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetUserGuiRendering", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "guiAdornee", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "faceId", - "Type": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Default": "0", - "Name": "horizontalCurvature", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "TakeScreenshot", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ToggleRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "UserGuiRenderingChanged", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "guiAdornee", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "faceId", - "Type": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Name": "horizontalCurvature", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CoreGui", - "Superclass": "BasePlayerGui", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "LandscapeLeft", - "MemberType": "Property", - "Name": "CurrentScreenOrientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScreenOrientation" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "InputBindingMappingsRaw", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "LandscapeSensor", - "MemberType": "Property", - "Name": "ScreenOrientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScreenOrientation" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SelectionImageObject", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetTopbarTransparency", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetTopbarTransparency", - "Parameters": [ - { - "Name": "transparency", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "TopbarTransparencyChangedSignal", - "Parameters": [ - { - "Name": "transparency", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerGui", - "Superclass": "BasePlayerGui", - "Tags": [ - "NotCreatable", - "PlayerReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ProcessUserInput", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ResetPlayerGuiOnSpawn", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RtlTextSupport", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RtlTextSupport" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ScreenOrientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScreenOrientation" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ShowDevelopmentGui", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "StudioDefaultStyleSheet", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "StyleSheet" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "StudioInsertWidgetLayerCollectorAutoLinkStyleSheet", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "StyleSheet" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VirtualCursorMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VirtualCursorMode" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetCoreGuiEnabled", - "Parameters": [ - { - "Name": "coreGuiType", - "Type": { - "Category": "Enum", - "Name": "CoreGuiType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "RegisterGetCore", - "Parameters": [ - { - "Name": "parameterName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "getFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "RegisterSetCore", - "Parameters": [ - { - "Name": "parameterName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "setFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetCore", - "Parameters": [ - { - "Name": "parameterName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetCoreGuiEnabled", - "Parameters": [ - { - "Name": "coreGuiType", - "Type": { - "Category": "Enum", - "Name": "CoreGuiType" - } - }, - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetCore", - "Parameters": [ - { - "Name": "parameterName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "CoreGuiChangedSignal", - "Parameters": [ - { - "Name": "coreGuiType", - "Type": { - "Category": "Enum", - "Name": "CoreGuiType" - } - }, - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StarterGui", - "Superclass": "BasePlayerGui", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "BaseRemoteEvent", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Function", - "Name": "FireAllClients", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Function", - "Name": "FireClient", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Function", - "Name": "FireServer", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "OnClientEvent", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "OnRemoteServerEvent", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "OnServerEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RemoteEvent", - "Superclass": "BaseRemoteEvent" - }, - { - "Members": [ - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Function", - "Name": "FireAllClients", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Function", - "Name": "FireClient", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Function", - "Name": "FireServer", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "OnClientEvent", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "OnRemoteServerEvent", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "OnServerEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UnreliableRemoteEvent", - "Superclass": "BaseRemoteEvent" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageMeshContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageMeshId", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageOrigin", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CageOriginWorld", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HSRAssetId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HSRData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HSRMeshIdData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ImportInProcess", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ImportOrigin", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ImportOriginWorld", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TemporaryCageMeshId", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetCageOffset", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetFaces", - "Parameters": [ - { - "Name": "cageType", - "Type": { - "Category": "Enum", - "Name": "CageType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetUVs", - "Parameters": [ - { - "Name": "cageType", - "Type": { - "Category": "Enum", - "Name": "CageType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetVertices", - "Parameters": [ - { - "Name": "cageType", - "Type": { - "Category": "Enum", - "Name": "CageType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "IsHSRReady", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ModifyVertices", - "Parameters": [ - { - "Name": "cageType", - "Type": { - "Category": "Enum", - "Name": "CageType" - } - }, - { - "Name": "vertices", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "VerticesModified", - "Parameters": [ - { - "Name": "vertices", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BaseWrap", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "SetCageMeshContent", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Name": "cageOrigin", - "Type": { - "Category": "DataType", - "Name": "CoordinateFrame?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "CreateEditableMeshAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "EditableMesh" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetDeformedCFrameAsync", - "Parameters": [ - { - "Name": "originalCFrame", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "WrapDeformer", - "Superclass": "BaseWrap" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Behavior", - "Default": "Disabled", - "MemberType": "Property", - "Name": "AutoSkin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "WrapLayerAutoSkin" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Tuning", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "BindOffset", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Debug", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Debug", - "Default": "None", - "MemberType": "Property", - "Name": "DebugMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "WrapLayerDebugMode" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "MaxSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Offset", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "Order", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "Puffiness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ReferenceMeshContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "ReferenceMeshId", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "ReferenceOrigin", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "ReferenceOriginWorld", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Tuning", - "Default": "0", - "MemberType": "Property", - "Name": "ShrinkFactor", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "TemporaryReferenceId", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "WrapLayer", - "Superclass": "BaseWrap" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Debug", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Debug", - "Default": "None", - "MemberType": "Property", - "Name": "DebugMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "WrapTargetDebugMode" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "Stiffness", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "WrapTarget", - "Superclass": "BaseWrap" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Shape", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Attachment0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Attachment" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Shape", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Attachment1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Attachment" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "Brightness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0 1 1 1 0 1 1 1 1 0 ", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ColorSequence" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Shape", - "Default": "0", - "MemberType": "Property", - "Name": "CurveSize0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Shape", - "Default": "0", - "MemberType": "Property", - "Name": "CurveSize1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Shape", - "Default": "false", - "MemberType": "Property", - "Name": "FaceCamera", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LightEmission", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LightInfluence", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LocalTransparencyModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Shape", - "Default": "10", - "MemberType": "Property", - "Name": "Segments", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "Texture", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "TextureLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "Stretch", - "MemberType": "Property", - "Name": "TextureMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextureMode" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "TextureSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0 0.5 0 1 0.5 0 ", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberSequence" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Shape", - "Default": "1", - "MemberType": "Property", - "Name": "Width0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Shape", - "Default": "1", - "MemberType": "Property", - "Name": "Width1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "ZOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetTextureOffset", - "Parameters": [ - { - "Default": "0", - "Name": "offset", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Beam", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Fire", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Event", - "Name": "Event", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BindableEvent", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Invoke", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Callback", - "Name": "OnInvoke", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BindableFunction", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "BodyMover", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 2, 0", - "MemberType": "Property", - "Name": "AngularVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "4000, 4000, 4000", - "MemberType": "Property", - "Name": "MaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "1250", - "MemberType": "Property", - "Name": "P", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 2, 0", - "MemberType": "Property", - "Name": "angularvelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "AngularVelocity", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "4000, 4000, 4000", - "MemberType": "Property", - "Name": "maxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "MaxTorque", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BodyAngularVelocity", - "Superclass": "BodyMover", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "AngularVelocity", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "Force", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "force", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Force", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BodyForce", - "Superclass": "BodyMover", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "VectorForce", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "CFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "500", - "MemberType": "Property", - "Name": "D", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "400000, 0, 400000", - "MemberType": "Property", - "Name": "MaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "3000", - "MemberType": "Property", - "Name": "P", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "cframe", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "CFrame", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "400000, 0, 400000", - "MemberType": "Property", - "Name": "maxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "MaxTorque", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BodyGyro", - "Superclass": "BodyMover", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "AlignOrientation", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "1250", - "MemberType": "Property", - "Name": "D", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "4000, 4000, 4000", - "MemberType": "Property", - "Name": "MaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "10000", - "MemberType": "Property", - "Name": "P", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 50, 0", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "4000, 4000, 4000", - "MemberType": "Property", - "Name": "maxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "MaxForce", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 50, 0", - "MemberType": "Property", - "Name": "position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Position", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "GetLastForce", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "lastForce", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetLastForce", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Event", - "Name": "ReachedTarget", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BodyPosition", - "Superclass": "BodyMover", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "AlignPosition", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "Force", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Location", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "force", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Force", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "location", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Location", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BodyThrust", - "Superclass": "BodyMover", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "VectorForce", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "4000, 4000, 4000", - "MemberType": "Property", - "Name": "MaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "1250", - "MemberType": "Property", - "Name": "P", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 2, 0", - "MemberType": "Property", - "Name": "Velocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "4000, 4000, 4000", - "MemberType": "Property", - "Name": "maxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "MaxForce", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 2, 0", - "MemberType": "Property", - "Name": "velocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Velocity", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "GetLastForce", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "lastForce", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BodyVelocity", - "Superclass": "BodyMover", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "LinearVelocity", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Internal", - "Default": "false", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0.699999988", - "MemberType": "Property", - "Name": "CartoonFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Thrust", - "Default": "30", - "MemberType": "Property", - "Name": "MaxSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Thrust", - "Default": "4000", - "MemberType": "Property", - "Name": "MaxThrust", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Turn", - "Default": "400000, 400000, 0", - "MemberType": "Property", - "Name": "MaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Target", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TargetOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Goals", - "Default": "4", - "MemberType": "Property", - "Name": "TargetRadius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Thrust", - "Default": "0.00100000005", - "MemberType": "Property", - "Name": "ThrustD", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Thrust", - "Default": "5", - "MemberType": "Property", - "Name": "ThrustP", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Turn", - "Default": "500", - "MemberType": "Property", - "Name": "TurnD", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Turn", - "Default": "3000", - "MemberType": "Property", - "Name": "TurnP", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "Abort", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "Fire", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "fire", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Fire", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Event", - "Name": "ReachedTarget", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RocketPropulsion", - "Superclass": "BodyMover", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "LineForce", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "AssetId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "Head", - "MemberType": "Property", - "Name": "BodyPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "BodyPart" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "HeadShape", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Instance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BodyPartDescription", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Condition", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "ContinueExecution", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Id", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Line", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "LogMessage", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MetaBreakpointId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "RemoveOnHit", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Script", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "State", - "Default": "true", - "MemberType": "Property", - "Name": "Valid", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Verified", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Breakpoint", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CloseBrowserWindow", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CopyAuthCookieFromBrowserToEngine", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "EmitHybridEvent", - "Parameters": [ - { - "Name": "moduleName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "params", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ExecuteJavaScript", - "Parameters": [ - { - "Name": "javascript", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenBrowserWindow", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenNativeOverlay", - "Parameters": [ - { - "Name": "title", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenWeChatAuthWindow", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReturnToJavaScript", - "Parameters": [ - { - "Name": "callbackId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "params", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendCommand", - "Parameters": [ - { - "Name": "command", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AuthCookieCopiedToEngine", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BrowserWindowClosed", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BrowserWindowWillNavigate", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "JavaScriptCallback", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BrowserService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "IsAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BugReportRequested", - "Parameters": [ - { - "Name": "trigger", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BugReporterService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "LaunchBulkImport", - "Parameters": [ - { - "Name": "assetTypeToImport", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowBulkImportView", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AssetImported", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AssetType" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BulkImportFinished", - "Parameters": [ - { - "Name": "state", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BulkImportStarted", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BulkImportService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CacheableContentProvider", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "HSRDataContentProvider", - "Superclass": "CacheableContentProvider", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetContentMemoryData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MeshContentProvider", - "Superclass": "CacheableContentProvider", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetContentMemoryData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SlimContentProvider", - "Superclass": "CacheableContentProvider", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "SolidModelContentProvider", - "Superclass": "CacheableContentProvider", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "AttachCallout", - "Parameters": [ - { - "Name": "definitionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "locationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DefineCallout", - "Parameters": [ - { - "Name": "definitionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "title", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "learnMoreURL", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DetachCalloutsByDefinitionId", - "Parameters": [ - { - "Name": "definitionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CalloutService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "CanCaptureVideo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "CaptureScreenshot", - "Parameters": [ - { - "Name": "onCaptureReady", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "DeleteCapture", - "Parameters": [ - { - "Name": "capturePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "DeleteVideoCapture", - "Parameters": [ - { - "Name": "videoCapture", - "Type": { - "Category": "Class", - "Name": "VideoCapture" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture", - "InternalTest" - ], - "MemberType": "Function", - "Name": "GetDeviceInfo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "IsCapturingVideo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "OnCaptureBegan", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "OnCaptureEnded", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "OnCaptureObjectShared", - "Parameters": [ - { - "Name": "capture", - "Type": { - "Category": "Class", - "Name": "Capture" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "OnCapturePermissionsPromptFinished", - "Parameters": [ - { - "Name": "promptId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "wasAccepted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "OnCaptureShared", - "Parameters": [ - { - "Name": "capturePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "OnSavePromptFinished", - "Parameters": [ - { - "Name": "promptId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "results", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "OnSharePromptFinished", - "Parameters": [ - { - "Name": "promptId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "accepted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "OnVideoCaptureShared", - "Parameters": [ - { - "Name": "videoCapture", - "Type": { - "Category": "Class", - "Name": "VideoCapture" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "PreCaptureShared", - "Parameters": [ - { - "Name": "capture", - "Type": { - "Category": "Class", - "Name": "Capture" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "PreVideoCaptureShared", - "Parameters": [ - { - "Name": "videoCapture", - "Type": { - "Category": "Class", - "Name": "VideoCapture" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "PromptSaveCapturesToGallery", - "Parameters": [ - { - "Name": "captures", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "resultCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "PromptShareCapture", - "Parameters": [ - { - "Name": "captureContent", - "Type": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Name": "launchData", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "onAcceptedCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "onDeniedCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "RetrieveCaptures", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "SaveCaptureObjectToExternalStorage", - "Parameters": [ - { - "Name": "capture", - "Type": { - "Category": "Class", - "Name": "Capture" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "SaveCaptureToExternalStorage", - "Parameters": [ - { - "Name": "capturePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "SaveScreenshotCapture", - "Parameters": [ - { - "Default": "", - "Name": "additionalInfo", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "SaveVideoCaptureToExternalStorage", - "Parameters": [ - { - "Name": "videoCapture", - "Type": { - "Category": "Class", - "Name": "VideoCapture" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "StopVideoCapture", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "StopVideoCaptureInternal", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "TakeScreenshotCaptureAsync", - "Parameters": [ - { - "Name": "onCaptureReady", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Default": "nil", - "Name": "captureParams", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "CreatePostAsync", - "Parameters": [ - { - "Name": "pathArr", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "caption", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "DeleteCapturesAsync", - "Parameters": [ - { - "Name": "pathArr", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "DeleteVideoCaptureAsync", - "Parameters": [ - { - "Name": "videoCapture", - "Type": { - "Category": "Class", - "Name": "VideoCapture" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "GetCaptureFilePathAsync", - "Parameters": [ - { - "Name": "captureContent", - "Type": { - "Category": "DataType", - "Name": "Content" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "GetCaptureSizeAsync", - "Parameters": [ - { - "Name": "captureContent", - "Type": { - "Category": "DataType", - "Name": "Content" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "GetCaptureStorageSizeAsync", - "Parameters": [ - { - "Name": "pathArr", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "GetCaptureUploadDataAsync", - "Parameters": [ - { - "Name": "capturePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture", - "InternalTest" - ], - "MemberType": "Function", - "Name": "InternalCheckPlayabilityAsync", - "Parameters": [ - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture", - "InternalTest" - ], - "MemberType": "Function", - "Name": "InternalGetStartPlaceIdAsync", - "Parameters": [ - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "PromptCaptureGalleryPermissionAsync", - "Parameters": [ - { - "Name": "captureGalleryPermission", - "Type": { - "Category": "Enum", - "Name": "CaptureGalleryPermission" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "ReadCapturesFromGalleryAsync", - "Parameters": [ - { - "Default": "{}", - "Name": "captureTypeFilters", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "false", - "Name": "readFromAllEligibleExperiences", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "SaveCapturesToExternalStorageAsync", - "Parameters": [ - { - "Name": "pathArr", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "StartVideoCaptureAsync", - "Parameters": [ - { - "Name": "onCaptureReady", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Default": "nil", - "Name": "captureParams", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "VideoCaptureStartedResult" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "StartVideoCaptureInternalAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "VideoCaptureStartedResult" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Function", - "Name": "UploadCaptureAsync", - "Parameters": [ - { - "Name": "capture", - "Type": { - "Category": "Class", - "Name": "Capture" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "CaptureBegan", - "Parameters": [ - { - "Name": "captureType", - "Type": { - "Category": "Enum", - "Name": "CaptureType" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "CaptureEnded", - "Parameters": [ - { - "Name": "captureType", - "Type": { - "Category": "Enum", - "Name": "CaptureType" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "CaptureObjectSavedInternal", - "Parameters": [ - { - "Name": "capture", - "Type": { - "Category": "Class", - "Name": "Capture" - } - }, - { - "Name": "triggerSource", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "CaptureSaved", - "Parameters": [ - { - "Name": "captureInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "UserCaptureSaved", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "CaptureSavedInternal", - "Parameters": [ - { - "Name": "captureInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "triggerSource", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "OnCaptureAndMetadataSignatureResult", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "captureSignature", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "captureSignatureVersion", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "metadataSignature", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "metadataSignatureVersion", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "OpenCapturePermissionsPrompt", - "Parameters": [ - { - "Name": "promptId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "captureGalleryPermission", - "Type": { - "Category": "Enum", - "Name": "CaptureGalleryPermission" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "OpenSaveCapturesPrompt", - "Parameters": [ - { - "Name": "promptId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "captures", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "OpenShareCapturePrompt", - "Parameters": [ - { - "Name": "promptId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "captureContent", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "launchData", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "RequestCaptureAndMetadataSignature", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "audioAssetIds", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "UserCaptureSaved", - "Parameters": [ - { - "Name": "captureContentId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "UserVideoCaptureFailed", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "VideoCaptureResult" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "UserVideoCaptureStartFailed", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "VideoCaptureStartedResult" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Capture" - ], - "MemberType": "Event", - "Name": "VideoCaptureInProgress", - "Parameters": [ - { - "Name": "isInProgress", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "captureTrigger", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CaptureService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "FinishRecording", - "Parameters": [ - { - "Name": "identifier", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "operation", - "Type": { - "Category": "Enum", - "Name": "FinishRecordingOperation" - } - }, - { - "Name": "finalOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCanRedo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCanUndo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsRecordingInProgress", - "Parameters": [ - { - "Name": "identifier", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Redo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResetWaypoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetEnabled", - "Parameters": [ - { - "Name": "state", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetWaypoint", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TryBeginRecording", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "displayName", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string?" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Undo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnRecordingFinished", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "displayName", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "identifier", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "operation", - "Type": { - "Category": "Enum", - "Name": "FinishRecordingOperation" - } - }, - { - "Name": "finalOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnRecordingStarted", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "displayName", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnRedo", - "Parameters": [ - { - "Name": "waypoint", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnUndo", - "Parameters": [ - { - "Name": "waypoint", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ChangeHistoryService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "SendCreateInstanceFromStudio", - "Parameters": [ - { - "Name": "parentInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SendDeleteInstanceFromStudio", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "setParentToNull", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SendReparentInstanceFromStudio", - "Parameters": [ - { - "Name": "parentInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SendTerrainChangeFromStudio", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "chunkX", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "chunkY", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "chunkZ", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "cells", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ChangeHistoryStreamingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CharacterAppearance", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "HeadColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "0.992157, 0.917647, 0.552941", - "MemberType": "Property", - "Name": "HeadColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftArmColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "0.992157, 0.917647, 0.552941", - "MemberType": "Property", - "Name": "LeftArmColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftLegColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "0.0509804, 0.411765, 0.67451", - "MemberType": "Property", - "Name": "LeftLegColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightArmColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "0.992157, 0.917647, 0.552941", - "MemberType": "Property", - "Name": "RightArmColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightLegColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "0.0509804, 0.411765, 0.67451", - "MemberType": "Property", - "Name": "RightLegColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TorsoColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "0.156863, 0.498039, 0.278431", - "MemberType": "Property", - "Name": "TorsoColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BodyColors", - "Superclass": "CharacterAppearance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "BaseTextureContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "BaseTextureId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "Head", - "MemberType": "Property", - "Name": "BodyPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "BodyPart" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MeshContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MeshId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "OverlayTextureContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "OverlayTextureId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "MemoryCategory": "Instances", - "Name": "CharacterMesh", - "Superclass": "CharacterAppearance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Color3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Outfit1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Outfit2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Clothing", - "Superclass": "CharacterAppearance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "PantsTemplate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Pants", - "Superclass": "Clothing" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "ShirtTemplate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Shirt", - "Superclass": "Clothing" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Color3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "Graphic", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ShirtGraphic", - "Superclass": "CharacterAppearance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SkinColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Skin", - "Superclass": "CharacterAppearance", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "BubbleChatEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsAutoMigrated", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "LoadDefaultChat", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "Unsupported", - "MemberType": "Property", - "Name": "ModerationMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "Chat", - "Parameters": [ - { - "Name": "partOrCharacter", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "Blue", - "Name": "color", - "Type": { - "Category": "Enum", - "Name": "ChatColor" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "ChatLocal", - "Parameters": [ - { - "Name": "partOrCharacter", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "Blue", - "Name": "color", - "Type": { - "Category": "Enum", - "Name": "ChatColor" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "GetShouldUseLuaChat", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "InvokeChatCallback", - "Parameters": [ - { - "Name": "callbackType", - "Type": { - "Category": "Enum", - "Name": "ChatCallbackType" - } - }, - { - "Name": "callbackArguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "ReconcileCommunicationAccess", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "RegisterChatCallback", - "Parameters": [ - { - "Name": "callbackType", - "Type": { - "Category": "Enum", - "Name": "ChatCallbackType" - } - }, - { - "Name": "callbackFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "RequestModerationModeEnabled", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SetBubbleChatSettings", - "Parameters": [ - { - "Name": "settings", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "CanUserChatAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "CanUsersChatAsync", - "Parameters": [ - { - "Name": "userIdFrom", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "userIdTo", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "FilterStringAsync", - "Parameters": [ - { - "Name": "stringToFilter", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerFrom", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "playerTo", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "FilterStringForBroadcast", - "Parameters": [ - { - "Name": "stringToFilter", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerFrom", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "FilterStringForPlayerAsync", - "Parameters": [ - { - "Name": "stringToFilter", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerToFilterFor", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "FilterStringAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "BubbleChatSettingsChanged", - "Parameters": [ - { - "Name": "settings", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "Chatted", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "color", - "Type": { - "Category": "Enum", - "Name": "ChatColor" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ClientToServerFilterMessageSignalV2", - "Parameters": [ - { - "Name": "sender", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "receiver", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "unfilteredMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ClientToServerReportUnfilteredSignal", - "Parameters": [ - { - "Name": "unfilteredText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "match", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "instancePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "instanceType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ModerationModeEnabledChanged", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "PlayerChatAvailabilityStatusChanged", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ReconcileCommunicationAccessCompleted", - "Parameters": [ - { - "Name": "chatAvailabilityStatus", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ReconcileCommunicationAccessSignal", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ServerToClientUnderOver13FilteredResponseSignal", - "Parameters": [ - { - "Name": "sender", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "unfilteredMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "isError", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "errorStr", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "under13", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "over13", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "TimeoutChatAttempt", - "Parameters": [ - { - "Name": "isPermanentTimeout", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "endTime", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Chat", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Image", - "Default": "", - "MemberType": "Property", - "Name": "CursorIcon", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Image", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "CursorIconContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "32", - "MemberType": "Property", - "Name": "MaxActivationDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "MouseActionReplicated", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "actionType", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "MouseClick", - "Parameters": [ - { - "Name": "playerWhoClicked", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "MouseHoverEnter", - "Parameters": [ - { - "Name": "playerWhoHovered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "MouseHoverLeave", - "Parameters": [ - { - "Name": "playerWhoHovered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "RightMouseClick", - "Parameters": [ - { - "Name": "playerWhoClicked", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "mouseClick", - "Parameters": [ - { - "Name": "playerWhoClicked", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "MouseClick", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ClickDetector", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Image", - "Default": "", - "MemberType": "Property", - "Name": "ActivatedCursorIcon", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Image", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ActivatedCursorIconContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Physics Response", - "Default": "false", - "MemberType": "Property", - "Name": "ApplyAtCenterOfMass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Drag Directions", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "Axis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Dragged Amount", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "DragFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Behavior", - "Default": "TranslatePlane", - "MemberType": "Property", - "Name": "DragStyle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DragDetectorDragStyle" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Mode Switching", - "Default": "ButtonR1", - "MemberType": "Property", - "Name": "GamepadModeSwitchKeyCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Mode Switching", - "Default": "LeftControl", - "MemberType": "Property", - "Name": "KeyboardModeSwitchKeyCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Drag Limits", - "Default": "0", - "MemberType": "Property", - "Name": "MaxDragAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Drag Limits", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "MaxDragTranslation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Physics Response", - "Default": "10000000", - "MemberType": "Property", - "Name": "MaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Physics Response", - "Default": "10000", - "MemberType": "Property", - "Name": "MaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Drag Limits", - "Default": "0", - "MemberType": "Property", - "Name": "MinDragAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Drag Limits", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "MinDragTranslation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Drag Directions", - "Default": "-0, 180, 90", - "MemberType": "Property", - "Name": "Orientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Behavior", - "Default": "Everybody", - "MemberType": "Property", - "Name": "PermissionPolicy", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DragDetectorPermissionPolicy" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Internal", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "PhysicalDragClickedPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Internal", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "PhysicalDragHitPoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Internal", - "Default": "false", - "MemberType": "Property", - "Name": "PhysicalDragIsInVR", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Internal", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "PhysicalDragTargetFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ReferenceInstance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Behavior", - "Default": "Physical", - "MemberType": "Property", - "Name": "ResponseStyle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DragDetectorResponseStyle" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Physics Response", - "Default": "10", - "MemberType": "Property", - "Name": "Responsiveness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "RunLocally", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Drag Directions", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "SecondaryAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "TrackballRadialPullFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "TrackballRollFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Mode Switching", - "Default": "ButtonL2", - "MemberType": "Property", - "Name": "VRSwitchKeyCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Drag Directions", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "WorldAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Input" - ] - }, - "Category": "Drag Directions", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "WorldSecondaryAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Function", - "Name": "AddConstraintFunction", - "Parameters": [ - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Function", - "Name": "GetReferenceFrame", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Function", - "Name": "RestartDrag", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Function", - "Name": "SetDragStyleFunction", - "Parameters": [ - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Function", - "Name": "SetPermissionPolicyFunction", - "Parameters": [ - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Event", - "Name": "DragContinue", - "Parameters": [ - { - "Name": "playerWhoDragged", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "cursorRay", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "Name": "viewFrame", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "vrInputFrame", - "Type": { - "Category": "DataType", - "Name": "OptionalCoordinateFrame" - } - }, - { - "Name": "isModeSwitchKeyDown", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Event", - "Name": "DragContinueReplicate", - "Parameters": [ - { - "Name": "playerWhoDragged", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "cursorRay", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "Name": "viewFrame", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "vrInputFrame", - "Type": { - "Category": "DataType", - "Name": "OptionalCoordinateFrame" - } - }, - { - "Name": "isModeSwitchKeyDown", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Event", - "Name": "DragEnd", - "Parameters": [ - { - "Name": "playerWhoDragged", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Event", - "Name": "DragEndReplicate", - "Parameters": [ - { - "Name": "playerWhoDragged", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Event", - "Name": "DragStart", - "Parameters": [ - { - "Name": "playerWhoDragged", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "cursorRay", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "Name": "viewFrame", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "hitFrame", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "clickedPart", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "vrInputFrame", - "Type": { - "Category": "DataType", - "Name": "OptionalCoordinateFrame" - } - }, - { - "Name": "isModeSwitchKeyDown", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Event", - "Name": "DragStartReplicate", - "Parameters": [ - { - "Name": "playerWhoDragged", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "cursorRay", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "Name": "viewFrame", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "hitFrame", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "clickedPart", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "vrInputFrame", - "Type": { - "Category": "DataType", - "Name": "OptionalCoordinateFrame" - } - }, - { - "Name": "isModeSwitchKeyDown", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics", - "Input" - ], - "MemberType": "Event", - "Name": "RestartPhysicalDragReplicate", - "Parameters": [ - { - "Name": "hitPoint", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DragDetector", - "Superclass": "ClickDetector" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CloudCRUDService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.5", - "MemberType": "Property", - "Name": "Cover", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.699999988", - "MemberType": "Property", - "Name": "Density", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Clouds", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ClusterPacketCache", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Camera", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "CFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CollaboratorColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "Deprecated", - { - "PreferredDescriptorName": "CollaboratorColor3", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "CollaboratorColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "CurDocGUID", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CurScriptLineNumber", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsIdle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "Status", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CollaboratorStatus" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "UserId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Username", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Collaborator", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetCollaboratorsList", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSelectionHighlightsEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RequestFlyToCollaborator", - "Parameters": [ - { - "Name": "collaboratorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ToggleSelectionHighlights", - "Parameters": [ - { - "Name": "showHighlights", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ToggleTeamCreate", - "Parameters": [ - { - "Name": "on", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CollaboratorIdleUpdate", - "Parameters": [ - { - "Name": "collaboratorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "isIdle", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CollaboratorInstanceCreatedSignal", - "Parameters": [ - { - "Name": "collaboratorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CollaboratorInstanceDestroyedSignal", - "Parameters": [ - { - "Name": "collaboratorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CollaboratorStatusUpdateRequestedSignal", - "Parameters": [ - { - "Name": "collaboratorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "newStatus", - "Type": { - "Category": "Enum", - "Name": "CollaboratorStatus" - } - } - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CollaboratorStatusUpdatedSignal", - "Parameters": [ - { - "Name": "collaboratorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "newStatus", - "Type": { - "Category": "Enum", - "Name": "CollaboratorStatus" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ToggleSelectionHighlightsSignal", - "Parameters": [ - { - "Name": "areHighlightsShown", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CollaboratorsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "AddTag", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetAllTags", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetCollection", - "Parameters": [ - { - "Name": "class", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetTagged", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetInstanceAddedSignal", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetInstanceRemovedSignal", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetTagged", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetTags", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "HasTag", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RemoveTag", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "ItemAdded", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetInstanceAddedSignal", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "ItemRemoved", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetInstanceRemovedSignal", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "TagAdded", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "TagRemoved", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CollectionService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "PromptCommerceProductPurchase", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "commerceProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "PromptRealWorldCommerceBrowser", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "SignalPromptCommerceProductPurchaseFinished", - "Parameters": [ - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "didTryPurchase", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "", - "Name": "checkoutSessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "GetCommerceProductInfoAsync", - "Parameters": [ - { - "Name": "commerceProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "PrepareCommerceProductPurchase", - "Parameters": [ - { - "Name": "commerceProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "UserEligibleForRealWorldCommerceAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "BenefitStatusReceived", - "Parameters": [ - { - "Name": "isGranted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "FetchReceipt", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "InExperienceBrowserRequested", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "PromptCommerceProductPurchaseFinished", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "PromptCommerceProductPurchaseRequested", - "Parameters": [ - { - "Name": "commerceProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Event", - "Name": "PurchaseBrowserClosed", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CommerceService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "NumberRange", - "MemberType": "Property", - "Name": "CurveType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CompositeValueCurveType" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetComponentCurves", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetValueAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CompositeValueCurve", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ClearTestingValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetTestingValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetConfigAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "ConfigSnapshot" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetConfigForPlayerAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "ConfigSnapshot" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ConfigService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "Configuration", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ConfigureServerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "Unknown", - "MemberType": "Property", - "Name": "NetworkStatus", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NetworkStatus" - } - }, - { - "MemberType": "Function", - "Name": "IsNetworkStateAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ConnectivityService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Attachments", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Attachment0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Attachment" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Attachments", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Attachment1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Attachment" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Visible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "GetDebugAppliedForce", - "Parameters": [ - { - "Name": "bodyId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "GetDebugAppliedTorque", - "Parameters": [ - { - "Name": "bodyId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "Constraint", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignOrientation", - "Default": "AllAxes", - "MemberType": "Property", - "Name": "AlignType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AlignType" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "TargetOrientation", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "CFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "TargetOrientation", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LookAtPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Compliance", - "Default": "INF", - "MemberType": "Property", - "Name": "MaxAngularVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Compliance", - "Default": "10000", - "MemberType": "Property", - "Name": "MaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignmentMode", - "Default": "TwoAttachment", - "MemberType": "Property", - "Name": "Mode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "OrientationAlignmentMode" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "TargetOrientation", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "PrimaryAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignOrientation", - "Default": "false", - "MemberType": "Property", - "Name": "PrimaryAxisOnly", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignOrientation", - "Default": "false", - "MemberType": "Property", - "Name": "ReactionTorqueEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Compliance", - "Default": "10", - "MemberType": "Property", - "Name": "Responsiveness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignOrientation", - "Default": "false", - "MemberType": "Property", - "Name": "RigidityEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "TargetOrientation", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "SecondaryAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "AlignOrientation", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignPosition", - "Default": "false", - "MemberType": "Property", - "Name": "ApplyAtCenterOfMass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Compliance", - "Default": "Magnitude", - "MemberType": "Property", - "Name": "ForceLimitMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ForceLimitMode" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Compliance", - "Default": "World", - "MemberType": "Property", - "Name": "ForceRelativeTo", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActuatorRelativeTo" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Compliance", - "Default": "10000, 10000, 10000", - "MemberType": "Property", - "Name": "MaxAxesForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Compliance", - "Default": "10000", - "MemberType": "Property", - "Name": "MaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Compliance", - "Default": "INF", - "MemberType": "Property", - "Name": "MaxVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignmentMode", - "Default": "TwoAttachment", - "MemberType": "Property", - "Name": "Mode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PositionAlignmentMode" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignPosition", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignPosition", - "Default": "false", - "MemberType": "Property", - "Name": "ReactionForceEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Compliance", - "Default": "10", - "MemberType": "Property", - "Name": "Responsiveness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AlignPosition", - "Default": "false", - "MemberType": "Property", - "Name": "RigidityEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "AlignPosition", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Torque", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "AngularVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Torque", - "Default": "0", - "MemberType": "Property", - "Name": "MaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Torque", - "Default": "false", - "MemberType": "Property", - "Name": "ReactionTorqueEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Torque", - "Default": "World", - "MemberType": "Property", - "Name": "RelativeTo", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActuatorRelativeTo" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "AngularVelocity", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics", - "Animation" - ] - }, - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "C0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Animation" - ] - }, - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "C1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Animation" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsKinematic", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Animation" - ] - }, - "Category": "Compliance", - "Default": "10000", - "MemberType": "Property", - "Name": "MaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Animation" - ] - }, - "Category": "Compliance", - "Default": "10000", - "MemberType": "Property", - "Name": "MaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Part0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Part1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics", - "Animation" - ] - }, - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Transform", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "AnimationConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "BallSocket", - "Default": "false", - "MemberType": "Property", - "Name": "LimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Friction", - "Default": "0", - "MemberType": "Property", - "Name": "MaxFrictionTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Friction", - "Default": "0", - "MemberType": "Property", - "Name": "MaxFrictionTorqueXml", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "0.150000006", - "MemberType": "Property", - "Name": "Radius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "0", - "MemberType": "Property", - "Name": "Restitution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "false", - "MemberType": "Property", - "Name": "TwistLimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "TwistLimits", - "Default": "-45", - "MemberType": "Property", - "Name": "TwistLowerAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "TwistLimits", - "Default": "45", - "MemberType": "Property", - "Name": "TwistUpperAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "45", - "MemberType": "Property", - "Name": "UpperAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "BallSocketConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Hinge", - "Default": "None", - "MemberType": "Property", - "Name": "ActuatorType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActuatorType" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "45", - "MemberType": "Property", - "Name": "AngularResponsiveness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "0", - "MemberType": "Property", - "Name": "AngularSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Motor", - "Default": "0", - "MemberType": "Property", - "Name": "AngularVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Derived", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Hinge", - "Default": "false", - "MemberType": "Property", - "Name": "LimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "-45", - "MemberType": "Property", - "Name": "LowerAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Motor", - "Default": "500000", - "MemberType": "Property", - "Name": "MotorMaxAcceleration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Motor", - "Default": "0", - "MemberType": "Property", - "Name": "MotorMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "0.150000006", - "MemberType": "Property", - "Name": "Radius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "0", - "MemberType": "Property", - "Name": "Restitution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "0", - "MemberType": "Property", - "Name": "ServoMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "false", - "MemberType": "Property", - "Name": "SoftlockServoUponReachingTarget", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "0", - "MemberType": "Property", - "Name": "TargetAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "45", - "MemberType": "Property", - "Name": "UpperAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "HingeConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "LineForce", - "Default": "false", - "MemberType": "Property", - "Name": "ApplyAtCenterOfMass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "LineForce", - "Default": "false", - "MemberType": "Property", - "Name": "InverseSquareLaw", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "LineForce", - "Default": "1000", - "MemberType": "Property", - "Name": "Magnitude", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "LineForce", - "Default": "INF", - "MemberType": "Property", - "Name": "MaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "LineForce", - "Default": "false", - "MemberType": "Property", - "Name": "ReactionForceEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "LineForce", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "Magnitude", - "MemberType": "Property", - "Name": "ForceLimitMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ForceLimitMode" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Mode", - "Default": "true", - "MemberType": "Property", - "Name": "ForceLimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Line", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "LineDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Line", - "Default": "-0", - "MemberType": "Property", - "Name": "LineVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "1000, 1000, 1000", - "MemberType": "Property", - "Name": "MaxAxesForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "1000", - "MemberType": "Property", - "Name": "MaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "1000, 1000", - "MemberType": "Property", - "Name": "MaxPlanarAxesForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Plane", - "Default": "0, 0", - "MemberType": "Property", - "Name": "PlaneVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Plane", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "PrimaryTangentAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Mode", - "Default": "true", - "MemberType": "Property", - "Name": "ReactionForceEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Mode", - "Default": "World", - "MemberType": "Property", - "Name": "RelativeTo", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActuatorRelativeTo" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Plane", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "SecondaryTangentAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Vector", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "VectorVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Mode", - "Default": "Vector", - "MemberType": "Property", - "Name": "VelocityConstraintMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VelocityConstraintMode" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "LinearVelocity", - "Superclass": "Constraint" - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "PlaneConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "Plane", - "Superclass": "PlaneConstraint", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "PlaneConstraint", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "RigidConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Derived", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Rod", - "Default": "5", - "MemberType": "Property", - "Name": "Length", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "90", - "MemberType": "Property", - "Name": "LimitAngle0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "90", - "MemberType": "Property", - "Name": "LimitAngle1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Rod", - "Default": "false", - "MemberType": "Property", - "Name": "LimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "0.100000001", - "MemberType": "Property", - "Name": "Thickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "RodConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Derived", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Rope", - "Default": "5", - "MemberType": "Property", - "Name": "Length", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Rope", - "Default": "0", - "MemberType": "Property", - "Name": "Restitution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "0.100000001", - "MemberType": "Property", - "Name": "Thickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Rope", - "Default": "false", - "MemberType": "Property", - "Name": "WinchEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Winch", - "Default": "10000", - "MemberType": "Property", - "Name": "WinchForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Winch", - "Default": "45", - "MemberType": "Property", - "Name": "WinchResponsiveness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Winch", - "Default": "2", - "MemberType": "Property", - "Name": "WinchSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Winch", - "Default": "5", - "MemberType": "Property", - "Name": "WinchTarget", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "RopeConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Slider", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ActuatorType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActuatorType" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Derived", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CurrentPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Slider", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LinearResponsiveness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LowerLimit", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Motor", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MotorMaxAcceleration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Motor", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MotorMaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Restitution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ServoMaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SoftlockServoUponReachingTarget", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Speed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Servo", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TargetPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UpperLimit", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Motor", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Velocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "SlidingBallConstraint", - "Superclass": "Constraint", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Cylinder", - "Default": "None", - "MemberType": "Property", - "Name": "AngularActuatorType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActuatorType" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Cylinder", - "Default": "false", - "MemberType": "Property", - "Name": "AngularLimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularServo", - "Default": "45", - "MemberType": "Property", - "Name": "AngularResponsiveness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularLimits", - "Default": "0", - "MemberType": "Property", - "Name": "AngularRestitution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularServo", - "Default": "0", - "MemberType": "Property", - "Name": "AngularSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularMotor", - "Default": "0", - "MemberType": "Property", - "Name": "AngularVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Derived", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Cylinder", - "Default": "0", - "MemberType": "Property", - "Name": "InclinationAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularLimits", - "Default": "-45", - "MemberType": "Property", - "Name": "LowerAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularMotor", - "Default": "500000", - "MemberType": "Property", - "Name": "MotorMaxAngularAcceleration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularMotor", - "Default": "0", - "MemberType": "Property", - "Name": "MotorMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "RotationAxisVisible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularServo", - "Default": "0", - "MemberType": "Property", - "Name": "ServoMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularServo", - "Default": "false", - "MemberType": "Property", - "Name": "SoftlockAngularServoUponReachingTarget", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularServo", - "Default": "0", - "MemberType": "Property", - "Name": "TargetAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "AngularLimits", - "Default": "45", - "MemberType": "Property", - "Name": "UpperAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Derived", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "WorldRotationAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "CylindricalConstraint", - "Superclass": "SlidingBallConstraint" - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "PrismaticConstraint", - "Superclass": "SlidingBallConstraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "3", - "MemberType": "Property", - "Name": "Coils", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Derived", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "0", - "MemberType": "Property", - "Name": "Damping", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "1", - "MemberType": "Property", - "Name": "FreeLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "false", - "MemberType": "Property", - "Name": "LimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "INF", - "MemberType": "Property", - "Name": "MaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "5", - "MemberType": "Property", - "Name": "MaxLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "0", - "MemberType": "Property", - "Name": "MinLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "0.400000006", - "MemberType": "Property", - "Name": "Radius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "0", - "MemberType": "Property", - "Name": "Stiffness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "0.100000001", - "MemberType": "Property", - "Name": "Thickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "SpringConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Torque", - "Default": "Attachment0", - "MemberType": "Property", - "Name": "RelativeTo", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActuatorRelativeTo" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Torque", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Torque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "Torque", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "8", - "MemberType": "Property", - "Name": "Coils", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Derived", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "0.00999999978", - "MemberType": "Property", - "Name": "Damping", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "false", - "MemberType": "Property", - "Name": "LimitEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated", - { - "PreferredDescriptorName": "LimitsEnabled", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "false", - "MemberType": "Property", - "Name": "LimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "45", - "MemberType": "Property", - "Name": "MaxAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "INF", - "MemberType": "Property", - "Name": "MaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "0.400000006", - "MemberType": "Property", - "Name": "Radius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "0", - "MemberType": "Property", - "Name": "Restitution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Spring", - "Default": "100", - "MemberType": "Property", - "Name": "Stiffness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "TorsionSpringConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Universal", - "Default": "false", - "MemberType": "Property", - "Name": "LimitsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "45", - "MemberType": "Property", - "Name": "MaxAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Appearance", - "Default": "0.200000003", - "MemberType": "Property", - "Name": "Radius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Limits", - "Default": "0", - "MemberType": "Property", - "Name": "Restitution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "UniversalConstraint", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "VectorForce", - "Default": "false", - "MemberType": "Property", - "Name": "ApplyAtCenterOfMass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "VectorForce", - "Default": "1000, 0, 0", - "MemberType": "Property", - "Name": "Force", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "VectorForce", - "Default": "Attachment0", - "MemberType": "Property", - "Name": "RelativeTo", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActuatorRelativeTo" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "VectorForce", - "Superclass": "Constraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "AssetManagement" - ], - "Write": [ - "AssetManagement" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BaseUrl", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "AssetManagement" - ], - "Write": [ - "AssetManagement" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RequestQueueSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "GetAssetFetchStatus", - "Parameters": [ - { - "Name": "contentId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "AssetFetchStatus" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "GetAssetFetchStatusChangedSignal", - "Parameters": [ - { - "Name": "contentId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "GetDependencyContentIds", - "Parameters": [ - { - "Name": "root", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "GetDetailedFailedRequests", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "GetFailedRequests", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "ListEncryptedAssets", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "Preload", - "Parameters": [ - { - "Name": "contentId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "PreloadAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "RegisterDefaultEncryptionKey", - "Parameters": [ - { - "Name": "encryptionKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "RegisterDefaultSessionKey", - "Parameters": [ - { - "Name": "sessionKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "RegisterEncryptedAsset", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "encryptionKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "RegisterSessionEncryptedAsset", - "Parameters": [ - { - "Name": "contentId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "sessionKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "SetBaseUrl", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "UnregisterDefaultEncryptionKey", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "UnregisterEncryptedAsset", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Function", - "Name": "PreloadAsync", - "Parameters": [ - { - "Name": "contentIdList", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "nil", - "Name": "callbackFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetManagement" - ], - "MemberType": "Event", - "Name": "AssetFetchFailed", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ContentProvider", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "BindAction", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "functionToBind", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "createTouchButton", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "inputTypes", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "BindActionAtPriority", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "functionToBind", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "createTouchButton", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "priorityLevel", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "inputTypes", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "BindActionToInputTypes", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "functionToBind", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "createTouchButton", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "inputTypes", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "BindAction", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "BindActivate", - "Parameters": [ - { - "Name": "userInputTypeForActivation", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Name": "keyCodesForActivation", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "BindCoreAction", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "functionToBind", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "createTouchButton", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "inputTypes", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "BindCoreActionAtPriority", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "functionToBind", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "createTouchButton", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "priorityLevel", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "inputTypes", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "BindCoreActivate", - "Parameters": [ - { - "Name": "userInputTypeForActivation", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Name": "keyCodesForActivation", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "CallFunction", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "UserInputState" - } - }, - { - "Name": "inputObject", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "FireActionButtonFoundSignal", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "actionButton", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetAllBoundActionInfo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetAllBoundCoreActionInfo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetBoundActionInfo", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetBoundCoreActionInfo", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetCurrentLocalToolIcon", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetInputContexts", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetDescription", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetImage", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "image", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetPosition", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "UDim2" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetTitle", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "title", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "UnbindAction", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "UnbindActivate", - "Parameters": [ - { - "Name": "userInputTypeForActivation", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Default": "Unknown", - "Name": "keyCodeForActivation", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "UnbindAllActions", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "UnbindCoreAction", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "UnbindCoreActivate", - "Parameters": [ - { - "Name": "userInputTypeForActivation", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Default": "Unknown", - "Name": "keyCodeForActivation", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetButton", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "BoundActionAdded", - "Parameters": [ - { - "Name": "actionAdded", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "createTouchButton", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "functionInfoTable", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "isCore", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "BoundActionChanged", - "Parameters": [ - { - "Name": "actionChanged", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "changeName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "changeTable", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "BoundActionRemoved", - "Parameters": [ - { - "Name": "actionRemoved", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "functionInfoTable", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "isCore", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "GetActionButtonEvent", - "Parameters": [ - { - "Name": "actionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "InputContextsChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "LocalToolEquipped", - "Parameters": [ - { - "Name": "toolEquipped", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "LocalToolUnequipped", - "Parameters": [ - { - "Name": "toolUnequipped", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ContextActionService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "BindButton", - "Parameters": [ - { - "Name": "button", - "Type": { - "Category": "Enum", - "Name": "Button" - } - }, - { - "Name": "caption", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetButton", - "Parameters": [ - { - "Name": "button", - "Type": { - "Category": "Enum", - "Name": "Button" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UnbindButton", - "Parameters": [ - { - "Name": "button", - "Type": { - "Category": "Enum", - "Name": "Button" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "bindButton", - "Parameters": [ - { - "Name": "button", - "Type": { - "Category": "Enum", - "Name": "Button" - } - }, - { - "Name": "caption", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "BindButton", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getButton", - "Parameters": [ - { - "Name": "button", - "Type": { - "Category": "Enum", - "Name": "Button" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetButton", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ButtonChanged", - "Parameters": [ - { - "Name": "button", - "Type": { - "Category": "Enum", - "Name": "Button" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Controller", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "HumanoidController", - "Superclass": "Controller" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Axes", - "Default": "0", - "MemberType": "Property", - "Name": "Steer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Axes", - "Default": "0", - "MemberType": "Property", - "Name": "Throttle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "AxisChanged", - "Parameters": [ - { - "Name": "axis", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SkateboardController", - "Superclass": "Controller" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "VehicleController", - "Superclass": "Controller" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Balance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BalanceRigidityEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Movement", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MoveSpeedFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ControllerBase", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "10000", - "MemberType": "Property", - "Name": "BalanceMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "100", - "MemberType": "Property", - "Name": "BalanceSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LinearImpulse", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Turn", - "Default": "true", - "MemberType": "Property", - "Name": "MaintainAngularMomentum", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "true", - "MemberType": "Property", - "Name": "MaintainLinearMomentum", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "1000", - "MemberType": "Property", - "Name": "MoveMaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Turn", - "Default": "10000", - "MemberType": "Property", - "Name": "TurnMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Turn", - "Default": "1", - "MemberType": "Property", - "Name": "TurnSpeedFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AirController", - "Superclass": "ControllerBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "0", - "MemberType": "Property", - "Name": "AccelerationTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "10000", - "MemberType": "Property", - "Name": "BalanceMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "100", - "MemberType": "Property", - "Name": "BalanceSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "10000", - "MemberType": "Property", - "Name": "MoveMaxForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ClimbController", - "Superclass": "ControllerBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "1", - "MemberType": "Property", - "Name": "AccelerationLean", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "0", - "MemberType": "Property", - "Name": "AccelerationTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "10000", - "MemberType": "Property", - "Name": "BalanceMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "100", - "MemberType": "Property", - "Name": "BalanceSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "0", - "MemberType": "Property", - "Name": "DecelerationTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "2", - "MemberType": "Property", - "Name": "Friction", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "1", - "MemberType": "Property", - "Name": "FrictionWeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "1", - "MemberType": "Property", - "Name": "GroundOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "10000", - "MemberType": "Property", - "Name": "StandForce", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "100", - "MemberType": "Property", - "Name": "StandSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "1", - "MemberType": "Property", - "Name": "TurnSpeedFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "GroundController", - "Superclass": "ControllerBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Movement", - "Default": "0", - "MemberType": "Property", - "Name": "AccelerationTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "10000", - "MemberType": "Property", - "Name": "PitchMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "1", - "MemberType": "Property", - "Name": "PitchSpeedFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "10000", - "MemberType": "Property", - "Name": "RollMaxTorque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Balance", - "Default": "1", - "MemberType": "Property", - "Name": "RollSpeedFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SwimController", - "Superclass": "ControllerBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ActiveController", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "ControllerBase" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Behavior", - "Default": "16", - "MemberType": "Property", - "Name": "BaseMoveSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Behavior", - "Default": "8", - "MemberType": "Property", - "Name": "BaseTurnSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ClimbSensor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "ControllerSensor" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Input", - "Default": "0, 0, 1", - "MemberType": "Property", - "Name": "FacingDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "GroundSensor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "ControllerSensor" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Input", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "MovingDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RootPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Input", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "UpDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ControllerManager", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ControllerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "SendMeshGenActivatedTelemetry", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendMeshGenCompletedTelemetry", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "generationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "prompt", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendMeshGenMeshInsertedTelemetry", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "generationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendMeshGenPublishedAssetsTelemetry", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "generationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "int64?" - } - }, - { - "Name": "imageId", - "Type": { - "Category": "Primitive", - "Name": "int64?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ConversationalAIAcceptanceService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CookiesService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "CapturesViewConfiguration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "CapturesViewConfiguration" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "PlayerListConfiguration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "PlayerListConfiguration" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SelfViewConfiguration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "SelfViewConfiguration" - } - } - ], - "MemoryCategory": "Instances", - "Name": "CoreGuiConfiguration", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CorePackages", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CoreScriptDebuggingManagerHelper", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetScriptFilePath", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CoreScriptSyncService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CreationDBService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetAssetInfoAsync", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCreatorStoreProductInfoAsync", - "Parameters": [ - { - "Name": "productTargetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformCreatorStorePurchase", - "Parameters": [ - { - "Name": "productTargetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CreatorStoreService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "IsWatchingScriptLine", - "Parameters": [ - { - "Name": "scriptRef", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "lineNumber", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartWatchingScriptLine", - "Parameters": [ - { - "Name": "scriptRef", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "debuggerConnectionId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "lineNumber", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "GuidLineContentsChanged", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "lineNumber", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "contents", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "GuidNameChanged", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "fullName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CrossDMScriptChangeListener", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "PersistedCurrentValue", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "MemberType": "Function", - "Name": "GetAttachedReceivers", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetValue", - "Parameters": [ - { - "Name": "newValue", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ReceiverConnected", - "Parameters": [ - { - "Name": "receiver", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ReceiverDisconnected", - "Parameters": [ - { - "Name": "receiver", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CustomEvent", - "Superclass": "Instance", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Source", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "MemberType": "Function", - "Name": "GetCurrentValue", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "EventConnected", - "Parameters": [ - { - "Name": "event", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "EventDisconnected", - "Parameters": [ - { - "Name": "event", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SourceValueChanged", - "Parameters": [ - { - "Name": "newValue", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CustomEventReceiver", - "Superclass": "Instance", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "Close", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "GetLogPath", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "Open", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "WriteAppend", - "Parameters": [ - { - "Name": "append", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CustomLog", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Offset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Scale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VertexColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DataModelMesh", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Bevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Bevel Roundness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Bulge", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BevelMesh", - "Superclass": "DataModelMesh", - "Tags": [ - "NotCreatable", - "NotBrowsable", - "Deprecated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "BlockMesh", - "Superclass": "BevelMesh" - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "CylinderMesh", - "Superclass": "BevelMesh", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "MeshId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "TextureId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "FileMesh", - "Superclass": "DataModelMesh" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "Head", - "MemberType": "Property", - "Name": "MeshType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MeshType" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "SpecialMesh", - "Superclass": "FileMesh" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetLuaVersion", - "Parameters": [ - { - "Name": "patchName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPatch", - "Parameters": [ - { - "Name": "patchName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterPatch", - "Parameters": [ - { - "Name": "patchName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "behaviorName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "localConfigPath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdatePatch", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "patchName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callbackFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DataModelPatchService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CurrentDataModelType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "StudioDataModelType" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SessionId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Event", - "Name": "CurrentDataModelTypeAboutToChange", - "Parameters": [ - { - "Name": "dataModelType", - "Type": { - "Category": "Enum", - "Name": "StudioDataModelType" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CurrentDataModelTypeChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DataModelSession", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "UseCache", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreGetOptions", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetMetadata", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "SetMetadata", - "Parameters": [ - { - "Name": "attributes", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreIncrementOptions", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CreatedTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DataStoreName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UpdatedTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreInfo", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "KeyName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreKey", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CreatedTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UpdatedTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Version", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetMetadata", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetUserIds", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreKeyInfo", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CreatedTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsDeleted", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Version", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreObjectVersionInfo", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "AllScopes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "SetExperimentalFeatures", - "Parameters": [ - { - "Name": "experimentalFeatures", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreOptions", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "AutomaticRetry", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "LegacyNamingScheme", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetDataStore", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "global", - "Name": "scope", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DataStore" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetGlobalDataStore", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "DataStore" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetOrderedDataStore", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "global", - "Name": "scope", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "OrderedDataStore" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetRequestBudgetForRequestType", - "Parameters": [ - { - "Name": "requestType", - "Type": { - "Category": "Enum", - "Name": "DataStoreRequestType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "SetRateLimitForRequestType", - "Parameters": [ - { - "Name": "requestType", - "Type": { - "Category": "Enum", - "Name": "DataStoreRequestType" - } - }, - { - "Name": "baseLimit", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "perPlayerLimit", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "ListDataStoresAsync", - "Parameters": [ - { - "Default": "", - "Name": "prefix", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "0", - "Name": "pageSize", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "", - "Name": "cursor", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DataStoreListingPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetMetadata", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "SetMetadata", - "Parameters": [ - { - "Name": "attributes", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreSetOptions", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MaxItems", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "AddItem", - "Parameters": [ - { - "Name": "item", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "10", - "Name": "lifetime", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetLegacyMaxItems", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "addItem", - "Parameters": [ - { - "Name": "item", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "10", - "Name": "lifetime", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Debris", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DataModel", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "InstanceCount", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Errors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IsScriptStackTracingEnabled", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "JobCount", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PlayerCount", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Errors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ReportSoundWarnings", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Profile", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RobloxVersion", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Benchmarking", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TickCountPreciseOverride", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TickCountSampleMethod" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DebugSettings", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated", - "NotBrowsable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "DebuggablePluginWatcher", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Condition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ContinueExecution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Line", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LogExpression", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "isContextDependentBreakpoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "line", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DebuggerBreakpoint", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ErrorMessage", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HasError", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Id", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsPaused", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "AddBreakpoint", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "Breakpoint" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Close", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "EvaluateWatch", - "Parameters": [ - { - "Name": "expression", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "frame", - "Type": { - "Category": "Class", - "Name": "StackFrame" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFrameById", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "StackFrame" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSource", - "Parameters": [ - { - "Name": "scriptRef", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "status", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetThreadById", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "ThreadState" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetThreads", - "Parameters": [ - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetVariableById", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DebuggerVariable" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Pause", - "Parameters": [ - { - "Name": "thread", - "Type": { - "Category": "Class", - "Name": "ThreadState" - } - }, - { - "Name": "status", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Populate", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveBreakpoint", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "Breakpoint" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Resume", - "Parameters": [ - { - "Name": "thread", - "Type": { - "Category": "Class", - "Name": "ThreadState" - } - }, - { - "Name": "status", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetExceptionBreakMode", - "Parameters": [ - { - "Name": "breakMode", - "Type": { - "Category": "Enum", - "Name": "DebuggerExceptionBreakMode" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetVariable", - "Parameters": [ - { - "Name": "variable", - "Type": { - "Category": "Class", - "Name": "DebuggerVariable" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Step", - "Parameters": [ - { - "Name": "thread", - "Type": { - "Category": "Class", - "Name": "ThreadState" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StepIn", - "Parameters": [ - { - "Name": "thread", - "Type": { - "Category": "Class", - "Name": "ThreadState" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StepOut", - "Parameters": [ - { - "Name": "thread", - "Type": { - "Category": "Class", - "Name": "ThreadState" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdateSelectedFrame", - "Parameters": [ - { - "Name": "threadId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "frameNumber", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BreakpointAdded", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "Breakpoint" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BreakpointChanged", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "Breakpoint" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BreakpointRemoved", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "Breakpoint" - } - }, - { - "Name": "reason", - "Type": { - "Category": "Enum", - "Name": "BreakpointRemoveReason" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Paused", - "Parameters": [ - { - "Name": "pausedState", - "Type": { - "Category": "Class", - "Name": "PausedState" - } - }, - { - "Name": "reason", - "Type": { - "Category": "Enum", - "Name": "DebuggerPauseReason" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Resumed", - "Parameters": [ - { - "Name": "pausedState", - "Type": { - "Category": "Class", - "Name": "PausedState" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DebuggerConnection", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "LocalDebuggerConnection", - "Superclass": "DebuggerConnection", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Timeout", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "MemberType": "Function", - "Name": "ConnectLocal", - "Parameters": [ - { - "Name": "dataModel", - "Type": { - "Category": "Class", - "Name": "DataModel" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FocusConnection", - "Parameters": [ - { - "Name": "connection", - "Type": { - "Category": "Class", - "Name": "DebuggerConnection" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAvailableConnection", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "DebuggerConnection" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetConnectionById", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DebuggerConnection" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ConnectionEnded", - "Parameters": [ - { - "Name": "connection", - "Type": { - "Category": "Class", - "Name": "DebuggerConnection" - } - }, - { - "Name": "reason", - "Type": { - "Category": "Enum", - "Name": "DebuggerEndReason" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ConnectionStarted", - "Parameters": [ - { - "Name": "connection", - "Type": { - "Category": "Class", - "Name": "DebuggerConnection" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "FocusChanged", - "Parameters": [ - { - "Name": "connection", - "Type": { - "Category": "Class", - "Name": "DebuggerConnection" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DebuggerConnectionManager", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsError", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsSuccess", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Message", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RequestId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Status", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DebuggerStatus" - } - }, - { - "MemberType": "Function", - "Name": "GetArg", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DebuggerLuaResponse", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DebuggingEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "AddDebugger", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "EnableDebugging", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDebuggers", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Resume", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StepIn", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StepOut", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StepOver", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DebuggerAdded", - "Parameters": [ - { - "Name": "debugger", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DebuggerRemoved", - "Parameters": [ - { - "Name": "debugger", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DebuggerManager", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "EditBreakpoint", - "Parameters": [ - { - "Name": "metaBreakpointId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "EditWatch", - "Parameters": [ - { - "Name": "expression", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsConnectionForPlayDataModel", - "Parameters": [ - { - "Name": "debuggerConnectionId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenExceptionMessagePopup", - "Parameters": [ - { - "Name": "exceptionMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "pausedLine", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenScriptAtLine", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "debuggerConnectionId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "showErrorOnFail", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Pause", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveScriptLineMarkers", - "Parameters": [ - { - "Name": "debuggerConnectionId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "allMarkers", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Resume", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetCurrentThreadId", - "Parameters": [ - { - "Name": "debuggerThreadId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetScriptLineMarker", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "debuggerConnectionId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "lineMarkerType", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetWatchExpressions", - "Parameters": [ - { - "Name": "expressions", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ExpressionAdded", - "Parameters": [ - { - "Name": "expression", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ExpressionsCleared", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DebuggerUIService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Name", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Populated", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Type", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VariableId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VariablesCount", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "GetVariableByIndex", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DebuggerVariable" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetVariableByName", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DebuggerVariable" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DebuggerVariable", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Expression", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DebuggerWatch", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetDeviceId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DeviceIdService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "SinglePlayer", - "MemberType": "Property", - "Name": "BehaviorType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DialogBehaviorType" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "25", - "MemberType": "Property", - "Name": "ConversationDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "GoodbyeChoiceActive", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "GoodbyeDialog", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "InUse", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "InitialPrompt", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "Help", - "MemberType": "Property", - "Name": "Purpose", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DialogPurpose" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "Neutral", - "MemberType": "Property", - "Name": "Tone", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DialogTone" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TriggerDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TriggerOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetCurrentPlayers", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetGuiObject", - "Parameters": [ - { - "Name": "gui", - "Type": { - "Category": "Class", - "Name": "BillboardGui" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetPlayerIsUsing", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "isUsing", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SignalDialogChoiceSelected", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "dialogChoice", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "DialogChoiceSelected", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "dialogChoice", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Dialog", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "GoodbyeChoiceActive", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "GoodbyeDialog", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ResponseDialog", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "UserDialog", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DialogChoice", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "DiscardEdits", - "Parameters": [ - { - "Name": "scripts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDraftStatus", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "DraftStatusCode" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditors", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RestoreScripts", - "Parameters": [ - { - "Name": "scripts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowDiffsAgainstBase", - "Parameters": [ - { - "Name": "scripts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowDiffsAgainstServer", - "Parameters": [ - { - "Name": "scripts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowSourceDiffsAgainstCurrent", - "Parameters": [ - { - "Name": "sources", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "scripts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CommitEdits", - "Parameters": [ - { - "Name": "scripts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDrafts", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdateToLatestVersion", - "Parameters": [ - { - "Name": "scripts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CommitStatusChanged", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "DraftStatusCode" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DraftAdded", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DraftRemoved", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DraftStatusChanged", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "EditorsListChanged", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UpdateStatusChanged", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "DraftStatusCode" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DraftsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "AxisRotate", - "Parameters": [ - { - "Default": "X", - "Name": "axis", - "Type": { - "Category": "Enum", - "Name": "Axis" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "MouseDown", - "Parameters": [ - { - "Name": "mousePart", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "pointOnMousePart", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "parts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "MouseMove", - "Parameters": [ - { - "Name": "mouseRay", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "MouseUp", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Dragger", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AlignDraggedObjects", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AngleSnapEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AngleSnapIncrement", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AnimateHover", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CollisionsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerCoordinateSpace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DraggerCoordinateSpace" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DraggerMovementMode" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "GeometrySnapColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HoverAnimateFrequency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HoverLineThickness", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HoverThickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "JointsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LinearSnapEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LinearSnapIncrement", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PartSnapEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PivotSnapToGeometry", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowHover", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowPivotIndicator", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DraggerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "Unknown", - "MemberType": "Property", - "Name": "EditableStatus", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "EditableStatus" - } - } - ], - "MemoryCategory": "Instances", - "Name": "EditableService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Base64Decode", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "buffer" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "Base64Encode", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "buffer" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "CompressBuffer", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - }, - { - "Name": "algorithm", - "Type": { - "Category": "Enum", - "Name": "CompressionAlgorithm" - } - }, - { - "Default": "1", - "Name": "compressionLevel", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "buffer" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "ComputeBufferHash", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - }, - { - "Name": "algorithm", - "Type": { - "Category": "Enum", - "Name": "HashAlgorithm" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "buffer" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "ComputeStringHash", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "algorithm", - "Type": { - "Category": "Enum", - "Name": "HashAlgorithm" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "DecompressBuffer", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - }, - { - "Name": "algorithm", - "Type": { - "Category": "Enum", - "Name": "CompressionAlgorithm" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "buffer" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetDecompressedBufferSize", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - }, - { - "Name": "algorithm", - "Type": { - "Category": "Enum", - "Name": "CompressionAlgorithm" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int?" - }, - "Security": "None", - "ThreadSafety": "Safe" - } - ], - "MemoryCategory": "Instances", - "Name": "EncodingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "XYZ", - "MemberType": "Property", - "Name": "RotationOrder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RotationOrder" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetAnglesAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetRotationAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "X", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "FloatCurve" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Y", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "FloatCurve" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Z", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "FloatCurve" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "EulerRotationCurve", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "SendEventDeferred", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventContext", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "additionalArgs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendEventImmediately", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventContext", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "additionalArgs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetRBXEvent", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventContext", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "additionalArgs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetRBXEventStream", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventContext", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "additionalArgs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "EventIngestService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "PrintHello", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnPolo", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ExampleV2Service", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ScopeCheckUIComplete", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "scopes", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "ScopeCheckResult" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenAuthPrompt", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "scopes", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScopeCheckResult", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "ScopeCheckResult" - } - }, - { - "Name": "token", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "scopes", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ExperienceAuthService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Social" - ], - "Write": [ - "Social" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "InviteMessageId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Social" - ], - "Write": [ - "Social" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "InviteUser", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Social" - ], - "Write": [ - "Social" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "LaunchData", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Social" - ], - "Write": [ - "Social" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PromptMessage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ExperienceInviteOptions", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Function", - "Name": "InvokeOptInPromptClosed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Function", - "Name": "PromptOptIn", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Function", - "Name": "CanPromptOptInAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Event", - "Name": "OptInPromptClosed", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Event", - "Name": "PromptOptInRequested", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ExperienceNotificationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ExecuteCrossExperienceCall", - "Parameters": [ - { - "Name": "callId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "successCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "errorCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPendingJoinAttempt", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LaunchExperience", - "Parameters": [ - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LaunchExperienceFromSource", - "Parameters": [ - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LaunchExperienceFromSourceWithCallback", - "Parameters": [ - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterForExperienceJoin", - "Parameters": [ - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterForExperienceLeave", - "Parameters": [ - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartCrossExperience", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StopCrossExperience", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnCrossExperienceStarted", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnCrossExperienceStopped", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnNewJoinAttempt", - "Parameters": [ - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ExperienceService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "HiddenSelectionEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsInBackground", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsInCaptureMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "SelectionMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ExperienceStateCaptureSelectionMode" - } - }, - { - "MemberType": "Function", - "Name": "CanEnterCaptureMode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResetHighlight", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ToggleCaptureMode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ItemSelectedInCaptureMode", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "ExperienceStateCaptureService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ExitPlayback", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCurrentPlaybackRestartFrames", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPlaybackCurrentFrame", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPlaybackMode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "ExperienceStateRecordingPlaybackMode" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPlaybackFrame", - "Parameters": [ - { - "Name": "frame", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPlaybackMode", - "Parameters": [ - { - "Name": "mode", - "Type": { - "Category": "Enum", - "Name": "ExperienceStateRecordingPlaybackMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPlaybackPercentage", - "Parameters": [ - { - "Name": "percentage", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LoadPlaybackAsync", - "Parameters": [ - { - "Name": "uri", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "placeFileUri", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "mode", - "Type": { - "Category": "Enum", - "Name": "ExperienceStateRecordingLoadMode" - } - }, - { - "Name": "sourceType", - "Type": { - "Category": "Enum", - "Name": "ExperienceStateRecordingLoadSourceType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PlaybackStatusUpdated", - "Parameters": [ - { - "Name": "percentage", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "currentFrameNumber", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ExperienceStateRecordingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "BeginSearch", - "Parameters": [ - { - "Name": "root", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAutocompleter", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "ExplorerFilterAutocompleter" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetErrors", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetLexemes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSearchResults", - "Parameters": [ - { - "Name": "maxCandidatesToExplore", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HasMoreResults", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InstancePassesFilter", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetFilter", - "Parameters": [ - { - "Name": "search", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ExplorerFilter", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ReplaceRange", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RequiresOutsideContext", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "GetSuggestions", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ExplorerFilterAutocompleter", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetServiceVisibility", - "Parameters": [ - { - "Name": "service", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ExplorerServiceVisibilityService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "500000", - "MemberType": "Property", - "Name": "BlastPressure", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "4", - "MemberType": "Property", - "Name": "BlastRadius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "DestroyJointRadiusPercent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "Craters", - "MemberType": "Property", - "Name": "ExplosionType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ExplosionType" - } - }, - { - "Capabilities": { - "Read": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "LocalTransparencyModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "TimeScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Visible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Hit", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "distance", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Explosion", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Control", - "Default": "true", - "MemberType": "Property", - "Name": "AudioAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Control", - "Default": "FaceTrackingUninitialized", - "MemberType": "Property", - "Name": "FaceTrackingStatusEnum", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TrackerFaceTrackingStatus" - } - }, - { - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "FlipHeadOrientation", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Control", - "Default": "true", - "MemberType": "Property", - "Name": "VideoAnimationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "GetTrackerLodController", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "TrackerLodController" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Init", - "Parameters": [ - { - "Name": "videoEnabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "audioEnabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsStarted", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Start", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Step", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Stop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TrackerError", - "Parameters": [ - { - "Name": "error", - "Type": { - "Category": "Enum", - "Name": "TrackerError" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TrackerPrompt", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Enum", - "Name": "TrackerPromptEvent" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FaceAnimatorService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "ChinRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "ChinRaiserUpperLip", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Brows", - "Default": "0", - "MemberType": "Property", - "Name": "Corrugator", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "EyesLookDown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "EyesLookLeft", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "EyesLookRight", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "EyesLookUp", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "FlatPucker", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "Funneler", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "InternalOverrideFACSData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Jaw", - "Default": "0", - "MemberType": "Property", - "Name": "JawDrop", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Jaw", - "Default": "0", - "MemberType": "Property", - "Name": "JawLeft", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Jaw", - "Default": "0", - "MemberType": "Property", - "Name": "JawRight", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Brows", - "Default": "0", - "MemberType": "Property", - "Name": "LeftBrowLowerer", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LeftCheekPuff", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "LeftCheekRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LeftDimpler", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "LeftEyeClosed", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "LeftEyeUpperLidRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Brows", - "Default": "0", - "MemberType": "Property", - "Name": "LeftInnerBrowRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LeftLipCornerDown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LeftLipCornerPuller", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LeftLipStretcher", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LeftLowerLipDepressor", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Brows", - "Default": "0", - "MemberType": "Property", - "Name": "LeftNoseWrinkler", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Brows", - "Default": "0", - "MemberType": "Property", - "Name": "LeftOuterBrowRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LeftUpperLipRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LipPresser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LipsTogether", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "LowerLipSuck", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "MouthLeft", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "MouthRight", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "Pucker", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Brows", - "Default": "0", - "MemberType": "Property", - "Name": "RightBrowLowerer", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "RightCheekPuff", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "RightCheekRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "RightDimpler", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "RightEyeClosed", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Eyes", - "Default": "0", - "MemberType": "Property", - "Name": "RightEyeUpperLidRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Brows", - "Default": "0", - "MemberType": "Property", - "Name": "RightInnerBrowRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "RightLipCornerDown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "RightLipCornerPuller", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "RightLipStretcher", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "RightLowerLipDepressor", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Brows", - "Default": "0", - "MemberType": "Property", - "Name": "RightNoseWrinkler", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Brows", - "Default": "0", - "MemberType": "Property", - "Name": "RightOuterBrowRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "RightUpperLipRaiser", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tongue", - "Default": "0", - "MemberType": "Property", - "Name": "TongueDown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tongue", - "Default": "0", - "MemberType": "Property", - "Name": "TongueOut", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tongue", - "Default": "0", - "MemberType": "Property", - "Name": "TongueUp", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mouth", - "Default": "0", - "MemberType": "Property", - "Name": "UpperLipSuck", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "HasOverrideFACSData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Event", - "Name": "InternalFacsOverrideChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "FaceControls", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Face", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "FaceInstance", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Color3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "ColorMap", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ColorMapContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LocalTransparencyModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "MetalnessMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MetalnessMapContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "NormalMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "NormalMapContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "Rotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "RoughnessMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RoughnessMapContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "20", - "MemberType": "Property", - "Name": "Shiny", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "Specular", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "Texture", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TextureContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "TexturePack", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "TexturePackMetadata", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0, 0", - "MemberType": "Property", - "Name": "UVOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1, 1", - "MemberType": "Property", - "Name": "UVScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "ZIndex", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "GraphicsTexture", - "Name": "Decal", - "Superclass": "FaceInstance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "OffsetStudsU", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "OffsetStudsV", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "2", - "MemberType": "Property", - "Name": "StudsPerTileU", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "2", - "MemberType": "Property", - "Name": "StudsPerTileV", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "GraphicsTexture", - "Name": "Texture", - "Superclass": "Decal" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "IsAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InquiryAsync", - "Parameters": [ - { - "Name": "inquiryRequest", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FacialAgeEstimationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "BiometricDataConsent", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "IsAgeRestricted", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CheckOrRequestCameraPermission", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FacialAnimationRecordingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Get", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetWithPlayerId", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FacialAnimationStreamingServiceStats", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "ServiceState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "GetStats", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "FacialAnimationStreamingServiceStats" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsAudioEnabled", - "Parameters": [ - { - "Name": "mask", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsPlaceEnabled", - "Parameters": [ - { - "Name": "mask", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsServerEnabled", - "Parameters": [ - { - "Name": "mask", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsVideoEnabled", - "Parameters": [ - { - "Name": "mask", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResolveStateForUser", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FacialAnimationStreamingServiceV2", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "FacialAnimationStreamingSubsessionStats", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ], - "Write": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FaceId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ], - "Write": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InOut", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "InOut" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ], - "Write": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LeftRight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "LeftRight" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ], - "Write": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TopBottom", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TopBottom" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Feature", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "Hole", - "Superclass": "Feature", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "MotorFeature", - "Superclass": "Feature", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "FeatureTimeoutAttempt", - "Parameters": [ - { - "Name": "permanent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "startTime", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "duration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "featureRestrictionAbuseVector", - "Type": { - "Category": "Enum", - "Name": "FeatureRestrictionAbuseVector" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "FeatureTimeoutRestored", - "Parameters": [ - { - "Name": "featureRestrictionAbuseVector", - "Type": { - "Category": "Enum", - "Name": "FeatureRestrictionAbuseVector" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RefreshFeatureRestrictions", - "Parameters": [ - { - "Name": "featureRestrictionAbuseVector", - "Type": { - "Category": "Enum", - "Name": "FeatureRestrictionAbuseVector" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ShowFeatureInterventionDetails", - "Parameters": [ - { - "Name": "featureRestrictionAbuseVector", - "Type": { - "Category": "Enum", - "Name": "FeatureRestrictionAbuseVector" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ShowFeatureInterventionDetailsV2", - "Parameters": [ - { - "Name": "featureRestrictionAbuseVector", - "Type": { - "Category": "Enum", - "Name": "FeatureRestrictionAbuseVector" - } - }, - { - "Name": "isGameJoin", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TimeoutChatAttempt", - "Parameters": [ - { - "Name": "isPermanentTimeout", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "endTime", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UpdateClientFeatureTimeout", - "Parameters": [ - { - "Name": "acknowledgeable", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "permanent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "startTime", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "duration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "featureRestrictionAbuseVector", - "Type": { - "Category": "Enum", - "Name": "FeatureRestrictionAbuseVector" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UpdateExperienceChatTimeout", - "Parameters": [ - { - "Name": "startTime", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "duration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UpdateFeatureTimeout", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "acknowledgeable", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "permanent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "startTime", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "duration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "featureRestrictionAbuseVector", - "Type": { - "Category": "Enum", - "Name": "FeatureRestrictionAbuseVector" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FeatureRestrictionManager", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetBinaryContents", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetTemporaryId", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "ContentId" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "File", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "OpenFileInWebBrowser", - "Parameters": [ - { - "Name": "folder", - "Type": { - "Category": "Enum", - "Name": "EngineFolder" - } - }, - { - "Name": "fileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenFolder", - "Parameters": [ - { - "Name": "folder", - "Type": { - "Category": "Enum", - "Name": "EngineFolder" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RevealFileInFolder", - "Parameters": [ - { - "Name": "folder", - "Type": { - "Category": "Enum", - "Name": "EngineFolder" - } - }, - { - "Name": "fileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ListFilesInFolderAsync", - "Parameters": [ - { - "Name": "folder", - "Type": { - "Category": "Enum", - "Name": "EngineFolder" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FileManagerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0.92549, 0.545098, 0.27451", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "9", - "MemberType": "Property", - "Name": "Heat", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "LocalTransparencyModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0.545098, 0.313726, 0.215686", - "MemberType": "Property", - "Name": "SecondaryColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "5", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "TimeScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "9", - "MemberType": "Property", - "Name": "heat_xml", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "5", - "MemberType": "Property", - "Name": "size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Size", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "5", - "MemberType": "Property", - "Name": "size_xml", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FastForward", - "Parameters": [ - { - "Name": "numFrames", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Fire", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "FlagStandService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Length", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "\u0002", - "MemberType": "Property", - "Name": "ValuesAndTimes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetKeyAtIndex", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "FloatCurveKey" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetKeyIndicesAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetKeys", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetValueAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float?" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "InsertKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "DataType", - "Name": "FloatCurveKey" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RemoveKeyAtIndex", - "Parameters": [ - { - "Name": "startingIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "1", - "Name": "count", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetKeys", - "Parameters": [ - { - "Name": "keys", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FloatCurve", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "FlyweightService", - "Superclass": "Instance", - "Tags": [ - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CSGDictionaryService", - "Superclass": "FlyweightService", - "Tags": [ - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "NonReplicatedCSGDictionaryService", - "Superclass": "FlyweightService", - "Tags": [ - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "2147483647", - "MemberType": "Property", - "Name": "ReplicatedGuiInsertionOrder", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Folder", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Visible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ForceField", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetPlatformFriends", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "FriendsUpdated", - "Parameters": [ - { - "Name": "friendData", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RemoteFriendEventSignal", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "event", - "Type": { - "Category": "Enum", - "Name": "FriendRequestEvent" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RemoteFriendStatusSignal", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "FriendStatus" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FriendService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Physics", - "Default": "true", - "MemberType": "Property", - "Name": "AllowSleep", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "?", - "MemberType": "Property", - "Name": "Description", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Settings", - "Default": "false", - "MemberType": "Property", - "Name": "HasMigratedSettingsToTestService", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Physics", - "Default": "true", - "MemberType": "Property", - "Name": "Is30FpsThrottleEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Physics", - "Default": "true", - "MemberType": "Property", - "Name": "PhysicsEnvironmentalThrottle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Settings", - "Default": "60", - "MemberType": "Property", - "Name": "Timeout", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "MemberType": "Function", - "Name": "Error", - "Parameters": [ - { - "Default": "", - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Failed", - "Parameters": [ - { - "Default": "", - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Pass", - "Parameters": [ - { - "Default": "", - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Passed", - "Parameters": [ - { - "Default": "", - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Warn", - "Parameters": [ - { - "Default": "", - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FunctionalTest", - "Superclass": "Instance", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Monetization" - ], - "MemberType": "Function", - "Name": "PlayerHasPass", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "gamePassId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GamePassService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Video", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VideoCaptureEnabled", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Event", - "Name": "VideoRecordingChangeRequest", - "Parameters": [ - { - "Name": "recording", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GameSettings", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "GamepadCursorEnabled", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "DisableGamepadCursor", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "EnableGamepadCursor", - "Parameters": [ - { - "Name": "guiObject", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetGamepadCursorPosition", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetGamepadCursorPosition", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "GamepadThumbstick1Changed", - "Parameters": [ - { - "Name": "event", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GamepadService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GenerateMeshAsync", - "Parameters": [ - { - "Name": "inputs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "intermediateResultCallback", - "Type": { - "Category": "DataType", - "Name": "Function?" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "GenerateModelAsync", - "Parameters": [ - { - "Name": "inputs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "schema", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "InternalGenerateMeshAsync", - "Parameters": [ - { - "Name": "inputs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "intermediateResultCallback", - "Type": { - "Category": "DataType", - "Name": "Function?" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "LoadGeneratedMeshAsync", - "Parameters": [ - { - "Name": "generationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MeshPart" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Function", - "Name": "LoadModelFromGlbAsync", - "Parameters": [ - { - "Name": "glbPath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Model" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Event", - "Name": "ReplicateGeneration", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "serializedModel", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DynamicGeneration" - ], - "MemberType": "Event", - "Name": "RequestGenerationReplication", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GenerationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "SignalChallengeAbandoned", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalChallengeCompleted", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "challengeType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "challengeMetadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalChallengeInvalidated", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalChallengeLoaded", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalChallengeRequired", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "challengeType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "challengeMetadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ChallengeAbandonedEvent", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ChallengeCompletedEvent", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "challengeType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "challengeMetadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ChallengeInvalidatedEvent", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ChallengeLoadedEvent", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ChallengeRequiredEvent", - "Parameters": [ - { - "Name": "challengeID", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "challengeType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "challengeMetadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GenericChallengeService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "Geometry", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "CalculateConstraintsToPreserve", - "Parameters": [ - { - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "destination", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "GenerateFragmentSites", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "TranscodeMesh", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "TranscodeModel", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "FragmentAsync", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "sites", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "HashMeshAsync", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "IntersectAsync", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "parts", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "SubtractAsync", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "parts", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "SweepPartAsync", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "cframes", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MeshPart" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "UnionAsync", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "parts", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GeometryService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Font", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "RichText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "20", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Width", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "GetTextBoundsParams", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "OnUpdate", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Class", - "Name": "DataStoreGetOptions" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "IncrementAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "1", - "Name": "delta", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "{}", - "Name": "userIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Class", - "Name": "DataStoreIncrementOptions" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "RemoveAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "SetAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "{}", - "Name": "userIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Class", - "Name": "DataStoreSetOptions" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "UpdateAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "transformFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GlobalDataStore", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetVersionAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "version", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetVersionAtTimeAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "timestamp", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "ListKeysAsync", - "Parameters": [ - { - "Default": "", - "Name": "prefix", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "0", - "Name": "pageSize", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "", - "Name": "cursor", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "false", - "Name": "excludeDeleted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DataStoreKeyPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "ListVersionsAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "Ascending", - "Name": "sortDirection", - "Type": { - "Category": "Enum", - "Name": "SortDirection" - } - }, - { - "Default": "0", - "Name": "minDate", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "0", - "Name": "maxDate", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "0", - "Name": "pageSize", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DataStoreVersionPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "RemoveVersionAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "version", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DataStore", - "Superclass": "GlobalDataStore", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetSortedAsync", - "Parameters": [ - { - "Name": "ascending", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pagesize", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "minValue", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "maxValue", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DataStorePages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "OrderedDataStore", - "Superclass": "GlobalDataStore", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Groups" - ], - "MemberType": "Function", - "Name": "PromptJoinCompleted", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "groupMembershipStatus", - "Type": { - "Category": "Enum", - "Name": "GroupMembershipStatus" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Groups" - ], - "MemberType": "Function", - "Name": "GetAlliesAsync", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "StandardPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Groups" - ], - "MemberType": "Function", - "Name": "GetEnemiesAsync", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "StandardPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Groups" - ], - "MemberType": "Function", - "Name": "GetGroupInfoAsync", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Groups" - ], - "MemberType": "Function", - "Name": "GetGroupsAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Groups" - ], - "MemberType": "Function", - "Name": "PromptJoinAsync", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "GroupMembershipStatus" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Groups" - ], - "MemberType": "Event", - "Name": "ShowJoinPrompt", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GroupService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "GuiBase", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AbsolutePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AbsoluteRotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AbsoluteSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ActiveQueryNames", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Localization", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AutoLocalize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Debugging", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ClippedRect", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Rect" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Debugging", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsNotOccluded", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Localization", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Localize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "AutoLocalize", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Debugging", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RawRect2D", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Rect" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ReplicatedInsertionOrder", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Localization", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RootLocalizationTable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "LocalizationTable" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionBehaviorDown", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SelectionBehavior" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionBehaviorLeft", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SelectionBehavior" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionBehaviorRight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SelectionBehavior" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionBehaviorUp", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SelectionBehavior" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionGroup", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Debugging", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TotalGroupScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "SelectionChanged", - "Parameters": [ - { - "Name": "amISelected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "previousSelection", - "Type": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Name": "newSelection", - "Type": { - "Category": "Class", - "Name": "GuiObject" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GuiBase2d", - "Superclass": "GuiBase", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AnchorPoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AutomaticSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AutomaticSize" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BackgroundColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BackgroundColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BackgroundTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BorderColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BorderColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BorderMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "BorderMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BorderSizePixel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ClipsDescendants", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DragBeginConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DragStoppedConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Draggable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "GuiState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "GuiState" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Interactable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LayoutOrder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseEnterConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseLeaveConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseMovedConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseWheelBackwardConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseWheelForwardConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NextSelectionDown", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NextSelectionLeft", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NextSelectionRight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NextSelectionUp", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Rotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Selectable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionImageObject", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionOrder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionRect2D", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Rect" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SizeConstraint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SizeConstraint" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Visible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ZIndex", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "TweenPosition", - "Parameters": [ - { - "Name": "endPosition", - "Type": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Default": "Out", - "Name": "easingDirection", - "Type": { - "Category": "Enum", - "Name": "EasingDirection" - } - }, - { - "Default": "Quad", - "Name": "easingStyle", - "Type": { - "Category": "Enum", - "Name": "EasingStyle" - } - }, - { - "Default": "1", - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "false", - "Name": "override", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "nil", - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "TweenSize", - "Parameters": [ - { - "Name": "endSize", - "Type": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Default": "Out", - "Name": "easingDirection", - "Type": { - "Category": "Enum", - "Name": "EasingDirection" - } - }, - { - "Default": "Quad", - "Name": "easingStyle", - "Type": { - "Category": "Enum", - "Name": "EasingStyle" - } - }, - { - "Default": "1", - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "false", - "Name": "override", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "nil", - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "TweenSizeAndPosition", - "Parameters": [ - { - "Name": "endSize", - "Type": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Name": "endPosition", - "Type": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Default": "Out", - "Name": "easingDirection", - "Type": { - "Category": "Enum", - "Name": "EasingDirection" - } - }, - { - "Default": "Quad", - "Name": "easingStyle", - "Type": { - "Category": "Enum", - "Name": "EasingStyle" - } - }, - { - "Default": "1", - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "false", - "Name": "override", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "nil", - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "DragBegin", - "Parameters": [ - { - "Name": "initialPosition", - "Type": { - "Category": "DataType", - "Name": "UDim2" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "DragStopped", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "InputBegan", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "InputChanged", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "InputEnded", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseEnter", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseLeave", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseMoved", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseWheelBackward", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseWheelForward", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "SelectionGained", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "SelectionLost", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "TouchLongPress", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "UserInputState" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "TouchPan", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "totalTranslation", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "velocity", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "UserInputState" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "TouchPinch", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "scale", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "velocity", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "UserInputState" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "TouchRotate", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "rotation", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "velocity", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "UserInputState" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "TouchSwipe", - "Parameters": [ - { - "Name": "swipeDirection", - "Type": { - "Category": "Enum", - "Name": "SwipeDirection" - } - }, - { - "Name": "numberOfTouches", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "TouchTap", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "GuiObject", - "Superclass": "GuiBase2d", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "GroupColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "GroupTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "ResolutionScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Gui", - "Name": "CanvasGroup", - "Superclass": "GuiObject" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "Custom", - "MemberType": "Property", - "Name": "Style", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FrameStyle" - } - } - ], - "MemoryCategory": "Gui", - "Name": "Frame", - "Superclass": "GuiObject" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AutoButtonColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Haptic", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HoverHapticEffect", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "HapticEffect" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Modal", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseButton1ClickConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseButton1DownConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseButton1UpConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseButton2ClickConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseButton2DownConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "EventReplicator", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MouseButton2UpConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Haptic", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PressHapticEffect", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "HapticEffect" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Selection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Selected", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Style", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ButtonStyle" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "Activated", - "Parameters": [ - { - "Name": "inputObject", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "clickCount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseButton1Click", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseButton1Down", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseButton1Up", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseButton2Click", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseButton2Down", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseButton2Up", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "SecondaryActivated", - "Parameters": [ - { - "Name": "inputObject", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "GuiButton", - "Superclass": "GuiObject", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0, 0", - "MemberType": "Property", - "Name": "ContentImageSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "", - "MemberType": "Property", - "Name": "HoverImage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "HoverImageContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "", - "MemberType": "Property", - "Name": "Image", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "ImageColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ImageContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0, 0", - "MemberType": "Property", - "Name": "ImageRectOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0, 0", - "MemberType": "Property", - "Name": "ImageRectSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0", - "MemberType": "Property", - "Name": "ImageTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "false", - "MemberType": "Property", - "Name": "IsLoaded", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "", - "MemberType": "Property", - "Name": "PressedImage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "PressedImageContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "Default", - "MemberType": "Property", - "Name": "ResampleMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ResamplerMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "Stretch", - "MemberType": "Property", - "Name": "ScaleType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScaleType" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0, 0, 0, 0", - "MemberType": "Property", - "Name": "SliceCenter", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Rect" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "1", - "MemberType": "Property", - "Name": "SliceScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "{1, 0}, {1, 0}", - "MemberType": "Property", - "Name": "TileSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetEnableContentImageSizeChangedEvents", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "ImageButton", - "Superclass": "GuiButton" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Confidential", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Button", - "MemberType": "Property", - "Name": "ContentText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Legacy", - "MemberType": "Property", - "Name": "Font", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FontFace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Size8", - "MemberType": "Property", - "Name": "FontSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "TextSize", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FontSize" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "1", - "MemberType": "Property", - "Name": "LineHeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "LocalizationMatchIdentifier", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "LocalizationMatchedSourceText", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "LocalizedText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "-1", - "MemberType": "Property", - "Name": "MaxVisibleGraphemes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "OpenTypeFeatures", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "OpenTypeFeaturesError", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "RichText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Button", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0, 0", - "MemberType": "Property", - "Name": "TextBounds", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TextColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0.105882, 0.164706, 0.207843", - "MemberType": "Property", - "Name": "TextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Auto", - "MemberType": "Property", - "Name": "TextDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextDirection" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextFits", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextScaled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "8", - "MemberType": "Property", - "Name": "TextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TextStrokeColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "1", - "MemberType": "Property", - "Name": "TextStrokeTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0", - "MemberType": "Property", - "Name": "TextTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "None", - "MemberType": "Property", - "Name": "TextTruncate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextTruncate" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextWrap", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "TextWrapped", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextWrapped", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Center", - "MemberType": "Property", - "Name": "TextXAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextXAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Center", - "MemberType": "Property", - "Name": "TextYAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextYAlignment" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetTextFromInput", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "TextButton", - "Superclass": "GuiButton" - }, - { - "Members": [ - ], - "MemoryCategory": "Gui", - "Name": "GuiLabel", - "Superclass": "GuiObject", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0, 0", - "MemberType": "Property", - "Name": "ContentImageSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "", - "MemberType": "Property", - "Name": "Image", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "ImageColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ImageContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0, 0", - "MemberType": "Property", - "Name": "ImageRectOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0, 0", - "MemberType": "Property", - "Name": "ImageRectSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0", - "MemberType": "Property", - "Name": "ImageTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "false", - "MemberType": "Property", - "Name": "IsLoaded", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "Default", - "MemberType": "Property", - "Name": "ResampleMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ResamplerMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "Stretch", - "MemberType": "Property", - "Name": "ScaleType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScaleType" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0, 0, 0, 0", - "MemberType": "Property", - "Name": "SliceCenter", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Rect" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "1", - "MemberType": "Property", - "Name": "SliceScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "{1, 0}, {1, 0}", - "MemberType": "Property", - "Name": "TileSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetEnableContentImageSizeChangedEvents", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "ImageLabel", - "Superclass": "GuiLabel" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Confidential", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Label", - "MemberType": "Property", - "Name": "ContentText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Legacy", - "MemberType": "Property", - "Name": "Font", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FontFace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Size8", - "MemberType": "Property", - "Name": "FontSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "TextSize", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FontSize" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "1", - "MemberType": "Property", - "Name": "LineHeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "LocalizationMatchIdentifier", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "LocalizationMatchedSourceText", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "LocalizedText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "-1", - "MemberType": "Property", - "Name": "MaxVisibleGraphemes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "OpenTypeFeatures", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "OpenTypeFeaturesError", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "RichText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Label", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0, 0", - "MemberType": "Property", - "Name": "TextBounds", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TextColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0.105882, 0.164706, 0.207843", - "MemberType": "Property", - "Name": "TextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Auto", - "MemberType": "Property", - "Name": "TextDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextDirection" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextFits", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextScaled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "8", - "MemberType": "Property", - "Name": "TextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TextStrokeColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "1", - "MemberType": "Property", - "Name": "TextStrokeTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0", - "MemberType": "Property", - "Name": "TextTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "None", - "MemberType": "Property", - "Name": "TextTruncate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextTruncate" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextWrap", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "TextWrapped", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextWrapped", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Center", - "MemberType": "Property", - "Name": "TextXAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextXAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Center", - "MemberType": "Property", - "Name": "TextYAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextYAlignment" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetTextFromInput", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "TextLabel", - "Superclass": "GuiLabel" - }, - { - "Members": [ - ], - "MemoryCategory": "Gui", - "Name": "RelativeGui", - "Superclass": "GuiObject", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsoluteCanvasSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsoluteWindowSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "None", - "MemberType": "Property", - "Name": "AutomaticCanvasSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AutomaticSize" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "rbxasset://textures/ui/Scroll/scroll-bottom.png", - "MemberType": "Property", - "Name": "BottomImage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "BottomImageContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "0, 0", - "MemberType": "Property", - "Name": "CanvasPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "{0, 0}, {2, 0}", - "MemberType": "Property", - "Name": "CanvasSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "DraggingScrollBar", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DraggingScrollBar" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "WhenScrollable", - "MemberType": "Property", - "Name": "ElasticBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ElasticBehavior" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Debugging", - "Default": "0, 0, 0, 0", - "MemberType": "Property", - "Name": "HorizontalBarRect", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Rect" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "None", - "MemberType": "Property", - "Name": "HorizontalScrollBarInset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScrollBarInset" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Debugging", - "Default": "0, 0", - "MemberType": "Property", - "Name": "MaxCanvasPosition", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "rbxasset://textures/ui/Scroll/scroll-middle.png", - "MemberType": "Property", - "Name": "MidImage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MidImageContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "ScrollBarImageColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "0", - "MemberType": "Property", - "Name": "ScrollBarImageTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "12", - "MemberType": "Property", - "Name": "ScrollBarThickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "1", - "MemberType": "Property", - "Name": "ScrollRate", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "0, 0", - "MemberType": "Property", - "Name": "ScrollVelocity", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "XY", - "MemberType": "Property", - "Name": "ScrollingDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScrollingDirection" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "true", - "MemberType": "Property", - "Name": "ScrollingEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "true", - "MemberType": "Property", - "Name": "SmoothScroll", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "rbxasset://textures/ui/Scroll/scroll-top.png", - "MemberType": "Property", - "Name": "TopImage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TopImageContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Debugging", - "Default": "0, 0, 0, 0", - "MemberType": "Property", - "Name": "VerticalBarRect", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Rect" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "None", - "MemberType": "Property", - "Name": "VerticalScrollBarInset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScrollBarInset" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Scrolling", - "Default": "Right", - "MemberType": "Property", - "Name": "VerticalScrollBarPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VerticalScrollBarPosition" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ClearInertialScrolling", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetSampledInertialVelocity", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetScrollVelocity", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ResetScrollVelocity", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ScrollToTop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "ScrollingFrame", - "Superclass": "GuiObject" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "ClearTextOnFocus", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Confidential", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "TextBox", - "MemberType": "Property", - "Name": "ContentText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "CursorPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Legacy", - "MemberType": "Property", - "Name": "Font", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FontFace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Size8", - "MemberType": "Property", - "Name": "FontSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "TextSize", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FontSize" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "1", - "MemberType": "Property", - "Name": "LineHeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "LocalizationMatchIdentifier", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "LocalizationMatchedSourceText", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "LocalizedPlaceholderText", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "ManualFocusRelease", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "-1", - "MemberType": "Property", - "Name": "MaxVisibleGraphemes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "MultiLine", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "OpenTypeFeatures", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "OpenTypeFeaturesError", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "OverlayNativeInput", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0.7, 0.7, 0.7", - "MemberType": "Property", - "Name": "PlaceholderColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "", - "MemberType": "Property", - "Name": "PlaceholderText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "ReturnKeyType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ReturnKeyType" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "RichText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "SelectionStart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "ShouldEmitReturnEvents", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "ShouldEmitTabEvents", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "ShouldEmitUpAndDownArrowEvents", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "ShowNativeInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "TextBox", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0, 0", - "MemberType": "Property", - "Name": "TextBounds", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TextColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0.105882, 0.164706, 0.207843", - "MemberType": "Property", - "Name": "TextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Auto", - "MemberType": "Property", - "Name": "TextDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextDirection" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "TextEditable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextFits", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "TextInputType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextInputType" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextScaled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "8", - "MemberType": "Property", - "Name": "TextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TextStrokeColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "1", - "MemberType": "Property", - "Name": "TextStrokeTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "0", - "MemberType": "Property", - "Name": "TextTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "None", - "MemberType": "Property", - "Name": "TextTruncate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextTruncate" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextWrap", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "TextWrapped", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "false", - "MemberType": "Property", - "Name": "TextWrapped", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Center", - "MemberType": "Property", - "Name": "TextXAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextXAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Text", - "Default": "Center", - "MemberType": "Property", - "Name": "TextYAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextYAlignment" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "CaptureFocus", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "IsFocused", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ReleaseFocus", - "Parameters": [ - { - "Default": "false", - "Name": "submitted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ResetKeyboardMode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetTextFromInput", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "FocusLost", - "Parameters": [ - { - "Name": "enterPressed", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "inputThatCausedFocusLoss", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "Focused", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "ReturnPressedFromOnScreenKeyboard", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "TextBox", - "Superclass": "GuiObject" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "Default", - "MemberType": "Property", - "Name": "ResampleMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ResamplerMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "Stretch", - "MemberType": "Property", - "Name": "ScaleType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScaleType" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "{1, 0}, {1, 0}", - "MemberType": "Property", - "Name": "TileSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "VideoColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "0, 0", - "MemberType": "Property", - "Name": "VideoRectOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "0, 0", - "MemberType": "Property", - "Name": "VideoRectSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "0", - "MemberType": "Property", - "Name": "VideoTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "VideoDisplay", - "Superclass": "GuiObject", - "Tags": [ - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "false", - "MemberType": "Property", - "Name": "IsLoaded", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "false", - "MemberType": "Property", - "Name": "Looped", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "false", - "MemberType": "Property", - "Name": "Playing", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "false", - "MemberType": "Property", - "Name": "PlayingReplicating", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "0, 0", - "MemberType": "Property", - "Name": "Resolution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "0", - "MemberType": "Property", - "Name": "TimeLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "0", - "MemberType": "Property", - "Name": "TimePositionReplicating", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "", - "MemberType": "Property", - "Name": "Video", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "VideoContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Video", - "Default": "1", - "MemberType": "Property", - "Name": "Volume", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "Pause", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "Play", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetStudioPreview", - "Parameters": [ - { - "Name": "isPreview", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "DidLoop", - "Parameters": [ - { - "Name": "video", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "Ended", - "Parameters": [ - { - "Name": "video", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "Loaded", - "Parameters": [ - { - "Name": "video", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "Paused", - "Parameters": [ - { - "Name": "video", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "Played", - "Parameters": [ - { - "Name": "video", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "PlayingUpdatedFromServer", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "TimePositionUpdatedFromServer", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "VideoFrame", - "Superclass": "GuiObject" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0.784314, 0.784314, 0.784314", - "MemberType": "Property", - "Name": "Ambient", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "CameraCFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1.22173059", - "MemberType": "Property", - "Name": "CameraFieldOfView", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "CurrentCamera", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Camera" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "ImageColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "0", - "MemberType": "Property", - "Name": "ImageTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "IsMirrored", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0.54902, 0.54902, 0.54902", - "MemberType": "Property", - "Name": "LightColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "-1, -1, -1", - "MemberType": "Property", - "Name": "LightDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "CaptureSnapshotAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "ContentId" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "ViewportFrame", - "Superclass": "GuiObject" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ResetOnSpawn", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ZIndexBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ZIndexBehavior" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetGuiObjectsAtPosition", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetLayoutNodeTree", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LayerCollector", - "Superclass": "GuiBase2d", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Adornee", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "AlwaysOnTop", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Brightness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "ClipsDescendants", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "DistanceLowerLimit", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "DistanceStep", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "DistanceUpperLimit", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ExtentsOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ExtentsOffsetWorldSpace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "LightInfluence", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "INF", - "MemberType": "Property", - "Name": "MaxDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "PlayerToHideFrom", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "{0, 0}, {0, 0}", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "SizeOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "StudsOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "StudsOffsetWorldSpace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetScreenSpaceBounds", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BillboardGui", - "Superclass": "LayerCollector" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Plugin", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Plugin" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Title", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "BindToClose", - "Parameters": [ - { - "Default": "nil", - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetRelativeMousePosition", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "InputBegan", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "InputChanged", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "InputEnded", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseEnter", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MouseLeave", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "PluginDragDropped", - "Parameters": [ - { - "Name": "dragData", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "PluginDragEntered", - "Parameters": [ - { - "Name": "dragData", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "PluginDragLeft", - "Parameters": [ - { - "Name": "dragData", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "PluginDragMoved", - "Parameters": [ - { - "Name": "dragData", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "WindowFocusReleased", - "Parameters": [ - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "WindowFocused", - "Parameters": [ - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginGui", - "Superclass": "LayerCollector", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "HostWidgetWasRestored", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "RequestRaise", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DockWidgetPluginGui", - "Superclass": "PluginGui", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "QWidgetPluginGui", - "Superclass": "PluginGui", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "true", - "MemberType": "Property", - "Name": "ClipToDeviceSafeArea", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "DisplayOrder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IgnoreGuiInset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "OnTopOfCoreBlur", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "FullscreenExtension", - "MemberType": "Property", - "Name": "SafeAreaCompatibility", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SafeAreaCompatibility" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "CoreUISafeInsets", - "MemberType": "Property", - "Name": "ScreenInsets", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ScreenInsets" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ScreenGui", - "Superclass": "LayerCollector" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "GuiMain", - "Superclass": "ScreenGui", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Adornee", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Face", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SurfaceGuiBase", - "Superclass": "LayerCollector", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "HorizontalRectangle", - "MemberType": "Property", - "Name": "AdShape", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AdShape" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Monetization" - ], - "Write": [ - "UI", - "Monetization" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "EnableVideoAds", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "FallbackImage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Monetization" - ], - "Write": [ - "UI", - "Monetization" - ] - }, - "Category": "Behavior", - "Default": "Inactive", - "MemberType": "Property", - "Name": "Status", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AdUnitStatus" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetSingleReportAdInfo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Map" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "HandleLuaUIEvent", - "Parameters": [ - { - "Name": "eventType", - "Type": { - "Category": "Enum", - "Name": "AdUIEventType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "forwardStateToLuaUI", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "AdEvent", - "Parameters": [ - { - "Name": "adEventType", - "Type": { - "Category": "Enum", - "Name": "AdEventType" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "ReportIsSubscribedToVideoCompletion", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "adGuiStateChanged", - "Parameters": [ - { - "Name": "adUIState", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Monetization" - ], - "MemberType": "Callback", - "Name": "OnAdEvent", - "Parameters": [ - { - "Name": "eventInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "AdGui", - "Superclass": "SurfaceGuiBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "AlwaysOnTop", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Brightness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Sizing", - "Default": "800, 600", - "MemberType": "Property", - "Name": "CanvasSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "ClipsDescendants", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "HorizontalCurvature", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "LightInfluence", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MaxDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Sizing", - "Default": "50", - "MemberType": "Property", - "Name": "PixelsPerStud", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "Flat", - "MemberType": "Property", - "Name": "Shape", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SurfaceGuiShape" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Sizing", - "Default": "FixedSize", - "MemberType": "Property", - "Name": "SizingMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SurfaceGuiSizingMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "ToolPunchThroughDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "ZOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SurfaceGui", - "Superclass": "SurfaceGuiBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Color3", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Color3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Visible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "GuiBase3d", - "Superclass": "GuiBase", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CycleOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "From", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "4", - "MemberType": "Property", - "Name": "StudsBetweenTextures", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "Texture", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "1, 1", - "MemberType": "Property", - "Name": "TextureSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "To", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "2", - "MemberType": "Property", - "Name": "Velocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "0.0625", - "MemberType": "Property", - "Name": "WireRadius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "FloorWire", - "Superclass": "GuiBase3d", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Adornee", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "MemoryCategory": "Instances", - "Name": "InstanceAdornment", - "Superclass": "GuiBase3d", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "0.150000006", - "MemberType": "Property", - "Name": "LineThickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "StudioSelectionBox", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SurfaceColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "SurfaceColor3", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "0.0509804, 0.411765, 0.67451", - "MemberType": "Property", - "Name": "SurfaceColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "SurfaceTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SelectionBox", - "Superclass": "InstanceAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Adornee", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "PVInstance" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PVAdornment", - "Superclass": "GuiBase3d", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AdornCullingMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AdornCullingMode" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AlwaysOnTop", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "GizmoReference", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SizeRelativeOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ZIndex", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "Basic", - "UI" - ], - "MemberType": "Event", - "Name": "MouseButton1Down", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI" - ], - "MemberType": "Event", - "Name": "MouseButton1Up", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI" - ], - "MemberType": "Event", - "Name": "MouseEnter", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI" - ], - "MemberType": "Event", - "Name": "MouseLeave", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "HandleAdornment", - "Superclass": "PVAdornment", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "Shading", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AdornShading" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BoxHandleAdornment", - "Superclass": "HandleAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "2", - "MemberType": "Property", - "Name": "Height", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Hollow", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "0.5", - "MemberType": "Property", - "Name": "Radius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "Shading", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AdornShading" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ConeHandleAdornment", - "Superclass": "HandleAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "360", - "MemberType": "Property", - "Name": "Angle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Height", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "InnerRadius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Radius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "Shading", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AdornShading" - } - } - ], - "MemoryCategory": "Instances", - "Name": "CylinderHandleAdornment", - "Superclass": "HandleAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "rbxasset://textures/SurfacesDefault.png", - "MemberType": "Property", - "Name": "Image", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "1, 1", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ImageHandleAdornment", - "Superclass": "HandleAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "5", - "MemberType": "Property", - "Name": "Length", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Thickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "LineHandleAdornment", - "Superclass": "HandleAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "2", - "MemberType": "Property", - "Name": "Height", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "Shading", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AdornShading" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "4", - "MemberType": "Property", - "Name": "Sides", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PyramidHandleAdornment", - "Superclass": "HandleAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Radius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "Shading", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AdornShading" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SphereHandleAdornment", - "Superclass": "HandleAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Scale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Thickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Basic", - "UI" - ], - "MemberType": "Function", - "Name": "AddLine", - "Parameters": [ - { - "Name": "from", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "to", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI" - ], - "MemberType": "Function", - "Name": "AddLines", - "Parameters": [ - { - "Name": "points", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI" - ], - "MemberType": "Function", - "Name": "AddPath", - "Parameters": [ - { - "Name": "points", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "loop", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI" - ], - "MemberType": "Function", - "Name": "AddText", - "Parameters": [ - { - "Name": "point", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "12", - "Name": "size", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI" - ], - "MemberType": "Function", - "Name": "Clear", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "WireframeHandleAdornment", - "Superclass": "HandleAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "A", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "B", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "C", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Range", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Thickness", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "FindPartOnParabola", - "Parameters": [ - { - "Name": "ignoreDescendentsTable", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ParabolaAdornment", - "Superclass": "PVAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SurfaceColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "SurfaceColor3", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "0.0509804, 0.411765, 0.67451", - "MemberType": "Property", - "Name": "SurfaceColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "SurfaceTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SelectionSphere", - "Superclass": "PVAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Adornee", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PartAdornment", - "Superclass": "GuiBase3d", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "HandlesBase", - "Superclass": "PartAdornment", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "X, Y, Z", - "MemberType": "Property", - "Name": "Axes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Axes" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseButton1DownConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseButton1UpConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseDragConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseEnterConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseLeaveConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseButton1Down", - "Parameters": [ - { - "Name": "axis", - "Type": { - "Category": "Enum", - "Name": "Axis" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseButton1Up", - "Parameters": [ - { - "Name": "axis", - "Type": { - "Category": "Enum", - "Name": "Axis" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseDrag", - "Parameters": [ - { - "Name": "axis", - "Type": { - "Category": "Enum", - "Name": "Axis" - } - }, - { - "Name": "relativeAngle", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "deltaRadius", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseEnter", - "Parameters": [ - { - "Name": "axis", - "Type": { - "Category": "Enum", - "Name": "Axis" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseLeave", - "Parameters": [ - { - "Name": "axis", - "Type": { - "Category": "Enum", - "Name": "Axis" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ArcHandles", - "Superclass": "HandlesBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "Right, Top, Back, Left, Bottom, Front", - "MemberType": "Property", - "Name": "Faces", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Faces" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseButton1DownConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseButton1UpConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseDragConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseEnterConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "EventReplicator", - "Default": "0", - "MemberType": "Property", - "Name": "MouseLeaveConnectionCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "UI", - "Input" - ] - }, - "Category": "Appearance", - "Default": "Resize", - "MemberType": "Property", - "Name": "Style", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HandlesStyle" - } - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseButton1Down", - "Parameters": [ - { - "Name": "face", - "Type": { - "Category": "Enum", - "Name": "NormalId" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseButton1Up", - "Parameters": [ - { - "Name": "face", - "Type": { - "Category": "Enum", - "Name": "NormalId" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseDrag", - "Parameters": [ - { - "Name": "face", - "Type": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Name": "distance", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseEnter", - "Parameters": [ - { - "Name": "face", - "Type": { - "Category": "Enum", - "Name": "NormalId" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "MouseLeave", - "Parameters": [ - { - "Name": "face", - "Type": { - "Category": "Enum", - "Name": "NormalId" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Handles", - "Superclass": "HandlesBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "Right", - "MemberType": "Property", - "Name": "TargetSurface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SurfaceSelection", - "Superclass": "PartAdornment" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Humanoid", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Humanoid" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SelectionLasso", - "Superclass": "GuiBase3d", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Part", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SelectionPartLasso", - "Superclass": "SelectionLasso", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Point", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SelectionPointLasso", - "Superclass": "SelectionLasso", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Closed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Color3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PropertiesSerialize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Control Points", - "Default": "1", - "MemberType": "Property", - "Name": "SelectedControlPoint", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Control Points", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SelectedControlPointData", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Path2DControlPoint" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Thickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Visible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "ZIndex", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetBoundingRect", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Rect" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetControlPoint", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Path2DControlPoint" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetControlPoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetLength", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetMaxControlPoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetPositionOnCurve", - "Parameters": [ - { - "Name": "t", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "UDim2" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetPositionOnCurveArcLength", - "Parameters": [ - { - "Name": "t", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "UDim2" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetSegmentCount", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetTangentOnCurve", - "Parameters": [ - { - "Name": "t", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetTangentOnCurveArcLength", - "Parameters": [ - { - "Name": "t", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "InsertControlPoint", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "point", - "Type": { - "Category": "DataType", - "Name": "Path2DControlPoint" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "RemoveControlPoint", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetControlPoints", - "Parameters": [ - { - "Name": "controlPoints", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "UpdateControlPoint", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "point", - "Type": { - "Category": "DataType", - "Name": "Path2DControlPoint" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "ControlPointChanged", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Path2D", - "Superclass": "GuiBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ], - "Write": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AutoSelectGuiEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CoreEffectFolder", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Folder" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CoreGuiFolder", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Folder" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ], - "Write": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CoreGuiNavigationEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DisplayScalingMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DisplayScalingMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ], - "Write": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "GuiNavigationEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsModalDialog", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsWindows", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MenuIsOpen", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PreferredTextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PreferredTextSize" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PreferredTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ReducedMotionEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectedCoreObject", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ], - "Write": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectedObject", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TopbarInset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Rect" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ], - "Write": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TouchControlsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ViewportDisplaySize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DisplaySize" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ViewportSizeInMM", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "AddCenterDialog", - "Parameters": [ - { - "Name": "dialog", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "centerDialogType", - "Type": { - "Category": "Enum", - "Name": "CenterDialogType" - } - }, - { - "Name": "showFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "hideFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "AddKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "AddSelectionParent", - "Parameters": [ - { - "Name": "selectionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "selectionParent", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SelectionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "AddSelectionTuple", - "Parameters": [ - { - "Name": "selectionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "selections", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SelectionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "AddSpecialKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Enum", - "Name": "SpecialKey" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "BroadcastNotification", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "notificationType", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ClearError", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "CloseInspectMenu", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "CloseStatsBasedOnInputString", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "DismissNotification", - "Parameters": [ - { - "Name": "notificationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ForceTenFootInterface", - "Parameters": [ - { - "Name": "isForced", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetBrickCount", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetClosestDialogToPosition", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetClosestVisibleDialogToPosition", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Dialog" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetEmotesMenuOpen", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetErrorCode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "ConnectionError" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetErrorDetails", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetErrorMessage", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetUiMessage", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetErrorType", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "ConnectionError" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetGameplayPausedNotificationEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetGuiInset", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetGuiIsVisible", - "Parameters": [ - { - "Name": "guiType", - "Type": { - "Category": "Enum", - "Name": "GuiType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetHardwareSafeViewport", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetInsetArea", - "Parameters": [ - { - "Name": "screenInsets", - "Type": { - "Category": "Enum", - "Name": "ScreenInsets" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Rect" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetInspectMenuEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetNotificationTypeList", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetRawScreenScale", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetResolutionScale", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetSafeZoneOffsets", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetUiMessage", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Avatar" - ], - "MemberType": "Function", - "Name": "InspectPlayerFromHumanoidDescription", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Avatar" - ], - "MemberType": "Function", - "Name": "InspectPlayerFromUserId", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "InspectPlayerFromUserIdWithCtx", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "ctx", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "IsMemoryTrackerEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "IsTenFootInterface", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "OnNotificationDisplayed", - "Parameters": [ - { - "Name": "notificationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "OnNotificationInteraction", - "Parameters": [ - { - "Name": "notificationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "buttonIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "OpenBrowserWindow", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "OpenNativeOverlay", - "Parameters": [ - { - "Name": "title", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "RemoveCenterDialog", - "Parameters": [ - { - "Name": "dialog", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "RemoveKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "RemoveSelectionGroup", - "Parameters": [ - { - "Name": "selectionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SelectionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "RemoveSpecialKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Enum", - "Name": "SpecialKey" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "Select", - "Parameters": [ - { - "Name": "selectionParent", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SendNotification", - "Parameters": [ - { - "Name": "notificationInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SendUIOcclusionMetricsForQueryRegion", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Name": "regionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetEmotesMenuOpen", - "Parameters": [ - { - "Name": "isOpen", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetGameplayPausedNotificationEnabled", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetGlobalGuiInset", - "Parameters": [ - { - "Name": "x1", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y1", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "x2", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y2", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetHardwareSafeAreaInsets", - "Parameters": [ - { - "Name": "left", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "top", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "right", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "bottom", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetInspectMenuEnabled", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetMenuIsOpen", - "Parameters": [ - { - "Name": "open", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "default", - "Name": "menuName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetPurchasePromptIsShown", - "Parameters": [ - { - "Name": "isShown", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetSafeZoneOffsets", - "Parameters": [ - { - "Name": "top", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "bottom", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "left", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "right", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetTopbarInset", - "Parameters": [ - { - "Name": "topbarInset", - "Type": { - "Category": "DataType", - "Name": "Rect" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetUiMessage", - "Parameters": [ - { - "Name": "msgType", - "Type": { - "Category": "Enum", - "Name": "UiMessageType" - } - }, - { - "Default": "errorCode", - "Name": "uiMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ShowStatsBasedOnInputString", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ToggleFullscreen", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ToggleGuiIsVisibleForCaptures", - "Parameters": [ - { - "Name": "guiType", - "Type": { - "Category": "Enum", - "Name": "GuiType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ToggleGuiIsVisibleIfAllowed", - "Parameters": [ - { - "Name": "guiType", - "Type": { - "Category": "Enum", - "Name": "GuiType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetScreenResolution", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "BrowserWindowClosed", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "CloseInspectMenuRequest", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "CoreGuiRenderOverflowed", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "EmotesMenuOpenChanged", - "Parameters": [ - { - "Name": "isOpen", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "ErrorMessageChanged", - "Parameters": [ - { - "Name": "newErrorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "UiMessageChanged", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "GuiVisibilityChangedSignal", - "Parameters": [ - { - "Name": "guiType", - "Type": { - "Category": "Enum", - "Name": "GuiType" - } - }, - { - "Name": "visible", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "InspectMenuEnabledChangedSignal", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "InspectPlayerFromHumanoidDescriptionRequest", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "InspectPlayerFromUserIdWithCtxRequest", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "ctx", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "KeyPressed", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "modifiers", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MenuClosed", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "MenuOpened", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "NativeClose", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "NetworkPausedEnabledChanged", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "Open9SliceEditor", - "Parameters": [ - { - "Name": "selectedImageObject", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "OpenStyleEditor", - "Parameters": [ - { - "Name": "styleBase", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "PurchasePromptShown", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "SafeZoneOffsetsChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "ShowLeaveConfirmation", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "SpecialKeyPressed", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Enum", - "Name": "SpecialKey" - } - }, - { - "Name": "modifiers", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "UiMessageChanged", - "Parameters": [ - { - "Name": "msgType", - "Type": { - "Category": "Enum", - "Name": "UiMessageType" - } - }, - { - "Name": "newUiMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Callback", - "Name": "SendCoreUiNotification", - "Parameters": [ - { - "Name": "title", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GuiService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "GuidRegistryService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Index1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Index1TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Index2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Index2TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Index3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Index3TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "IndexRange", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "IndexSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Middle1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Middle1TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Middle2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Middle2TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Middle3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Middle3TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "MiddleRange", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "MiddleSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Pinky1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Pinky1TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Pinky2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Pinky2TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Pinky3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Pinky3TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "PinkyRange", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "PinkySize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Ring1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Ring1TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Ring2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Ring2TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Ring3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Ring3TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RingRange", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RingSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "Side", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HandRigDescriptionSide" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Thumb1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Thumb1TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Thumb2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Thumb2TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Thumb3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Thumb3TposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ThumbRange", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "ThumbSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetFingerControl", - "Parameters": [ - { - "Name": "fingerIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetFingerTip", - "Parameters": [ - { - "Name": "fingerIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetFingerControl", - "Parameters": [ - { - "Name": "fingerIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "control", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetFingerTip", - "Parameters": [ - { - "Name": "fingerIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "point", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "HandRigDescription", - "Superclass": "Instance", - "Tags": [ - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Looped", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "3", - "MemberType": "Property", - "Name": "Radius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "UIClick", - "MemberType": "Property", - "Name": "Type", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HapticEffectType" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Waveform", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "FloatCurve" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "WaveformData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "Play", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetWaveformKeys", - "Parameters": [ - { - "Name": "keys", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "Stop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Ended", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "HapticEffect", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetMotor", - "Parameters": [ - { - "Name": "inputType", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Name": "vibrationMotor", - "Type": { - "Category": "Enum", - "Name": "VibrationMotor" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "IsMotorSupported", - "Parameters": [ - { - "Name": "inputType", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Name": "vibrationMotor", - "Type": { - "Category": "Enum", - "Name": "VibrationMotor" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "IsVibrationSupported", - "Parameters": [ - { - "Name": "inputType", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetMotor", - "Parameters": [ - { - "Name": "inputType", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Name": "vibrationMotor", - "Type": { - "Category": "Enum", - "Name": "VibrationMotor" - } - }, - { - "Name": "vibrationValues", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "HapticService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "HarmonyService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ClientRequestDataAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ServerRequestDataAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnNewData", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "jsonString", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - }, - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "compressedLength", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "uncompressedLength", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RequestData", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "HeapProfilerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "HeatmapService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CancelImportHeightmap", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsValidColormap", - "Parameters": [ - { - "Name": "colormapAssetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsValidHeightmap", - "Parameters": [ - { - "Name": "heightmapAssetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetImportHeightmapPaused", - "Parameters": [ - { - "Name": "paused", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetHeightmapPreviewAsync", - "Parameters": [ - { - "Name": "heightmapAssetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ImportHeightmap", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "heightmapAssetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "colormapAssetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "defaultMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ColormapHasUnknownPixels", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ProgressUpdate", - "Parameters": [ - { - "Name": "progressRatio", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "operation", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "HeightmapImporterService", - "Superclass": "Instance", - "Tags": [ - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "HSRData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "HSRMeshIdData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - } - ], - "MemoryCategory": "Instances", - "Name": "HiddenSurfaceRemovalAsset", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Adornee", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "AlwaysOnTop", - "MemberType": "Property", - "Name": "DepthMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HighlightDepthMode" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "FillColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0.5", - "MemberType": "Property", - "Name": "FillTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "LineThickness", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "OutlineColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "OutlineTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "Standard", - "MemberType": "Property", - "Name": "ReservedId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ReservedHighlightId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Highlight", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "Hopper", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "Deprecated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetDocumentationUrl", - "Parameters": [ - { - "Name": "partialUrl", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAsync", - "Parameters": [ - { - "Name": "apiUrlPath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "Default", - "Name": "priority", - "Type": { - "Category": "Enum", - "Name": "ThrottlingPriority" - } - }, - { - "Default": "Default", - "Name": "httpRequestType", - "Type": { - "Category": "Enum", - "Name": "HttpRequestType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAsyncFullUrl", - "Parameters": [ - { - "Name": "apiUrl", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "Default", - "Name": "priority", - "Type": { - "Category": "Enum", - "Name": "ThrottlingPriority" - } - }, - { - "Default": "Default", - "Name": "httpRequestType", - "Type": { - "Category": "Enum", - "Name": "HttpRequestType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PostAsync", - "Parameters": [ - { - "Name": "apiUrlPath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "Default", - "Name": "priority", - "Type": { - "Category": "Enum", - "Name": "ThrottlingPriority" - } - }, - { - "Default": "ApplicationJson", - "Name": "content_type", - "Type": { - "Category": "Enum", - "Name": "HttpContentType" - } - }, - { - "Default": "Default", - "Name": "httpRequestType", - "Type": { - "Category": "Enum", - "Name": "HttpRequestType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PostAsyncFullUrl", - "Parameters": [ - { - "Name": "apiUrl", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "Default", - "Name": "priority", - "Type": { - "Category": "Enum", - "Name": "ThrottlingPriority" - } - }, - { - "Default": "ApplicationJson", - "Name": "content_type", - "Type": { - "Category": "Enum", - "Name": "HttpContentType" - } - }, - { - "Default": "Default", - "Name": "httpRequestType", - "Type": { - "Category": "Enum", - "Name": "HttpRequestType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RequestAsync", - "Parameters": [ - { - "Name": "requestOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Default": "Default", - "Name": "priority", - "Type": { - "Category": "Enum", - "Name": "ThrottlingPriority" - } - }, - { - "Default": "ApplicationJson", - "Name": "content_type", - "Type": { - "Category": "Enum", - "Name": "HttpContentType" - } - }, - { - "Default": "Default", - "Name": "httpRequestType", - "Type": { - "Category": "Enum", - "Name": "HttpRequestType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RequestLimitedAsync", - "Parameters": [ - { - "Name": "requestOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Default": "Default", - "Name": "priority", - "Type": { - "Category": "Enum", - "Name": "ThrottlingPriority" - } - }, - { - "Default": "ApplicationJson", - "Name": "content_type", - "Type": { - "Category": "Enum", - "Name": "HttpContentType" - } - }, - { - "Default": "Default", - "Name": "httpRequestType", - "Type": { - "Category": "Enum", - "Name": "HttpRequestType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "HttpRbxApiService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Cancel", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Start", - "Parameters": [ - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "HttpRequest", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "HttpEnabled", - "Security": { - "Read": "None", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "CreateWebStreamClient", - "Parameters": [ - { - "Name": "streamClientType", - "Type": { - "Category": "Enum", - "Name": "WebStreamClientType" - } - }, - { - "Name": "requestOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "WebStreamClient" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateWebStreamClientInternal", - "Parameters": [ - { - "Name": "streamClientType", - "Type": { - "Category": "Enum", - "Name": "WebStreamClientType" - } - }, - { - "Name": "requestOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "WebStreamClient" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GenerateGUID", - "Parameters": [ - { - "Default": "true", - "Name": "wrapInCurlyBraces", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetHttpEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "GetSecret", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Secret" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetUserAgent", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "JSONDecode", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "JSONEncode", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "RequestInternal", - "Parameters": [ - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetHttpEnabled", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "UrlEncode", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "GetAsync", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "false", - "Name": "nocache", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "headers", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "JSONDecodeAsync", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "JSONEncodeAsync", - "Parameters": [ - { - "Name": "obj", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "PostAsync", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "ApplicationJson", - "Name": "content_type", - "Type": { - "Category": "Enum", - "Name": "HttpContentType" - } - }, - { - "Default": "false", - "Name": "compress", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "headers", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "RequestAsync", - "Parameters": [ - { - "Name": "requestOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "HttpService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Jump Settings", - "Default": "true", - "MemberType": "Property", - "Name": "AutoJumpEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "true", - "MemberType": "Property", - "Name": "AutoRotate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Game", - "Default": "true", - "MemberType": "Property", - "Name": "AutomaticScalingEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "BreakJointsOnDeath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "400", - "MemberType": "Property", - "Name": "CameraMaxDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CameraMinDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "Classic", - "MemberType": "Property", - "Name": "CameraMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CameraMode" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "CameraOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Behavior", - "Default": "OuterBox", - "MemberType": "Property", - "Name": "CollisionType", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HumanoidCollisionType" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "Viewer", - "MemberType": "Property", - "Name": "DisplayDistanceType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HumanoidDisplayDistanceType" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "DisplayName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "EvaluateStateMachine", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "Air", - "MemberType": "Property", - "Name": "FloorMaterial", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Game", - "Default": "100", - "MemberType": "Property", - "Name": "Health", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "100", - "MemberType": "Property", - "Name": "HealthDisplayDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "DisplayWhenDamaged", - "MemberType": "Property", - "Name": "HealthDisplayType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HumanoidHealthDisplayType" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Game", - "Default": "100", - "MemberType": "Property", - "Name": "Health_XML", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Game", - "Default": "0", - "MemberType": "Property", - "Name": "HipHeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "InternalBodyScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "InternalDisplayName", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "InternalHeadScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "InternalOriginalHipHeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "Jump", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Jump Settings", - "Default": "7.19999981", - "MemberType": "Property", - "Name": "JumpHeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Jump Settings", - "Default": "50", - "MemberType": "Property", - "Name": "JumpPower", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "JumpReplicate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftLeg", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Game", - "Default": "100", - "MemberType": "Property", - "Name": "MaxHealth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Game", - "Default": "89", - "MemberType": "Property", - "Name": "MaxSlopeAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "MoveDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Control", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "MoveDirectionInternal", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "100", - "MemberType": "Property", - "Name": "NameDisplayDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "OccludeAll", - "MemberType": "Property", - "Name": "NameOcclusion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NameOcclusion" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "FallingDown", - "MemberType": "Property", - "Name": "NetworkHumanoidState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HumanoidStateType" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "OverrideDefaultCollisions", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "PlatformStand", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "RequiresNeck", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "R6", - "MemberType": "Property", - "Name": "RigType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightLeg", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RootPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "MovementRelative", - "MemberType": "Property", - "Name": "RotationType", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RotationType" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SeatPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "Sit", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "Strafe", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TargetPoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Torso", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Jump Settings", - "Default": "true", - "MemberType": "Property", - "Name": "UseJumpPower", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Control", - "Default": "0", - "MemberType": "Property", - "Name": "WalkAngleError", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Control", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "WalkDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Game", - "Default": "16", - "MemberType": "Property", - "Name": "WalkSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "WalkToPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar", - "AvatarBehavior" - ], - "Write": [ - "AvatarBehavior" - ] - }, - "Category": "Control", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "WalkToPoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Game", - "Default": "100", - "MemberType": "Property", - "Name": "maxHealth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "MaxHealth", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "AddAccessory", - "Parameters": [ - { - "Name": "accessory", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "AddCustomStatus", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "AddStatus", - "Parameters": [ - { - "Default": "Poison", - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "Status" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "BuildRigFromAttachments", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "ChangeState", - "Parameters": [ - { - "Default": "None", - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "HumanoidStateType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ComputeOriginalSizeForPart", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3?" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ComputeR15BodyBoundingBox", - "Parameters": [ - ], - "ReturnType": [ - { - "Category": "DataType", - "Name": "CFrame" - }, - { - "Category": "DataType", - "Name": "Vector3" - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "EquipTool", - "Parameters": [ - { - "Name": "tool", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetAccessories", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetAccessoryHandleScale", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "partType", - "Type": { - "Category": "Enum", - "Name": "BodyPartR15" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetAppliedDescription", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "GetBodyPartR15", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "BodyPartR15" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "GetLimb", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "Limb" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "GetMoveVelocity", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetPlayingAnimationTracks", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPlayingAnimationTracks", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "GetState", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "HumanoidStateType" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "GetStateEnabled", - "Parameters": [ - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "HumanoidStateType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetStatuses", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "HasCustomStatus", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "HasStatus", - "Parameters": [ - { - "Default": "Poison", - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "Status" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "LoadAnimation", - "Parameters": [ - { - "Name": "animation", - "Type": { - "Category": "Class", - "Name": "Animation" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationTrack" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "LoadAnimation", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "Move", - "Parameters": [ - { - "Name": "moveDirection", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "false", - "Name": "relativeToCamera", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "MoveTo", - "Parameters": [ - { - "Name": "location", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "nil", - "Name": "part", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "RemoveAccessories", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "RemoveCustomStatus", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "RemoveStatus", - "Parameters": [ - { - "Default": "Poison", - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "Status" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ReplaceBodyPartR15", - "Parameters": [ - { - "Name": "bodyPart", - "Type": { - "Category": "Enum", - "Name": "BodyPartR15" - } - }, - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "SetClickToWalkEnabled", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "SetStateEnabled", - "Parameters": [ - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "HumanoidStateType" - } - }, - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "TakeDamage", - "Parameters": [ - { - "Name": "amount", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "UnequipTools", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "loadAnimation", - "Parameters": [ - { - "Name": "animation", - "Type": { - "Category": "Class", - "Name": "Animation" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "AnimationTrack" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "LoadAnimation", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "takeDamage", - "Parameters": [ - { - "Name": "amount", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "TakeDamage", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "CacheDefaults", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ApplyAvatarRules", - "Parameters": [ - { - "Name": "avatarRules", - "Type": { - "Category": "Class", - "Name": "AvatarRules" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ApplyDescription", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Default": "Default", - "Name": "assetTypeVerification", - "Type": { - "Category": "Enum", - "Name": "AssetTypeVerification" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "ApplyDescriptionAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ApplyDescriptionAsync", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Default": "Default", - "Name": "assetTypeVerification", - "Type": { - "Category": "Enum", - "Name": "AssetTypeVerification" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ApplyDescriptionClientServer", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ApplyDescriptionReset", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Default": "Default", - "Name": "assetTypeVerification", - "Type": { - "Category": "Enum", - "Name": "AssetTypeVerification" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "ApplyDescriptionResetAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "ApplyDescriptionResetAsync", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Default": "Default", - "Name": "assetTypeVerification", - "Type": { - "Category": "Enum", - "Name": "AssetTypeVerification" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "PlayEmote", - "Parameters": [ - { - "Name": "emoteName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "PlayEmoteAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "PlayEmoteAndGetAnimTrackById", - "Parameters": [ - { - "Name": "emoteId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Function", - "Name": "PlayEmoteAsync", - "Parameters": [ - { - "Name": "emoteName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "AnimationPlayed", - "Parameters": [ - { - "Name": "animationTrack", - "Type": { - "Category": "Class", - "Name": "AnimationTrack" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "AnimationPlayed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "ApplyDescriptionFinished", - "Parameters": [ - { - "Name": "description", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Climbing", - "Parameters": [ - { - "Name": "speed", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "ClusterCompositionFinished", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "CustomStatusAdded", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "CustomStatusRemoved", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Died", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "EmoteTriggered", - "Parameters": [ - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "animationTrack", - "Type": { - "Category": "Class", - "Name": "AnimationTrack" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "FallingDown", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "FreeFalling", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "GettingUp", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "HealthChanged", - "Parameters": [ - { - "Name": "health", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Jumping", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "MoveToFinished", - "Parameters": [ - { - "Name": "reached", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "PlatformStanding", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Ragdoll", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Running", - "Parameters": [ - { - "Name": "speed", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Seated", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "currentSeatPart", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "ServerApplyDescription", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "ServerBreakJoints", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "ServerEquipTool", - "Parameters": [ - { - "Name": "tool", - "Type": { - "Category": "Class", - "Name": "Tool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "StateChanged", - "Parameters": [ - { - "Name": "old", - "Type": { - "Category": "Enum", - "Name": "HumanoidStateType" - } - }, - { - "Name": "new", - "Type": { - "Category": "Enum", - "Name": "HumanoidStateType" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "StateEnabledChanged", - "Parameters": [ - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "HumanoidStateType" - } - }, - { - "Name": "isEnabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "StatusAdded", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "Status" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "StatusRemoved", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "Status" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Strafing", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Swimming", - "Parameters": [ - { - "Name": "speed", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "AvatarBehavior" - ], - "MemberType": "Event", - "Name": "Touched", - "Parameters": [ - { - "Name": "touchingPart", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "humanoidPart", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Humanoid", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Accessories", - "Default": "[]", - "MemberType": "Property", - "Name": "AccessoryBlob", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Accessories", - "Default": "", - "MemberType": "Property", - "Name": "BackAccessory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Scale", - "Default": "0.300000012", - "MemberType": "Property", - "Name": "BodyTypeScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "0", - "MemberType": "Property", - "Name": "ClimbAnimation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Scale", - "Default": "1", - "MemberType": "Property", - "Name": "DepthScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "EmotesDataInternal", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "EquippedEmotesDataInternal", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Parts", - "Default": "0", - "MemberType": "Property", - "Name": "Face", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Accessories", - "Default": "", - "MemberType": "Property", - "Name": "FaceAccessory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "0", - "MemberType": "Property", - "Name": "FallAnimation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Accessories", - "Default": "", - "MemberType": "Property", - "Name": "FrontAccessory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Clothes", - "Default": "0", - "MemberType": "Property", - "Name": "GraphicTShirt", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Accessories", - "Default": "", - "MemberType": "Property", - "Name": "HairAccessory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Accessories", - "Default": "", - "MemberType": "Property", - "Name": "HatAccessory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Parts", - "Default": "0", - "MemberType": "Property", - "Name": "Head", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Colors", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "HeadColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Scale", - "Default": "1", - "MemberType": "Property", - "Name": "HeadScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Scale", - "Default": "1", - "MemberType": "Property", - "Name": "HeightScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "0", - "MemberType": "Property", - "Name": "IdleAnimation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "0", - "MemberType": "Property", - "Name": "JumpAnimation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Parts", - "Default": "0", - "MemberType": "Property", - "Name": "LeftArm", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Colors", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftArmColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Parts", - "Default": "0", - "MemberType": "Property", - "Name": "LeftLeg", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Colors", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftLegColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "0", - "MemberType": "Property", - "Name": "MoodAnimation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Accessories", - "Default": "", - "MemberType": "Property", - "Name": "NeckAccessory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "-1", - "MemberType": "Property", - "Name": "NumberEmotesLoaded", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Clothes", - "Default": "0", - "MemberType": "Property", - "Name": "Pants", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Scale", - "Default": "1", - "MemberType": "Property", - "Name": "ProportionScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "ResetIncludesBodyParts", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Parts", - "Default": "0", - "MemberType": "Property", - "Name": "RightArm", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Colors", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightArmColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Parts", - "Default": "0", - "MemberType": "Property", - "Name": "RightLeg", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Colors", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightLegColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "0", - "MemberType": "Property", - "Name": "RunAnimation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Clothes", - "Default": "0", - "MemberType": "Property", - "Name": "Shirt", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Accessories", - "Default": "", - "MemberType": "Property", - "Name": "ShouldersAccessory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ], - "Write": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "false", - "MemberType": "Property", - "Name": "StaticFacialAnimation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "0", - "MemberType": "Property", - "Name": "SwimAnimation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Parts", - "Default": "0", - "MemberType": "Property", - "Name": "Torso", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Body Colors", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TorsoColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "UseAvatarSettings", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Accessories", - "Default": "", - "MemberType": "Property", - "Name": "WaistAccessory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Animation", - "Default": "0", - "MemberType": "Property", - "Name": "WalkAnimation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Scale", - "Default": "1", - "MemberType": "Property", - "Name": "WidthScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "AddEmote", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetAccessories", - "Parameters": [ - { - "Name": "includeRigidAccessories", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetEmotes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetEquippedEmotes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "RemoveEmote", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "SetAccessories", - "Parameters": [ - { - "Name": "accessories", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "includeRigidAccessories", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "SetEmotes", - "Parameters": [ - { - "Name": "emotes", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "SetEquippedEmotes", - "Parameters": [ - { - "Name": "equippedEmotes", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "EmotesChanged", - "Parameters": [ - { - "Name": "newEmotes", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Event", - "Name": "EquippedEmotesChanged", - "Parameters": [ - { - "Name": "newEquippedEmotes", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "HumanoidDescription", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Chest", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ChestRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ChestRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "ChestSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "ChestTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "HeadBase", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "HeadBaseRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "HeadBaseRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "HeadBaseSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "HeadBaseTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftAnkle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftAnkleRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftAnkleRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "LeftAnkleSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "LeftAnkleTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftClavicle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftClavicleRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftClavicleRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "LeftClavicleSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "LeftClavicleTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftElbow", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftElbowRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftElbowRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "LeftElbowSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "LeftElbowTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftHip", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftHipRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftHipRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "LeftHipSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "LeftHipTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftKnee", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftKneeRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftKneeRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "LeftKneeSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "LeftKneeTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftShoulder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftShoulderRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftShoulderRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "LeftShoulderSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "LeftShoulderTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftToes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftToesRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftToesRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "LeftToesSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "LeftToesTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LeftWrist", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftWristRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LeftWristRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "LeftWristSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "LeftWristTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Neck", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "NeckRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "NeckRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "NeckSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "NeckTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "OriginOffset", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Pelvis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "PelvisRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "PelvisRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "PelvisSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "PelvisTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightAnkle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightAnkleRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightAnkleRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RightAnkleSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RightAnkleTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightClavicle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightClavicleRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightClavicleRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RightClavicleSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RightClavicleTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightElbow", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightElbowRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightElbowRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RightElbowSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RightElbowTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightHip", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightHipRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightHipRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RightHipSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RightHipTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightKnee", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightKneeRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightKneeRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RightKneeSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RightKneeTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightShoulder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightShoulderRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightShoulderRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RightShoulderSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RightShoulderTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightToes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightToesRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightToesRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RightToesSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RightToesTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RightWrist", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightWristRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RightWristRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RightWristSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RightWristTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Root", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RootRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RootRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "RootSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "RootTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Mapping", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Waist", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "WaistRangeMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Range", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "WaistRangeMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Size", - "Default": "0", - "MemberType": "Property", - "Name": "WaistSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Tpose", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "WaistTposeAdjustment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "AutoRig", - "Parameters": [ - { - "Name": "character", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetJoint", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetJointFromName", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetJointLabels", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetJointNames", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetJointRangeMax", - "Parameters": [ - { - "Name": "rigLabel", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetJointRangeMin", - "Parameters": [ - { - "Name": "rigLabel", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetJointSize", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetR15JointLabels", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetR15JointNames", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetR6JointLabels", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetR6JointNames", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetTposeAdjustment", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetJoint", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - }, - { - "Name": "joint", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetJointRangeMax", - "Parameters": [ - { - "Name": "rigLabel", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - }, - { - "Name": "rangeMax", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetJointRangeMin", - "Parameters": [ - { - "Name": "rigLabel", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - }, - { - "Name": "rangeMin", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetJointSize", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - }, - { - "Name": "size", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "SetTposeAdjustment", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Enum", - "Name": "RigLabel" - } - }, - { - "Name": "transform", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "ShowVolumes", - "Parameters": [ - { - "Name": "show", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - } - ], - "MemoryCategory": "Animation", - "Name": "HumanoidRigDescription", - "Superclass": "Instance", - "Tags": [ - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ChainRoot", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "EndEffector", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "EndEffectorOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Offset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Pole", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "0", - "MemberType": "Property", - "Name": "Priority", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "0.0500000007", - "MemberType": "Property", - "Name": "SmoothTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Target", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "Transform", - "MemberType": "Property", - "Name": "Type", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "IKControlType" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "Weight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetChainCount", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetChainLength", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetNodeLocalCFrame", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetNodeWorldCFrame", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetRawFinalTarget", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetSmoothedFinalTarget", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "Solve", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "IKControl", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ILegacyStudioBridge", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "LegacyStudioBridge", - "Superclass": "ILegacyStudioBridge", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ClearCreatorLayers", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ClearUserLayers", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBrowserTrackerLayerLoadingStatus", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "IXPLoadingStatus" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBrowserTrackerLayerVariables", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBrowserTrackerStatusForLayer", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "IXPLoadingStatus?" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCreatorLayerLoadingStatus", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "IXPLoadingStatus" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCreatorLayerVariables", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCreatorStatusForLayer", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "IXPLoadingStatus?" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRegisteredCreatorLayersToStatus", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRegisteredUserLayersToStatus", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserLayerLoadingStatus", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "IXPLoadingStatus" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserLayerVariables", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserStatusForLayer", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "IXPLoadingStatus?" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InitializeCreatorLayers", - "Parameters": [ - { - "Name": "creatorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InitializeUserLayers", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogBrowserTrackerLayerExposure", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogCreatorLayerExposure", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogFlagLinkedUserLayerExposure", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogUserLayerExposure", - "Parameters": [ - { - "Name": "layerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterCreatorLayers", - "Parameters": [ - { - "Name": "creatorLayers", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterUserLayers", - "Parameters": [ - { - "Name": "userLayers", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnBrowserTrackerLayerLoadingStatusChanged", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "IXPLoadingStatus" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnCreatorLayerLoadingStatusChanged", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "IXPLoadingStatus" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnUserLayerLoadingStatusChanged", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "IXPLoadingStatus" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "IXPService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Cancel", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFilename", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStatuses", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Upload", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UploadComplete", - "Parameters": [ - { - "Name": "results", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UploadProgress", - "Parameters": [ - { - "Name": "progressRatio", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ImportSession", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ApplyPreset", - "Parameters": [ - { - "Name": "preset", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreatePresetFromData", - "Parameters": [ - { - "Name": "importData", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetImportTree", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetKeyframeSequences", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetKeyframeSequencesForSelectedRestPose", - "Parameters": [ - { - "Name": "modelInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "restPoseSource", - "Type": { - "Category": "Enum", - "Name": "RestPoseModel" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRigVisualization", - "Parameters": [ - { - "Name": "importDataInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUploadStatus", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HasAnimation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsAvatar", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsGltf", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsR15", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Reset", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "usesCustomRestPoseLua", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "AssetImportSession", - "Superclass": "ImportSession", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "AddPathsToBundle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0.10000000000000000555", - "MemberType": "Property", - "Name": "BuildDebouncePeriod", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "HighCompression", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "SerializePatch", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "UseFileLevelCompressionInsteadOfChunk", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "ZstdCompression", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "IncrementalPatchBuilder", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "BoolState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Direction1DState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "Direction2DState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Direction3DState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "Bool", - "MemberType": "Property", - "Name": "Type", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "InputActionType" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "ViewportPositionState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "Fire", - "Parameters": [ - { - "Name": "state", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetInputBindings", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetState", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "InputBindingsChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Pressed", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Released", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "StateChanged", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "InputAction", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Composite Directions", - "Default": "Unknown", - "MemberType": "Property", - "Name": "Backward", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Composite Directions", - "Default": "true", - "MemberType": "Property", - "Name": "ClampMagnitudeToOne", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Composite Directions", - "Default": "Unknown", - "MemberType": "Property", - "Name": "Down", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Composite Directions", - "Default": "Unknown", - "MemberType": "Property", - "Name": "Forward", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "Unknown", - "MemberType": "Property", - "Name": "KeyCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Composite Directions", - "Default": "Unknown", - "MemberType": "Property", - "Name": "Left", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "0", - "MemberType": "Property", - "Name": "PointerIndex", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "0.5", - "MemberType": "Property", - "Name": "PressedThreshold", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "Unknown", - "MemberType": "Property", - "Name": "PrimaryModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "0.200000003", - "MemberType": "Property", - "Name": "ReleasedThreshold", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "ResponseCurve", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Composite Directions", - "Default": "Unknown", - "MemberType": "Property", - "Name": "Right", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "Scale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "Unknown", - "MemberType": "Property", - "Name": "SecondaryModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "UIButton", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiButton" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Composite Directions", - "Default": "Unknown", - "MemberType": "Property", - "Name": "Up", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "1, 1", - "MemberType": "Property", - "Name": "Vector2Scale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Vector3Scale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "InputBinding", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "1000", - "MemberType": "Property", - "Name": "Priority", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "Sink", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetInputActions", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "InputActionsChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "InputContext", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Delta", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "Unknown", - "MemberType": "Property", - "Name": "KeyCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "State", - "Default": "None", - "MemberType": "Property", - "Name": "UserInputState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UserInputState" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "UserInputType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "IsModifierKeyDown", - "Parameters": [ - { - "Name": "modifierKey", - "Type": { - "Category": "Enum", - "Name": "ModifierKey" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "InputObject", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "AllowClientInsertModels", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "AllowInsertFreeModels", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated", - "NotBrowsable", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "ApproveAssetId", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ApproveAssetVersionId", - "Parameters": [ - { - "Name": "assetVersionId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetLocalFileContents", - "Parameters": [ - { - "Name": "contentId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Insert", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LoadLocalAsset", - "Parameters": [ - { - "Name": "assetPath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "CreateMeshPartAsync", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "collisionFidelity", - "Type": { - "Category": "Enum", - "Name": "CollisionFidelity" - } - }, - { - "Name": "renderFidelity", - "Type": { - "Category": "Enum", - "Name": "RenderFidelity" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MeshPart" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBaseCategories", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetBaseSets", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBaseSets", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCollection", - "Parameters": [ - { - "Name": "categoryId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetFreeDecals", - "Parameters": [ - { - "Name": "searchText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "pageNum", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetFreeDecalsAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetFreeDecalsAsync", - "Parameters": [ - { - "Name": "searchText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "pageNum", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetFreeModels", - "Parameters": [ - { - "Name": "searchText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "pageNum", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetFreeModelsAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetFreeModelsAsync", - "Parameters": [ - { - "Name": "searchText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "pageNum", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetLatestAssetVersionAsync", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserCategories", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetUserSets", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserSets", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LoadOwnedAsset" - ], - "MemberType": "Function", - "Name": "LoadAsset", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LoadOwnedAsset" - ], - "MemberType": "Function", - "Name": "LoadAssetVersion", - "Parameters": [ - { - "Name": "assetVersionId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LoadAssetWithFormat", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "format", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "loadAsset", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "LoadAsset", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LoadPackageAssetAsync", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "InternalDelete", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "InsertService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CountChildren", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "InstanceExtensionsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetAllInstances", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStatus", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "InstanceFileSyncStatus" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSyncedInstance", - "Parameters": [ - { - "Name": "filePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTooltip", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string?" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StatusChanged", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "InstanceFileSyncStatus" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "InstanceFileSyncService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "AutoSync", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Path", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Target", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "MemoryCategory": "Instances", - "Name": "InternalSyncItem", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "InternalSyncService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "C0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "C1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Part0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Part1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "part1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Part1", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "JointInstance", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BaseAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "DynamicRotate", - "Superclass": "JointInstance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "RotateP", - "Superclass": "DynamicRotate", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "HingeConstraint", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "RotateV", - "Superclass": "DynamicRotate", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "HingeConstraint", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "F0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "F1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "F2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "F3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "Glue", - "Superclass": "JointInstance", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "WeldConstraint", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "ManualSurfaceJointInstance", - "Superclass": "JointInstance", - "Tags": [ - "NotCreatable", - "Deprecated", - { - "PreferredDescriptorName": "WeldConstraint", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "ManualGlue", - "Superclass": "ManualSurfaceJointInstance", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "WeldConstraint", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "ManualWeld", - "Superclass": "ManualSurfaceJointInstance", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "WeldConstraint", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "DesiredAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MaxVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Replication", - "Default": "0", - "MemberType": "Property", - "Name": "ReplicateCurrentAngle", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "SetDesiredAngle", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "Motor", - "Superclass": "JointInstance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Animatable", - "Default": "", - "MemberType": "Property", - "Name": "ChildName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Animatable", - "Default": "", - "MemberType": "Property", - "Name": "ParentName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Replication", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ReplicateCurrentAngle6D", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Replication", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ReplicateCurrentOffset6D", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Transform", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "Motor6D", - "Superclass": "Motor" - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "Rotate", - "Superclass": "JointInstance", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "HingeConstraint", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "Snap", - "Superclass": "JointInstance", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "WeldConstraint", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "DesiredAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Hole", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Hole" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MaxVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "VelocityMotor", - "Superclass": "JointInstance" - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "Weld", - "Superclass": "JointInstance" - }, - { - "Members": [ - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "ClearJoinAfterMoveJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "CreateJoinAfterMoveJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "SetJoinAfterMoveInstance", - "Parameters": [ - { - "Name": "joinInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "SetJoinAfterMoveTarget", - "Parameters": [ - { - "Name": "joinTarget", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "ShowPermissibleJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "JointsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "Deprecated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "KeyboardService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Time", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "AddMarker", - "Parameters": [ - { - "Name": "marker", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "AddPose", - "Parameters": [ - { - "Name": "pose", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetMarkers", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetPoses", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RemoveMarker", - "Parameters": [ - { - "Name": "marker", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RemovePose", - "Parameters": [ - { - "Name": "pose", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "Keyframe", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Animation", - "Name": "KeyframeMarker", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetKeyframeSequence", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetKeyframeSequenceAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetKeyframeSequenceById", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "useCache", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetKeyframeSequenceAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetMemStats", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RegisterActiveKeyframeSequence", - "Parameters": [ - { - "Name": "keyframeSequence", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "ContentId" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RegisterKeyframeSequence", - "Parameters": [ - { - "Name": "keyframeSequence", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "ContentId" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetAnimations", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetAnimationsAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetAnimationsAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetKeyframeSequenceAsync", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "KeyframeSequenceProvider", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "LSPFileSyncService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetCapabilitiesUsedInPackageAsync", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LanguageService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Brightness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Shadows", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Light", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Range", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PointLight", - "Superclass": "Light" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Angle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Face", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Range", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SpotLight", - "Superclass": "Light" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Angle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Face", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Range", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SurfaceLight", - "Superclass": "Light" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.5, 0.5, 0.5", - "MemberType": "Property", - "Name": "Ambient", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "Brightness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "14", - "MemberType": "Property", - "Name": "ClockTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ColorShift_Bottom", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ColorShift_Top", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "EnvironmentDiffuseScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "EnvironmentSpecularScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Exposure", - "Default": "0", - "MemberType": "Property", - "Name": "ExposureCompensation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "Default", - "MemberType": "Property", - "Name": "ExtendLightRangeTo120", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Fog", - "Default": "0.75, 0.75, 0.75", - "MemberType": "Property", - "Name": "FogColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Fog", - "Default": "100000", - "MemberType": "Property", - "Name": "FogEnd", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Fog", - "Default": "0", - "MemberType": "Property", - "Name": "FogStart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "41.7332993", - "MemberType": "Property", - "Name": "GeographicLatitude", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "GlobalShadows", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "Realistic", - "MemberType": "Property", - "Name": "LightingStyle", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "LightingStyle" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.5, 0.5, 0.5", - "MemberType": "Property", - "Name": "OutdoorAmbient", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "true", - "MemberType": "Property", - "Name": "Outlines", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "true", - "MemberType": "Property", - "Name": "PrioritizeLightingQuality", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.7, 0.7, 0.72", - "MemberType": "Property", - "Name": "ShadowColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.5", - "MemberType": "Property", - "Name": "ShadowSoftness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "Compatibility", - "MemberType": "Property", - "Name": "Technology", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Technology" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "14:00:00", - "MemberType": "Property", - "Name": "TimeOfDay", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "GetMinutesAfterMidnight", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "GetMoonDirection", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "GetMoonPhase", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "GetSunDirection", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "SetMinutesAfterMidnight", - "Parameters": [ - { - "Name": "minutes", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "getMinutesAfterMidnight", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetMinutesAfterMidnight", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "setMinutesAfterMidnight", - "Parameters": [ - { - "Name": "minutes", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SetMinutesAfterMidnight", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Event", - "Name": "LightingChanged", - "Parameters": [ - { - "Name": "skyChanged", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Lighting", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "DetectUrl", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAndClearLastPendingUrl", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetLastLuaUrl", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string?" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsUrlRegistered", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterLuaUrl", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartLuaUrlDelivery", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary?" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StopLuaUrlDelivery", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenUrl", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SupportsSwitchToSettingsApp", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SwitchToSettingsApp", - "Parameters": [ - { - "Name": "route", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnLuaUrl", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "matchedUrl", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "attributionUrl", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LinkingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Scripting", - "Default": "Uninitialized", - "MemberType": "Property", - "Name": "ServerLiveEditingMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ServerLiveEditingMode" - } - }, - { - "MemberType": "Event", - "Name": "BeginEdit", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BroadcastMessage", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "type", - "Type": { - "Category": "Enum", - "Name": "LiveEditingBroadcastMessageType" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "EndEdit", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "FailedToOpen", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "legalToOpenLocal", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "KickFromEdit", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "msg", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "LiveEditingClientConfiguration", - "Parameters": [ - { - "Name": "serializedConfig", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OpenedWithSource", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SendAtomicOperation", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "op", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "hash", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SendAtomicUpdateResponse", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "response", - "Type": { - "Category": "Enum", - "Name": "LiveEditingAtomicUpdateResponse" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SendOperation", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "op", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LiveScriptingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "HasSyncedInstances", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "GetSyncState", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SyncStatusChanged", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LiveSyncService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Flush", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetItem", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetItem", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "WhenLoaded", - "Parameters": [ - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ItemWasSet", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StoreWasCleared", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LocalStorageService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "AppStorageService", - "Superclass": "LocalStorageService", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "UserStorageService", - "Superclass": "LocalStorageService", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "ForcePlayModeGameLocaleId", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "ForcePlayModeRobloxLocaleId", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Localization", - "Default": "", - "MemberType": "Property", - "Name": "GameSourceLanguageId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Localization", - "Default": "false", - "MemberType": "Property", - "Name": "IsTextScraperRunning", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Localization", - "Default": "", - "MemberType": "Property", - "Name": "LocaleManifest", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "RobloxForcePlayModeGameLocaleId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "RobloxForcePlayModeRobloxLocaleId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Localization", - "Default": "", - "MemberType": "Property", - "Name": "RobloxLocaleId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Localization", - "Default": "false", - "MemberType": "Property", - "Name": "ShouldUseCloudTable", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Localization", - "Default": "", - "MemberType": "Property", - "Name": "SystemLocaleId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetCorescriptLocalizations", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetIsLoadingInternalTranslations", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetTableEntries", - "Parameters": [ - { - "Default": "nil", - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetTranslatorForPlayer", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "IsLoadingInternalTranslationsSettingChanged", - "Parameters": [ - { - "Name": "newIsLoadingInternalTranslations", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetRobloxLocaleId", - "Parameters": [ - { - "Name": "locale", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "StartTextScraper", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "StopTextScraper", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetCountryRegionForPlayerAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetTranslatorForLocaleAsync", - "Parameters": [ - { - "Name": "locale", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetTranslatorForPlayerAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "PromptDownloadGameTableToCSV", - "Parameters": [ - { - "Name": "table", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "PromptExportToCSVs", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "PromptImportFromCSVs", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "PromptUploadCSVToGameTable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "AutoTranslateWillRun", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "DynamicTranslationServerToClientResponse", - "Parameters": [ - { - "Name": "entries", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "TextScraperClientMessageWithPlayerSignal", - "Parameters": [ - { - "Name": "version", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "message", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LocalizationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "[]", - "MemberType": "Property", - "Name": "Contents", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Localization", - "Default": "en-us", - "MemberType": "Property", - "Name": "DevelopmentLanguage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "SourceLocaleId", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Localization", - "Default": "false", - "MemberType": "Property", - "Name": "IsExemptFromUGCAnalytics", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Root", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "RootLocalizationTable", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Localization", - "Default": "en-us", - "MemberType": "Property", - "Name": "SourceLocaleId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetContents", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetEntries", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetEntries", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetString", - "Parameters": [ - { - "Name": "targetLocaleId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetTranslator", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetTranslator", - "Parameters": [ - { - "Name": "localeId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RemoveEntry", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RemoveEntryValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "localeId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RemoveKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "RemoveEntry", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RemoveTargetLocale", - "Parameters": [ - { - "Name": "localeId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetContents", - "Parameters": [ - { - "Name": "contents", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SetEntries", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetEntries", - "Parameters": [ - { - "Name": "entries", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetEntry", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "targetLocaleId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SetEntryValue", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetEntryContext", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newContext", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetEntryExample", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "example", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetEntryKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetEntrySource", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newSource", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetEntryValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "localeId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetIsExemptFromUGCAnalytics", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LocalizationTable", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CloudLocalizationTable", - "Superclass": "LocalizationTable", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "EntityData", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "EntityLodEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "EntityPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "EntityScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "EntitySource", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsSlimEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SlimAnimationSource", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "SlimAnimationDataEntity" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "SlimReplicationTimestampSec", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "MemoryCategory": "Instances", - "Name": "LodDataEntity", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "LodDataService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ReportLog", - "Parameters": [ - { - "Name": "fingerprint", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "uuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "desc", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "attributes", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "annotations", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportMultipleLogs", - "Parameters": [ - { - "Name": "fingerprint", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "uuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "desc", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "attributes", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "annotations", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "numLogs", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LogReporterService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Function", - "Name": "ClearOutput", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Function", - "Name": "ExecuteScript", - "Parameters": [ - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Function", - "Name": "GetHttpResultHistory", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Function", - "Name": "GetLogHistory", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Function", - "Name": "RequestHttpResultApproved", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Function", - "Name": "RequestServerHttpResult", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Function", - "Name": "RequestServerOutput", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "HttpResultOut", - "Parameters": [ - { - "Name": "httpResult", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "MessageOut", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "messageType", - "Type": { - "Category": "Enum", - "Name": "MessageType" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "OnHttpResultApproved", - "Parameters": [ - { - "Name": "isApproved", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "RequestHttpResultApprovedSignal", - "Parameters": [ - { - "Name": "requestingPlayer", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "RequestScriptExecutionSignal", - "Parameters": [ - { - "Name": "requestingPlayer", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "source", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "RequestServerHttpResultSignal", - "Parameters": [ - { - "Name": "requestingPlayer", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "RequestServerOutputSignal", - "Parameters": [ - { - "Name": "requestingPlayer", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "RequestSettingsChange", - "Parameters": [ - { - "Name": "requestingPlayer", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "expressivePrinting", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "ServerHttpResultOut", - "Parameters": [ - { - "Name": "httpResult", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "ServerMessageOut", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "messageType", - "Type": { - "Category": "Enum", - "Name": "MessageType" - } - }, - { - "Name": "timestamp", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Logging" - ], - "MemberType": "Event", - "Name": "ServerVariantMessageOut", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LogService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Logout", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptLogin", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "LoginFailed", - "Parameters": [ - { - "Name": "loginError", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "LoginSucceeded", - "Parameters": [ - { - "Name": "username", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "LoginService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "LuaSettings", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CachedRemoteSource", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ProtectedString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CachedRemoteSourceLoadState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HasAssociatedDrafts", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsDifferentFromFileSystem", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SandboxedSource", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ProtectedString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ScriptGuid", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "isPlayerScript", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "LuaSourceContainer", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AuroraScriptBindingsSerialize", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableCulling", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableLOD", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LODCriticality", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Priority", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Source", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ProtectedString" - } - }, - { - "MemberType": "Function", - "Name": "AddTo", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "parameters", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSchema", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "IsOnInstance", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveFrom", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalFired", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "topic", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ChangedThisFrame", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SynchronizeState", - "Parameters": [ - { - "Name": "frameId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "state", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "ingressHeaders", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "ingressArgs", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "egressHeaders", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "egressArgs", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "lodLevel", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "priorInvocationFrame", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Script", - "Name": "AuroraScript", - "Superclass": "LuaSourceContainer", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Disabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LinkedSource", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RunContext", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RunContext" - } - } - ], - "MemoryCategory": "Script", - "Name": "BaseScript", - "Superclass": "LuaSourceContainer", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Script", - "Name": "CoreScript", - "Superclass": "BaseScript", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "PluginOrOpenCloud" - ], - "Write": [ - "PluginOrOpenCloud" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Source", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ProtectedString" - } - }, - { - "MemberType": "Function", - "Name": "GetHash", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Script", - "Name": "Script", - "Superclass": "BaseScript" - }, - { - "Members": [ - ], - "MemoryCategory": "Script", - "Name": "LocalScript", - "Superclass": "Script" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Confidential", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "LinkedSource", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "PluginOrOpenCloud" - ], - "Write": [ - "PluginOrOpenCloud" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Source", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ProtectedString" - } - } - ], - "MemoryCategory": "Script", - "Name": "ModuleScript", - "Superclass": "LuaSourceContainer" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "LuaWebService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "LuauScriptAnalyzerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "MLModelDeliveryService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CreateSessionAsync", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MLSession" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MLService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "AssetId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Instance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "Face", - "MemberType": "Property", - "Name": "MakeupType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MakeupType" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Order", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "Avatar" - ], - "MemberType": "Function", - "Name": "GetAppliedInstance", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MakeupDescription", - "Superclass": "Instance", - "Tags": [ - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Length", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "\u0002", - "MemberType": "Property", - "Name": "ValuesAndTimes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetMarkerAtIndex", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetMarkers", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "InsertMarkerAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "marker", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RemoveMarkerAtIndex", - "Parameters": [ - { - "Name": "startingIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "1", - "Name": "count", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MarkerCurve", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "PlayerCanMakePurchases", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PrepareCollectiblesPurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "collectibleItemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleItemInstanceId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "expectedPrice", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "PromptExternalPurchase" - ], - "MemberType": "Function", - "Name": "PromptBulkPurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "lineItems", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "PromptExternalPurchase" - ], - "MemberType": "Function", - "Name": "PromptBundlePurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "PromptExternalPurchase" - ], - "MemberType": "Function", - "Name": "PromptCancelSubscription", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptCollectiblesPurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "collectibleItemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleItemInstanceId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "expectedPrice", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "PromptExternalPurchase" - ], - "MemberType": "Function", - "Name": "PromptGamePassPurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "gamePassId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptNativePurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptNativePurchaseWithLocalPlayer", - "Parameters": [ - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "PromptExternalPurchase" - ], - "MemberType": "Function", - "Name": "PromptPremiumPurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "PromptExternalPurchase" - ], - "MemberType": "Function", - "Name": "PromptProductPurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "true", - "Name": "equipIfPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "Default", - "Name": "currencyType", - "Type": { - "Category": "Enum", - "Name": "CurrencyType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "PromptExternalPurchase" - ], - "MemberType": "Function", - "Name": "PromptPurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "true", - "Name": "equipIfPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "Default", - "Name": "currencyType", - "Type": { - "Category": "Enum", - "Name": "CurrencyType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptRobloxPurchase", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "equipIfPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptSubscriptionPurchase", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptThirdPartyPurchase", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportAssetSale", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "robuxAmount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportRobuxUpsellStarted", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalAssetTypePurchased", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AssetType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalClientPurchaseSuccess", - "Parameters": [ - { - "Name": "ticket", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalMockPurchasePremium", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalPromptBulkPurchaseFinished", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "MarketplaceBulkPurchasePromptStatus" - } - }, - { - "Name": "results", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalPromptBundlePurchaseFinished", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalPromptGamePassPurchaseFinished", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "gamePassId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalPromptPremiumPurchaseFinished", - "Parameters": [ - { - "Name": "didTryPurchasing", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalPromptProductPurchaseFinished", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalPromptPurchaseFinished", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalPromptSubscriptionPurchaseFinished", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "didTryPurchasing", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalServerLuaDialogClosed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SignalUserSubscriptionStatusChanged", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetDeveloperProductsAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetProductInfo", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "Asset", - "Name": "infoType", - "Type": { - "Category": "Enum", - "Name": "InfoType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetProductInfoAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetProductInfoAsync", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "Asset", - "Name": "infoType", - "Type": { - "Category": "Enum", - "Name": "InfoType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRobuxBalance", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "GetSubscriptionProductInfoAsync", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSubscriptionPurchaseInfoAsync", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserSubscriptionDetailsAsync", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserSubscriptionDetailsInternalAsync", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserSubscriptionPaymentHistoryAsync", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserSubscriptionStatusAsync", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUsersPriceLevelsAsync", - "Parameters": [ - { - "Name": "userIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformBulkPurchase", - "Parameters": [ - { - "Name": "orderRequest", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformCancelSubscription", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformPurchase", - "Parameters": [ - { - "Name": "infoType", - "Type": { - "Category": "Enum", - "Name": "InfoType" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "expectedPrice", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "isRobloxPurchase", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "", - "Name": "collectibleItemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "collectibleProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "idempotencyKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "purchaseAuthToken", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "0", - "Name": "timedOptionsDays", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformPurchaseV2", - "Parameters": [ - { - "Name": "infoType", - "Type": { - "Category": "Enum", - "Name": "InfoType" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "expectedPrice", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "isRobloxPurchase", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "collectiblesProductDetails", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformSubscriptionPurchase", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PerformSubscriptionPurchaseV2", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "paymentProvider", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "PlayerOwnsAsset", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "PlayerOwnsAssetAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "PlayerOwnsAssetAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "PlayerOwnsBundle", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "PlayerOwnsBundleAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "PlayerOwnsBundleAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RankProductsAsync", - "Parameters": [ - { - "Name": "productIdentifiers", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RecommendTopProductsAsync", - "Parameters": [ - { - "Name": "infoTypes", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "AssetRead" - ], - "MemberType": "Function", - "Name": "UserOwnsGamePassAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "gamePassId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AssetTypePurchased", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AssetType" - } - } - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ClientLuaDialogRequested", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ClientPurchaseSuccess", - "Parameters": [ - { - "Name": "ticket", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ConfirmPlayerMembership", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ConfirmUserSubscriptionPurchase", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "LuaDialogCallbackSignal", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "MockConfirmUserSubscriptionPurchase", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "MockPurchasePremium", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "NativePurchaseFinished", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wasPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "NativePurchaseFinishedWithLocalPlayer", - "Parameters": [ - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wasPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PrepareCollectiblesPurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "collectibleItemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleItemInstanceId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "expectedPrice", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptBulkPurchaseFinished", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "MarketplaceBulkPurchasePromptStatus" - } - }, - { - "Name": "results", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptBulkPurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "displayData", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "orderRequest", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "purchaserRobuxBalance", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "orderTotalRobux", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptBundlePurchaseFinished", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "wasPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptBundlePurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptCancelSubscriptionRequested", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptCollectibleBundlePurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "bundleId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "collectibleItemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleItemInstanceId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "expectedPrice", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "idempotencyKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "purchaseAuthToken", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptCollectiblesPurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "collectibleItemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleItemInstanceId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collectibleProductId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "expectedPrice", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "idempotencyKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "purchaseAuthToken", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptGamePassPurchaseFinished", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "gamePassId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "wasPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptGamePassPurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "gamePassId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptNativePurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptNativePurchaseRequestedWithLocalPlayer", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptPremiumPurchaseFinished", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptPremiumPurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptProductPurchaseFinished", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "isPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptProductPurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "equipIfPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "currencyType", - "Type": { - "Category": "Enum", - "Name": "CurrencyType" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptPurchaseFinished", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "isPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptPurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "equipIfPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "currencyType", - "Type": { - "Category": "Enum", - "Name": "CurrencyType" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptPurchaseRequestedV2", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "equipIfPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "currencyType", - "Type": { - "Category": "Enum", - "Name": "CurrencyType" - } - }, - { - "Name": "idempotencyKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "purchaseAuthToken", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptRobloxPurchaseRequested", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "equipIfPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptSubscriptionPurchaseFinished", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "didTryPurchasing", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptSubscriptionPurchaseRequested", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptThirdPartyPurchaseRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ServerPurchaseVerification", - "Parameters": [ - { - "Name": "serverResponseTable", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ThirdPartyPurchaseFinished", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "productId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "receipt", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wasPurchased", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UserSubscriptionStatusChanged", - "Parameters": [ - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Callback", - "Name": "ProcessReceipt", - "Parameters": [ - { - "Name": "receiptInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "ProductPurchaseDecision" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MarketplaceService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetServerAttribute", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "InitializeServerAttributesForStudio", - "Parameters": [ - { - "Name": "serverAttributes", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetServerAttribute", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MatchmakingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GenerateMaterialVariantsAsync", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "samples", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MaterialGenerationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Asphalt", - "MemberType": "Property", - "Name": "AsphaltName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Basalt", - "MemberType": "Property", - "Name": "BasaltName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Brick", - "MemberType": "Property", - "Name": "BrickName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Cardboard", - "MemberType": "Property", - "Name": "CardboardName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Carpet", - "MemberType": "Property", - "Name": "CarpetName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "CeramicTiles", - "MemberType": "Property", - "Name": "CeramicTilesName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "ClayRoofTiles", - "MemberType": "Property", - "Name": "ClayRoofTilesName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Cobblestone", - "MemberType": "Property", - "Name": "CobblestoneName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Concrete", - "MemberType": "Property", - "Name": "ConcreteName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "CorrodedMetal", - "MemberType": "Property", - "Name": "CorrodedMetalName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "CrackedLava", - "MemberType": "Property", - "Name": "CrackedLavaName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "DiamondPlate", - "MemberType": "Property", - "Name": "DiamondPlateName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Fabric", - "MemberType": "Property", - "Name": "FabricName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Foil", - "MemberType": "Property", - "Name": "FoilName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Glacier", - "MemberType": "Property", - "Name": "GlacierName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Granite", - "MemberType": "Property", - "Name": "GraniteName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Grass", - "MemberType": "Property", - "Name": "GrassName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Ground", - "MemberType": "Property", - "Name": "GroundName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Ice", - "MemberType": "Property", - "Name": "IceName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "LeafyGrass", - "MemberType": "Property", - "Name": "LeafyGrassName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Leather", - "MemberType": "Property", - "Name": "LeatherName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Limestone", - "MemberType": "Property", - "Name": "LimestoneName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Marble", - "MemberType": "Property", - "Name": "MarbleName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Metal", - "MemberType": "Property", - "Name": "MetalName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Mud", - "MemberType": "Property", - "Name": "MudName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Pavement", - "MemberType": "Property", - "Name": "PavementName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Pebble", - "MemberType": "Property", - "Name": "PebbleName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Plaster", - "MemberType": "Property", - "Name": "PlasterName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Plastic", - "MemberType": "Property", - "Name": "PlasticName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Rock", - "MemberType": "Property", - "Name": "RockName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "RoofShingles", - "MemberType": "Property", - "Name": "RoofShinglesName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Rubber", - "MemberType": "Property", - "Name": "RubberName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Salt", - "MemberType": "Property", - "Name": "SaltName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Sand", - "MemberType": "Property", - "Name": "SandName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Sandstone", - "MemberType": "Property", - "Name": "SandstoneName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Slate", - "MemberType": "Property", - "Name": "SlateName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "SmoothPlastic", - "MemberType": "Property", - "Name": "SmoothPlasticName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Snow", - "MemberType": "Property", - "Name": "SnowName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Pack", - "Default": "false", - "MemberType": "Property", - "Name": "Use2022Materials", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Pack", - "Default": "false", - "MemberType": "Property", - "Name": "Use2022MaterialsXml", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "Wood", - "MemberType": "Property", - "Name": "WoodName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Material Overrides", - "Default": "WoodPlanks", - "MemberType": "Property", - "Name": "WoodPlanksName", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Function", - "Name": "GetBaseMaterialOverride", - "Parameters": [ - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Function", - "Name": "GetIsMaterialActionAsToolEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Function", - "Name": "GetMaterialOverrideChanged", - "Parameters": [ - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Function", - "Name": "GetMaterialVariant", - "Parameters": [ - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MaterialVariant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Function", - "Name": "GetOverrideStatus", - "Parameters": [ - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "PropertyStatus" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Function", - "Name": "SetBaseMaterialOverride", - "Parameters": [ - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Function", - "Name": "SetCurrentMaterial", - "Parameters": [ - { - "Name": "baseMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Name": "materialVariant", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Function", - "Name": "ToggleMaterialFillToolEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Event", - "Name": "MaterialFillToolEnabledChanged", - "Parameters": [ - { - "Name": "shouldEnable", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Material" - ], - "MemberType": "Event", - "Name": "OverrideStatusChanged", - "Parameters": [ - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MaterialService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "Opaque", - "MemberType": "Property", - "Name": "AlphaMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotBrowsable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AlphaMode" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Internal", - "Default": "0", - "MemberType": "Property", - "Name": "AvgMetalness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Internal", - "Default": "127", - "MemberType": "Property", - "Name": "AvgRoughness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "Plastic", - "MemberType": "Property", - "Name": "BaseMaterial", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "ColorMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ColorMapContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ], - "Write": [ - "Material" - ] - }, - "Category": "Material", - "Default": "default", - "MemberType": "Property", - "Name": "CustomPhysicalProperties", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "PhysicalProperties" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "EmissiveMaskContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ], - "Write": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "EmissiveStrength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ], - "Write": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "EmissiveTint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "Regular", - "MemberType": "Property", - "Name": "MaterialPattern", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MaterialPattern" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "MetalnessMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MetalnessMapContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "NormalMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "NormalMapContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "RoughnessMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RoughnessMapContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ], - "Write": [ - "Material" - ] - }, - "Category": "Appearance", - "Default": "10", - "MemberType": "Property", - "Name": "StudsPerTile", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Material" - ] - }, - "Category": "Internal", - "Default": "", - "MemberType": "Property", - "Name": "TexturePack", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "MaterialVariant", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Disconnect", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MemStorageConnection", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Bind", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MemStorageConnection" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "BindAndFire", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MemStorageConnection" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Call", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "input", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Fire", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetItem", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "defaultValue", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HasItem", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveItem", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetItem", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MemStorageService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "ListItemsAsync", - "Parameters": [ - { - "Name": "count", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MemoryStoreHashMapPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "RemoveAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "SetAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "expiration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "UpdateAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "transformFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "expiration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MemoryStoreHashMap", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "AddAsync", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "expiration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "0", - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetSizeAsync", - "Parameters": [ - { - "Default": "false", - "Name": "excludeInvisible", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "ReadAsync", - "Parameters": [ - { - "Name": "count", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "false", - "Name": "allOrNothing", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "-1", - "Name": "waitTimeout", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "RemoveAsync", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MemoryStoreQueue", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetHashMap", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MemoryStoreHashMap" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetQueue", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "30", - "Name": "invisibilityTimeout", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MemoryStoreQueue" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetSortedMap", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MemoryStoreSortedMap" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MemoryStoreService", - "Superclass": "Instance", - "Tags": [ - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetRangeAsync", - "Parameters": [ - { - "Name": "direction", - "Type": { - "Category": "Enum", - "Name": "SortDirection" - } - }, - { - "Name": "count", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "exclusiveLowerBound", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "exclusiveUpperBound", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "GetSizeAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "RemoveAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "SetAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "expiration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "sortKey", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "DataStore" - ], - "MemberType": "Function", - "Name": "UpdateAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "transformFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "expiration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MemoryStoreSortedMap", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Message", - "Superclass": "Instance", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "Hint", - "Superclass": "Message", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Disconnect", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MessageBusConnection", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Call", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "input", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetLast", - "Parameters": [ - { - "Name": "mid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMessageId", - "Parameters": [ - { - "Name": "domainName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "messageName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetProtocolMethodRequestMessageId", - "Parameters": [ - { - "Name": "protocolName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetProtocolMethodResponseMessageId", - "Parameters": [ - { - "Name": "protocolName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "MakeRequest", - "Parameters": [ - { - "Name": "protocolName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "message", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "customTelemetryData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Publish", - "Parameters": [ - { - "Name": "mid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "params", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PublishProtocolMethodRequest", - "Parameters": [ - { - "Name": "protocolName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "message", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "customTelemetryData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PublishProtocolMethodResponse", - "Parameters": [ - { - "Name": "protocolName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "message", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "responseCode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "customTelemetryData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetRequestHandler", - "Parameters": [ - { - "Name": "protocolName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Subscribe", - "Parameters": [ - { - "Name": "mid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "once", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "sticky", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SubscribeToProtocolMethodRequest", - "Parameters": [ - { - "Name": "protocolName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "once", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "sticky", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SubscribeToProtocolMethodResponse", - "Parameters": [ - { - "Name": "protocolName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "once", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "sticky", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MessageBusService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "ServerCommunication" - ], - "MemberType": "Function", - "Name": "PublishAsync", - "Parameters": [ - { - "Name": "topic", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "message", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "ServerCommunication" - ], - "MemberType": "Function", - "Name": "SubscribeAsync", - "Parameters": [ - { - "Name": "topic", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MessagingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Condition", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "ContinueExecution", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "4", - "MemberType": "Property", - "Name": "Id", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "IsLogpoint", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Line", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "LogMessage", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "RemoveOnHit", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Script", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "State", - "Default": "true", - "MemberType": "Property", - "Name": "Valid", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "GetContextBreakpoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Remove", - "Parameters": [ - { - "Name": "status", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetChildBreakpointEnabledByScriptAndContext", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "contextGST", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetContextEnabled", - "Parameters": [ - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetContinueExecution", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetEnabled", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetLine", - "Parameters": [ - { - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "status", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetRemoveOnHit", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MetaBreakpoint", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0 1 2 ", - "MemberType": "Property", - "Name": "ContextDataInternal", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "MetaBreakpointContext", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "AddBreakpoint", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "condition", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBreakpointById", - "Parameters": [ - { - "Name": "metaBreakpointId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "MetaBreakpoint" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveBreakpointById", - "Parameters": [ - { - "Name": "metaBreakpointId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "MetaBreakpointAdded", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "MetaBreakpoint" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "MetaBreakpointChanged", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "MetaBreakpoint" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "MetaBreakpointRemoved", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "MetaBreakpoint" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "MetaBreakpointSetChanged", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "MetaBreakpoint" - } - }, - { - "Name": "detail", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MetaBreakpointManager", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ContextLabel", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "DumpToFileAsync", - "Parameters": [ - { - "Name": "secondsToDelay", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "framesToDump", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MicroProfilerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "BindReviewableContentEventProcessor", - "Parameters": [ - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateReviewableContentKey", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "DataType", - "Name": "Content" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateReviewableContentAsync", - "Parameters": [ - { - "Name": "config", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "InternalRequestReviewableContentReviewAsync", - "Parameters": [ - { - "Name": "config", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TriggeredCaptureUpload", - "Parameters": [ - { - "Name": "config", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ModerationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Hit", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Icon", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IconContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Origin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Target", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TargetFilter", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TargetSurface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UnitRay", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ViewSizeX", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ViewSizeY", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "X", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Y", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "hit", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Hit", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "target", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Target", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Button1Down", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Button1Up", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Button2Down", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Button2Up", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Idle", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "KeyDown", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "InputBegan", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "KeyUp", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "InputEnded", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Move", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "WheelBackward", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "WheelForward", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "keyDown", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "InputBegan", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Mouse", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "PlayerMouse", - "Superclass": "Mouse", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "DragEnter", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginMouse", - "Superclass": "Mouse", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "MouseEnterStudioViewport", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "MouseLeaveStudioViewport", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MouseService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FocusedDataModelSession", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "DataModelSession" - } - }, - { - "MemberType": "Event", - "Name": "DataModelSessionEnded", - "Parameters": [ - { - "Name": "dataModelSession", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DataModelSessionStarted", - "Parameters": [ - { - "Name": "dataModelSession", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MultipleDocumentInterfaceInstance", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "Received", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "NetworkMarker", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "InitializeRemoteAllowList", - "Parameters": [ - { - "Name": "names", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetOutgoingKBPSLimit", - "Parameters": [ - { - "Name": "limit", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "NetworkPeer", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "ConnectionAccepted", - "Parameters": [ - { - "Name": "peer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "replicator", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ConnectionFailed", - "Parameters": [ - { - "Name": "peer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "code", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "NetworkClient", - "Superclass": "NetworkPeer", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "EncryptStringForPlayerId", - "Parameters": [ - { - "Name": "toEncrypt", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "NetworkServer", - "Superclass": "NetworkPeer", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Network", - "Players" - ], - "MemberType": "Function", - "Name": "GetPlayer", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "NetworkReplicator", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "IsStreamedOut", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "RequestRCCProfilerData", - "Parameters": [ - { - "Name": "frameRate", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "timeFrame", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Function", - "Name": "RequestServerStats", - "Parameters": [ - { - "Name": "request", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Event", - "Name": "RCCProfilerDataComplete", - "Parameters": [ - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Network" - ], - "MemberType": "Event", - "Name": "StatsReceived", - "Parameters": [ - { - "Name": "stats", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ClientReplicator", - "Superclass": "NetworkReplicator", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ServerReplicator", - "Superclass": "NetworkReplicator", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EmulatedTotalMemoryInMB", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "FreeMemoryMBytes", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Proxy Settings", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HttpProxyEnabled", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Proxy Settings", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HttpProxyURL", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "InboundNetworkLossPercent", - "Security": { - "Read": "NotAccessibleSecurity", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "InboundNetworkMaxDelayMs", - "Security": { - "Read": "NotAccessibleSecurity", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "InboundNetworkMinDelayMs", - "Security": { - "Read": "NotAccessibleSecurity", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Diagnostics", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IncomingReplicationLag", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "NetworkEmulationEnabled", - "Security": { - "Read": "NotAccessibleSecurity", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Proxy Settings", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OpenCertManagerDialog", - "Security": { - "Read": "NotAccessibleSecurity", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OutboundNetworkLossPercent", - "Security": { - "Read": "NotAccessibleSecurity", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OutboundNetworkMaxDelayMs", - "Security": { - "Read": "NotAccessibleSecurity", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OutboundNetworkMinDelayMs", - "Security": { - "Read": "NotAccessibleSecurity", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Diagnostics", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PrintJoinSizeBreakdown", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Diagnostics", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PrintPhysicsErrors", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Diagnostics", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PrintStreamInstanceQuota", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Advanced", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RandomizeJoinInstanceOrder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Network" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RenderStreamedRegions", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Network", - "Animation" - ], - "Write": [ - "Network", - "Animation" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowActiveAnimationAsset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "NetworkSettings", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Parts", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Part0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Parts", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Part1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "NoCollisionConstraint", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "SimplexGabor", - "MemberType": "Property", - "Name": "NoiseType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NoiseType" - } - }, - { - "Category": "Data", - "Default": "1234", - "MemberType": "Property", - "Name": "Seed", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "SampleDirectional", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "direction", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SampleUniform", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Noise", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsConnected", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsLuaChatEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsLuaGameDetailsEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectedTheme", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "ActionEnabled", - "Parameters": [ - { - "Name": "actionType", - "Type": { - "Category": "Enum", - "Name": "AppShellActionType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ActionTaken", - "Parameters": [ - { - "Name": "actionType", - "Type": { - "Category": "Enum", - "Name": "AppShellActionType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CancelAllNotification", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CancelNotification", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "alertId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ScheduleNotification", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "alertId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "alertMsg", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "minutesToFire", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SwitchedToAppShellFeature", - "Parameters": [ - { - "Name": "appShellFeature", - "Type": { - "Category": "Enum", - "Name": "AppShellFeature" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetScheduledNotifications", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "LocalUserSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Roblox17sConnectionChanged", - "Parameters": [ - { - "Name": "connectionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "connectionState", - "Type": { - "Category": "Enum", - "Name": "ConnectionState" - } - }, - { - "Name": "namespaceSequenceNumbers", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Roblox17sEventReceived", - "Parameters": [ - { - "Name": "eventData", - "Type": { - "Category": "Group", - "Name": "Map" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RobloxConnectionChanged", - "Parameters": [ - { - "Name": "connectionName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "connectionState", - "Type": { - "Category": "Enum", - "Name": "ConnectionState" - } - }, - { - "Name": "sequenceNumber", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "namespaceSequenceNumbers", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RobloxEventReceived", - "Parameters": [ - { - "Name": "eventData", - "Type": { - "Category": "Group", - "Name": "Map" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "NotificationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ClearSessionId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSessionId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "MakeRequest", - "Parameters": [ - { - "Name": "nextPageToken", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HttpRequest" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "OmniRecommendationsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CreateModel", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "OpenCloudModel" - }, - "Security": "None", - "Tags": [ - "Deprecated", - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateUserNotificationAsync", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "userNotification", - "Type": { - "Category": "DataType", - "Name": "OpenCloudModel" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "OpenCloudModel" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "OpenCloudApiV1", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "HttpService", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetApiV1", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "OpenCloudApiV1" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterOpenCloud", - "Parameters": [ - { - "Name": "version", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "method", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegistrationComplete", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HttpRequestAsync", - "Parameters": [ - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InvokeAsync", - "Parameters": [ - { - "Name": "version", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "methodName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Default": "nil", - "Name": "headers", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "OpenCloudService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "HttpService", - "ThreadSafety": "Unknown" - } - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "OperationGraph", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Transform", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Origin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Pivot", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Pivot Offset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "MemberType": "Function", - "Name": "GetPivot", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "PivotTo", - "Parameters": [ - { - "Name": "targetCFrame", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PVInstance", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Anchored", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Assembly", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AssemblyAngularVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Assembly", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AssemblyCenterOfMass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Assembly", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AssemblyLinearVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Assembly", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AssemblyMass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Assembly", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AssemblyRootPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Category": "Collision", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AudioCanCollide", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BackParamA", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BackParamB", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BackSurface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SurfaceType" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BackSurfaceInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "InputType" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BottomParamA", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BottomParamB", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BottomSurface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SurfaceType" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BottomSurfaceInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "InputType" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BrickColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Category": "Transform", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Collision", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CanCollide", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Collision", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CanQuery", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Collision", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CanTouch", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CastShadow", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CenterOfMass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Collision", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CollisionGroup", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Collision", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CollisionGroupId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "CollisionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Collision", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CollisionGroupReplicate", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Color3uint8", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3uint8" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CurrentPhysicalProperties", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "PhysicalProperties" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CustomPhysicalProperties", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "PhysicalProperties" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DraggingV1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Elasticity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "EnableFluidForces", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Transform", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ExtentsCFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Transform", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ExtentsSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Friction", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrontParamA", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrontParamB", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrontSurface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SurfaceType" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrontSurfaceInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "InputType" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LeftParamA", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LeftParamB", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LeftSurface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SurfaceType" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LeftSurfaceInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "InputType" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LocalSimulationValidation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LocalTransparencyModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Locked", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Mass", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Massless", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Material", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MaterialVariant", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MaterialVariantSerialized", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NetworkIsSleeping", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NetworkOwnerV3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SystemAddress" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NetworkOwnershipRule", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NetworkOwnership" - } - }, - { - "Category": "Transform", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Orientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Transform", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PhysicsRepRootPart", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Category": "Pivot", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PivotOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Transform", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ReceiveAge", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Reflectance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Transform", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ReplicationPV", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ReplicationPV" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ResizeIncrement", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ResizeableFaces", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Faces" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RightParamA", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RightParamB", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RightSurface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SurfaceType" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RightSurfaceInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "InputType" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RootPriority", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RotVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated", - { - "PreferredDescriptorName": "AssemblyAngularVelocity", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Rotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Transform", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SpecificGravity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "SpecificGravity", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TopParamA", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TopParamB", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Surface", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TopSurface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SurfaceType" - } - }, - { - "Category": "Surface Inputs", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TopSurfaceInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "InputType" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Velocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated", - { - "PreferredDescriptorName": "AssemblyLinearVelocity", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "brickColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "BrickColor", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "siz", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "WriteOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "MemberType": "Function", - "Name": "AngularAccelerationToTorque", - "Parameters": [ - { - "Name": "angAcceleration", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "0, 0, 0", - "Name": "angVelocity", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ApplyAngularImpulse", - "Parameters": [ - { - "Name": "impulse", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ApplyImpulse", - "Parameters": [ - { - "Name": "impulse", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ApplyImpulseAtPosition", - "Parameters": [ - { - "Name": "impulse", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "BreakJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CanCollideWith", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "CanSetNetworkOwnership", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetClosestPointOnSurface", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetConnectedParts", - "Parameters": [ - { - "Default": "false", - "Name": "recursive", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetMass", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetNetworkOwner", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetNetworkOwnershipAuto", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetNoCollisionConstraints", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPhysicsCost", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetRenderCFrame", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRootPart", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "AssemblyRootPart", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetTouchingParts", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetVelocityAtPosition", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "IsGrounded", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "MakeJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Resize", - "Parameters": [ - { - "Name": "normalId", - "Type": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Name": "deltaAmount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetNetworkOwner", - "Parameters": [ - { - "Default": "nil", - "Name": "playerInstance", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetNetworkOwnershipAuto", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TorqueToAngularAcceleration", - "Parameters": [ - { - "Name": "torque", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "0, 0, 0", - "Name": "angVelocity", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "breakJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "BreakJoints", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getMass", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetMass", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "makeJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "resize", - "Parameters": [ - { - "Name": "normalId", - "Type": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Name": "deltaAmount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Resize", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "IntersectAsync", - "Parameters": [ - { - "Name": "parts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "Default", - "Name": "collisionfidelity", - "Type": { - "Category": "Enum", - "Name": "CollisionFidelity" - } - }, - { - "Default": "Automatic", - "Name": "renderFidelity", - "Type": { - "Category": "Enum", - "Name": "RenderFidelity" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "SubtractAsync", - "Parameters": [ - { - "Name": "parts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "Default", - "Name": "collisionfidelity", - "Type": { - "Category": "Enum", - "Name": "CollisionFidelity" - } - }, - { - "Default": "Automatic", - "Name": "renderFidelity", - "Type": { - "Category": "Enum", - "Name": "RenderFidelity" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "CSG" - ], - "MemberType": "Function", - "Name": "UnionAsync", - "Parameters": [ - { - "Name": "parts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "Default", - "Name": "collisionfidelity", - "Type": { - "Category": "Enum", - "Name": "CollisionFidelity" - } - }, - { - "Default": "Automatic", - "Name": "renderFidelity", - "Type": { - "Category": "Enum", - "Name": "RenderFidelity" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "LocalSimulationTouched", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "NetworkOwnerChanged", - "Parameters": [ - { - "Name": "systemAddress", - "Type": { - "Category": "DataType", - "Name": "SystemAddress" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OutfitChanged", - "Parameters": [ - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StoppedTouching", - "Parameters": [ - { - "Name": "otherPart", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "TouchEnded", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TouchEnded", - "Parameters": [ - { - "Name": "otherPart", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Touched", - "Parameters": [ - { - "Name": "otherPart", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BasePart", - "Superclass": "PVInstance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CornerWedgePart", - "Superclass": "BasePart" - }, - { - "Members": [ - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FormFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FormFactor" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "formFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FormFactor" - } - }, - { - "Category": "Part", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "formFactorRaw", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FormFactor" - } - } - ], - "MemoryCategory": "Instances", - "Name": "FormFactorPart", - "Superclass": "BasePart", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Part", - "Default": "Block", - "MemberType": "Property", - "Name": "Shape", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PartType" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Part", - "Default": "__api_dump_write_only_property__", - "MemberType": "Property", - "Name": "shap", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "WriteOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PartType" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Part", - "Default": "Block", - "MemberType": "Property", - "Name": "shape", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PartType" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "Part", - "Superclass": "FormFactorPart" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TeamColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "FlagCaptured", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "FlagStand", - "Superclass": "Part", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Basic", - "Avatar" - ], - "MemberType": "Event", - "Name": "RemoteCreateMotor6D", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "Avatar" - ], - "MemberType": "Event", - "Name": "RemoteDestroyMotor6D", - "Parameters": [ - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "Platform", - "Superclass": "Part", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "Disabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Occupant", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Humanoid" - } - }, - { - "Capabilities": [ - "Basic", - "Avatar" - ], - "MemberType": "Function", - "Name": "Sit", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "Avatar" - ], - "MemberType": "Event", - "Name": "RemoteCreateSeatWeld", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "Avatar" - ], - "MemberType": "Event", - "Name": "RemoteDestroySeatWeld", - "Parameters": [ - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "Seat", - "Superclass": "Part" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Control", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Controller", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "SkateboardController" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Control", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ControllingHumanoid", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Humanoid" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Control", - "Default": "Stopped", - "MemberType": "Property", - "Name": "MoveState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MoveState" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Control", - "Default": "0", - "MemberType": "Property", - "Name": "Steer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Control", - "Default": "true", - "MemberType": "Property", - "Name": "StickyWheels", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Control", - "Default": "0", - "MemberType": "Property", - "Name": "Throttle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "ApplySpecificImpulse", - "Parameters": [ - { - "Name": "impulseWorld", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "Equipped", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "skateboardController", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "MoveStateChanged", - "Parameters": [ - { - "Name": "newState", - "Type": { - "Category": "Enum", - "Name": "MoveState" - } - }, - { - "Name": "oldState", - "Type": { - "Category": "Enum", - "Name": "MoveState" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "RemoteCreateMotor6D", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "RemoteDestroyMotor6D", - "Parameters": [ - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "Unequipped", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "equipped", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "skateboardController", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Equipped", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "unequipped", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Unequipped", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "SkateboardPlatform", - "Superclass": "Part", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "Players" - ] - }, - "Category": "Teams", - "Default": "false", - "MemberType": "Property", - "Name": "AllowTeamChangeOnTouch", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Players" - ] - }, - "Category": "Forcefield", - "Default": "10", - "MemberType": "Property", - "Name": "Duration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Players" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Players" - ] - }, - "Category": "Teams", - "Default": "true", - "MemberType": "Property", - "Name": "Neutral", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Players" - ] - }, - "Category": "Teams", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TeamColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "SpawnLocation", - "Superclass": "Part" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "WedgePart", - "Superclass": "FormFactorPart" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "AcquisitionMethod", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TerrainAcquisitionMethod" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "__api_dump_write_only_property__", - "MemberType": "Property", - "Name": "ClusterGrid", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "WriteOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "__api_dump_write_only_property__", - "MemberType": "Property", - "Name": "ClusterGridV2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "WriteOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "__api_dump_write_only_property__", - "MemberType": "Property", - "Name": "ClusterGridV3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "WriteOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "Decoration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.699999988", - "MemberType": "Property", - "Name": "GrassLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "IsSmooth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "LastUsedModificationMethod", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TerrainAcquisitionMethod" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "MaterialColors", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MaxExtents", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Region3int16" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "\u0002\u0003", - "MemberType": "Property", - "Name": "PhysicsGrid", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "\u0001\u0005", - "MemberType": "Property", - "Name": "SmoothGrid", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "SmoothVoxelsUpgraded", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.05, 0.33, 0.36", - "MemberType": "Property", - "Name": "WaterColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "WaterReflectance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.300000012", - "MemberType": "Property", - "Name": "WaterTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0.150000006", - "MemberType": "Property", - "Name": "WaterWaveSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "10", - "MemberType": "Property", - "Name": "WaterWaveSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "AutowedgeCell", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "AutowedgeCells", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3int16" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "CanSmoothVoxelsBeUpgraded", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "CellCenterToWorld", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "CellCornerToWorld", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "Clear", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ClearVoxelsAsync_beta", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "channelIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ConvertToSmooth", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "CopyRegion", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3int16" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TerrainRegion" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "CountCells", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "CreateVoxelBuffer_beta", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "VoxelBuffer" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "FillBall", - "Parameters": [ - { - "Name": "center", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "FillBlock", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "FillCylinder", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "height", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "FillRegion", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "FillWedge", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "GetCell", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "GetMaterialColor", - "Parameters": [ - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Color3" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "GetTerrainWireframe", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "GetWaterCell", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "IterateVoxelsAsync_beta", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "channelIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TerrainIterateOperation" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ModifyVoxelsAsync_beta", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "channelIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TerrainModifyOperation" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "PasteRegion", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "Class", - "Name": "TerrainRegion" - } - }, - { - "Name": "corner", - "Type": { - "Category": "DataType", - "Name": "Vector3int16" - } - }, - { - "Name": "pasteEmptyCells", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ReadVoxelChannels", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "channelIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ReadVoxels", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ReadVoxelsAsync_beta", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "channelIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TerrainReadOperation" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ReplaceMaterial", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "sourceMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Name": "targetMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ReplaceMaterialInTransform", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "sourceMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Name": "targetMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ReplaceMaterialInTransformSubregion", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "sourceMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Name": "targetMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Name": "targetRegion", - "Type": { - "Category": "DataType", - "Name": "Region3int16" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "SetCell", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "CellMaterial" - } - }, - { - "Name": "block", - "Type": { - "Category": "Enum", - "Name": "CellBlock" - } - }, - { - "Name": "orientation", - "Type": { - "Category": "Enum", - "Name": "CellOrientation" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "SetCells", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3int16" - } - }, - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "CellMaterial" - } - }, - { - "Name": "block", - "Type": { - "Category": "Enum", - "Name": "CellBlock" - } - }, - { - "Name": "orientation", - "Type": { - "Category": "Enum", - "Name": "CellOrientation" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "SetMaterialColor", - "Parameters": [ - { - "Name": "material", - "Type": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "Color3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "SetMaterialInTransform", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "targetMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "SetMaterialInTransformSubregion", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "targetMaterial", - "Type": { - "Category": "Enum", - "Name": "Material" - } - }, - { - "Name": "targetRegion", - "Type": { - "Category": "DataType", - "Name": "Region3int16" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "SetWaterCell", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "force", - "Type": { - "Category": "Enum", - "Name": "WaterForce" - } - }, - { - "Name": "direction", - "Type": { - "Category": "Enum", - "Name": "WaterDirection" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "SmoothRegion", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "strength", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "WorldToCell", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "WorldToCellPreferEmpty", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "WorldToCellPreferSolid", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "WriteVoxelChannels", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "channels", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "WriteVoxels", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "materials", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "occupancy", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "WriteVoxelsAsync_beta", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "channelIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TerrainWriteOperation" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "DrawBufferAsync", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "scale", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "source", - "Type": { - "Category": "Class", - "Name": "VoxelBuffer" - } - }, - { - "Name": "mergeConfig", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ReadBufferAsync", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "VoxelBuffer" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Terrain", - "Superclass": "BasePart", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AeroMeshData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Collision", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CollisionFidelity", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CollisionFidelity" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ConvexDecompHolder", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NetAssetRef" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FluidFidelity", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FluidFidelity" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FluidFidelityInternal", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FluidFidelity" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InertiaMigrated", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MeshSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PhysicalConfigData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UnscaledCofm", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UnscaledVolInertiaDiags", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UnscaledVolInertiaOffDiags", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UnscaledVolume", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TriangleMeshPart", - "Superclass": "BasePart", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "AlternateMeshHash", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "DoubleSided", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "HasJointOffset", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "HasSkinnedMesh", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "InitialSize", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "JointOffset", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MeshContent", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "MeshID", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "Deprecated", - { - "PreferredDescriptorName": "MeshId", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "MeshId", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PhysicsData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "Automatic", - "MemberType": "Property", - "Name": "RenderFidelity", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RenderFidelity" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "Automatic", - "MemberType": "Property", - "Name": "RenderFidelityReplicate", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RenderFidelity" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SolidMeshHolder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NetAssetRef" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TextureContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "TextureID", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "VertexCount", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "ApplyMesh", - "Parameters": [ - { - "Name": "meshPart", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "MeshPart", - "Superclass": "TriangleMeshPart" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "AssetId", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ChildData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ChildData2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "ComponentIndex", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "DCDPropertyData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CSGPropertyData" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "Custom", - "MemberType": "Property", - "Name": "FormFactor", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FormFactor" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "InitialSize", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ManifoldMesh_DEPRECATED", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "MeshData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MeshData2", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "OffCentered", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PhysicsData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Appearance", - "Default": "Automatic", - "MemberType": "Property", - "Name": "RenderFidelity", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RenderFidelity" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SerializedOperationGraph", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "SmoothingAngle", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SolidMeshHolder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NetAssetRef" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TriangleCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "UsePartColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Basic", - "CSG" - ], - "MemberType": "Function", - "Name": "SubstituteGeometry", - "Parameters": [ - { - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PartOperation", - "Superclass": "TriangleMeshPart" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "IntersectOperation", - "Superclass": "PartOperation" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "CSG" - ] - }, - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "PreviousOperation", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NegateOperationHiddenHistory" - } - } - ], - "MemoryCategory": "Instances", - "Name": "NegateOperation", - "Superclass": "PartOperation" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "UnionOperation", - "Superclass": "PartOperation" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Part", - "Default": "AlternatingSupports", - "MemberType": "Property", - "Name": "Style", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Style" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Part", - "Default": "AlternatingSupports", - "MemberType": "Property", - "Name": "style", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Style" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TrussPart", - "Superclass": "BasePart" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "0", - "MemberType": "Property", - "Name": "AreHingesDetected", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "Disabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "true", - "MemberType": "Property", - "Name": "HeadsUpDisplay", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "25", - "MemberType": "Property", - "Name": "MaxSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Occupant", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Humanoid" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "0", - "MemberType": "Property", - "Name": "Steer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "0", - "MemberType": "Property", - "Name": "SteerFloat", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "0", - "MemberType": "Property", - "Name": "Throttle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "0", - "MemberType": "Property", - "Name": "ThrottleFloat", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "10", - "MemberType": "Property", - "Name": "Torque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "Avatar" - ] - }, - "Category": "Control", - "Default": "1", - "MemberType": "Property", - "Name": "TurnSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Basic", - "Avatar" - ], - "MemberType": "Function", - "Name": "Sit", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "Avatar" - ], - "MemberType": "Event", - "Name": "RemoteCreateSeatWeld", - "Parameters": [ - { - "Name": "humanoid", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "Avatar" - ], - "MemberType": "Event", - "Name": "RemoteDestroySeatWeld", - "Parameters": [ - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VehicleSeat", - "Superclass": "BasePart" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0, 20, 20, 1, 0, -0, -0, 0.707106829, 0.707106829, 0, -0.707106829, 0.707106829", - "MemberType": "Property", - "Name": "CFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Camera", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "CameraSubject", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Camera", - "Default": "Fixed", - "MemberType": "Property", - "Name": "CameraType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CameraType" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0, 20, 20, 1, 0, -0, -0, 0.707106829, 0.707106829, 0, -0.707106829, 0.707106829", - "MemberType": "Property", - "Name": "CoordinateFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "CFrame", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Camera", - "Default": "88.8765335", - "MemberType": "Property", - "Name": "DiagonalFieldOfView", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Camera", - "Default": "70", - "MemberType": "Property", - "Name": "FieldOfView", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Camera", - "Default": "Vertical", - "MemberType": "Property", - "Name": "FieldOfViewMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FieldOfViewMode" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0, 0, -5, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Focus", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "HeadLocked", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "HeadScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Camera", - "Default": "70", - "MemberType": "Property", - "Name": "MaxAxisFieldOfView", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "-0.5", - "MemberType": "Property", - "Name": "NearPlaneZ", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "VRTiltAndRollEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1, 1", - "MemberType": "Property", - "Name": "ViewportSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ], - "Write": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0, 0, -5, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "focus", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Focus", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetLargestCutoffDistance", - "Parameters": [ - { - "Name": "ignoreList", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetPanSpeed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetPartsObscuringTarget", - "Parameters": [ - { - "Name": "castPoints", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "ignoreList", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetRenderCFrame", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetRoll", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetTiltSpeed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Interpolate", - "Parameters": [ - { - "Name": "endPos", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "endFocus", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "duration", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "PanUnits", - "Parameters": [ - { - "Name": "units", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "ScreenPointToRay", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "0", - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Ray" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetCameraPanMode", - "Parameters": [ - { - "Default": "Classic", - "Name": "mode", - "Type": { - "Category": "Enum", - "Name": "CameraPanMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetImageServerView", - "Parameters": [ - { - "Name": "modelCoord", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetRoll", - "Parameters": [ - { - "Name": "rollAngle", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "TiltUnits", - "Parameters": [ - { - "Name": "units", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "ViewportPointToRay", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "0", - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Ray" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "WorldToScreenPoint", - "Parameters": [ - { - "Name": "worldPoint", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "WorldToViewportPoint", - "Parameters": [ - { - "Name": "worldPoint", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Zoom", - "Parameters": [ - { - "Name": "distance", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "ZoomToExtents", - "Parameters": [ - { - "Name": "boundingBoxCFrame", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "boundingBoxSize", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "FirstPersonTransition", - "Parameters": [ - { - "Name": "entering", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "InterpolationFinished", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Camera", - "Superclass": "PVInstance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Appearance", - "Default": "Automatic", - "MemberType": "Property", - "Name": "LevelOfDetail", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ModelLevelOfDetail" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "LodEntity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "LodDataEntity" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "ModelMeshCFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ModelMeshData", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ModelMeshSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Behavior", - "Default": "Default", - "MemberType": "Property", - "Name": "ModelStreamingMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ModelStreamingMode" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "NeedsPivotMigration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Pivot", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "PrimaryPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Category": "Pivot", - "Default": "1", - "MemberType": "Property", - "Name": "Scale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Pivot", - "Default": "1", - "MemberType": "Property", - "Name": "ScaleFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SlimAnimationTarget", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "SlimAnimationDataEntity" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SlimHash", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Category": "Pivot", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "WorldPivot", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Pivot", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "WorldPivotData", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "OptionalCoordinateFrame" - } - }, - { - "MemberType": "Function", - "Name": "AddPersistentPlayer", - "Parameters": [ - { - "Default": "nil", - "Name": "playerInstance", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "BreakJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBoundingBox", - "Parameters": [ - ], - "ReturnType": [ - { - "Category": "DataType", - "Name": "CFrame" - }, - { - "Category": "DataType", - "Name": "Vector3" - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetExtentsSize", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetModelCFrame", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPrimaryPartCFrame", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetModelSize", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetExtentsSize", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPersistentPlayers", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPrimaryPartCFrame", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPivot", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetScale", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "MakeJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "MoveTo", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemovePersistentPlayer", - "Parameters": [ - { - "Default": "nil", - "Name": "playerInstance", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResetOrientationToIdentity", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SetPrimaryPartCFrame", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ScaleTo", - "Parameters": [ - { - "Name": "newScaleFactor", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetIdentityOrientation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SetPrimaryPartCFrame", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPrimaryPartCFrame", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "PivotTo", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TranslateBy", - "Parameters": [ - { - "Name": "delta", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "breakJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "BreakJoints", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "makeJoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "MakeJoints", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "move", - "Parameters": [ - { - "Name": "location", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "MoveTo", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "moveTo", - "Parameters": [ - { - "Name": "location", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "MoveTo", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "Model", - "Superclass": "PVInstance" - }, - { - "Members": [ - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "BindToMessage", - "Parameters": [ - { - "Name": "topic", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "BindToMessageParallel", - "Parameters": [ - { - "Name": "topic", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SendMessage", - "Parameters": [ - { - "Name": "topic", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "message", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Safe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "Actor", - "Superclass": "Model" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TextureContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TextureId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "BackpackItem", - "Superclass": "Model", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "Script", - "MemberType": "Property", - "Name": "BinType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "BinType" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_write_only_property__", - "MemberType": "Property", - "Name": "Command", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "WriteOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_write_only_property__", - "MemberType": "Property", - "Name": "TextureName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "WriteOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "Disable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "ToggleSelect", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Deselected", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "ReplicatedSelected", - "Parameters": [ - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Selected", - "Parameters": [ - { - "Name": "mouse", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "HopperBin", - "Superclass": "BackpackItem", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "CanBeDropped", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "State", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Transform", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Grip", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Transform", - "Default": "-0, -0, -1", - "MemberType": "Property", - "Name": "GripForward", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Transform", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "GripPos", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Transform", - "Default": "1, 0, 0", - "MemberType": "Property", - "Name": "GripRight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Transform", - "Default": "0, 1, 0", - "MemberType": "Property", - "Name": "GripUp", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "ManualActivationOnly", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "RequiresHandle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "ToolTip", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "Activate", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "Deactivate", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Activated", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Deactivated", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Equipped", - "Parameters": [ - { - "Name": "mouse", - "Type": { - "Category": "Class", - "Name": "Mouse" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "Unequipped", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "VRLaserPointerClicked", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "Tool", - "Superclass": "BackpackItem" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic", - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TeamColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "Flag", - "Superclass": "Tool", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "Status", - "Superclass": "Model", - "Tags": [ - "NotCreatable", - "Deprecated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PhysicsStepTime", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "Safe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "MemberType": "Function", - "Name": "ArePartsTouchingOthers", - "Parameters": [ - { - "Name": "partList", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "0.000199999995", - "Name": "overlapIgnored", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Blockcast", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "direction", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "RaycastParams{IgnoreWater=false, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}", - "Name": "params", - "Type": { - "Category": "DataType", - "Name": "RaycastParams" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RaycastResult?" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "BulkMoveTo", - "Parameters": [ - { - "Name": "partList", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Name": "cframeList", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "FireAllEvents", - "Name": "eventMode", - "Type": { - "Category": "Enum", - "Name": "BulkMoveMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CacheCurrentTerrain", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "center", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ClearCachedTerrain", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FindPartOnRay", - "Parameters": [ - { - "Name": "ray", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "Default": "nil", - "Name": "ignoreDescendantsInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "false", - "Name": "terrainCellsAreCubes", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "false", - "Name": "ignoreWater", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Raycast", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FindPartOnRayWithIgnoreList", - "Parameters": [ - { - "Name": "ray", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "Name": "ignoreDescendantsTable", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "false", - "Name": "terrainCellsAreCubes", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "false", - "Name": "ignoreWater", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Raycast", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FindPartOnRayWithWhitelist", - "Parameters": [ - { - "Name": "ray", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "Name": "whitelistDescendantsTable", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "false", - "Name": "ignoreWater", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Raycast", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FindPartsInRegion3", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Default": "nil", - "Name": "ignoreDescendantsInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "20", - "Name": "maxParts", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPartBoundsInBox", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FindPartsInRegion3WithIgnoreList", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "ignoreDescendantsTable", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "20", - "Name": "maxParts", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPartBoundsInBox", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FindPartsInRegion3WithWhiteList", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "whitelistDescendantsTable", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "20", - "Name": "maxParts", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPartBoundsInBox", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAwakeContactNormals", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetAwakeContactParts", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetAwakeContactPositions", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetAwakeRootParts", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetPartBoundsInBox", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "OverlapParams{MaxParts=0, Tolerance=0, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}", - "Name": "overlapParams", - "Type": { - "Category": "DataType", - "Name": "OverlapParams" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetPartBoundsInRadius", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "OverlapParams{MaxParts=0, Tolerance=0, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}", - "Name": "overlapParams", - "Type": { - "Category": "DataType", - "Name": "OverlapParams" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetPartsInPart", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Default": "OverlapParams{MaxParts=0, Tolerance=0, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}", - "Name": "overlapParams", - "Type": { - "Category": "DataType", - "Name": "OverlapParams" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "IKMoveTo", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "target", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Default": "0.5", - "Name": "translateStiffness", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "0.5", - "Name": "rotateStiffness", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "OtherMechanismsAnchored", - "Name": "collisionsMode", - "Type": { - "Category": "Enum", - "Name": "IKCollisionsMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsRegion3Empty", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Default": "nil", - "Name": "ignoreDescendentsInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPartBoundsInBox", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsRegion3EmptyWithIgnoreList", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Name": "ignoreDescendentsTable", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPartBoundsInBox", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Raycast", - "Parameters": [ - { - "Name": "origin", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "direction", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "RaycastParams{IgnoreWater=false, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}", - "Name": "raycastParams", - "Type": { - "Category": "DataType", - "Name": "RaycastParams" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RaycastResult?" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "RaycastCachedTerrain", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "origin", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "direction", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "ignoreWater", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RaycastResult?" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetInsertPoint", - "Parameters": [ - { - "Name": "point", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Shapecast", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "direction", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "RaycastParams{IgnoreWater=false, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}", - "Name": "params", - "Type": { - "Category": "DataType", - "Name": "RaycastParams" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RaycastResult?" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Spherecast", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "direction", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "RaycastParams{IgnoreWater=false, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}", - "Name": "params", - "Type": { - "Category": "DataType", - "Name": "RaycastParams" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RaycastResult?" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "StepPhysics", - "Parameters": [ - { - "Name": "dt", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Default": "{}", - "Name": "parts", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "findPartOnRay", - "Parameters": [ - { - "Name": "ray", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "Default": "nil", - "Name": "ignoreDescendantsInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "false", - "Name": "terrainCellsAreCubes", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "false", - "Name": "ignoreWater", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Raycast", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "findPartsInRegion3", - "Parameters": [ - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3" - } - }, - { - "Default": "nil", - "Name": "ignoreDescendantsInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "20", - "Name": "maxParts", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPartBoundsInBox", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "WorldRoot", - "Superclass": "Model", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Category": "AirProperties", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AirDensity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "AirProperties", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AirTurbulenceIntensity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AllowThirdPartySales", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Server Authority", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AuthorityMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AuthorityMode" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AvatarUnificationMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AvatarUnificationMode" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ClientAnimatorThrottling", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ClientAnimatorThrottlingMode" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CollisionGroupData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CollisionGroups", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "WriteOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ConvexDecompCompressed", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CurrentCamera", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Camera" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DataModelPlaceVersion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DistributedGameTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ExplicitAutoJoints", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FallHeightEnabled", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FallenPartsDestroyHeight", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FilteringEnabled", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FluidForces", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FluidForces" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "GlobalWind", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Gravity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IKControlConstraintSupport", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "IKControlConstraintSupport" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InsertPoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InterpolationThrottling", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "InterpolationThrottlingMode" - } - }, - { - "Category": "Scripting", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LuauTypeCheckMode", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "LuauTypeCheckMode" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MeshPartHeadsAndAccessories", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MeshPartHeadsAndAccessories" - } - }, - { - "Category": "Streaming", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ModelStreamingBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ModelStreamingBehavior" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MoverConstraintRootBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MoverConstraintRootBehaviorMode" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NextGenerationReplication", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PathfindingUseImprovedSearch", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PathfindingUseImprovedSearch" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PhysicsImprovedSleep", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PhysicsSteppingMethod", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PhysicsSteppingMethod" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PlayerCharacterDestroyBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PlayerCharacterDestroyBehavior" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PlayerScriptsUseInputActionSystem", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PrimalPhysicsSolver", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PrimalPhysicsSolver" - } - }, - { - "Category": "Networking", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RejectCharacterDeletions", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RejectCharacterDeletions" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RenderingCacheOptimizations", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RenderingCacheOptimizationMode" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ReplicateInstanceDestroySetting", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ReplicateInstanceDestroySetting" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Retargeting", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AnimatorRetargetingMode" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SandboxedInstanceMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SandboxedInstanceMode" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SignalBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SignalBehavior" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SignalBehavior2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SignalBehavior" - } - }, - { - "Category": "Streaming", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "StreamOutBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "StreamOutBehavior" - } - }, - { - "Category": "Streaming", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "StreamingEnabled", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Streaming", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "StreamingIntegrityMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "StreamingIntegrityMode" - } - }, - { - "Category": "Streaming", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "StreamingMinRadius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Streaming", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "StreamingPauseMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "StreamingPauseMode" - } - }, - { - "Category": "Streaming", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "StreamingTargetRadius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Terrain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Terrain" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TerrainWeldsFixed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TouchEventsUseCollisionGroups", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "TouchesUseCollisionGroups", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UseFixedSimulation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Category": "Scripting", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UseNewLuauTypeSolver", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "MemberType": "Function", - "Name": "BreakJoints", - "Parameters": [ - { - "Name": "objects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateJumpDistance", - "Parameters": [ - { - "Name": "gravity", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "jumpPower", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "walkSpeed", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateJumpHeight", - "Parameters": [ - { - "Name": "gravity", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "jumpPower", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateJumpPower", - "Parameters": [ - { - "Name": "gravity", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "jumpHeight", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ExperimentalSolverIsEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetNumAwakeParts", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetPhysicsThrottling", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetRealPhysicsFPS", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetServerTimeNow", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "JoinToOutsiders", - "Parameters": [ - { - "Name": "objects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Name": "jointType", - "Type": { - "Category": "Enum", - "Name": "JointCreationMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "MakeJoints", - "Parameters": [ - { - "Name": "objects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "PGSIsEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetAvatarUnificationMode", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Enum", - "Name": "AvatarUnificationMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetMeshPartHeadsAndAccessories", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Enum", - "Name": "MeshPartHeadsAndAccessories" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPhysicsThrottleEnabled", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UnjoinFromOutsiders", - "Parameters": [ - { - "Name": "objects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ZoomToExtents", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PersistentLoaded", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SendServerTime", - "Parameters": [ - { - "Name": "serverTimeMs", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "BaseParts", - "Name": "Workspace", - "Superclass": "WorldRoot", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "BaseParts", - "Name": "WorldModel", - "Superclass": "WorldRoot" - }, - { - "Members": [ - { - "Category": "Link", - "Default": "false", - "MemberType": "Property", - "Name": "AutoUpdate", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "CanAutoUpdate", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Creator", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Link", - "Default": "", - "MemberType": "Property", - "Name": "DefaultName", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "HasNewVersion", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Link", - "Default": "0", - "MemberType": "Property", - "Name": "ModifiedState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PackageAssetName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Link", - "Default": "0", - "MemberType": "Property", - "Name": "PackageGuid", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Link", - "Default": "", - "MemberType": "Property", - "Name": "PackageId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Category": "Link", - "Default": "", - "MemberType": "Property", - "Name": "PackageIdSerialize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Category": "Link", - "Default": "", - "MemberType": "Property", - "Name": "SerializedDefaultAttributes", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Link", - "Default": "0", - "MemberType": "Property", - "Name": "VersionIdSerialize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Link", - "Default": "0", - "MemberType": "Property", - "Name": "VersionNumber", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "AssetRead" - ], - "Write": [ - "AssetRead" - ] - }, - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "PermissionLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PackagePermission" - } - }, - { - "Category": "Link", - "Default": "Up To Date", - "MemberType": "Property", - "Name": "Status", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PackageLink", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "PackageService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ConvertToMockPackage", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ConvertToPackageClosedCallback", - "Parameters": [ - { - "Name": "sourceRoot", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ConvertToPackageUpload", - "Parameters": [ - { - "Name": "uploadUrl", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "cloneInstances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Name": "originalInstances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ConvertToPackageAsync", - "Parameters": [ - { - "Name": "sourceRoot", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "cloneRoot", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPackageInfo", - "Parameters": [ - { - "Name": "packageAssetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PublishPackage", - "Parameters": [ - { - "Name": "packageInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "addUndoWayPoint", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPackageVersion", - "Parameters": [ - { - "Name": "packageInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "versionNumber", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnConvertToPackageResult", - "Parameters": [ - { - "Name": "isSuccessful", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnOpenConvertToPackagePlugin", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "cloneInstances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PackageUIService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsFinished", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "GetCurrentPage", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AdvanceToNextPageAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Pages", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "AudioPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "BanHistoryPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CapturesPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CatalogPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Cursor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreKeyPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "DataStore" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Cursor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DataStoreListingPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "DataStorePages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "DataStoreVersionPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "FriendPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "InventoryPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "EmotesPages", - "Superclass": "InventoryPages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "MemoryStoreHashMapPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "OutfitPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RecommendationPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "StandardPages", - "Superclass": "Pages", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ChildData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "MeshData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PartOperationAsset", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Motion", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Acceleration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "Brightness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0 1 1 1 0 1 1 1 1 0 ", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ColorSequence" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Particles", - "Default": "0", - "MemberType": "Property", - "Name": "Drag", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "Top", - "MemberType": "Property", - "Name": "EmissionDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "NormalId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Flipbook", - "Default": "1 1 ", - "MemberType": "Property", - "Name": "FlipbookFramerate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Flipbook", - "Default": "Particle texture must be 1024 by 1024 to use flipbooks.", - "MemberType": "Property", - "Name": "FlipbookIncompatible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Flipbook", - "Default": "None", - "MemberType": "Property", - "Name": "FlipbookLayout", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ParticleFlipbookLayout" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Flipbook", - "Default": "Loop", - "MemberType": "Property", - "Name": "FlipbookMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ParticleFlipbookMode" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Flipbook", - "Default": "1", - "MemberType": "Property", - "Name": "FlipbookSizeX", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Flipbook", - "Default": "1", - "MemberType": "Property", - "Name": "FlipbookSizeY", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Flipbook", - "Default": "false", - "MemberType": "Property", - "Name": "FlipbookStartRandom", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "5 10 ", - "MemberType": "Property", - "Name": "Lifetime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LightEmission", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LightInfluence", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LocalTransparencyModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Particles", - "Default": "false", - "MemberType": "Property", - "Name": "LockedToPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "FacingCamera", - "MemberType": "Property", - "Name": "Orientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ParticleOrientation" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "20", - "MemberType": "Property", - "Name": "Rate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "0 0 ", - "MemberType": "Property", - "Name": "RotSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "0 0 ", - "MemberType": "Property", - "Name": "Rotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "EmitterShape", - "Default": "Box", - "MemberType": "Property", - "Name": "Shape", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ParticleEmitterShape" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "EmitterShape", - "Default": "Outward", - "MemberType": "Property", - "Name": "ShapeInOut", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ParticleEmitterShapeInOut" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "EmitterShape", - "Default": "1", - "MemberType": "Property", - "Name": "ShapePartial", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "EmitterShape", - "Default": "Volume", - "MemberType": "Property", - "Name": "ShapeStyle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ParticleEmitterShapeStyle" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0 1 0 1 1 0 ", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberSequence" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "5 5 ", - "MemberType": "Property", - "Name": "Speed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "0, 0", - "MemberType": "Property", - "Name": "SpreadAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0 0 0 1 0 0 ", - "MemberType": "Property", - "Name": "Squash", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberSequence" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "rbxasset://textures/particles/sparkles_main.dds", - "MemberType": "Property", - "Name": "Texture", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Particles", - "Default": "1", - "MemberType": "Property", - "Name": "TimeScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0 0 0 1 0 0 ", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberSequence" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Particles", - "Default": "0", - "MemberType": "Property", - "Name": "VelocityInheritance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "0", - "MemberType": "Property", - "Name": "VelocitySpread", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "SpreadAngle", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Particles", - "Default": "false", - "MemberType": "Property", - "Name": "WindAffectsDrag", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "ZOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Clear", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Emit", - "Parameters": [ - { - "Default": "16", - "Name": "particleCount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FastForward", - "Parameters": [ - { - "Name": "numFrames", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "OnClearRequested", - "Parameters": [ - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "OnEmitRequested", - "Parameters": [ - { - "Name": "particleCount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ParticleEmitter", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CreateNewParty", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DeleteParty", - "Parameters": [ - { - "Name": "partyId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEmulatedPartyConfiguration", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetIsEmulationEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OnTestPlayerCountChanged", - "Parameters": [ - { - "Name": "newPlayerCount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetIsEmulationEnabled", - "Parameters": [ - { - "Name": "isEnabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPlayerPartyId", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "partyId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "applyPartyIdToPlayer", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEmulatedPartyAsync", - "Parameters": [ - { - "Name": "partyId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ConfigurationChanged", - "Parameters": [ - { - "Name": "configuration", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PartyEmulatorService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "PatchBundlerFileWatch", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "FlattenTree", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PatchId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "TargetPath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PatchMapping", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Status", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PathStatus" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetPointCoordinates", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetWaypoints", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetWaypoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "CheckOcclusionAsync", - "Parameters": [ - { - "Name": "start", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "ComputeAsync", - "Parameters": [ - { - "Name": "start", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "finish", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "Blocked", - "Parameters": [ - { - "Name": "blockedWaypointIdx", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "Unblocked", - "Parameters": [ - { - "Name": "unblockedWaypointIdx", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Path", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Attachment0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Attachment" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Attachment1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Attachment" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "IsBidirectional", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Label", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PathfindingLink", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Label", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "PassThrough", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PathfindingModifier", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "EmptyCutoff", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "CreatePath", - "Parameters": [ - { - "Default": "nil", - "Name": "agentParameters", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Path" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "ComputeRawPathAsync", - "Parameters": [ - { - "Name": "start", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "finish", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "maxDistance", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Path" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "FindPathAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "ComputeSmoothPathAsync", - "Parameters": [ - { - "Name": "start", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "finish", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "maxDistance", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Path" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "FindPathAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FindPathAsync", - "Parameters": [ - { - "Name": "start", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "finish", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Path" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PathfindingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AllThreadsPaused", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Reason", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DebuggerPauseReason" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ThreadId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PausedState", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Breakpoint", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Breakpoint" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PausedStateBreakpoint", - "Superclass": "PausedState", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ExceptionText", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PausedStateException", - "Superclass": "PausedState", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "IsCrossExperienceLaunchFeasible", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PerformanceControlService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetIsThirdPartyAssetAllowed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetIsThirdPartyPurchaseAllowed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetIsThirdPartyTeleportAllowed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPermissions", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPermissions", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "permissions", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PermissionsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "CollisionGroupContainsPart", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "CollisionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "CollisionGroupSetCollidable", - "Parameters": [ - { - "Name": "name1", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "name2", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "collidable", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "CollisionGroupsAreCollidable", - "Parameters": [ - { - "Name": "name1", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "name2", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "CreateCollisionGroup", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "RegisterCollisionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "GetCollisionGroupId", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "CollisionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "GetCollisionGroupName", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "CollisionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "GetCollisionGroups", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetRegisteredCollisionGroups", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "GetMaxCollisionGroups", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "GetRegisteredCollisionGroups", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "IkSolve", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "target", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "translateStiffness", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "rotateStiffness", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "IsCollisionGroupRegistered", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "LocalIkSolve", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "target", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "translateStiffness", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "rotateStiffness", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "RegisterCollisionGroup", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "RemoveCollisionGroup", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "UnregisterCollisionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "RenameCollisionGroup", - "Parameters": [ - { - "Name": "from", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "to", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "SetPartCollisionGroup", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "CollisionGroup", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Function", - "Name": "UnregisterCollisionGroup", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Physics" - ], - "MemberType": "Event", - "Name": "CollisionGroupCollidableChanged", - "Parameters": [ - { - "Name": "collisionGroupIndex1", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "collisionGroupIndex2", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PhysicsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AllowSleep", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreAnchorsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreAssembliesShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreAssemblyCentersOfMassShown", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreAwakePartsHighlighted", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreBodyTypesShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreCollisionCostsShown", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreConstraintForcesShownForSelectedOrHoveredInstances", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreConstraintTorquesShownForSelectedOrHoveredInstances", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreContactForcesShownForSelectedOrHoveredAssemblies", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreContactIslandsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreContactPointsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreGravityForcesShownForSelectedOrHoveredAssemblies", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreJointCoordinatesShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreMagnitudesShownForDrawnForcesAndTorques", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreMechanismsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreModelCoordsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreNonAnchorsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreOwnersShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ArePartCoordsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreRegionsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreSolverIslandsShown", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreTerrainReplicationRegionsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreTimestepsShown", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreUnalignedPartsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AreWorldCoordsShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DisableCSGv2", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DisableCSGv3ForPlugins", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DrawConstraintsNetForce", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DrawContactsNetForce", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DrawTotalNetForce", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableForceVisualizationSmoothing", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "FluidForceDrawScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ForceCSGv2", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ForceDrawScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ForceVisualizationSmoothingSteps", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IsInterpolationThrottleShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IsReceiveAgeShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IsTreeShown", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PhysicsEnvironmentalThrottle", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "EnviromentalPhysicsThrottle" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowDecompositionGeometry", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowFluidForcesForSelectedOrHoveredMechanisms", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowInstanceNamesForDrawnForcesAndTorques", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "SolverConvergenceMetricType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SolverConvergenceMetricType" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "SolverConvergenceVisualizationMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SolverConvergenceVisualizationMode" - } - }, - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ThrottleAdjustTime", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TorqueDrawScale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Display", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UseCSGv2", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PhysicsSettings", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "PlaceAssetIdsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "PlaceStatsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "StartPlaySolo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StopPlaySolo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlacesService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "IsUserDataAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserDataAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetUserDataAsync", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "data", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlatformCloudStorageService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "IsInviteFriendsEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsProfileEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowInviteFriendsUI", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowProfile", - "Parameters": [ - { - "Name": "platformUserId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPartyMembers", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlatformFriendsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "RemoteRequireRequest", - "Parameters": [ - { - "Name": "libraryName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RemoteRequireResponse", - "Parameters": [ - { - "Name": "libraryName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "module", - "Type": { - "Category": "Class", - "Name": "ModuleScript" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlatformLibraries", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AccountAge", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AccountAgeReplicate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AppearanceDidLoad", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AutoJumpEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraFrustumRequested", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraMaxZoomDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraMinZoomDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CameraMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CanLoadCharacterAppearance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Character", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Model" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CharacterAppearance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotBrowsable", - "Deprecated", - { - "PreferredDescriptorName": "CharacterAppearanceId", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CharacterAppearanceId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ChararacterRegionId", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ChatAvailabilityStatus", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ChatMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ChatMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ChatPrivacyMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ChatPrivacyMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CloudEditCameraCoordinateFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CloudEditPlayerActive", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CountryRegionCodeReplicate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DataComplexity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DataComplexityLimit", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DataReady", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DevCameraOcclusionMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevCameraOcclusionMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DevComputerCameraMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevComputerCameraMovementMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DevComputerMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevComputerMovementMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DevEnableMouseLock", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DevTouchCameraMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevTouchCameraMovementMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DevTouchMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevTouchMovementMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DisplayName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "FollowUserId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "FollowUserIdReplicated", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "GameplayPaused", - "Security": { - "Read": "None", - "Write": "NotAccessibleSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Guest", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HasVerifiedBadge", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HealthDisplayDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "InternalCharacterAppearanceLoaded", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LocaleId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MaxSimulationRadius", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MaximumSimulationRadius", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MembershipType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MembershipType" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MembershipTypeReplicate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MembershipType" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "NameDisplayDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "NeedRegionalFallback", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Team", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Neutral", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OsPlatform", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PartyId", - "Security": { - "Read": "None", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PlatformName", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RawJoinData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ReplicationFocus", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RespawnLocation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "SpawnLocation" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "SimulationRadius", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "StepIdOffset", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "SuperSafeChatReplicate", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Team", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Team", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Team" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Team", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TeamColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Teleported", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TeleportedIn", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ThirdPartyTextChatRestrictionStatus", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ChatRestrictionStatus" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UnfilteredChat", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UserId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VRDevice", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VREnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "userId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "UserId", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "AddReplicationFocus", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "AddReplicationFocusPosition", - "Parameters": [ - { - "Name": "center", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "AddToBlockList", - "Parameters": [ - { - "Name": "userIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "ClearCharacterAppearance", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "DistanceFromCharacter", - "Parameters": [ - { - "Name": "point", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "PlayerData" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetFriendStatus", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "FriendStatus" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetGameSessionID", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetJoinData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input", - "Players" - ], - "MemberType": "Function", - "Name": "GetMouse", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Mouse" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetNetworkPing", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetUnder13", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "HasAppearanceLoaded", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "IsVerified", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Consequences" - ], - "MemberType": "Function", - "Name": "Kick", - "Parameters": [ - { - "Default": "", - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadBoolean", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "Players" - ], - "MemberType": "Function", - "Name": "LoadCharacterAppearance", - "Parameters": [ - { - "Name": "assetInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadInstance", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadNumber", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadString", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "Move", - "Parameters": [ - { - "Name": "walkDirection", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "false", - "Name": "relativeToCamera", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "OverrideStreamingRadii", - "Parameters": [ - { - "Name": "minRadius", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "targetRadius", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "PinStreamingForInstance", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "PinStreamingForInstanceByUniqueId", - "Parameters": [ - { - "Name": "uniqueIdString", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "RemoveCharacter", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "RemoveReplicationFocus", - "Parameters": [ - { - "Name": "part", - "Type": { - "Category": "Class", - "Name": "BasePart" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "RemoveReplicationFocusPosition", - "Parameters": [ - { - "Name": "center", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "RequestFriendship", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "RevokeFriendship", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SaveBoolean", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SaveData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SaveInstance", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SaveNumber", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SaveString", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetAccountAge", - "Parameters": [ - { - "Name": "accountAge", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetBlockListInitialized", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetCharacterAppearanceJson", - "Parameters": [ - { - "Name": "jsonBlob", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetChatTranslationSettingsLocaleId", - "Parameters": [ - { - "Name": "locale", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetExperienceSettingsLocaleId", - "Parameters": [ - { - "Name": "locale", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetMembershipType", - "Parameters": [ - { - "Name": "membershipType", - "Type": { - "Category": "Enum", - "Name": "MembershipType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetModerationAccessKey", - "Parameters": [ - { - "Name": "moderationAccessKey", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetSuperSafeChat", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetUnder13", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "UnpinStreamingForInstance", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "UpdatePlayerBlocked", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "blocked", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "loadBoolean", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "LoadBoolean", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "loadInstance", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "LoadInstance", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "loadNumber", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "LoadNumber", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "loadString", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "LoadString", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "saveBoolean", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SaveBoolean", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "saveInstance", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SaveInstance", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "saveNumber", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SaveNumber", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "saveString", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "SaveString", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetCanManageAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Function", - "Name": "GetFriendsOnline", - "Parameters": [ - { - "Default": "200", - "Name": "maxFriends", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetFriendsOnlineAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Function", - "Name": "GetFriendsOnlineAsync", - "Parameters": [ - { - "Default": "200", - "Name": "maxFriends", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Groups" - ], - "MemberType": "Function", - "Name": "GetRankInGroup", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetRankInGroupAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Groups" - ], - "MemberType": "Function", - "Name": "GetRankInGroupAsync", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Groups" - ], - "MemberType": "Function", - "Name": "GetRoleInGroup", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetRoleInGroupAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Groups" - ], - "MemberType": "Function", - "Name": "GetRoleInGroupAsync", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "IsBestFriendsWith", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Function", - "Name": "IsFriendsWith", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "IsFriendsWithAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Function", - "Name": "IsFriendsWithAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Groups" - ], - "MemberType": "Function", - "Name": "IsInGroup", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "IsInGroupAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Groups" - ], - "MemberType": "Function", - "Name": "IsInGroupAsync", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadCharacter", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "LoadCharacterAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadCharacterAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadCharacterBlocking", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadCharacterWithAvatarRules", - "Parameters": [ - { - "Name": "avatarRules", - "Type": { - "Category": "Class", - "Name": "AvatarRules" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadCharacterWithHumanoidDescription", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "LoadCharacterWithHumanoidDescriptionAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "LoadCharacterWithHumanoidDescriptionAsync", - "Parameters": [ - { - "Name": "humanoidDescription", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "PromptSecurityChallengeAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "RequestStreamAroundAsync", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "0", - "Name": "timeOut", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "WaitForDataReady", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "isFriendsWith", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "IsFriendsWith", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "waitForDataReady", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "WaitForDataReady", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "CharacterAdded", - "Parameters": [ - { - "Name": "character", - "Type": { - "Category": "Class", - "Name": "Model" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "CharacterAppearanceLoaded", - "Parameters": [ - { - "Name": "character", - "Type": { - "Category": "Class", - "Name": "Model" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "CharacterRemoving", - "Parameters": [ - { - "Name": "character", - "Type": { - "Category": "Class", - "Name": "Model" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat", - "Players" - ], - "MemberType": "Event", - "Name": "Chatted", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "recipient", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "CloudEditSelectionChanged", - "Parameters": [ - { - "Name": "newSelection", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "ConnectDiedSignalBackend", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "FriendStatusChanged", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "friendStatus", - "Type": { - "Category": "Enum", - "Name": "FriendStatus" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "Idled", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "InstancePinned", - "Parameters": [ - { - "Name": "uniqueIdString", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "InstanceUnpinned", - "Parameters": [ - { - "Name": "uniqueIdString", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "Kill", - "Parameters": [ - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "NotifyStreamingUnpinned", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Teleport" - ], - "MemberType": "Event", - "Name": "OnTeleport", - "Parameters": [ - { - "Name": "teleportState", - "Type": { - "Category": "Enum", - "Name": "TeleportState" - } - }, - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "spawnName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "OnTeleportInternal", - "Parameters": [ - { - "Name": "teleportState", - "Type": { - "Category": "Enum", - "Name": "TeleportState" - } - }, - { - "Name": "teleportInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "customLoadingScreen", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "OverrideStreamRadii", - "Parameters": [ - { - "Name": "minRadius", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "targetRadius", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerCharacterLoaded", - "Parameters": [ - { - "Name": "metrics", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerChatTranslationSettingsLocaleSetFromLua", - "Parameters": [ - { - "Name": "newLocaleId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerExperienceSettingsLocaleSetFromLua", - "Parameters": [ - { - "Name": "newLocaleId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "RemoteFriendRequestSignal", - "Parameters": [ - { - "Name": "otherUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "eventType", - "Type": { - "Category": "Enum", - "Name": "FriendRequestEvent" - } - } - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "RemoteInsert", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "RequestStreamingPin", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "RequestStreamingPinByUniqueId", - "Parameters": [ - { - "Name": "uniqueIdString", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "ScopeCheckInitiated", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "serializedScopes", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "ScriptSecurityError", - "Parameters": [ - { - "Name": "hash", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "error", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "stack", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "SendCameraFrustum", - "Parameters": [ - { - "Name": "pv", - "Type": { - "Category": "DataType", - "Name": "ReplicationPV" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "SendMaxClientBandwidthBps", - "Parameters": [ - { - "Name": "bandwidthBps", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "ServerToClientUnfilteredChatReplicate", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "ServerUpdatedHead", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Enum", - "Name": "AssetType" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "SetShutdownMessage", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "SimulationRadiusChanged", - "Parameters": [ - { - "Name": "radius", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "StatsAvailable", - "Parameters": [ - { - "Name": "info", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "StreamingPinComplete", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "UnpinStreaming", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "depth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Player", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetPlayer", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Player" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRecordAsync", - "Parameters": [ - { - "Default": "Default", - "Name": "recordName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "PlayerDataRecord" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerData", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CreatedTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "DefaultRecordName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Dirty", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "None", - "MemberType": "Property", - "Name": "Error", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PlayerDataErrorState" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "FlushedTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "LoadedTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "ModifiedTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "NewRecord", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Readable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "RecordName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Writable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "GetPlayer", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Player" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetValueChangedSignal", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReleaseAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RequestFlushAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Flushed", - "Parameters": [ - { - "Name": "flushState", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "error", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Loaded", - "Parameters": [ - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "error", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerDataRecord", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "RecordName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "GetDefaultValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetDefaultValue", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerDataRecordConfig", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "Failure", - "MemberType": "Property", - "Name": "LoadFailureBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PlayerDataLoadFailureBehavior" - } - }, - { - "MemberType": "Function", - "Name": "GetRecordConfig", - "Parameters": [ - { - "Default": "Default", - "Name": "recordName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "PlayerDataRecordConfig" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerDataService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "CustomPoliciesEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "EmulatedCountryCode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "EmulatedGameLocale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "PlayerEmulationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "PseudolocalizationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "SerializedEmulatedPolicyInfo", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Behavior", - "Default": "0", - "MemberType": "Property", - "Name": "TextElongationFactor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "GetEmulatedPolicyInfo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegionCodeWillHaveAutomaticNonCustomPolicies", - "Parameters": [ - { - "Name": "regionCode", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetEmulatedPolicyInfo", - "Parameters": [ - { - "Name": "emulatedPolicyInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerEmulatorService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "PlayerHydration", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "playerHydrationBlob", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerHydrationSignature", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerHydrationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "ClearComputerCameraMovementModes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input", - "Players" - ], - "MemberType": "Function", - "Name": "ClearComputerMovementModes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "ClearTouchCameraMovementModes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input", - "Players" - ], - "MemberType": "Function", - "Name": "ClearTouchMovementModes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetRegisteredComputerCameraMovementModes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetRegisteredComputerMovementModes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetRegisteredTouchCameraMovementModes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetRegisteredTouchMovementModes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "RegisterComputerCameraMovementMode", - "Parameters": [ - { - "Name": "cameraMovementMode", - "Type": { - "Category": "Enum", - "Name": "ComputerCameraMovementMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input", - "Players" - ], - "MemberType": "Function", - "Name": "RegisterComputerMovementMode", - "Parameters": [ - { - "Name": "movementMode", - "Type": { - "Category": "Enum", - "Name": "ComputerMovementMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "RegisterTouchCameraMovementMode", - "Parameters": [ - { - "Name": "cameraMovementMode", - "Type": { - "Category": "Enum", - "Name": "TouchCameraMovementMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input", - "Players" - ], - "MemberType": "Function", - "Name": "RegisterTouchMovementMode", - "Parameters": [ - { - "Name": "movementMode", - "Type": { - "Category": "Enum", - "Name": "TouchMovementMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "ComputerCameraMovementModeRegistered", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "ComputerMovementModeRegistered", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "TouchCameraMovementModeRegistered", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "TouchMovementModeRegistered", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerScripts", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "SensitiveInput" - ], - "MemberType": "Function", - "Name": "GetDeviceCameraCFrame", - "Parameters": [ - { - "Default": "nil", - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "SensitiveInput" - ], - "MemberType": "Function", - "Name": "GetDeviceCameraCFrameForSelfView", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "SensitiveInput" - ], - "MemberType": "Function", - "Name": "OnCameraCFrameReplicationRequest", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "SensitiveInput" - ], - "MemberType": "Function", - "Name": "UpdateDeviceCFrame", - "Parameters": [ - { - "Default": "nil", - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Default": "Identity", - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Default": "0", - "Name": "timestamp", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PlayerViewService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BanningEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat", - "Players" - ], - "Write": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "BubbleChat", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CharacterAutoLoads", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat", - "Players" - ], - "Write": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ClassicChat", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LocalPlayer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MaxPlayers", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MaxPlayersInternal", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "NumPlayers", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "GetPlayers", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PreferredPlayers", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PreferredPlayersInternal", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RespawnTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ServerGitHash", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ServerLogPrefix", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UseStrafingAnimations", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "localPlayer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "LocalPlayer", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "numPlayers", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "NumPlayers", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "Chat", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "CreateLocalPlayer", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Player" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetPlayerByUserId", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Player" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetPlayerFromCharacter", - "Parameters": [ - { - "Name": "character", - "Type": { - "Category": "Class", - "Name": "Model" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Player" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetPlayers", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "ReportAbuse", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "reason", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "optionalMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "ReportAbuseV3", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "jsonTags", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "ReportAvatarAbuse", - "Parameters": [ - { - "Name": "targetUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "tags", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "ReportChatAbuse", - "Parameters": [ - { - "Name": "eligibleChatLines", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "targetChatLines", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "tags", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "ResetLocalPlayer", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetChatStyle", - "Parameters": [ - { - "Default": "Classic", - "Name": "style", - "Type": { - "Category": "Enum", - "Name": "ChatStyle" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetLocalPlayerInfo", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "userName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "displayName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "membershipType", - "Type": { - "Category": "Enum", - "Name": "MembershipType" - } - }, - { - "Name": "isUnder13", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "TeamChat", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "WhisperChat", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "getPlayers", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPlayers", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "playerFromCharacter", - "Parameters": [ - { - "Name": "character", - "Type": { - "Category": "Class", - "Name": "Model" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Player" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPlayerFromCharacter", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "players", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetPlayers", - "ThreadSafety": "Safe" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Consequences" - ], - "MemberType": "Function", - "Name": "BanAsync", - "Parameters": [ - { - "Name": "config", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "Players" - ], - "MemberType": "Function", - "Name": "CreateHumanoidModelFromDescription", - "Parameters": [ - { - "Name": "description", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - }, - { - "Default": "Default", - "Name": "assetTypeVerification", - "Type": { - "Category": "Enum", - "Name": "AssetTypeVerification" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Model" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "CreateHumanoidModelFromDescriptionAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "Players" - ], - "MemberType": "Function", - "Name": "CreateHumanoidModelFromDescriptionAsync", - "Parameters": [ - { - "Name": "description", - "Type": { - "Category": "Class", - "Name": "HumanoidDescription" - } - }, - { - "Name": "rigType", - "Type": { - "Category": "Enum", - "Name": "HumanoidRigType" - } - }, - { - "Default": "Default", - "Name": "assetTypeVerification", - "Type": { - "Category": "Enum", - "Name": "AssetTypeVerification" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Model" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "CreateHumanoidModelFromUserId", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Model" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "CreateHumanoidModelFromUserIdAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "CreateHumanoidModelFromUserIdAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Model" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Consequences" - ], - "MemberType": "Function", - "Name": "GetBanHistoryAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "BanHistoryPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetCharacterAppearanceAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Model" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetCharacterAppearanceInfoAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Social" - ], - "MemberType": "Function", - "Name": "GetFriendsAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "FriendPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "Players" - ], - "MemberType": "Function", - "Name": "GetHumanoidDescriptionFromOutfitId", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetHumanoidDescriptionFromOutfitIdAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "Players" - ], - "MemberType": "Function", - "Name": "GetHumanoidDescriptionFromOutfitIdAsync", - "Parameters": [ - { - "Name": "outfitId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "Players" - ], - "MemberType": "Function", - "Name": "GetHumanoidDescriptionFromUserId", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "GetHumanoidDescriptionFromUserIdAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Avatar", - "Players" - ], - "MemberType": "Function", - "Name": "GetHumanoidDescriptionFromUserIdAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "HumanoidDescription" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetNameFromUserIdAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetUserIdFromNameAsync", - "Parameters": [ - { - "Name": "userName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetUserThumbnailAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "thumbnailType", - "Type": { - "Category": "Enum", - "Name": "ThumbnailType" - } - }, - { - "Name": "thumbnailSize", - "Type": { - "Category": "Enum", - "Name": "ThumbnailSize" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Consequences" - ], - "MemberType": "Function", - "Name": "UnbanAsync", - "Parameters": [ - { - "Name": "config", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "CloudEditApplyEditsMessage", - "Parameters": [ - { - "Name": "playerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "scriptName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "FriendRequestEvent", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "friendRequestEvent", - "Type": { - "Category": "Enum", - "Name": "FriendRequestEvent" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "GameAnnounce", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerAdded", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerChatted", - "Parameters": [ - { - "Name": "chatType", - "Type": { - "Category": "Enum", - "Name": "PlayerChatType" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "targetPlayer", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerConnecting", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerDisconnecting", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerMembershipChanged", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerRejoining", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerRemoving", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "reason", - "Type": { - "Category": "Enum", - "Name": "PlayerExitReason" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PromptGameServerAvatarReportEnrichment", - "Parameters": [ - { - "Name": "reportId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "targetUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PromptGameServerReportEnrichment", - "Parameters": [ - { - "Name": "reportId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PromptGameServerTargetedChatReportEnrichment", - "Parameters": [ - { - "Name": "reportId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eligibleChatLines", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "targetChatLines", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PromptReportServerEnrichmentAndScan", - "Parameters": [ - { - "Name": "v1comment", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "submitterId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "abuserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "reportId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "RequestCloudEditKick", - "Parameters": [ - { - "Name": "playerId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "RequestCloudEditShutdown", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "TeamCreateServerMessage", - "Parameters": [ - { - "Name": "messageType", - "Type": { - "Category": "Enum", - "Name": "MessageType" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "printToStatusBar", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players", - "Monetization" - ], - "MemberType": "Event", - "Name": "UserSubscriptionStatusChanged", - "Parameters": [ - { - "Name": "user", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "subscriptionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Players", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CollisionEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DisableUIDragDetectorDrags", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "GridSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HostDataModelType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "StudioDataModelType" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HostDataModelTypeIsCurrent", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsDebuggable", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MultipleDocumentInterfaceInstance", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "MultipleDocumentInterfaceInstance" - } - }, - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UsesAssetInsertionDrag", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "Activate", - "Parameters": [ - { - "Name": "exclusiveMouse", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreatePluginAction", - "Parameters": [ - { - "Name": "actionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "statusTip", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "iconName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "true", - "Name": "allowBinding", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "PluginAction" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreatePluginMenu", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "title", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "icon", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "PluginMenu" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateToolbar", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "PluginToolbar" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Deactivate", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetItem", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "defaultValue", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetJoinMode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "JointCreationMode" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMouse", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "PluginMouse" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPluginComponent", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSelectedRibbonTool", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "RibbonTool" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSetting", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStudioUserId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUri", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Intersect", - "Parameters": [ - { - "Name": "objects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Invoke", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsActivated", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsActivatedWithExclusiveMouse", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsLoadedFromProject", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Negate", - "Parameters": [ - { - "Name": "objects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OnInvoke", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OnInvokeSuspendOverride", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OnSetItem", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenScript", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - }, - { - "Default": "1", - "Name": "lineNumber", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenWikiPage", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PauseSound", - "Parameters": [ - { - "Name": "sound", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PlaySound", - "Parameters": [ - { - "Name": "sound", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "0", - "Name": "normalizedTimePosition", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResumeSound", - "Parameters": [ - { - "Name": "sound", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SaveSelectedToRoblox", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SelectRibbonTool", - "Parameters": [ - { - "Name": "tool", - "Type": { - "Category": "Enum", - "Name": "RibbonTool" - } - }, - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "UDim2" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Separate", - "Parameters": [ - { - "Name": "objects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetItem", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetReady", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetSetting", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartDecalDrag", - "Parameters": [ - { - "Name": "decal", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartDrag", - "Parameters": [ - { - "Name": "dragData", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StopAllSounds", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Union", - "Parameters": [ - { - "Name": "objects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateDockWidgetPluginGui", - "Parameters": [ - { - "Name": "pluginGuiId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "dockWidgetPluginGuiInfo", - "Type": { - "Category": "DataType", - "Name": "DockWidgetPluginGuiInfo" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DockWidgetPluginGui" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "CreateDockWidgetPluginGuiAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateDockWidgetPluginGuiAsync", - "Parameters": [ - { - "Name": "pluginGuiId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "dockWidgetPluginGuiInfo", - "Type": { - "Category": "DataType", - "Name": "DockWidgetPluginGuiInfo" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "DockWidgetPluginGui" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateQWidgetPluginGui", - "Parameters": [ - { - "Name": "pluginGuiId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "pluginGuiOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "QWidgetPluginGui" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ImportFbxAnimation", - "Parameters": [ - { - "Name": "rigModel", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "true", - "Name": "isR15", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "ImportFbxAnimationAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ImportFbxAnimationAsync", - "Parameters": [ - { - "Name": "rigModel", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "true", - "Name": "isR15", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ImportFbxRig", - "Parameters": [ - { - "Default": "true", - "Name": "isR15", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "ImportFbxRigAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ImportFbxRigAsync", - "Parameters": [ - { - "Default": "true", - "Name": "isR15", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptForExistingAssetId", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptForExistingAssetIdAsync", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptSaveSelection", - "Parameters": [ - { - "Default": "", - "Name": "suggestedFileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "PromptSaveSelectionAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptSaveSelectionAsync", - "Parameters": [ - { - "Default": "", - "Name": "suggestedFileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Deactivation", - "Parameters": [ - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Ready", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Unloading", - "Parameters": [ - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Callback", - "Name": "ProcessAssetInsertionDrag", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "assetTypeId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "NoYield" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Callback", - "Name": "ProcessAssetInsertionDrop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "NoYield" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Plugin", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ActionId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "AllowBinding", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Checked", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "DefaultShortcut", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "StatusTip", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Event", - "Name": "Triggered", - "Parameters": [ - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginAction", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "{\"Metadata\":{\"TargetDataModels\": [\"Edit\", \"Server\", \"Client\"]},\"Permissions\":{}}", - "MemberType": "Property", - "Name": "Manifest", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PluginCapabilities", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "PluginDebugService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Data", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MimeType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Sender", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PluginDragEvent", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "PluginGuiService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "SetAutoUpdate", - "Parameters": [ - { - "Name": "pluginId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "state", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetOTAPluginVersion", - "Parameters": [ - { - "Default": "", - "Name": "pluginName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginManagementService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CreatePlugin", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated", - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ExportPlace", - "Parameters": [ - { - "Default": "", - "Name": "filePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ExportSelection", - "Parameters": [ - { - "Default": "", - "Name": "filePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginManager", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CreatePlugin", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated", - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ExportPlace", - "Parameters": [ - { - "Default": "", - "Name": "filePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ExportSelection", - "Parameters": [ - { - "Default": "", - "Name": "filePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginManagerInterface", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Icon", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Title", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "AddAction", - "Parameters": [ - { - "Name": "action", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AddMenu", - "Parameters": [ - { - "Name": "menu", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AddNewAction", - "Parameters": [ - { - "Name": "actionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "icon", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AddSeparator", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Clear", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginMenu", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetPluginPolicy", - "Parameters": [ - { - "Name": "pluginName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginPolicyService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CreateButton", - "Parameters": [ - { - "Name": "buttonId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "tooltip", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "iconname", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "PluginToolbarButton" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreatePopupButton", - "Parameters": [ - { - "Name": "buttonId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "tooltip", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "iconname", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "PluginToolbarButton" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginToolbar", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ClickableWhenViewportHidden", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Icon", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "MemberType": "Function", - "Name": "SetActive", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetDropdownActive", - "Parameters": [ - { - "Name": "active", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Click", - "Parameters": [ - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DropdownClick", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PluginToolbarButton", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetAwardablePoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "AwardPoints", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "amount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetGamePointBalance", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetPointBalance", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "PointsAwarded", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "pointsAwarded", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "userBalanceInGame", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "userTotalBalance", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PointsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "Deprecated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "Unknown", - "MemberType": "Property", - "Name": "IsLuobuServer", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TriStateBoolean" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "Unknown", - "MemberType": "Property", - "Name": "LuobuWhitelisted", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TriStateBoolean" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "CanViewBrandProjectAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "brandProjectId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetPolicyInfoForPlayerAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetPolicyInfoForServerRobloxOnlyAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PolicyService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "EasingDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PoseEasingDirection" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "EasingStyle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PoseEasingStyle" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Weight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PoseBase", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "MemoryCategory": "Animation", - "Name": "NumberPose", - "Superclass": "PoseBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "CFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Animation" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MaskWeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "AddSubPose", - "Parameters": [ - { - "Name": "pose", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "GetSubPoses", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Animation" - ], - "MemberType": "Function", - "Name": "RemoveSubPose", - "Parameters": [ - { - "Name": "pose", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Animation", - "Name": "Pose", - "Superclass": "PoseBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PostEffect", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0.400000006", - "MemberType": "Property", - "Name": "Intensity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "24", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0.949999988", - "MemberType": "Property", - "Name": "Threshold", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BloomEffect", - "Superclass": "PostEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "24", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BlurEffect", - "Superclass": "PostEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "Brightness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "Contrast", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "Saturation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "TintColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ColorCorrectionEffect", - "Superclass": "PostEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "Default", - "MemberType": "Property", - "Name": "TonemapperPreset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TonemapperPreset" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ColorGradingEffect", - "Superclass": "PostEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0.75", - "MemberType": "Property", - "Name": "FarIntensity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0.0500000007", - "MemberType": "Property", - "Name": "FocusDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "10", - "MemberType": "Property", - "Name": "InFocusRadius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0.75", - "MemberType": "Property", - "Name": "NearIntensity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DepthOfFieldEffect", - "Superclass": "PostEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "0.25", - "MemberType": "Property", - "Name": "Intensity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Spread", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SunRaysEffect", - "Superclass": "PostEffect" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ProcessInstancePhysicsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "Interact", - "MemberType": "Property", - "Name": "ActionText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Localization", - "Default": "true", - "MemberType": "Property", - "Name": "AutoLocalize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "ClickablePrompt", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "OnePerButton", - "MemberType": "Property", - "Name": "Exclusivity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ProximityPromptExclusivity" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "ButtonX", - "MemberType": "Property", - "Name": "GamepadKeyCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "HoldDuration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "E", - "MemberType": "Property", - "Name": "KeyboardKeyCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "10", - "MemberType": "Property", - "Name": "MaxActivationDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MaxIndicatorDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ObjectText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "RequiresLineOfSight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Localization", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RootLocalizationTable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "LocalizationTable" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "Style", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ProximityPromptStyle" - } - }, - { - "Capabilities": { - "Read": [ - "UI", - "Input" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "UIOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Function", - "Name": "InputHoldBegin", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Function", - "Name": "InputHoldEnd", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "ButtonHoldBeganActionReplicated", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "ButtonHoldEndedActionReplicated", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "IndicatorHidden", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "IndicatorShown", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "PromptButtonHoldBegan", - "Parameters": [ - { - "Name": "playerWhoTriggered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "PromptButtonHoldEnded", - "Parameters": [ - { - "Name": "playerWhoTriggered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "PromptHidden", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "PromptShown", - "Parameters": [ - { - "Name": "inputType", - "Type": { - "Category": "Enum", - "Name": "ProximityPromptInputType" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "TriggerEnded", - "Parameters": [ - { - "Name": "playerWhoTriggered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "TriggerEndedActionReplicated", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "Triggered", - "Parameters": [ - { - "Name": "playerWhoTriggered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Input" - ], - "MemberType": "Event", - "Name": "TriggeredActionReplicated", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ProximityPrompt", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "16", - "MemberType": "Property", - "Name": "MaxIndicatorsVisible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "16", - "MemberType": "Property", - "Name": "MaxPromptsVisible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "IndicatorHidden", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Class", - "Name": "ProximityPrompt" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "IndicatorShown", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Class", - "Name": "ProximityPrompt" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "PromptButtonHoldBegan", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Class", - "Name": "ProximityPrompt" - } - }, - { - "Name": "playerWhoTriggered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "PromptButtonHoldEnded", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Class", - "Name": "ProximityPrompt" - } - }, - { - "Name": "playerWhoTriggered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "PromptHidden", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Class", - "Name": "ProximityPrompt" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "PromptShown", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Class", - "Name": "ProximityPrompt" - } - }, - { - "Name": "inputType", - "Type": { - "Category": "Enum", - "Name": "ProximityPromptInputType" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "PromptTriggerEnded", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Class", - "Name": "ProximityPrompt" - } - }, - { - "Name": "playerWhoTriggered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "PromptTriggered", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Class", - "Name": "ProximityPrompt" - } - }, - { - "Name": "playerWhoTriggered", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ProximityPromptService", - "Superclass": "Instance", - "Tags": [ - "Service", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "PublishDescendantAssets", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateAssetAndWaitForAssetId", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Name": "operationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "creatorType", - "Type": { - "Category": "Enum", - "Name": "AssetCreatorType" - } - }, - { - "Name": "creatorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "0", - "Name": "expectedPrice", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateAssetOrAssetVersionAndPollAssetWithTelemetryAsync", - "Parameters": [ - { - "Name": "serializedInstance", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "creatorType", - "Type": { - "Category": "Enum", - "Name": "AssetCreatorType" - } - }, - { - "Name": "creatorId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "token", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "contentType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "0", - "Name": "expectedPrice", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateAssetOrAssetVersionAndPollAssetWithTelemetryAsyncWithAddParam", - "Parameters": [ - { - "Name": "serializedInstance", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "publishInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateAssetOrAssetVersionAndPollAssetWithTelemetryAsyncWithAddParamErrorJson", - "Parameters": [ - { - "Name": "serializedInstance", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "publishInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PublishCageMeshAsync", - "Parameters": [ - { - "Name": "wrap", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "cageType", - "Type": { - "Category": "Enum", - "Name": "CageType" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "ContentId" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PublishDescendantAssetsAsync", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "PublishService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Control", - "Default": "false", - "MemberType": "Property", - "Name": "EnableFallbackAudioInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Control", - "Default": "", - "MemberType": "Property", - "Name": "SessionName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Control", - "Default": "None", - "MemberType": "Property", - "Name": "TrackerMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TrackerMode" - } - }, - { - "Category": "Control", - "Default": "Face", - "MemberType": "Property", - "Name": "TrackerType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TrackerType" - } - }, - { - "MemberType": "Function", - "Name": "Step", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TrackerError", - "Parameters": [ - { - "Name": "errorCode", - "Type": { - "Category": "Enum", - "Name": "TrackerError" - } - }, - { - "Name": "msg", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TrackerPrompt", - "Parameters": [ - { - "Name": "prompt", - "Type": { - "Category": "Enum", - "Name": "TrackerPromptEvent" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RTAnimationTracker", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "AddGlobalPointsField", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AddGlobalPointsTag", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DEPRECATED_TrackEvent", - "Parameters": [ - { - "Name": "category", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "action", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "label", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "0", - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DEPRECATED_TrackEventWithArgs", - "Parameters": [ - { - "Name": "category", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "action", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "label", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Default": "0", - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetClientId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPlaySessionId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSessionId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReleaseRBXEventStream", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveGlobalPointsField", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveGlobalPointsTag", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportCounter", - "Parameters": [ - { - "Name": "counterName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "1", - "Name": "amount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportInfluxSeries", - "Parameters": [ - { - "Name": "seriesName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "points", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "throttlingPercentage", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportStats", - "Parameters": [ - { - "Name": "category", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportToDiagByCountryCode", - "Parameters": [ - { - "Name": "featureName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "measureName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "seconds", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendEventDeferred", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventContext", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "additionalArgs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendEventImmediately", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventContext", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "additionalArgs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetRBXEvent", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventContext", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "additionalArgs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetRBXEventStream", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventContext", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "additionalArgs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TrackEvent", - "Parameters": [ - { - "Name": "category", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "action", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "label", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "0", - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TrackEventWithArgs", - "Parameters": [ - { - "Name": "category", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "action", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "label", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Default": "0", - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdateHeartbeatObject", - "Parameters": [ - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RbxAnalyticsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "LogActionEvent", - "Parameters": [ - { - "Name": "actionType", - "Type": { - "Category": "Enum", - "Name": "RecommendationActionType" - } - }, - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "tracingId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "actionEventDetails", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogImpressionEvent", - "Parameters": [ - { - "Name": "impressionType", - "Type": { - "Category": "Enum", - "Name": "RecommendationImpressionType" - } - }, - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "tracingId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "impressionEventDetails", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GenerateItemListAsync", - "Parameters": [ - { - "Name": "generateRecommendationItemListRequest", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "RecommendationPages" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRecommendationItemAsync", - "Parameters": [ - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterItemAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "registerRecommendationItemsRequest", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveItemAsync", - "Parameters": [ - { - "Name": "itemId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdateItemAsync", - "Parameters": [ - { - "Name": "updateRecommendationItemRequest", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RecommendationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadata", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataCallbacks", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataClasses", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataEnums", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataEvents", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataFunctions", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Browsable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ClassCategory", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ClientOnly", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Constraint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Deprecated", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "EditingDisabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "EditorType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FFlag", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsBackend", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PropertyOrder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ScriptContext", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ServerOnly", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SliderScaling", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UIMaximum", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UIMinimum", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Reflection", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UINumTicks", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataItem", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Category": "Reflection", - "Default": "0", - "MemberType": "Property", - "Name": "ExplorerImageIndex", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Reflection", - "Default": "2147483647", - "MemberType": "Property", - "Name": "ExplorerOrder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Reflection", - "Default": "true", - "MemberType": "Property", - "Name": "Insertable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Reflection", - "Default": "", - "MemberType": "Property", - "Name": "PreferredParent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Reflection", - "Default": "Always", - "MemberType": "Property", - "Name": "ServiceVisibility", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ServiceVisibility" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataClass", - "Superclass": "ReflectionMetadataItem" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataEnum", - "Superclass": "ReflectionMetadataItem" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataEnumItem", - "Superclass": "ReflectionMetadataItem" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataMember", - "Superclass": "ReflectionMetadataItem" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataProperties", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReflectionMetadataYieldFunctions", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetClass", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "filter", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary?" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetClasses", - "Parameters": [ - { - "Default": "nil", - "Name": "filter", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEventsOfClass", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "filter", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMethodsOfClass", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "filter", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPropertiesOfClass", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "filter", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPropertyNames", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStyledPropertyNames", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ReflectionService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ExecuteCommand", - "Parameters": [ - { - "Name": "code", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "ExecutedRemoteCommand" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteCommand" - ], - "MemberType": "Function", - "Name": "GetExecutingPlayer", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Player" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteCommand" - ], - "MemberType": "Function", - "Name": "GetReceivedUpdateSignal", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteCommand" - ], - "MemberType": "Function", - "Name": "GetStoppingSignal", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteCommand" - ], - "MemberType": "Function", - "Name": "SendUpdate", - "Parameters": [ - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ExecuteCommandAsync", - "Parameters": [ - { - "Name": "code", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CommandSentFromStudio", - "Parameters": [ - { - "Name": "commandId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "code", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OneshotCommandErrorFromRcc", - "Parameters": [ - { - "Name": "commandId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "error", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OneshotCommandResultFromRcc", - "Parameters": [ - { - "Name": "commandId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OneshotCommandSentFromStudio", - "Parameters": [ - { - "Name": "commandId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "code", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StandardOutMessageFromRcc", - "Parameters": [ - { - "Name": "messageType", - "Type": { - "Category": "Enum", - "Name": "MessageType" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StopSentFromStudio", - "Parameters": [ - { - "Name": "commandId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UpdateSentFromRcc", - "Parameters": [ - { - "Name": "commandId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UpdateSentFromStudio", - "Parameters": [ - { - "Name": "commandId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RemoteCommandService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "BroadcastRemoteCursorPositions", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "remoteCursorPosition", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RequestAllRemoteCursorPositionForScript", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UpdateClientRemoteCursorPosition", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "remoteCursorPosition", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RemoteCursorService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RemoteDebuggerServer", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Function", - "Name": "InvokeClient", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Function", - "Name": "InvokeServer", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "RemoteOnInvokeClient", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "RemoteOnInvokeError", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "RemoteOnInvokeServer", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Event", - "Name": "RemoteOnInvokeSuccess", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Callback", - "Name": "OnClientInvoke", - "Parameters": [ - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteEvent" - ], - "MemberType": "Callback", - "Name": "OnServerInvoke", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "arguments", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RemoteFunction", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Debug", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AutoFRMLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EagerBulkExecution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EditQualityLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "QualityLevel" - } - }, - { - "Category": "Debug", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableFRM", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "General", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable VR Mode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "General", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ExportMergeByMaterial", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "General", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "FrameRateManager", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FramerateManagerMode" - } - }, - { - "Category": "General", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "GraphicsMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "GraphicsMode" - } - }, - { - "Category": "Cache", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MeshCacheSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Debug", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MeshPartDetailLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MeshPartDetailLevel" - } - }, - { - "Category": "Performance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "QualityLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "QualityLevel" - } - }, - { - "Category": "Debug", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ReloadAssets", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Debug", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RenderCSGTrianglesDebug", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Debug", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowBoundingBoxes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Debug", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ViewMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ViewMode" - } - }, - { - "MemberType": "Function", - "Name": "GetMaxQualityLevel", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RenderSettings", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Category": "RenderingTest", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "CFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "RenderingTest", - "Default": "10", - "MemberType": "Property", - "Name": "ComparisonDiffThreshold", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "RenderingTest", - "Default": "psnr", - "MemberType": "Property", - "Name": "ComparisonMethod", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RenderingTestComparisonMethod" - } - }, - { - "Category": "RenderingTest", - "Default": "50", - "MemberType": "Property", - "Name": "ComparisonPsnrThreshold", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "RenderingTest", - "Default": "", - "MemberType": "Property", - "Name": "Description", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "RenderingTest", - "Default": "70", - "MemberType": "Property", - "Name": "FieldOfView", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "RenderingTest", - "Default": "-0, 0, 0", - "MemberType": "Property", - "Name": "Orientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "RenderingTest", - "Default": "false", - "MemberType": "Property", - "Name": "PerfTest", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "RenderingTest", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Category": "RenderingTest", - "Default": "false", - "MemberType": "Property", - "Name": "QualityAuto", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "RenderingTest", - "Default": "21", - "MemberType": "Property", - "Name": "QualityLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "RenderingTest", - "Default": "20", - "MemberType": "Property", - "Name": "RenderingTestFrameCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "RenderingTest", - "Default": "false", - "MemberType": "Property", - "Name": "ShouldSkip", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "RenderingTest", - "Default": "", - "MemberType": "Property", - "Name": "Ticket", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "RenderingTest", - "Default": "30", - "MemberType": "Property", - "Name": "Timeout", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "RenderdocTriggerCapture", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RenderingTest", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "IsDefaultLoadingGuiRemoved", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsFinishedReplicating", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveDefaultLoadingScreen", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetDefaultLoadingGuiRemoved", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DefaultLoadingGuiRemoved", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "FinishedReplicating", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RemoveDefaultLoadingGuiSignal", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ReplicatedFirst", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ReplicatedStorage", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "OnNotificationUpdateFromPlugin", - "Parameters": [ - { - "Name": "newNotificationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "seenNotificationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AllNotificationsReadFromRibbon", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "NewNotificationFromRibbon", - "Parameters": [ - { - "Name": "newNotificationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "NotificationReadFromRibbon", - "Parameters": [ - { - "Name": "newNotificationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ToggleNotificationTray", - "Parameters": [ - { - "Name": "checked", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "newNotificationAvailable", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RibbonNotificationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RobloxPluginGuiService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RobloxReplicatedStorage", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Data", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - } - ], - "MemoryCategory": "Instances", - "Name": "RobloxSerializableInstance", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RobloxServerStorage", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "AdditionalFluffOne", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "AdditionalFluffThree", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "AdditionalFluffTwo", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CreationVersion", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "FirstBinaryExpectedValue", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "FirstBinaryString", - "Security": { - "Read": "RobloxSecurity", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FirstSharedExpectedValue", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FirstSharedString", - "Security": { - "Read": "RobloxSecurity", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "SecondBinaryExpectedValue", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "SecondBinaryString", - "Security": { - "Read": "RobloxSecurity", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SecondSharedExpectedValue", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SecondSharedString", - "Security": { - "Read": "RobloxSecurity", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ThirdBinaryExpectedValue", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ThirdBinaryString", - "Security": { - "Read": "RobloxSecurity", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ThirdSharedExpectedValue", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ThirdSharedString", - "Security": { - "Read": "RobloxSecurity", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "SharedString" - } - } - ], - "MemoryCategory": "Instances", - "Name": "RolloutValidation", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RolloutValidationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RomarkRbxAnalyticsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "EndRemoteRomarkTest", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RomarkEndOfTest", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RomarkService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Length", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "\u0001", - "MemberType": "Property", - "Name": "ValuesAndTimes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetKeyAtIndex", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RotationCurveKey" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetKeyIndicesAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetKeys", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetValueAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CoordinateFrame?" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "InsertKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "DataType", - "Name": "RotationCurveKey" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RemoveKeyAtIndex", - "Parameters": [ - { - "Name": "startingIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "1", - "Name": "count", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetKeys", - "Parameters": [ - { - "Name": "keys", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RotationCurve", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RtMessagingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ClientGitHash", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic", - "InternalTest" - ], - "Write": [ - "InternalTest" - ] - }, - "Category": "Server Authority", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrameNumber", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RunState", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RunState" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "BindToRenderStep", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "BindToSimulation", - "Parameters": [ - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Default": "Hz60", - "Name": "frequency", - "Type": { - "Category": "Enum", - "Name": "StepFrequency" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetControlAndVariantRolloutFlags", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetCoreScriptVersion", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetPredictionStatus", - "Parameters": [ - { - "Name": "context", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "PredictionStatus" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetRobloxClientChannel", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetRobloxGuiFocused", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetRobloxVersion", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetTotalScriptPlusExecutionTime", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "IsClient", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "IsEdit", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "IsRunMode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "IsRunning", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "IsServer", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "IsStudio", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Pause", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Reset", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Run", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Set3dRenderingEnabled", - "Parameters": [ - { - "Name": "enable", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetPredictionMode", - "Parameters": [ - { - "Name": "context", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "mode", - "Type": { - "Category": "Enum", - "Name": "PredictionMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetRobloxGuiFocused", - "Parameters": [ - { - "Name": "focus", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Stop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "UnbindFromRenderStep", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "getThrottleFramerateEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "setThrottleFramerateEnabled", - "Parameters": [ - { - "Name": "enable", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "Heartbeat", - "Parameters": [ - { - "Name": "deltaTime", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic", - "InternalTest" - ], - "MemberType": "Event", - "Name": "Misprediction", - "Parameters": [ - { - "Name": "remoteWorldStepId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "mispredictedInstances", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "PostSimulation", - "Parameters": [ - { - "Name": "deltaTimeSim", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "PreAnimation", - "Parameters": [ - { - "Name": "deltaTimeSim", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "PreRender", - "Parameters": [ - { - "Name": "deltaTimeRender", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "PreSimulation", - "Parameters": [ - { - "Name": "deltaTimeSim", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "RenderStepped", - "Parameters": [ - { - "Name": "deltaTime", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "RobloxGuiFocusedChanged", - "Parameters": [ - { - "Name": "isRobloxGuiFocused", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "Stepped", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Name": "deltaTime", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RunService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "RuntimeContentFail", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RuntimeContentLRCleanup", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "priorityList", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RuntimeContentQuery", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "expectedType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "priorityList", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RuntimeContentShare", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "content", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RuntimeContentService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RuntimeScriptService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsCaptureModeForReport", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "DecodeAvatarMovementProto", - "Parameters": [ - { - "Name": "avatarMovementProtoString", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportMenuTabClose", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportMenuTabOpen", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TakeScreenshot", - "Parameters": [ - { - "Name": "screenshotOptions", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "FSTriggeredSignal", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "playerId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "mac", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScreenshotContentReady", - "Parameters": [ - { - "Name": "screenshotJobId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "contentId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScreenshotUploaded", - "Parameters": [ - { - "Name": "screenshotJobId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "screenshotId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SafetyService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CameraButtonIcon", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CameraButtonPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CloseButtonPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CloseWhenScreenshotTaken", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ExperienceNameOverlayEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HideCoreGuiForCaptures", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HidePlayerGuiForCaptures", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "OverlayFont", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UsernameOverlayEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Visible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ScreenshotHud", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ScriptBuilder", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "CoreScript", - "MemberType": "Property", - "Name": "CompileTarget", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CompileTarget" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "CoverageInfo", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "DebugInfo", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "PackAsSource", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "RawBytecode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "CompileTarget", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SyncScriptBuilder", - "Superclass": "ScriptBuilder", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "ScriptAdded", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptBeingRemoved", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptChanged", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - }, - { - "Name": "property", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptFullNameChanged", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptSourceChanged", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ScriptChangeService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ScriptCloneWatcher", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ScriptCloneWatcherHelper", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ScriptCommitService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "ScriptsDisabled", - "Security": { - "Read": "LocalUserSecurity", - "Write": "LocalUserSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "AddCoreScriptLocal", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "parent", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CompressLuaApp", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCoverageStats", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetLuauHeapInstanceReferenceReport", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetLuauHeapMemoryReport", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportLuaRequireCount", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetTimeout", - "Parameters": [ - { - "Name": "seconds", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Error", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "stackTrace", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ErrorDetailed", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "stackTrace", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "details", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "securityLevel", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "messageId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ScriptContext", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "CoreScriptIdentifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "CurrentLine", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsDebugging", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsPaused", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Script", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ScriptGuid", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "AddWatch", - "Parameters": [ - { - "Name": "expression", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBreakpoints", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetGlobals", - "Parameters": [ - { - "Default": "0", - "Name": "stackFrame", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Map" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetLocals", - "Parameters": [ - { - "Default": "0", - "Name": "stackFrame", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Map" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStack", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUpvalues", - "Parameters": [ - { - "Default": "0", - "Name": "stackFrame", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Map" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetWatchValue", - "Parameters": [ - { - "Name": "watch", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetWatches", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetBreakpoint", - "Parameters": [ - { - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "isContextDependentBreakpoint", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetGlobal", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "stackFrame", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetLocal", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "0", - "Name": "stackFrame", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetUpvalue", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "0", - "Name": "stackFrame", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BreakpointAdded", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "BreakpointRemoved", - "Parameters": [ - { - "Name": "breakpoint", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "EncounteredBreak", - "Parameters": [ - { - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "breakReason", - "Type": { - "Category": "Enum", - "Name": "BreakReason" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Resuming", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "WatchAdded", - "Parameters": [ - { - "Name": "watch", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "WatchRemoved", - "Parameters": [ - { - "Name": "watch", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ScriptDebugger", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetInternalUri", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetLine", - "Parameters": [ - { - "Default": "nil", - "Name": "lineIndex", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetLineCount", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetScript", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "LuaSourceContainer" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSelectedText", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSelection", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSelectionEnd", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSelectionStart", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetText", - "Parameters": [ - { - "Default": "nil", - "Name": "startLine", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - }, - { - "Default": "nil", - "Name": "startCharacter", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - }, - { - "Default": "nil", - "Name": "endLine", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - }, - { - "Default": "nil", - "Name": "endCharacter", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetViewport", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HasSelectedText", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsCommandBar", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CloseAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "EditTextAsync", - "Parameters": [ - { - "Name": "newText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "startLine", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "startCharacter", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "endLine", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "endCharacter", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ForceSetSelectionAsync", - "Parameters": [ - { - "Name": "cursorLine", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "cursorCharacter", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "nil", - "Name": "anchorLine", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - }, - { - "Default": "nil", - "Name": "anchorCharacter", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "MultiEditTextAsync", - "Parameters": [ - { - "Name": "edits", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RequestSetSelectionAsync", - "Parameters": [ - { - "Name": "cursorLine", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "cursorCharacter", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "nil", - "Name": "anchorLine", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - }, - { - "Default": "nil", - "Name": "anchorCharacter", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SelectionChanged", - "Parameters": [ - { - "Name": "positionLine", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "positionCharacter", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "anchorLine", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "anchorCharacter", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ViewportChanged", - "Parameters": [ - { - "Name": "startLine", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "endLine", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ScriptDocument", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "DeregisterAutocompleteCallback", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DeregisterScriptAnalysisCallback", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FindScriptDocument", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "ScriptDocument" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ForceReloadSource", - "Parameters": [ - { - "Name": "uri", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newsrc", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditorSource", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetScriptDocuments", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsAutocompleteCallbackRegistered", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsScriptAnalysisCallbackRegistered", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterAutocompleteCallback", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "callbackFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterScriptAnalysisCallback", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "callbackFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StripComments", - "Parameters": [ - { - "Name": "code", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "EditSourceAsyncWithRanges", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - }, - { - "Name": "newText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "startLine", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "startCharacter", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "endLine", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "endCharacter", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenScriptDocumentAsync", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdateSourceAsync", - "Parameters": [ - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "LuaSourceContainer" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TextDocumentDidChange", - "Parameters": [ - { - "Name": "document", - "Type": { - "Category": "Class", - "Name": "ScriptDocument" - } - }, - { - "Name": "changesArray", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TextDocumentDidClose", - "Parameters": [ - { - "Name": "oldDocument", - "Type": { - "Category": "Class", - "Name": "ScriptDocument" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TextDocumentDidOpen", - "Parameters": [ - { - "Name": "newDocument", - "Type": { - "Category": "Class", - "Name": "ScriptDocument" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ScriptEditorService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ClientRequestData", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ClientStart", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "frequency", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ClientStop", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DeserializeJSON", - "Parameters": [ - { - "Name": "jsonString", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "PluginSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SaveScriptProfilingData", - "Parameters": [ - { - "Name": "jsonString", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "filename", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ServerRequestData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ServerStart", - "Parameters": [ - { - "Name": "frequency", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ServerStop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnNewData", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "jsonString", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RequestData", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SetProfilingState", - "Parameters": [ - { - "Name": "start", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "frequency", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ScriptProfilerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetSourceContainerByScriptGuid", - "Parameters": [ - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "LuaSourceContainer" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ScriptRegistrationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ScriptRuntime", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ScriptService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ActiveInstance", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RenderMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SelectionRenderMode" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionBoxThickness", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionLineThickness", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SelectionThickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ShowActiveInstanceHighlight", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "Add", - "Parameters": [ - { - "Name": "instancesToAdd", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AddFocusCallback", - "Parameters": [ - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ClearTerrainSelectionHack", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Get", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Remove", - "Parameters": [ - { - "Name": "instancesToRemove", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Set", - "Parameters": [ - { - "Name": "selection", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetTerrainSelectionHack", - "Parameters": [ - { - "Name": "center", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SelectionChanged", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SelectionChangedThisFrame", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Selection", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "SelectionHighlightManager", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Settings", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UpdateType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SensorUpdateType" - } - }, - { - "MemberType": "Function", - "Name": "Sense", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnSensorOutputChanged", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SensorBase", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "0", - "MemberType": "Property", - "Name": "AirDensity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "RelativeWindVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "MemoryCategory": "Instances", - "Name": "AtmosphereSensor", - "Superclass": "SensorBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "false", - "MemberType": "Property", - "Name": "FullySubmerged", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "false", - "MemberType": "Property", - "Name": "TouchingSurface", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BuoyancySensor", - "Superclass": "SensorBase" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ControllerSensor", - "Superclass": "SensorBase", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "HitFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "HitNormal", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Input", - "Default": "0", - "MemberType": "Property", - "Name": "SearchDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SensedPart", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Input", - "Default": "Floor", - "MemberType": "Property", - "Name": "SensorMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SensorMode" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ControllerPartSensor", - "Superclass": "ControllerSensor" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "CenterOfPressure", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Force", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Output", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Torque", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "EvaluateAsync", - "Parameters": [ - { - "Name": "linearVelocity", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "angularVelocity", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "FluidForceSensor", - "Superclass": "SensorBase" - }, - { - "Members": [ - { - "Capabilities": [ - "PluginOrOpenCloud" - ], - "MemberType": "Function", - "Name": "DeserializeInstancesAsync", - "Parameters": [ - { - "Name": "buffer", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "PluginOrOpenCloud" - ], - "MemberType": "Function", - "Name": "SerializeInstancesAsync", - "Parameters": [ - { - "Name": "inputInstances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "buffer" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SerializationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "LoadStringEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ServerScriptService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ServerStorage", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "FindService", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "MemberType": "Function", - "Name": "GetService", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getService", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetService", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "service", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetService", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Close", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CloseLate", - "Parameters": [ - ], - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ServiceAdded", - "Parameters": [ - { - "Name": "service", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ServiceRemoving", - "Parameters": [ - { - "Name": "service", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ServiceProvider", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CreatorId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CreatorType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CreatorType" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Environment", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ForceR15", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "GameAvatarType", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "GameAvatarType" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "GameId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "GearGenreSetting", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "GearGenreSetting" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Genre", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Genre" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "IsSFFlagsLoaded", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "JobInfo", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "JobId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MatchmakingType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MatchmakingType" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PlaceId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PlaceVersion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PrivateServerId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PrivateServerOwnerId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "R15CollisionType", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "R15CollisionType" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RunService", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VIPServerId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "PrivateServerId", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VIPServerOwnerId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "PrivateServerOwnerId", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Workspace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Workspace" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "lighting", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "workspace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "Workspace", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Workspace" - } - }, - { - "MemberType": "Function", - "Name": "BindToClose", - "Parameters": [ - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DefineFastFlag", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "defaultValue", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DefineFastInt", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "defaultValue", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DefineFastString", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "defaultValue", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEngineFeature", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFastFlag", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFastInt", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFastString", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetJobsInfo", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMessage", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPlaySessionId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRemoteBuildMode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsContentLoaded", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsGearTypeAllowed", - "Parameters": [ - { - "Name": "gearType", - "Type": { - "Category": "Enum", - "Name": "GearType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsLoaded", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsUniverseMetadataLoaded", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Load", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenLogsFolder", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenScreenshotsFolder", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenVideosFolder", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportInGoogleAnalytics", - "Parameters": [ - { - "Name": "category", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "custom", - "Name": "action", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "none", - "Name": "label", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "0", - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetFlagVersion", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "version", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetIsLoaded", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "placeSizeInBytes", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Shutdown", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getGameTime", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetObjects", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetObjectsAllOrNone", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Default": "false", - "Name": "binaryFormatOnly", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetObjectsList", - "Parameters": [ - { - "Name": "urls", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPlaceId", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetUniverseId", - "Parameters": [ - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetFastFlagForTesting", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newValue", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetFastIntForTesting", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newValue", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetFastStringForTesting", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newValue", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HttpGetAsync", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "Default", - "Name": "httpRequestType", - "Type": { - "Category": "Enum", - "Name": "HttpRequestType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HttpPostAsync", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "*/*", - "Name": "contentType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "Default", - "Name": "httpRequestType", - "Type": { - "Category": "Enum", - "Name": "HttpRequestType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SavePlace", - "Parameters": [ - { - "Default": "SaveAll", - "Name": "saveFilter", - "Type": { - "Category": "Enum", - "Name": "SaveFilter" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetObjectsAsync", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InsertObjectsAndJoinIfLegacyAsync", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "AllowedGearTypeChanged", - "Parameters": [ - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "GraphicsQualityChangeRequest", - "Parameters": [ - { - "Name": "betterQuality", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ItemChanged", - "Parameters": [ - { - "Name": "object", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "descriptor", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Loaded", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScreenshotReady", - "Parameters": [ - { - "Name": "path", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScreenshotSavedToAlbum", - "Parameters": [ - { - "Name": "filename", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UniverseMetadataLoaded", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Callback", - "Name": "OnClose", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "BindToClose", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DataModel", - "Superclass": "ServiceProvider", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "GenericSettings", - "Superclass": "ServiceProvider", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetFFlag", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFFlagOverrides", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFFlags", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFVariable", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetFFlagOverrides", - "Parameters": [ - { - "Name": "overrides", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "GlobalSettings", - "Superclass": "GenericSettings", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "IsUserFeatureEnabled", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "Reset", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SaveState", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UserSettings", - "Superclass": "GenericSettings", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "HiddenServices", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "VisibleServices", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "MemberType": "Function", - "Name": "SetServiceVisibilityPreference", - "Parameters": [ - { - "Name": "service", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "visible", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ServiceVisibilityChanged", - "Parameters": [ - { - "Name": "serviceName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ServiceVisibilityService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "SessionCheckService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "AcquireContextFocus", - "Parameters": [ - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GenerateSessionInfoString", - "Parameters": [ - { - "Name": "includeArbitrarySessions", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "includeTag", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "includeTimestamps", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "includeMetadata", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCreatedTimestampUtcMs", - "Parameters": [ - { - "Name": "sid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMetadata", - "Parameters": [ - { - "Name": "sid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetRootSID", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSessionID", - "Parameters": [ - { - "Name": "structuralId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSessionTag", - "Parameters": [ - { - "Name": "sid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsContextFocused", - "Parameters": [ - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReleaseContextFocus", - "Parameters": [ - { - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveMetadata", - "Parameters": [ - { - "Name": "sid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveSession", - "Parameters": [ - { - "Name": "sid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RemoveSessionsWithMetadataKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReplaceSession", - "Parameters": [ - { - "Name": "sid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SessionExists", - "Parameters": [ - { - "Name": "sid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetMetadata", - "Parameters": [ - { - "Name": "sid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "", - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetSession", - "Parameters": [ - { - "Name": "parentSid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "childSid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "context", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SessionService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "ScriptGlobals" - ], - "MemberType": "Function", - "Name": "GetSharedTable", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "SharedTable" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "ScriptGlobals" - ], - "MemberType": "Function", - "Name": "SetSharedTable", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "st", - "Type": { - "Category": "DataType", - "Name": "SharedTable?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Safe" - } - ], - "MemoryCategory": "Instances", - "Name": "SharedTableRegistry", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "true", - "MemberType": "Property", - "Name": "CelestialBodiesShown", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "11", - "MemberType": "Property", - "Name": "MoonAngularSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MoonTextureContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "rbxasset://sky/moon.jpg", - "MemberType": "Property", - "Name": "MoonTextureId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SkyboxBackContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "rbxasset://textures/sky/sky512_bk.tex", - "MemberType": "Property", - "Name": "SkyboxBk", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "rbxasset://textures/sky/sky512_dn.tex", - "MemberType": "Property", - "Name": "SkyboxDn", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SkyboxDownContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SkyboxFrontContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "rbxasset://textures/sky/sky512_ft.tex", - "MemberType": "Property", - "Name": "SkyboxFt", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SkyboxLeftContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "rbxasset://textures/sky/sky512_lf.tex", - "MemberType": "Property", - "Name": "SkyboxLf", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "SkyboxOrientation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SkyboxRightContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "rbxasset://textures/sky/sky512_rt.tex", - "MemberType": "Property", - "Name": "SkyboxRt", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "rbxasset://textures/sky/sky512_up.tex", - "MemberType": "Property", - "Name": "SkyboxUp", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SkyboxUpContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "3000", - "MemberType": "Property", - "Name": "StarCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "21", - "MemberType": "Property", - "Name": "SunAngularSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SunTextureContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "rbxasset://sky/sun.jpg", - "MemberType": "Property", - "Name": "SunTextureId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Sky", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "EntitySource", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "Handle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsSlimEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "NumBones", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone10", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone11", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone12", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone13", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone14", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone15", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone16", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone17", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone18", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone19", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone20", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone21", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone22", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone23", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone24", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone25", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone26", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone27", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone28", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone29", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone30", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone31", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone4", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone5", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone6", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone7", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone8", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "SlimBone9", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "SlimReplicationTimestampSec", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SlimAnimationDataEntity", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "SlimAnimationReplicationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "SlimReplicationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "SlimService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "LocalTransparencyModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0.5", - "MemberType": "Property", - "Name": "Opacity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "RiseVelocity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Size", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "TimeScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0.5", - "MemberType": "Property", - "Name": "opacity_xml", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "riseVelocity_xml", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "size_xml", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FastForward", - "Parameters": [ - { - "Name": "numFrames", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Smoke", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Cancel", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Start", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Status", - "Parameters": [ - { - "Name": "progressRatio", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SmoothVoxelsUpgraderService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "SnippetService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "GetPlayersByPartyId", - "Parameters": [ - { - "Name": "partyId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "HideSelfView", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "InvokeGameInvitePromptClosed", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "recipientIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "InvokeIrisInvite", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "irisParticipants", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "InvokeIrisInvitePromptClosed", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "InvokeShareSheetClosed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "PromptGameInvite", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "nil", - "Name": "experienceInviteOptions", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "PromptPhoneBook", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "PromptRsvpToEventCompleted", - "Parameters": [ - { - "Name": "eventId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "rsvpStatus", - "Type": { - "Category": "Enum", - "Name": "RsvpStatus" - } - }, - { - "Default": "None", - "Name": "previousRsvpStatus", - "Type": { - "Category": "Enum", - "Name": "RsvpStatus" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "ShowSelfView", - "Parameters": [ - { - "Default": "LastPosition", - "Name": "selfViewPosition", - "Type": { - "Category": "Enum", - "Name": "SelfViewPosition" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "SignalFeedbackSubmissionCompleted", - "Parameters": [ - { - "Name": "feedback", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "SignalFeedbackSubmissionPermissionDenied", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "UpdatePlayerPartyData", - "Parameters": [ - { - "Name": "partyId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "CanSendCallInviteAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "CanSendGameInviteAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "0", - "Name": "recipientId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "GetEventRsvpStatusAsync", - "Parameters": [ - { - "Name": "eventId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "RsvpStatus" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "GetExperienceEventAsync", - "Parameters": [ - { - "Name": "eventId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary?" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "GetPartyAsync", - "Parameters": [ - { - "Name": "partyId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "GetUpcomingExperienceEventsAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "PromptFeedbackSubmissionAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "PromptLinkSharing", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "PromptLinkSharingAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "PromptLinkSharingAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Default": "nil", - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Function", - "Name": "PromptRsvpToEventAsync", - "Parameters": [ - { - "Name": "eventId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "RsvpStatus" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "CallInviteStateChanged", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "inviteState", - "Type": { - "Category": "Enum", - "Name": "InviteState" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "GameInvitePromptClosed", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "recipientIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "IrisInviteInitiated", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "OpenShareSheetWithLink", - "Parameters": [ - { - "Name": "link", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "PhoneBookPromptClosed", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "PlayerPartyDataChanged", - "Parameters": [ - { - "Name": "partyId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "PromptInviteRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "experienceInviteOptions", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "PromptIrisInviteRequested", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "SelfViewHidden", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "SelfViewVisible", - "Parameters": [ - { - "Name": "selfViewPosition", - "Type": { - "Category": "Enum", - "Name": "SelfViewPosition" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "ShareSheetClosed", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "ShowPromptFeedbackSubmission", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "ShowPromptFeedbackUnavailable", - "Parameters": [ - { - "Name": "reason", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Event", - "Name": "ShowPromptRsvpToEvent", - "Parameters": [ - { - "Name": "eventId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Social" - ], - "MemberType": "Callback", - "Name": "OnCallInviteInvoked", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "callParticipantIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SocialService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ], - "Write": [ - "LegacySound" - ] - }, - "Category": "Emitter", - "Default": "true", - "MemberType": "Property", - "Name": "AcousticSimulationEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Asset", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "AudioContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Asset", - "Default": "0", - "MemberType": "Property", - "Name": "ChannelCount", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "NotBrowsable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "10", - "MemberType": "Property", - "Name": "EmitterSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "RollOffMinDistance", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Asset", - "Default": "false", - "MemberType": "Property", - "Name": "IsLoaded", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsMutedForCapture", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "true", - "MemberType": "Property", - "Name": "IsPaused", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "IsSpatial", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Regions", - "Default": "0 60000 ", - "MemberType": "Property", - "Name": "LoopRegion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "Looped", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "10000", - "MemberType": "Property", - "Name": "MaxDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "RollOffMaxDistance", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "10", - "MemberType": "Property", - "Name": "MinDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "RollOffMinDistance", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "Pitch", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "PlaybackSpeed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "PlayOnRemove", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "0", - "MemberType": "Property", - "Name": "PlaybackLoudness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Regions", - "Default": "0 60000 ", - "MemberType": "Property", - "Name": "PlaybackRegion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "PlaybackRegionsEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "1", - "MemberType": "Property", - "Name": "PlaybackSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "Playing", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "PlayingReplicator", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "1", - "MemberType": "Property", - "Name": "RollOffGain", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Emitter", - "Default": "10000", - "MemberType": "Property", - "Name": "RollOffMaxDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Emitter", - "Default": "10", - "MemberType": "Property", - "Name": "RollOffMinDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Emitter", - "Default": "Inverse", - "MemberType": "Property", - "Name": "RollOffMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RollOffMode" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Routing", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SoundGroup", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "SoundGroup" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Asset", - "Default": "", - "MemberType": "Property", - "Name": "SoundId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Asset", - "Default": "0", - "MemberType": "Property", - "Name": "TimeLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "TimePositionReplicator", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Behavior", - "Default": "Default", - "MemberType": "Property", - "Name": "UsageContextPermission", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UsageContext" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Playback", - "Default": "0.5", - "MemberType": "Property", - "Name": "Volume", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "isPlaying", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "IsPlaying", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "10000", - "MemberType": "Property", - "Name": "xmlRead_MaxDistance_3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "Deprecated", - { - "PreferredDescriptorName": "RollOffMaxDistance", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "Data", - "Default": "10", - "MemberType": "Property", - "Name": "xmlRead_MinDistance_3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable", - "Deprecated", - { - "PreferredDescriptorName": "RollOffMinDistance", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Function", - "Name": "Pause", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Function", - "Name": "Play", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Function", - "Name": "Resume", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Function", - "Name": "Stop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Function", - "Name": "pause", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Pause", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Function", - "Name": "play", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Play", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Function", - "Name": "stop", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Stop", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "DidLoop", - "Parameters": [ - { - "Name": "soundId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "numOfTimesLooped", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "Ended", - "Parameters": [ - { - "Name": "soundId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "Loaded", - "Parameters": [ - { - "Name": "soundId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "Paused", - "Parameters": [ - { - "Name": "soundId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "Played", - "Parameters": [ - { - "Name": "soundId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "PlayingUpdatedFromClient", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "PlayingUpdatedFromServer", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "Resumed", - "Parameters": [ - { - "Name": "soundId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "Stopped", - "Parameters": [ - { - "Name": "soundId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "TimePositionUpdatedFromClient", - "Parameters": [ - { - "Name": "newPositionSeconds", - "Type": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Name": "lastLuaSetTimePosition", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "TimePositionUpdatedFromServer", - "Parameters": [ - { - "Name": "newPositionSeconds", - "Type": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Name": "lastLuaSetTimePosition", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "LegacySound" - ], - "MemberType": "Event", - "Name": "playbackActionSync", - "Parameters": [ - { - "Name": "action", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Internal", - "Name": "Sound", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Priority", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SoundEffect", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.150000006", - "MemberType": "Property", - "Name": "Depth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.5", - "MemberType": "Property", - "Name": "Mix", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.5", - "MemberType": "Property", - "Name": "Rate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ChorusSoundEffect", - "Superclass": "SoundEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.100000001", - "MemberType": "Property", - "Name": "Attack", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "GainMakeup", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "40", - "MemberType": "Property", - "Name": "Ratio", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.100000001", - "MemberType": "Property", - "Name": "Release", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SideChain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "-40", - "MemberType": "Property", - "Name": "Threshold", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "CompressorSoundEffect", - "Superclass": "SoundEffect" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "CustomSoundEffect", - "Superclass": "SoundEffect", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "AssetSoundEffect", - "Superclass": "CustomSoundEffect", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Channel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ChannelSelectorSoundEffect", - "Superclass": "CustomSoundEffect", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.75", - "MemberType": "Property", - "Name": "Level", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "DistortionSoundEffect", - "Superclass": "SoundEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Delay", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "DryLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.5", - "MemberType": "Property", - "Name": "Feedback", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "WetLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "EchoSoundEffect", - "Superclass": "SoundEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "HighGain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "-20", - "MemberType": "Property", - "Name": "LowGain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "-10", - "MemberType": "Property", - "Name": "MidGain", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "EqualizerSoundEffect", - "Superclass": "SoundEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.449999988", - "MemberType": "Property", - "Name": "Depth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.850000024", - "MemberType": "Property", - "Name": "Mix", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "5", - "MemberType": "Property", - "Name": "Rate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "FlangeSoundEffect", - "Superclass": "SoundEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "1.25", - "MemberType": "Property", - "Name": "Octave", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "PitchShiftSoundEffect", - "Superclass": "SoundEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "1.5", - "MemberType": "Property", - "Name": "DecayTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Density", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Diffusion", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "-6", - "MemberType": "Property", - "Name": "DryLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0", - "MemberType": "Property", - "Name": "WetLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ReverbSoundEffect", - "Superclass": "SoundEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Depth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.5", - "MemberType": "Property", - "Name": "Duty", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "5", - "MemberType": "Property", - "Name": "Frequency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TremoloSoundEffect", - "Superclass": "SoundEffect" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "LegacySound" - ] - }, - "Category": "State", - "Default": "0.5", - "MemberType": "Property", - "Name": "Volume", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Internal", - "Name": "SoundGroup", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio" - ], - "Write": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "AcousticSimulationEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ], - "Write": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "NoReverb", - "MemberType": "Property", - "Name": "AmbientReverb", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ReverbType" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "AudioApiByDefault", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "CharacterSoundsUseNewApi", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "DefaultListenerLocation", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ListenerLocation" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ], - "Write": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "3.32999992", - "MemberType": "Property", - "Name": "DistanceFactor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ], - "Write": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "DopplerScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsNewExpForAudioApiByDefault", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ], - "Write": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "RespectFilteringEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ], - "Write": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "RolloffScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Audio" - ], - "Write": [ - "Audio" - ] - }, - "Category": "Data", - "Default": "Automatic", - "MemberType": "Property", - "Name": "VolumetricAudio", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VolumetricAudio" - } - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "BeginRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetAudioApiByDefault", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetAudioInstances", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputDevice", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetInputDevices", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetListener", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputDevice", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetOutputDevices", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetSoundMemoryData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "InsertAsset", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "assetName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "true", - "Name": "useSelection", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "OpenAttenuationCurveEditor", - "Parameters": [ - { - "Name": "selectedCurveObjects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "OpenDirectionalCurveEditor", - "Parameters": [ - { - "Name": "selectedCurveObjects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "PlayLocalSound", - "Parameters": [ - { - "Name": "sound", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetAudioApiByDefault", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetInputDevice", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetListener", - "Parameters": [ - { - "Name": "listenerType", - "Type": { - "Category": "Enum", - "Name": "ListenerType" - } - }, - { - "Name": "listener", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetOutputDevice", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetRecordingDevice", - "Parameters": [ - { - "Name": "deviceIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "SetSoundEnabled", - "Parameters": [ - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "EndRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Function", - "Name": "GetRecordingDevices", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "AudioInstanceAdded", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "ClientLoggedEvent", - "Parameters": [ - { - "Name": "sessionIdRaw", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "DeviceListChanged", - "Parameters": [ - { - "Name": "newDevices", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "OpenAttenuationCurveEditorSignal", - "Parameters": [ - { - "Name": "selectedCurveObjects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "OpenAudioCompressorEditorSignal", - "Parameters": [ - { - "Name": "selectedCompressorObjects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "OpenAudioEqualizerEditorSignal", - "Parameters": [ - { - "Name": "selectedEqualizerObjects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio" - ], - "MemberType": "Event", - "Name": "OpenDirectionalCurveEditorSignal", - "Parameters": [ - { - "Name": "selectedCurveObjects", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SoundService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "SoundShimService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "LocalTransparencyModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0.564706, 0.0980392, 1", - "MemberType": "Property", - "Name": "SparkleColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "TimeScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FastForward", - "Parameters": [ - { - "Name": "numFrames", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Sparkles", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "SpawnerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrameId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrameName", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrameType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DebuggerFrameType" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Globals", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "DebuggerVariable" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Line", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Locals", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "DebuggerVariable" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Populated", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Script", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Upvalues", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "DebuggerVariable" - } - } - ], - "MemoryCategory": "Instances", - "Name": "StackFrame", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "StandalonePluginScripts", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "generateTempUrlInContentProvider", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getDaysSinceFirstUserLogin", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getLocalGamesFromRegistry", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getRecentAPIGamesFromRegistry", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getTempUrlInContentProvider", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "isTutorialBannerClosed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "isTutorialPopupClosed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "openLink", - "Parameters": [ - { - "Name": "link", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "openLocalFile", - "Parameters": [ - { - "Name": "filePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "openPlace", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "launchTutorial", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "removeAPIGameFromRegistry", - "Parameters": [ - { - "Name": "gameId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "removeLocalFileFromRegistry", - "Parameters": [ - { - "Name": "fileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "setTutorialBannerClosed", - "Parameters": [ - { - "Name": "closed", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "setTutorialPopupClosed", - "Parameters": [ - { - "Name": "closed", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "shouldShowMacOSDeprecationWarning", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "shouldShowWinOSDeprecationWarning", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "startTutorial", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ImageImportedSignal", - "Parameters": [ - { - "Name": "urlImported", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "temporaryId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "LocalGamesFromRegistryUpdatedSignal", - "Parameters": [ - { - "Name": "localGames", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RecentApiGamesFromRegistryUpdatedSignal", - "Parameters": [ - { - "Name": "recentGames", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StartPageService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "StarterGear", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "StarterPack", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "true", - "MemberType": "Property", - "Name": "AllowCustomAnimations", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Mobile", - "Default": "true", - "MemberType": "Property", - "Name": "AutoJumpEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "Default", - "MemberType": "Property", - "Name": "AvatarJointUpgrade", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "Default", - "MemberType": "Property", - "Name": "AvatarJointUpgrade_SerializedRollout", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RolloutState" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "400", - "MemberType": "Property", - "Name": "CameraMaxZoomDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "0.5", - "MemberType": "Property", - "Name": "CameraMinZoomDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "Classic", - "MemberType": "Property", - "Name": "CameraMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CameraMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "true", - "MemberType": "Property", - "Name": "CharacterBreakJointsOnDeath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character Jump Settings", - "Default": "7.19999981", - "MemberType": "Property", - "Name": "CharacterJumpHeight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character Jump Settings", - "Default": "50", - "MemberType": "Property", - "Name": "CharacterJumpPower", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "89", - "MemberType": "Property", - "Name": "CharacterMaxSlopeAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character Jump Settings", - "Default": "true", - "MemberType": "Property", - "Name": "CharacterUseJumpPower", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "16", - "MemberType": "Property", - "Name": "CharacterWalkSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "true", - "MemberType": "Property", - "Name": "ClassicDeath", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Controls", - "Default": "true", - "MemberType": "Property", - "Name": "CreateDefaultPlayerModule", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "Zoom", - "MemberType": "Property", - "Name": "DevCameraOcclusionMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevCameraOcclusionMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "UserChoice", - "MemberType": "Property", - "Name": "DevComputerCameraMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevComputerCameraMovementMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Controls", - "Default": "UserChoice", - "MemberType": "Property", - "Name": "DevComputerMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevComputerMovementMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Camera", - "Default": "UserChoice", - "MemberType": "Property", - "Name": "DevTouchCameraMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevTouchCameraMovementMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Controls", - "Default": "UserChoice", - "MemberType": "Property", - "Name": "DevTouchMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DevTouchMovementMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "Default", - "MemberType": "Property", - "Name": "EnableDynamicHeads", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "LoadDynamicHeads" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Controls", - "Default": "true", - "MemberType": "Property", - "Name": "EnableMouseLockOption", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDFace", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDHead", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDLeftArm", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDLeftLeg", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDPants", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDRightArm", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDRightLeg", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDShirt", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDTeeShirt", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0", - "MemberType": "Property", - "Name": "GameSettingsAssetIDTorso", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "R15", - "MemberType": "Property", - "Name": "GameSettingsAvatar", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "GameAvatarType" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "OuterBox", - "MemberType": "Property", - "Name": "GameSettingsR15Collision", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "R15CollisionType" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0 1 ", - "MemberType": "Property", - "Name": "GameSettingsScaleRangeBodyType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0.95 1 ", - "MemberType": "Property", - "Name": "GameSettingsScaleRangeHead", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0.9 1.05 ", - "MemberType": "Property", - "Name": "GameSettingsScaleRangeHeight", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0 1 ", - "MemberType": "Property", - "Name": "GameSettingsScaleRangeProportion", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "0.7 1 ", - "MemberType": "Property", - "Name": "GameSettingsScaleRangeWidth", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "100", - "MemberType": "Property", - "Name": "HealthDisplayDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "true", - "MemberType": "Property", - "Name": "LoadCharacterAppearance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "Default", - "MemberType": "Property", - "Name": "LoadCharacterLayeredClothing", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "LoadCharacterLayeredClothing" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "Default", - "MemberType": "Property", - "Name": "LoadCharacterLayeredClothing ", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "LoadCharacterLayeredClothing" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Controls", - "Default": "Default", - "MemberType": "Property", - "Name": "LuaCharacterController", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CharacterControlMode" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "100", - "MemberType": "Property", - "Name": "NameDisplayDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Character", - "Default": "true", - "MemberType": "Property", - "Name": "UserEmotesEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "ClearDefaults", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StarterPlayer", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "StarterPlayerScripts", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "StarterCharacterScripts", - "Superclass": "StarterPlayerScripts", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetStartupMessage", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StartupMessageService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ContactsCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DataReceiveKbps", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DataSendKbps", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrameTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HeartbeatTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HeartbeatTimeMs", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "InstanceCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MemoryTrackingEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "MovingPrimitivesCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PhysicsReceiveKbps", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PhysicsSendKbps", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PhysicsStepTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PhysicsStepTimeMs", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PrimitivesCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RenderCPUFrameTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "RenderGPUFrameTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SceneDrawcallCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SceneTriangleCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ShadowsDrawcallCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ShadowsTriangleCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UI2DDrawcallCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UI2DTriangleCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UI3DDrawcallCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "UI3DTriangleCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "GetBrowserTrackerId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "GetHarmonyQualityLevel", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "GetMemoryCategoryNames", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "GetMemoryUsageMbAllCategories", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMemoryUsageMbForTag", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Enum", - "Name": "DeveloperMemoryTag" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTotalMemoryUsageMb", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "ResetHarmonyMemoryTarget", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "SetHarmonyMemoryTarget", - "Parameters": [ - { - "Name": "targetMB", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPaginatedMemoryByTexture", - "Parameters": [ - { - "Name": "queryType", - "Type": { - "Category": "Enum", - "Name": "TextureQueryType" - } - }, - { - "Name": "pageIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "pageSize", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Stats", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "DisplayName", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "GetValue", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "double" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetValueString", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StatsItem", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RunningAverageItemDouble", - "Superclass": "StatsItem", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RunningAverageItemInt", - "Superclass": "StatsItem", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "RunningAverageTimeIntervalItem", - "Superclass": "StatsItem", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "TotalCountTimeIntervalItem", - "Superclass": "StatsItem", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "FinishTask", - "Parameters": [ - { - "Name": "taskId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendReport", - "Parameters": [ - { - "Name": "reportName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartTask", - "Parameters": [ - { - "Name": "reportName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "taskName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StopWatchReporter", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ActionOnAutoResumeSync", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActionOnAutoResumeSync" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ActionOnStopSync", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ActionOnStopSync" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Active Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Active Hover Over Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "General", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Always Save Script Changes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Animate Hover Over", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AutoResumeSyncOnPlaceOpen", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Updates", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AutoUpdateEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Auto Clean Empty Line", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Auto Closing Brackets", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Auto Closing Quotes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Auto Delete Closing Brackets and Quotes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Auto Indent Rule", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AutoIndentRule" - } - }, - { - "Category": "Auto-Recovery", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Auto-Recovery Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Auto-Recovery", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Auto-Recovery Interval (Minutes)", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AutocompleteAcceptanceBehavior", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CompletionAcceptanceBehavior" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Automatically trigger AI Code Completion", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Background Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "General", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Basic Objects Display Mode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ListDisplayMode" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Bool Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Bracket Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Built-in Function Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraAdaptiveSpeed", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraNavigationModel", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CameraNavigationModel" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraOrbitSensitivity", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraPanSensitivity", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraShiftFactor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraSpeedLockDefault", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraTweenFocus", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraZoomSpeed", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Camera Mouse Wheel Speed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Camera Pan Speed", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Camera Shift Speed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Camera Speed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Camera Speed Adjust Binding", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CameraSpeedAdjustBinding" - } - }, - { - "Category": "Camera", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Camera Zoom to Mouse Position", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Output", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Clear Output On Start", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CommandBarEnterExec", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CommandBarFont", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "QFont" - } - }, - { - "Category": "Lua Debugger", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CommandBarLocalState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Comment Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Current Line Highlight Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Debugger Current Line Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Debugger Error Line Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DefaultInstancesDir", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "QDir" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DefaultScriptSyncFileType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DefaultScriptSyncFileType" - } - }, - { - "Category": "Browsing", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DeprecatedObjectsShown", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "General", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DisplayLanguage", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Doc View Code Background Color", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerActiveColor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerLengthFactor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerMajorGridIncrement", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerMaxSoftSnaps", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerPassiveColor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerScaleFactor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerShowAxisTicks", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerShowHoverRuler", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerShowMeasurement", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerShowNegativeAxes", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerShowPlanes", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerShowTargetSnap", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerShowTrackball", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerShowWhileDragging", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerSoftSnapMarginFactor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerSummonMarginFactor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerTiltRotateDuration", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableCodeAssist", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableFindOnType", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableIndentationRulers", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableOnTypeAutocomplete", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableSelectionTooltips", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Streaming", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "EnableStudioStreaming", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Autocomplete", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Autocomplete Doc View", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Advanced", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable CoreScript Debugger", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Advanced", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Http Sandboxing", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Advanced", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Internal Beta Features", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Advanced", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Internal Features", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Script Analysis", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Scrollbar Markers", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Signature Help", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Signature Help Doc View", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Temporary Tabs", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Temporary Tabs In Explorer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Enable Type Hover", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Error Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ExternalEditorSelection", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "QDir" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Find Selection Background Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Font", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "QFont" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Format On Paste", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Format On Type", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Function Name Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Highlight Current Line", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Highlight Occurances", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HintColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Hover Animate Speed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HoverAnimateSpeed" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Hover Box Thickness", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Hover Line Thickness", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Hover Over Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IconOverrideDir", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "QDir" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Indent Using Spaces", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IndentationRulerColor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "InformationColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Keyword Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LargeFileLineCountThreshold", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LargeFileThreshold", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Primary Part", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Line Thickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LoadAllBuiltinPluginsInRunModes", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LoadInternalPlugins", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LoadUserPluginsInRunModes", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LocalAssetsFolder", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "QDir" - } - }, - { - "Category": "Lua Debugger", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LuaDebuggerEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Lua Debugger", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LuaDebuggerEnabledAtStartup", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Luau Keyword Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Audio", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Main Volume", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Matching Word Background Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MaxFindReplaceAllResults", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Output", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Maximum Output Lines", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Menu Item Background Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Method Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Number Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Audio", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Only Play Audio from Window in Focus", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Operator Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Output", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Output Font", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "QFont" - } - }, - { - "Category": "Output", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Output Layout Mode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "OutputLayoutMode" - } - }, - { - "Category": "Browsing", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PermissionLevelShown", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PermissionLevelShown" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Physical Draggers Select Scope By Default", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Pivot Snap To Geometry Color", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Lua Debugger", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PluginDebuggingEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PluginsDir", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "QDir" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Primary Text Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Property Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ReloadBuiltinPluginsOnChange", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ReloadLocalPluginsOnChange", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Advanced", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Respect Studio shortcuts when game has focus", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Ruler Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Rulers", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Undo", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RuntimeUndoBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RuntimeUndoBehavior" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ScriptEditorMenuBorderColor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ScriptEditorShouldShowPluginMethods", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Lua Debugger", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ScriptTimeoutLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Script Editor Color Preset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "StudioScriptEditorColorPresets" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Script Editor Scrollbar Background Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Script Editor Scrollbar Handle Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Scroll Past Last Line", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Secondary Text Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Select Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Primary Part", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Select/Hover Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Selected Menu Item Background Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Selected Text Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Selection Background Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Selection Box Thickness", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Selection Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Selection Line Thickness", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Advanced", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Set Pivot of Imported Parts", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Explorer", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowCorePackagesInExplorer", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Explorer", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Core GUI in Explorer while Playing", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Advanced", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Diagnostics Bar", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Explorer", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show FileSyncService", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Explorer", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Hidden Objects in Explorer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Hover Over", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Visualization", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Light Guides", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Visualization", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Navigation Labels", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Visualization", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Navigation Mesh", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Visualization", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Pathfinding Links", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Explorer", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Plugin GUI Service in Explorer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Visualization", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Singly Selected Attachment Parent Frame", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show Whitespace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Explorer", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Show plus button on hover in Explorer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Skip Closing Brackets and Quotes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "String Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "\"TODO\" Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Tab Width", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Text Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Text Wrapping", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "General", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Theme", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TypeColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "General", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UI Theme", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UITheme" - } - }, - { - "Category": "Directories", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UseDefaultExternalEditor", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Tools", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Use Bounding Box Move Handles", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Warning Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Whitespace Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "\"function\" Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "\"local\" Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "\"nil\" Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Category": "Script Editor Colors", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "\"self\" Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "MemberType": "Function", - "Name": "GetAvailableThemes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ThemeChanged", - "Parameters": [ - ], - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Studio", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ConvertToPackageUpload", - "Parameters": [ - { - "Name": "uploadUrl", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "cloneInstances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Name": "originalInstances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FireOnUGCSubmitCompleted", - "Parameters": [ - { - "Name": "cancelled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PublishPackage", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "publishInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResolveSaveInstanceToRoblox", - "Parameters": [ - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64?" - } - }, - { - "Name": "assetName", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowSaveToRoblox", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "false", - "Name": "hasSubsequent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdatePublishedPackage", - "Parameters": [ - { - "Name": "assetmetadata", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "rootInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "false", - "Name": "isConvert", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "false", - "Name": "addUndoWaypoint", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AutoSetupAvatarAsync", - "Parameters": [ - { - "Name": "modelId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "progressCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "notificationCallback", - "Type": { - "Category": "DataType", - "Name": "Function?" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AutoSetupSerializedAvatarAsync", - "Parameters": [ - { - "Name": "serializedInstance", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "publishInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "telemetryMetadata", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "progressCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - }, - { - "Name": "notificationCallback", - "Type": { - "Category": "DataType", - "Name": "Function?" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CancelAutoSetupAvatarAsync", - "Parameters": [ - { - "Name": "jobId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DEPRECATED_SerializeInstances", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptSaveInstanceToRobloxAsync", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RequestAvatarAutosetupAsync", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "textureId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "progressCallback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SerializeInstances", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "0", - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "false", - "Name": "isPackage", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnConvertToPackageResult", - "Parameters": [ - { - "Name": "isSuccessful", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnPromptSaveInstanceToRobloxAsync", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "requestId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnPublishPackageResult", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnSaveToRoblox", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Name": "assetType", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "hasSubsequent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnUGCSubmitCompleted", - "Parameters": [ - { - "Name": "cancelled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioAssetService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "AutoHideParent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsArrowVisible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "Offset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "SourceAnchorPoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "TargetAnchorPoint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "MemoryCategory": "Instances", - "Name": "StudioAttachment", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0.5, 0", - "MemberType": "Property", - "Name": "AnchorPoint", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "IsArrowVisible", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsNextVisible", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "RowName", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Title", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "SetOnNextClicked", - "Parameters": [ - { - "Name": "onClick", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioCallout", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "50", - "MemberType": "Property", - "Name": "FocusDistance", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "LockCameraSpeed", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "LoggingEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "InFocusMode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "InterpolateView", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetFocusLock", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "FocusStateChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnMouseCaptureBegin", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnMouseCaptureEnd", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PointFocused", - "Parameters": [ - { - "Name": "point", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ShowCameraSpeed", - "Parameters": [ - { - "Name": "speed", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UpdateUI", - "Parameters": [ - { - "Name": "deltaTime", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioCameraService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "EnableScriptCollabByDefaultOnLoad", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "StudioData", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HasMultiTouchStarted", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IsMultiTouchEmulationOn", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IsMultiTouchEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PivotPosition", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "MemberType": "Function", - "Name": "GetMaxNumTouches", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTouchInBounds", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTouchPosition", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "EmulatePCDeviceWithResolution", - "Parameters": [ - { - "Name": "deviceId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "resolution", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCurrentDeviceId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCurrentOrientation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "ScreenOrientation" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HasDeviceWithId", - "Parameters": [ - { - "Name": "deviceId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetCurrentDeviceId", - "Parameters": [ - { - "Name": "deviceId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetCurrentOrientation", - "Parameters": [ - { - "Name": "orientation", - "Type": { - "Category": "Enum", - "Name": "ScreenOrientation" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CurrentDeviceIdChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OrientationChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TouchInBoundsChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TouchPositionsChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioDeviceEmulatorService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "StudioObjectBase", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "SetFixedSize", - "Parameters": [ - { - "Name": "width", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "height", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioWidget", - "Superclass": "StudioObjectBase", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "PublishLocked", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "ClearUploadNames", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CloseAfterPublish", - "Parameters": [ - { - "Name": "closeMode", - "Type": { - "Category": "Enum", - "Name": "StudioCloseMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PublishAs", - "Parameters": [ - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "isPublish", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "publishParameters", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "false", - "Name": "willRetryOnConflict", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "true", - "Name": "allowOpeningNewPlace", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PublishThenTurnOnTeamCreate", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RefreshDocumentDisplayName", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterPublishHold", - "Parameters": [ - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "callback", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SaveOrPublishPlaceToRobloxIsCanceled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetTeamCreateOnPublishInfo", - "Parameters": [ - { - "Name": "shouldTurnOnTcOnPublish", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "newPlaceName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetUniverseDisplayName", - "Parameters": [ - { - "Name": "newName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetUploadNames", - "Parameters": [ - { - "Name": "placeName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "universeName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowSaveOrPublishPlaceToRoblox", - "Parameters": [ - { - "Name": "showGameSelect", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "isPublish", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "closeMode", - "Type": { - "Category": "Enum", - "Name": "StudioCloseMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "GameNameUpdated", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "GamePublishCancelled", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "GamePublishFinished", - "Parameters": [ - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "gameId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "reason", - "Type": { - "Category": "Enum", - "Name": "StudioPlaceUpdateFailureReason" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnPublishAttempt", - "Parameters": [ - { - "Name": "isPublishAs", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnSaveOrPublishPlaceToRoblox", - "Parameters": [ - { - "Name": "showGameSelect", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "isPublish", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "closeMode", - "Type": { - "Category": "Enum", - "Name": "StudioCloseMode" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioPublishService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "StudioScriptDebugEventListener", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetSdk", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetSdk", - "Parameters": [ - { - "Name": "sdk", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioSdkService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ActiveScript", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AlignDraggedObjects", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DraggerSolveConstraints", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DrawConstraintsOnTop", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "GridSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HoverInstance", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "InstalledPluginData", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PivotSnapToGeometry", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RotateIncrement", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Secrets", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowConstraintDetails", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ShowWeldDetails", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "StudioLocaleId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UseLocalSpace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Function", - "Name": "AnimationIdSelected", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CopyToClipboard", - "Parameters": [ - { - "Name": "stringToCopy", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBadgeConfigureUrl", - "Parameters": [ - { - "Name": "badgeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBadgeUploadUrl", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetClassIcon", - "Parameters": [ - { - "Name": "className", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPlaceIsPersistedToCloud", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetResourceByCategory", - "Parameters": [ - { - "Name": "category", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStartupAssetId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStartupPluginId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTermsOfUseUrl", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetUserId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int64" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GizmoRaycast", - "Parameters": [ - { - "Name": "origin", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "direction", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Default": "RaycastParams{IgnoreWater=false, BruteForceAllSlow=false, RespectCanCollide=false, CollisionGroup=Default, FilterDescendantsInstances={}}", - "Name": "raycastParams", - "Type": { - "Category": "DataType", - "Name": "RaycastParams" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RaycastResult?" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HasInternalPermission", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsPluginInstalled", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsPluginUpToDate", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "currentAssetVersion", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenInBrowser_DONOTUSE", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetPluginEnabled", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "state", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowPlaceVersionHistoryDialog", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowPublishToRoblox", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UninstallPlugin", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdatePluginManagement", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptImportFile", - "Parameters": [ - { - "Default": "{}", - "Name": "fileTypeFilter", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "PromptImportFileAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptImportFileAsync", - "Parameters": [ - { - "Default": "{}", - "Name": "fileTypeFilter", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptImportFiles", - "Parameters": [ - { - "Default": "{}", - "Name": "fileTypeFilter", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "PromptImportFilesAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptImportFilesAsync", - "Parameters": [ - { - "Default": "{}", - "Name": "fileTypeFilter", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TryInstallPlugin", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "assetVersionId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnImportFromRoblox", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnOpenGameSettings", - "Parameters": [ - { - "Name": "pageIdentifier", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnOpenManagePackagePlugin", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnPluginInstalledFromToolbox", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnPluginInstalledFromWeb", - "Parameters": [ - { - "Name": "pluginId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnPublishAsPlugin", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnSaveToRoblox", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PromptTransformPluginCheckEnable", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "SaveLocallyAsComplete", - "Parameters": [ - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "EndTest", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTestArgs", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ExecutePlayModeAsync", - "Parameters": [ - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ExecuteRunModeAsync", - "Parameters": [ - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioTestService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetColor", - "Parameters": [ - { - "Name": "styleguideitem", - "Type": { - "Category": "Enum", - "Name": "StudioStyleGuideColor" - } - }, - { - "Default": "Default", - "Name": "modifier", - "Type": { - "Category": "Enum", - "Name": "StudioStyleGuideModifier" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Color3" - }, - "Security": "PluginSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioTheme", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsLoggedIn", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "StudioUserService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ApplyFillInBox", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "StudioWidget" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ApplyHighlight", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "StudioWidget" - } - }, - { - "Name": "rowName", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ApplyShadows", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ApplySpotlight", - "Parameters": [ - { - "Name": "target", - "Type": { - "Category": "Class", - "Name": "StudioWidget" - } - }, - { - "Name": "rowName", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetWidgetFromLabel", - "Parameters": [ - { - "Name": "label", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "StudioWidget" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetWidgetFromPluginGui", - "Parameters": [ - { - "Name": "gui", - "Type": { - "Category": "Class", - "Name": "PluginGui" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "StudioWidget" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HideSpotlight", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StudioWidgetsService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetStyleRules", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "InsertStyleRule", - "Parameters": [ - { - "Name": "rule", - "Type": { - "Category": "Class", - "Name": "StyleRule" - } - }, - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetStyleRules", - "Parameters": [ - { - "Name": "rules", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "StyleRulesChanged", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "StyleBase", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "Index", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Priority", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PropertiesSerialize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PropertyTransitionsSerialize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Selector", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "SelectorError", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetProperties", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetPropertiesResolved", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetProperty", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetPropertyResolved", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetPropertyTransitions", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetProperties", - "Parameters": [ - { - "Name": "styleProperties", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetProperty", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetPropertyTransition", - "Parameters": [ - { - "Name": "property", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "transitionParams", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetPropertyTransitions", - "Parameters": [ - { - "Name": "properties", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "StyleRulePropertyChanged", - "Parameters": [ - { - "Name": "styleProperty", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "StyleRule", - "Superclass": "StyleBase" - }, - { - "Members": [ - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetDerives", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetDerives", - "Parameters": [ - { - "Name": "derives", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "StyleSheet", - "Superclass": "StyleBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "Index", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Priority", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "StyleSheet", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "StyleSheet" - } - } - ], - "MemoryCategory": "Gui", - "Name": "StyleDerive", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ], - "Write": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "StyleSheet", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "StyleSheet" - } - } - ], - "MemoryCategory": "Gui", - "Name": "StyleLink", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Conditions", - "Default": "0 inf ", - "MemberType": "Property", - "Name": "AspectRatioRange", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberRange" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ConditionsSerialize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "IsActive", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Conditions", - "Default": "INF, INF", - "MemberType": "Property", - "Name": "MaxSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Conditions", - "Default": "0, 0", - "MemberType": "Property", - "Name": "MinSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Conditions", - "Default": "KeyboardAndMouse", - "MemberType": "Property", - "Name": "PreferredInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PreferredInput" - } - }, - { - "Category": "Conditions", - "Default": "false", - "MemberType": "Property", - "Name": "ReducedMotionEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Conditions", - "Default": "Small", - "MemberType": "Property", - "Name": "ViewportDisplaySize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DisplaySize" - } - }, - { - "MemberType": "Function", - "Name": "GetCondition", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetConditions", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetCondition", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetConditions", - "Parameters": [ - { - "Name": "conditions", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StyleQuery", - "Superclass": "Instance", - "Tags": [ - "NotReplicated", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetAppliedStyles", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStyleInfo", - "Parameters": [ - { - "Name": "style", - "Type": { - "Category": "Class", - "Name": "StyleRule" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStyleSheetDerivesChain", - "Parameters": [ - { - "Name": "styleSheet", - "Type": { - "Category": "Class", - "Name": "StyleSheet" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetStyleSheetInfo", - "Parameters": [ - { - "Name": "styleSheet", - "Type": { - "Category": "Class", - "Name": "StyleSheet" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpdateUnitTestOnly", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Gui", - "Name": "StylingService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "Overlay", - "MemberType": "Property", - "Name": "AlphaMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AlphaMode" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "ColorMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ColorMapContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "EmissiveMaskContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "EmissiveStrength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "EmissiveTint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "MetalnessMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MetalnessMapContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "NormalMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "NormalMapContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "RoughnessMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RoughnessMapContent", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "TexturePack", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "SurfaceAppearance", - "Superclass": "Instance" - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "getSystemTheme", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "SystemThemeValue" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "isSystemThemeAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "setTheme", - "Parameters": [ - { - "Name": "theme", - "Type": { - "Category": "Enum", - "Name": "SystemThemeValue" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getSystemThemeAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "SystemThemeValue" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnLuaThemeUpdated", - "Parameters": [ - { - "Name": "theme", - "Type": { - "Category": "Enum", - "Name": "SystemThemeValue" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "SystemThemeService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Diagnostics", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "SchedulerDutyCycle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Diagnostics", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "SchedulerRate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Configuration", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ThreadPoolConfig", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ThreadPoolConfig" - } - }, - { - "Category": "Diagnostics", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ThreadPoolSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TaskScheduler", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "AutoAssignable", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "AutoColorCharacters", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "-1", - "MemberType": "Property", - "Name": "ChildOrder", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Score", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TeamColor", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetPlayers", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Safe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerAdded", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Event", - "Name": "PlayerRemoved", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Team", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Camera", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "InitialCameraCFrame", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TeamCreateData", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "TeamCreateErrorStatus", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Enum", - "Name": "TeamCreateErrorState" - } - }, - { - "Name": "teamCreateSaveData", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TeamCreatePlaceUploadRequest", - "Parameters": [ - { - "Name": "metadata", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TeamCreatePlaceUploadResponse", - "Parameters": [ - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TeamCreatePublishService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CloseGameIfUserDoesntHavePerms", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TeamCreateService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetTeams", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "RebalanceTeams", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Teams", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "LogCounter", - "Parameters": [ - { - "Name": "config", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "data", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - }, - { - "Default": "1", - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogDurationEvent", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogDurationEventWithTimestamp", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "timestamp", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogEvent", - "Parameters": [ - { - "Name": "config", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Default": "nil", - "Name": "data", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogStat", - "Parameters": [ - { - "Name": "config", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "data", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TelemetryService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Teleport" - ], - "Write": [ - "Teleport" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PrivateServerId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Teleport" - ], - "Write": [ - "Teleport" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ReservedServerAccessCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TeleportAsyncResult", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Teleport" - ], - "Write": [ - "Teleport" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ReservedServerAccessCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Teleport" - ], - "Write": [ - "Teleport" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "ServerInstanceId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Teleport" - ], - "Write": [ - "Teleport" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "ShouldReserveServer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "GetTeleportData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "SetTeleportData", - "Parameters": [ - { - "Name": "teleportData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TeleportOptions", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Teleport" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "CustomizedTeleportUI", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "Block", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Teleport" - ], - "MemberType": "Function", - "Name": "GetArrivingTeleportGui", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "GetLocalPlayerTeleportData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "GetTeleportSetting", - "Parameters": [ - { - "Name": "setting", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "GetThirdPartyTeleportInfo", - "Parameters": [ - { - "Name": "goForth", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "PromptExperienceDetailsCompleted", - "Parameters": [ - { - "Name": "resultEnum", - "Type": { - "Category": "Enum", - "Name": "PromptExperienceDetailsResult" - } - }, - { - "Default": "", - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Teleport" - ], - "MemberType": "Function", - "Name": "SetTeleportGui", - "Parameters": [ - { - "Name": "gui", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "SetTeleportSetting", - "Parameters": [ - { - "Name": "setting", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Teleport" - ], - "MemberType": "Function", - "Name": "Teleport", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "nil", - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "teleportData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "nil", - "Name": "customLoadingScreen", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportCancel", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportReconnect", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportToPlaceInstance", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "instanceId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "", - "Name": "spawnName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "teleportData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "nil", - "Name": "customLoadingScreen", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportToPrivateServer", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "reservedServerAccessCode", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "players", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "", - "Name": "spawnName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "teleportData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "nil", - "Name": "customLoadingScreen", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportToSpawnByName", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "spawnName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "teleportData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "nil", - "Name": "customLoadingScreen", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportTrustedBackForth", - "Parameters": [ - { - "Name": "goForth", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportTrustedBackHistory", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportedPlacesBackHistory", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportedUniversesBackHistory", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "GetPlayerPlaceInstanceAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "PromptExperienceDetailsAsync", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "PromptExperienceDetailsResult" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "ReserveServer", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "ReserveServerAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "ReserveServerAsync", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportAsync", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "players", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Default": "nil", - "Name": "teleportOptions", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI", - "Teleport" - ], - "MemberType": "Function", - "Name": "TeleportPartyAsync", - "Parameters": [ - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "players", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - }, - { - "Name": "teleportData", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "nil", - "Name": "customLoadingScreen", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Function", - "Name": "UnblockAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Event", - "Name": "LocalPlayerArrivedFromTeleport", - "Parameters": [ - { - "Name": "loadingGui", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "dataTable", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Event", - "Name": "MenuTeleportAttempt", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Event", - "Name": "OpenExperienceDetailsPrompt", - "Parameters": [ - { - "Name": "universeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Event", - "Name": "ReconnectTeleportInitFailed", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "teleportResult", - "Type": { - "Category": "Enum", - "Name": "TeleportResult" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "teleportOptions", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "RobloxSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Event", - "Name": "SendVIPData", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "vipServerCode", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "dmPlaceID", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Event", - "Name": "TeleportInProgress", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "teleportInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Event", - "Name": "TeleportInitFailed", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "teleportResult", - "Type": { - "Category": "Enum", - "Name": "TeleportResult" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "placeId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "teleportOptions", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Teleport" - ], - "MemberType": "Event", - "Name": "TeleportInitFailedInternal", - "Parameters": [ - { - "Name": "player", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "teleportResult", - "Type": { - "Category": "Enum", - "Name": "TeleportResult" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "guid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TeleportService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "TemporaryCageMeshProvider", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "TemporaryScriptService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "ColorMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ColorMapContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "EmissiveMaskContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "EmissiveStrength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "EmissiveTint", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "Side", - "MemberType": "Property", - "Name": "Face", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TerrainFace" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "Regular", - "MemberType": "Property", - "Name": "MaterialPattern", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MaterialPattern" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "MetalnessMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "MetalnessMapContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "NormalMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "NormalMapContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "RoughnessMap", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "RoughnessMapContent", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Appearance", - "Default": "10", - "MemberType": "Property", - "Name": "StudsPerTile", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Internal", - "Default": "", - "MemberType": "Property", - "Name": "TexturePack", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TerrainDetail", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ExtentsMax", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3int16" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "ExtentsMin", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3int16" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "__api_dump_write_only_property__", - "MemberType": "Property", - "Name": "GridV3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "WriteOnly", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "IsSmooth", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ], - "Write": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "SizeInCells", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Environment" - ] - }, - "Category": "Data", - "Default": "\u0001\u0005", - "MemberType": "Property", - "Name": "SmoothGrid", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ApplyTransform", - "Parameters": [ - { - "Name": "rotation", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ApplyTransformSubregion", - "Parameters": [ - { - "Name": "rotation", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "size", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "region", - "Type": { - "Category": "DataType", - "Name": "Region3int16" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TerrainRegion" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "ConvertToSmooth", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Environment" - ], - "MemberType": "Function", - "Name": "GetRegionWireframe", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TerrainRegion", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Physics", - "Default": "true", - "MemberType": "Property", - "Name": "AutoRuns", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Description", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Results", - "Default": "0", - "MemberType": "Property", - "Name": "ErrorCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Settings", - "Default": "false", - "MemberType": "Property", - "Name": "ExecuteWithStudioRun", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Physics", - "Default": "true", - "MemberType": "Property", - "Name": "Is30FpsThrottleEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "Deprecated", - { - "PreferredDescriptorName": "ThrottlePhysicsToRealtime", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Physics", - "Default": "true", - "MemberType": "Property", - "Name": "IsPhysicsEnvironmentalThrottled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Physics", - "Default": "true", - "MemberType": "Property", - "Name": "IsSleepAllowed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Settings", - "Default": "0", - "MemberType": "Property", - "Name": "NumberOfPlayers", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Settings", - "Default": "0", - "MemberType": "Property", - "Name": "SimulateSecondsLag", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Results", - "Default": "0", - "MemberType": "Property", - "Name": "TestCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Physics", - "Default": "true", - "MemberType": "Property", - "Name": "ThrottlePhysicsToRealtime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Settings", - "Default": "10", - "MemberType": "Property", - "Name": "Timeout", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Results", - "Default": "0", - "MemberType": "Property", - "Name": "WarnCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "MemberType": "Function", - "Name": "Check", - "Parameters": [ - { - "Name": "condition", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "0", - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Checkpoint", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "0", - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ConvertSlimAcrToObj", - "Parameters": [ - { - "Name": "acrFullFilePath", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "objFileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateAndSavePropertySet", - "Parameters": [ - { - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateExtraAssetsFileFromPropertySet", - "Parameters": [ - { - "Name": "psetFileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Done", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Error", - "Parameters": [ - { - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "0", - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Fail", - "Parameters": [ - { - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "0", - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FetchExtraAssets", - "Parameters": [ - { - "Name": "extraAssetsFileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Message", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "0", - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Require", - "Parameters": [ - { - "Name": "condition", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "0", - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ScopeTime", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "StartTestSession", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "StopTestSession", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "TakeSnapshot", - "Parameters": [ - { - "Name": "snapshotname", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TranscodePropertySet", - "Parameters": [ - { - "Name": "extraAssetsFileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "psetFileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Warn", - "Parameters": [ - { - "Name": "condition", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "description", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "nil", - "Name": "source", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "0", - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "InternalTest" - ], - "MemberType": "Function", - "Name": "getTestSessionProviderStats", - "Parameters": [ - { - "Name": "providerName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "isFeatureEnabled", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Run", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields", - "Deprecated", - { - "PreferredDescriptorName": "RunAsync", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RunAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "PluginSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ServerCollectConditionalResult", - "Parameters": [ - { - "Name": "condition", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ServerCollectResult", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "script", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "line", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TestService", - "Superclass": "Instance", - "Tags": [ - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "TextBoxService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "DirectChatRequester", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Player" - } - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "DisplaySystemMessage", - "Parameters": [ - { - "Name": "systemMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TextChatMessage" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SetDirectChatRequester", - "Parameters": [ - { - "Name": "requester", - "Type": { - "Category": "Class", - "Name": "Player" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "AddUserAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SendAsync", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "", - "Name": "metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TextChatMessage" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "MessageReceived", - "Parameters": [ - { - "Name": "incomingMessage", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Callback", - "Name": "OnIncomingMessage", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Callback", - "Name": "ShouldDeliverCallback", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - }, - { - "Name": "textSource", - "Type": { - "Category": "Class", - "Name": "TextSource" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextChannel", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "AutocompleteVisible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "PrimaryAlias", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "", - "MemberType": "Property", - "Name": "SecondaryAlias", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "Triggered", - "Parameters": [ - { - "Name": "originTextSource", - "Type": { - "Category": "Class", - "Name": "TextSource" - } - }, - { - "Name": "unfilteredText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextChatCommand", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "TextChatConfigurations", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "HumanoidRootPart", - "MemberType": "Property", - "Name": "AdorneeName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.980392, 0.980392, 0.980392", - "MemberType": "Property", - "Name": "BackgroundColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.10000000000000000555", - "MemberType": "Property", - "Name": "BackgroundTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "15", - "MemberType": "Property", - "Name": "BubbleDuration", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "6", - "MemberType": "Property", - "Name": "BubblesSpacing", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "GothamMedium", - "MemberType": "Property", - "Name": "Font", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FontFace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "LocalPlayerStudsOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "3", - "MemberType": "Property", - "Name": "MaxBubbles", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "100", - "MemberType": "Property", - "Name": "MaxDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "40", - "MemberType": "Property", - "Name": "MinimizeDistance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "true", - "MemberType": "Property", - "Name": "TailVisible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.223529, 0.231373, 0.239216", - "MemberType": "Property", - "Name": "TextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "16", - "MemberType": "Property", - "Name": "TextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "0", - "MemberType": "Property", - "Name": "VerticalStudsOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BubbleChatConfiguration", - "Superclass": "TextChatConfigurations", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsolutePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsoluteSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.0980392, 0.105882, 0.113725", - "MemberType": "Property", - "Name": "BackgroundColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "BackgroundTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FontFace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.490196, 0.490196, 0.490196", - "MemberType": "Property", - "Name": "HoverBackgroundColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "SelectedTabTextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.686275, 0.686275, 0.686275", - "MemberType": "Property", - "Name": "TextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "18", - "MemberType": "Property", - "Name": "TextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TextStrokeColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "TextStrokeTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SetAbsolutePosition", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SetAbsoluteSize", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ChannelTabsConfiguration", - "Superclass": "TextChatConfigurations", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsolutePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsolutePositionWrite", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsoluteSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsoluteSizeWrite", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "AutocompleteEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.0980392, 0.105882, 0.113725", - "MemberType": "Property", - "Name": "BackgroundColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.2000000000000000111", - "MemberType": "Property", - "Name": "BackgroundTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FontFace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsFocused", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsFocusedWrite", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "Slash", - "MemberType": "Property", - "Name": "KeyboardKeyCode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.698039, 0.698039, 0.698039", - "MemberType": "Property", - "Name": "PlaceholderColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TargetTextChannel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "TextChannel" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TextBox", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "TextBox" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "TextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "14", - "MemberType": "Property", - "Name": "TextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TextStrokeColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.5", - "MemberType": "Property", - "Name": "TextStrokeTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ChatInputBarConfiguration", - "Superclass": "TextChatConfigurations", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsolutePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsolutePositionWrite", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsoluteSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsoluteSizeWrite", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.0980392, 0.105882, 0.113725", - "MemberType": "Property", - "Name": "BackgroundColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.2999999999999999889", - "MemberType": "Property", - "Name": "BackgroundTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FontFace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "HeightScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "Left", - "MemberType": "Property", - "Name": "HorizontalAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "Enum", - "Name": "HorizontalAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "TextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "14", - "MemberType": "Property", - "Name": "TextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TextStrokeColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.5", - "MemberType": "Property", - "Name": "TextStrokeTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "Top", - "MemberType": "Property", - "Name": "VerticalAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "Enum", - "Name": "VerticalAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "WidthScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "DeriveNewMessageProperties", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "ChatWindowMessageProperties" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ChatWindowConfiguration", - "Superclass": "TextChatConfigurations", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "BubbleChatMessageProperties", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BubbleChatMessageProperties" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ChatWindowMessageProperties", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "ChatWindowMessageProperties" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "ForModeration", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "MessageId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Metadata", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "OriginalText", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PrefixText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "RewrittenText", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "RewrittenTranslation", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Status", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextChatMessageStatus" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TextChannel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "TextChannel" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TextSource", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "TextSource" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Timestamp", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "DateTime" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Translation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Verified", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "WasRewritten", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TextChatMessage", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "PrefixText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Text", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Translation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TextChatMessageProperties", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.980392, 0.980392, 0.980392", - "MemberType": "Property", - "Name": "BackgroundColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.10000000000000000555", - "MemberType": "Property", - "Name": "BackgroundTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FontFace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "true", - "MemberType": "Property", - "Name": "TailVisible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.223529, 0.231373, 0.239216", - "MemberType": "Property", - "Name": "TextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "16", - "MemberType": "Property", - "Name": "TextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "MemoryCategory": "Instances", - "Name": "BubbleChatMessageProperties", - "Superclass": "TextChatMessageProperties" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "FontFace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Font" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "PrefixTextProperties", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "ChatWindowMessageProperties" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "1, 1, 1", - "MemberType": "Property", - "Name": "TextColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "18", - "MemberType": "Property", - "Name": "TextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "TextStrokeColor3", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Appearance", - "Default": "0.5", - "MemberType": "Property", - "Name": "TextStrokeTransparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "MemoryCategory": "Instances", - "Name": "ChatWindowMessageProperties", - "Superclass": "TextChatMessageProperties", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "ChatTranslationEnabled", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "ChatTranslationFTUXShown", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "ChatTranslationToggleEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "LegacyChatService", - "MemberType": "Property", - "Name": "ChatVersion", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ChatVersion" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "CreateDefaultCommands", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "CreateDefaultTextChannels", - "Security": { - "Read": "None", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "HasSeenDeprecationDialog", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsLegacyChatDisabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "DisplayBubble", - "Parameters": [ - { - "Name": "partOrCharacter", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SendEnableChatButtonClicked", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SendEnableChatButtonShown", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SendExpChatLoadSuccess", - "Parameters": [ - { - "Name": "loadingLatency", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SendExpChatMessageClientRendered", - "Parameters": [ - { - "Name": "textChatMessage", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - }, - { - "Default": "unknown", - "Name": "messageRenderedSurface", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SendExpChatWindowScroll", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "SendExpChatWindowStatusChange", - "Parameters": [ - { - "Name": "timeClosed", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "timeOpen", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "timeBackgroundIdle", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "timeTextIdle", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "setModerationModeEnabled", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "CanUserChatAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "CanUsersChatAsync", - "Parameters": [ - { - "Name": "userIdFrom", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "userIdTo", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "CanUsersDirectChatAsync", - "Parameters": [ - { - "Name": "requesterUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "userIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "CanUsersWhisperAsync", - "Parameters": [ - { - "Name": "fromUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "toUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Function", - "Name": "GetChatGroupsAsync", - "Parameters": [ - { - "Name": "players", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "BubbleDisplayed", - "Parameters": [ - { - "Name": "partOrCharacter", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "textChatMessage", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ClientToServerMessageReplicateSignalV2", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "messageId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "textSource", - "Type": { - "Category": "Class", - "Name": "TextSource" - } - }, - { - "Name": "textChannel", - "Type": { - "Category": "Class", - "Name": "TextChannel" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ClientToServerMessageReplicateSignalV3", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "messageId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "textSource", - "Type": { - "Category": "Class", - "Name": "TextSource" - } - }, - { - "Name": "textChannel", - "Type": { - "Category": "Class", - "Name": "TextChannel" - } - }, - { - "Name": "verified", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "isEscapedFlagEnabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "MessageReceived", - "Parameters": [ - { - "Name": "textChatMessage", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "OnIncomingMessageEvent", - "Parameters": [ - { - "Name": "textChatMessage", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "SendingMessage", - "Parameters": [ - { - "Name": "textChatMessage", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ServerToClientMessageReplicateSignal", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "prefixText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "messageId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "textSource", - "Type": { - "Category": "Class", - "Name": "TextSource" - } - }, - { - "Name": "textChannel", - "Type": { - "Category": "Class", - "Name": "TextChannel" - } - }, - { - "Name": "timestamp", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "status", - "Type": { - "Category": "Enum", - "Name": "TextChatMessageStatus" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "ServerToClientMessageReplicateSignalV2", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "UpdateChatTimeout", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "startTime", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "duration", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "UserMessageIntentSent", - "Parameters": [ - { - "Name": "userIntentMessage", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Event", - "Name": "UserMessageIntentSentRemote", - "Parameters": [ - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "prefixText", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "metadata", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "messageId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "textSource", - "Type": { - "Category": "Class", - "Name": "TextSource" - } - }, - { - "Name": "textChannel", - "Type": { - "Category": "Class", - "Name": "TextChannel" - } - }, - { - "Name": "timestamp", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Callback", - "Name": "OnBubbleAdded", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - }, - { - "Name": "adornee", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Callback", - "Name": "OnChatWindowAdded", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Chat" - ], - "MemberType": "Callback", - "Name": "OnIncomingMessage", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Class", - "Name": "TextChatMessage" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextChatService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetChatForUserAsync", - "Parameters": [ - { - "Name": "toUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields", - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetNonChatStringForBroadcastAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetNonChatStringForUserAsync", - "Parameters": [ - { - "Name": "toUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextFilterResult", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SourceLanguage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SourceText", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "TextFilterResult" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetTranslationForLocale", - "Parameters": [ - { - "Name": "locale", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TextFilterResult" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetTranslations", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextFilterTranslatedResult", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Seed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "SystemPrompt", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "0.699999988", - "MemberType": "Property", - "Name": "Temperature", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "0.899999976", - "MemberType": "Property", - "Name": "TopP", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "MemberType": "Function", - "Name": "GenerateTextAsync", - "Parameters": [ - { - "Name": "request", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextGenerator", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetFontMemoryData", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetTextSize", - "Parameters": [ - { - "Name": "string", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "fontSize", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "font", - "Type": { - "Category": "Enum", - "Name": "Font" - } - }, - { - "Name": "frameSize", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetResolutionScale", - "Parameters": [ - { - "Name": "scale", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "FilterAndTranslateStringAsync", - "Parameters": [ - { - "Name": "stringToFilter", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "fromUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "targetLocales", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Default": "PrivateChat", - "Name": "textContext", - "Type": { - "Category": "Enum", - "Name": "TextFilterContext" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TextFilterTranslatedResult" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "FilterStringAsync", - "Parameters": [ - { - "Name": "stringToFilter", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "fromUserId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Default": "PrivateChat", - "Name": "textContext", - "Type": { - "Category": "Enum", - "Name": "TextFilterContext" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TextFilterResult" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetFamilyInfoAsync", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetTextBoundsAsync", - "Parameters": [ - { - "Name": "params", - "Type": { - "Category": "Class", - "Name": "GetTextBoundsParams" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetTextSizeOffsetAsync", - "Parameters": [ - { - "Name": "fontSize", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "font", - "Type": { - "Category": "DataType", - "Name": "Font" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "CanSend", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "UserId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Capabilities": { - "Read": [ - "Chat" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "UserIdReplicated", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "MemoryCategory": "Instances", - "Name": "TextSource", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetInstances", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMeshIdsHash", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextureGenerationPartGroup", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CancelGenerationRequest", - "Parameters": [ - { - "Name": "jobUuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreatePartGroup", - "Parameters": [ - { - "Name": "instances", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TextureGenerationPartGroup" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GenerateTexture", - "Parameters": [ - { - "Name": "previewJobId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PreviewTexture", - "Parameters": [ - { - "Name": "partGroup", - "Type": { - "Category": "Class", - "Name": "TextureGenerationPartGroup" - } - }, - { - "Name": "prompt", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetQuotasAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "GenerationNotificationSignal", - "Parameters": [ - { - "Name": "notificationData", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PreviewNotificationSignal", - "Parameters": [ - { - "Name": "notificationData", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextureGenerationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ApplyToDataModel", - "Parameters": [ - { - "Name": "partGroup", - "Type": { - "Category": "Class", - "Name": "TextureGenerationPartGroup" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "TextureGenerationPartGroup" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPartGroup", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "TextureGenerationPartGroup" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TextureGenerationUnwrappingRequest", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FriendCommunicationRestrictionStatus", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ChatRestrictionStatus" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HasActiveUser", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VoiceChatRestrictionStatus", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ChatRestrictionStatus" - } - }, - { - "MemberType": "Function", - "Name": "GetUserPlatformName", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetVoiceChatRestrictionStatus", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "ChatRestrictionStatus" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HaveActiveUser", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsAccountSwitchingSupported", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsChatRestrictionSupported", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsSingleSignOnSupported", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowAccountPicker", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterActiveUser", - "Parameters": [ - { - "Name": "gamepadId", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ActiveUserSignedOut", - "Parameters": [ - { - "Name": "signOutStatus", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ThirdPartyUserService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FrameCount", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "State", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "Populated", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ThreadId", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ThreadName", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "GetFrame", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ThreadState", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "TimerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "HideNotification", - "Parameters": [ - { - "Name": "notificationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowNotification", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "notificationId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ToastNotificationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "TouchInputService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "TouchTransmitter", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "TraceRouteService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "FinishSpan", - "Parameters": [ - { - "Name": "spanId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartSpan", - "Parameters": [ - { - "Name": "name", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "parentId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TracerService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Control", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AudioMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TrackerLodFlagMode" - } - }, - { - "Category": "Control", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VideoExtrapolationMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TrackerExtrapolationFlagMode" - } - }, - { - "Category": "Control", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VideoLodMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TrackerLodValueMode" - } - }, - { - "Category": "Control", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VideoMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TrackerLodFlagMode" - } - }, - { - "MemberType": "Function", - "Name": "getExtrapolation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "getVideoLod", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "isAudioEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "isVideoEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "UpdateState", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TrackerLodController", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Animation", - "Name": "TrackerStreamAnimation", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Attachment0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Attachment" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Attachment1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Attachment" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "Brightness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0 1 1 1 0 1 1 1 1 0 ", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ColorSequence" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "FaceCamera", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "2", - "MemberType": "Property", - "Name": "Lifetime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LightEmission", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LightInfluence", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "LocalTransparencyModifier", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "0", - "MemberType": "Property", - "Name": "MaxLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "0.100000001", - "MemberType": "Property", - "Name": "MinLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "", - "MemberType": "Property", - "Name": "Texture", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "TextureLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "Stretch", - "MemberType": "Property", - "Name": "TextureMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TextureMode" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Appearance", - "Default": "0 0.5 0 1 0.5 0 ", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberSequence" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Emission", - "Default": "0 1 0 1 1 0 ", - "MemberType": "Property", - "Name": "WidthScale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberSequence" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Clear", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Event", - "Name": "OnClearRequested", - "Parameters": [ - ], - "Security": "None", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Trail", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "LocaleId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "FormatByKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "args", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RobloxOnlyTranslate", - "Parameters": [ - { - "Name": "context", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Translate", - "Parameters": [ - { - "Name": "context", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "text", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Translator", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetMainViewSessionId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HasUserCompletedTutorial", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HideWidgets", - "Parameters": [ - { - "Name": "commaSeparatedNames", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PromptClosePlace", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetTutorialCompletionStatus", - "Parameters": [ - { - "Name": "completed", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShouldLaunchTutorial", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ShowWidgets", - "Parameters": [ - { - "Name": "commaSeparatedNames", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TutorialService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "PlaybackState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PlaybackState" - } - }, - { - "MemberType": "Function", - "Name": "Cancel", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Pause", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Play", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Completed", - "Parameters": [ - { - "Name": "playbackState", - "Type": { - "Category": "Enum", - "Name": "PlaybackState" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TweenBase", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Instance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "Time:1 DelayTime:0 RepeatCount:0 Reverses:False EasingDirection:Out EasingStyle:Quad", - "MemberType": "Property", - "Name": "TweenInfo", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "TweenInfo" - } - } - ], - "MemoryCategory": "Instances", - "Name": "Tween", - "Superclass": "TweenBase" - }, - { - "Members": [ - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Create", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "tweenInfo", - "Type": { - "Category": "DataType", - "Name": "TweenInfo" - } - }, - { - "Name": "propertyTable", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Tween" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetValue", - "Parameters": [ - { - "Name": "alpha", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "easingStyle", - "Type": { - "Category": "Enum", - "Name": "EasingStyle" - } - }, - { - "Name": "easingDirection", - "Type": { - "Category": "Enum", - "Name": "EasingDirection" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SmoothDamp", - "Parameters": [ - { - "Name": "current", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "target", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "velocity", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Name": "smoothTime", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "maxSpeed", - "Type": { - "Category": "Primitive", - "Name": "float?" - } - }, - { - "Name": "dt", - "Type": { - "Category": "Primitive", - "Name": "float?" - } - } - ], - "ReturnType": [ - { - "Category": "Group", - "Name": "Variant" - }, - { - "Category": "Group", - "Name": "Variant" - } - ], - "Security": "None", - "ThreadSafety": "Safe" - } - ], - "MemoryCategory": "Instances", - "Name": "TweenService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "UGCAvatarService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CalculateAverageEditableCageMeshDistance", - "Parameters": [ - { - "Name": "innerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "outerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "refMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "innerTransform", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "outerTransform", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateBodyPartMaxCageDistance", - "Parameters": [ - { - "Name": "outerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "renderMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "outerTransform", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "scale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateEditableMeshInsideMeshPercentage", - "Parameters": [ - { - "Name": "editableMeshRoot", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "editableMeshQuery", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "meshQueryTransform", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "meshQueryScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateEditableMeshModifiedCageBoundingBox", - "Parameters": [ - { - "Name": "referenceUVValues", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "innerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "innerTransform", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "outerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "outerTransform", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateEditableMeshNumModifiedCageUVsInSet", - "Parameters": [ - { - "Name": "referenceUVValues", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "innerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "innerTransform", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "outerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "outerTransform", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateEditableMeshTotalSurfaceArea", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "meshScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateEditableMeshUniqueUVCount", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CheckEditableMeshInCameraFrustum", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "meshScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "handleWorldCF", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "cameraWorldCF", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateEditableImageFromBinaryStringRobloxOnly", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Class", - "Name": "BinaryStringValue" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "EditableImage" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CreateEditableMeshFromBinaryStringRobloxOnly", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Class", - "Name": "BinaryStringValue" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "EditableMesh" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBoundingBoxManipulationData", - "Parameters": [ - { - "Name": "partMeshObjects", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "partCFs", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "meshScales", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Map" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDynamicHeadEditableMeshInactiveControls", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "controlNames", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditableCagingRelevancyMetrics", - "Parameters": [ - { - "Name": "innerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "outerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "refMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "offsetInner", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "offsetOuter", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditableImageData", - "Parameters": [ - { - "Name": "editableImage", - "Type": { - "Category": "Class", - "Name": "EditableImage" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "BinaryStringValue" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditableImageSize", - "Parameters": [ - { - "Name": "editableImage", - "Type": { - "Category": "Class", - "Name": "EditableImage" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditableMeshMaxNearbyVerticesCollisions", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "meshScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditableMeshSkinningTransferJointsInfo", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditableMeshTriCount", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditableMeshVertColors", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditableMeshVerticesSimilarityRate", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "meshScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetEditableMeshVerts", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFacsDrivenJointNamesFromEditableMesh", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetImageTransparencyWithByteString", - "Parameters": [ - { - "Name": "textureId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMaximalJointDistancesWithinFacs", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetPropertyValue", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "property", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSkinnedJointNamesFromEditableMesh", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsEditableMeshNumCoplanarIntersectionsOverLimit", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "limit", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "meshScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "intersectBackFaces", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterAlternateMesh", - "Parameters": [ - { - "Name": "alternateId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "binaryStringValue", - "Type": { - "Category": "Class", - "Name": "BinaryStringValue" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "RegisterUGCValidationFunction", - "Parameters": [ - { - "Name": "setFunction", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportUGCValidationCounter", - "Parameters": [ - { - "Name": "success", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "validationType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportUGCValidationFailureTelemetry", - "Parameters": [ - { - "Name": "errorType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReportUGCValidationTelemetry", - "Parameters": [ - { - "Name": "assetType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "data", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResetCollisionFidelity", - "Parameters": [ - { - "Name": "meshPart", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "Box", - "Name": "collisionFidelity", - "Type": { - "Category": "Enum", - "Name": "CollisionFidelity" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResetCollisionFidelityWithEditableMeshDataLua", - "Parameters": [ - { - "Name": "meshPart", - "Type": { - "Category": "Class", - "Name": "MeshPart" - } - }, - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Default": "Box", - "Name": "collisionFidelity", - "Type": { - "Category": "Enum", - "Name": "CollisionFidelity" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetMeshIdBlocking", - "Parameters": [ - { - "Name": "meshPart", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateDynamicHeadEditableMesh", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableImageSize", - "Parameters": [ - { - "Name": "editableImage", - "Type": { - "Category": "Class", - "Name": "EditableImage" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshCageMeshIntersection", - "Parameters": [ - { - "Name": "innerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "outerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "refMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshCageNonManifoldAndHoles", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshCageUVCoincident", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshCageUVTriangleArea", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshFacialBounds", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "boundsScale", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "partSize", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshFacialExpressiveness", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "minDelta", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "partSize", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshFullBodyCageDeletion", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshMisMatchUV", - "Parameters": [ - { - "Name": "innerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "outerCage", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshOverlappingVertices", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshTriangleArea", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshTriangles", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshUVDuplicates", - "Parameters": [ - { - "Name": "referenceValues", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshUVSpace", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshUVValuesInReference", - "Parameters": [ - { - "Name": "referenceValues", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshUniqueUVCount", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "numRequired", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateEditableMeshVertColors", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Default": "true", - "Name": "includeAlpha", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateHSRMeshIds", - "Parameters": [ - { - "Name": "wrapLayerInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "hsrInstance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidatePartBBoxAfterFullFacs", - "Parameters": [ - { - "Name": "headEditableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "partEditableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - }, - { - "Name": "headScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "partScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "boundsMaxMultiplier", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidatePropertiesSensible", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Default": "nil", - "Name": "stringLenRestrictions", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateSkinnedEditableMesh", - "Parameters": [ - { - "Name": "editableMesh", - "Type": { - "Category": "Class", - "Name": "EditableMesh" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CalculateBodyMaxCageDistance", - "Parameters": [ - { - "Name": "inputBodyParts", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CanLoadAsset", - "Parameters": [ - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CompareTextureOverlapByteString", - "Parameters": [ - { - "Name": "byteStringBaseline", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "byteStringFollowup", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CompareTextureOverlapTextureId", - "Parameters": [ - { - "Name": "textureIdBaseline", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "textureIdFollowup", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DoesMeshHaveSkinningData", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DoesSurfaceAppearanceMatchTexturePackAsync", - "Parameters": [ - { - "Name": "surfaceAppearance", - "Type": { - "Category": "Class", - "Name": "SurfaceAppearance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FetchAssetWithFormat", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Name": "assetFormat", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetCagingRelevancyMetrics", - "Parameters": [ - { - "Name": "innerCageMeshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "outerCageMeshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "refMeshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "offsetInner", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "offsetOuter", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDynamicHeadMeshInactiveControls", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "controlNames", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetFacsDrivenJointNamesFromMeshId", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetImageTransparencyWithTextureID", - "Parameters": [ - { - "Name": "textureId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMaxNearbyVerticesCollisions", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "meshScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMeshDataBinaryString", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "BinaryStringValue" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMeshTriCount", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMeshVertColors", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMeshVerts", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSkinnedJointNamesFromMeshId", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSkinningTransferJointsInfo", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTextureSize", - "Parameters": [ - { - "Name": "textureId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsDeformedLayeredClothingOutOfRenderBounds", - "Parameters": [ - { - "Name": "accessory", - "Type": { - "Category": "Class", - "Name": "Accessory" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateCageMeshIntersection", - "Parameters": [ - { - "Name": "innerCageMeshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "outerCageMeshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "refMeshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateCageUVCoincident", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateCageUVTriangleArea", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateDynamicHeadMesh", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateFacialBounds", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "boundsScale", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "partSize", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateFacialExpressiveness", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "minDelta", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "partSize", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateImageTransparencyThresholdByteString", - "Parameters": [ - { - "Name": "image", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "threshold", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateImageTransparencyThresholdByteString_V2", - "Parameters": [ - { - "Name": "image", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "threshold", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateImageTransparencyThresholdTextureID", - "Parameters": [ - { - "Name": "textureId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "threshold", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateImageTransparencyThresholdTextureID_V2", - "Parameters": [ - { - "Name": "textureId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "threshold", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateMeshVertColors", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "true", - "Name": "includeAlpha", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateOverlappingVertices", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidatePartBBoxAfterFullFacsFromMeshIds", - "Parameters": [ - { - "Name": "headMeshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "partMeshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "headScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "partScale", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "boundsMaxMultiplier", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateSkinnedMesh", - "Parameters": [ - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateTextureAlpha", - "Parameters": [ - { - "Name": "textureId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "pixelWidth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateTextureAlphaByteString", - "Parameters": [ - { - "Name": "byteString", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "pixelWidth", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ValidateUVValuesInReference", - "Parameters": [ - { - "Name": "referenceValues", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "meshId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UGCValidationService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "UIBase", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "UIComponent", - "Superclass": "UIBase", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "UIConstraint", - "Superclass": "UIComponent", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "AspectRatio", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "FitWithinMaxSize", - "MemberType": "Property", - "Name": "AspectType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AspectType" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "Width", - "MemberType": "Property", - "Name": "DominantAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "DominantAxis" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UIAspectRatioConstraint", - "Superclass": "UIConstraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "INF, INF", - "MemberType": "Property", - "Name": "MaxSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "0, 0", - "MemberType": "Property", - "Name": "MinSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UISizeConstraint", - "Superclass": "UIConstraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "100", - "MemberType": "Property", - "Name": "MaxTextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "MinTextSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UITextSizeConstraint", - "Superclass": "UIConstraint" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0, 8", - "MemberType": "Property", - "Name": "CornerRadius", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UICorner", - "Superclass": "UIComponent" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "", - "MemberType": "Property", - "Name": "ActivatedCursorIcon", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ActivatedCursorIconContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "Automatic", - "MemberType": "Property", - "Name": "BoundingBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UIDragDetectorBoundingBehavior" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "BoundingUI", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiBase2d" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "", - "MemberType": "Property", - "Name": "CursorIcon", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Image", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "CursorIconContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Drag Directions", - "Default": "1, 0", - "MemberType": "Property", - "Name": "DragAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "Absolute", - "MemberType": "Property", - "Name": "DragRelativity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UIDragDetectorDragRelativity" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Dragged Amount", - "Default": "0", - "MemberType": "Property", - "Name": "DragRotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "Parent", - "MemberType": "Property", - "Name": "DragSpace", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UIDragDetectorDragSpace" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "TranslatePlane", - "MemberType": "Property", - "Name": "DragStyle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UIDragDetectorDragStyle" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Dragged Amount", - "Default": "{0, 0}, {0, 0}", - "MemberType": "Property", - "Name": "DragUDim2", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Drag Limits", - "Default": "0", - "MemberType": "Property", - "Name": "MaxDragAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Drag Limits", - "Default": "{0, 0}, {0, 0}", - "MemberType": "Property", - "Name": "MaxDragTranslation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Drag Limits", - "Default": "0", - "MemberType": "Property", - "Name": "MinDragAngle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Drag Limits", - "Default": "{0, 0}, {0, 0}", - "MemberType": "Property", - "Name": "MinDragTranslation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ReferenceUIInstance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "Offset", - "MemberType": "Property", - "Name": "ResponseStyle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UIDragDetectorResponseStyle" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "{0, 300}, {0, 300}", - "MemberType": "Property", - "Name": "SelectionModeDragSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "90", - "MemberType": "Property", - "Name": "SelectionModeRotateSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "XY", - "MemberType": "Property", - "Name": "UIDragSpeedAxisMapping", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UIDragSpeedAxisMapping" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "AddConstraintFunction", - "Parameters": [ - { - "Name": "priority", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptConnection" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetReferencePosition", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "UDim2" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "GetReferenceRotation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "float" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetDragStyleFunction", - "Parameters": [ - { - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "DragContinue", - "Parameters": [ - { - "Name": "inputPosition", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "DragEnd", - "Parameters": [ - { - "Name": "inputPosition", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "DragStart", - "Parameters": [ - { - "Name": "inputPosition", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UIDragDetector", - "Superclass": "UIComponent" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "None", - "MemberType": "Property", - "Name": "FlexMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UIFlexMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "GrowRatio", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "Automatic", - "MemberType": "Property", - "Name": "ItemLineAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ItemLineAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "ShrinkRatio", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UIFlexItem", - "Superclass": "UIComponent" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0 1 1 1 0 1 1 1 1 0 ", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ColorSequence" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0, 0", - "MemberType": "Property", - "Name": "Offset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "Rotation", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0 0 0 1 0 0 ", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "NumberSequence" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UIGradient", - "Superclass": "UIComponent" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "UILayout", - "Superclass": "UIComponent", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "AbsoluteContentSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "FillDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "FillDirection" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Alignment", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "HorizontalAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "HorizontalAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "SortOrder", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SortOrder" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Alignment", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "VerticalAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VerticalAlignment" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "ApplyLayout", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "SetCustomSortFunction", - "Parameters": [ - { - "Default": "nil", - "Name": "function", - "Type": { - "Category": "DataType", - "Name": "Function" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UIGridStyleLayout", - "Superclass": "UILayout", - "Tags": [ - "NotCreatable", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "AbsoluteCellCount", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "100, 100", - "MemberType": "Property", - "Name": "AbsoluteCellSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "Unsafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "{0, 5}, {0, 5}", - "MemberType": "Property", - "Name": "CellPadding", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "{0, 100}, {0, 100}", - "MemberType": "Property", - "Name": "CellSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "0", - "MemberType": "Property", - "Name": "FillDirectionMaxCells", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "TopLeft", - "MemberType": "Property", - "Name": "StartCorner", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "StartCorner" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UIGridLayout", - "Superclass": "UIGridStyleLayout" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Alignment", - "Default": "None", - "MemberType": "Property", - "Name": "HorizontalFlex", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UIFlexAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "HorizontalPadding", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Alignment", - "Default": "Automatic", - "MemberType": "Property", - "Name": "ItemLineAlignment", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ItemLineAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0, 0", - "MemberType": "Property", - "Name": "Padding", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Alignment", - "Default": "None", - "MemberType": "Property", - "Name": "VerticalFlex", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UIFlexAlignment" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "0, 0", - "MemberType": "Property", - "Name": "VerticalPadding", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "Wraps", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UIListLayout", - "Superclass": "UIGridStyleLayout" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "true", - "MemberType": "Property", - "Name": "Animated", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "Circular", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "CurrentPage", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "GuiObject" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "Out", - "MemberType": "Property", - "Name": "EasingDirection", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "EasingDirection" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "Back", - "MemberType": "Property", - "Name": "EasingStyle", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "EasingStyle" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Input", - "Default": "true", - "MemberType": "Property", - "Name": "GamepadInputEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0, 0", - "MemberType": "Property", - "Name": "Padding", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Input", - "Default": "true", - "MemberType": "Property", - "Name": "ScrollWheelInputEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Input", - "Default": "true", - "MemberType": "Property", - "Name": "TouchInputEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "TweenTime", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "JumpTo", - "Parameters": [ - { - "Name": "page", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "JumpToIndex", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "Next", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Function", - "Name": "Previous", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "PageEnter", - "Parameters": [ - { - "Name": "page", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "PageLeave", - "Parameters": [ - { - "Name": "page", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "UI" - ], - "MemberType": "Event", - "Name": "Stopped", - "Parameters": [ - { - "Name": "currentPage", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UIPageLayout", - "Superclass": "UIGridStyleLayout" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "FillEmptySpaceColumns", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "false", - "MemberType": "Property", - "Name": "FillEmptySpaceRows", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "RowMajor", - "MemberType": "Property", - "Name": "MajorAxis", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TableMajorAxis" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "{0, 0}, {0, 0}", - "MemberType": "Property", - "Name": "Padding", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim2" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UITableLayout", - "Superclass": "UIGridStyleLayout" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "0, 0", - "MemberType": "Property", - "Name": "PaddingBottom", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "0, 0", - "MemberType": "Property", - "Name": "PaddingLeft", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "0, 0", - "MemberType": "Property", - "Name": "PaddingRight", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "0, 0", - "MemberType": "Property", - "Name": "PaddingTop", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UIPadding", - "Superclass": "UIComponent" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Behavior", - "Default": "1", - "MemberType": "Property", - "Name": "Scale", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UIScale", - "Superclass": "UIComponent" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "Contextual", - "MemberType": "Property", - "Name": "ApplyStrokeMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ApplyStrokeMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0, 0", - "MemberType": "Property", - "Name": "BorderOffset", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "UDim" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "Outer", - "MemberType": "Property", - "Name": "BorderStrokePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "BorderStrokePosition" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Color", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "Round", - "MemberType": "Property", - "Name": "LineJoinMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "LineJoinMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "FixedSize", - "MemberType": "Property", - "Name": "StrokeSizingMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "StrokeSizingMode" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "Thickness", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "0", - "MemberType": "Property", - "Name": "Transparency", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "UI" - ] - }, - "Category": "Appearance", - "Default": "1", - "MemberType": "Property", - "Name": "ZIndex", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "Instances", - "Name": "UIStroke", - "Superclass": "UIComponent" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "UIDragDetectorService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetInstanceByRfc4122String", - "Parameters": [ - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "Instance" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetOrCreateUniqueId", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "RemoteCommand" - ], - "MemberType": "Function", - "Name": "GetOrCreateUniqueIdRemoteCommand", - "Parameters": [ - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UniqueIdLookupService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "{\"lastSaveTime\":0,\"lastKnownPublishRequest\":0,\"users\":[]}", - "MemberType": "Property", - "Name": "CachedData", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "AppendTempAssetId", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "lookAt", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "camPos", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "usage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "AppendVantagePoint", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "id", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "lookAt", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "Name": "camPos", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UpgradeTempAssetId", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "tempId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "assetId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UnvalidatedAssetService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AllTutorialsDisabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "BadgeVisible", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "CustomCameraMode" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CameraYInverted", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ChatTranslationEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ChatTranslationFTUXShown", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ChatTranslationLocale", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ChatTranslationToggleEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ChatVisible", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "CompletedTutorials", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ComputerCameraMovementChanged", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ComputerCameraMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ComputerCameraMovementMode" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ComputerMovementChanged", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ComputerMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ComputerMovementMode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ControlMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "ControlMode" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "DefaultCameraID", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "FramerateCap", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "Fullscreen", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "GamepadCameraSensitivity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "GraphicsOptimizationMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "GraphicsOptimizationMode" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "GraphicsQualityLevel", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HapticStrength", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "HasEverUsedVR", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IsUsingCameraYInverted", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "IsUsingGamepadCameraSensitivity", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MasterVolume", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MasterVolumeStudio", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MaxQualityEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MicroProfilerWebServerEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MicroProfilerWebServerIP", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MicroProfilerWebServerPort", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MouseSensitivity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MouseSensitivityFirstPerson", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MouseSensitivityThirdPerson", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OnScreenProfilerEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OnboardingsCompleted", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PartyVoiceVolume", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PeoplePageLayout", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PeoplePageLayout" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PerformanceStatsVisible", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PlayerHeight", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PlayerListVisible", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PlayerNamesEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PreferredTextSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PreferredTextSize" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PreferredTransparency", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "QualityResetLevel", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RCCProfilerRecordFrameRate", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RCCProfilerRecordTimeFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ReadAloud", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ReducedMotion", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RotationType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "RotationType" - } - }, - { - "Capabilities": { - "Read": [ - "Players" - ], - "Write": [ - "Players" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "SavedQualityLevel", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "SavedQualitySetting" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "StartMaximized", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "StartScreenPosition", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "StartScreenSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TouchCameraMovementChanged", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TouchCameraMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TouchCameraMovementMode" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TouchMovementChanged", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TouchMovementMode", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "TouchMovementMode" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UiNavigationKeyBindEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UsedCoreGuiIsVisibleToggle", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UsedCustomGuiIsVisibleToggle", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UsedHideHudShortcut", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VRComfortSetting", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VRComfortSetting" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VREnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VRRotationIntensity", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Category": "Control", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VRSafetyBubbleMode", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VRSafetyBubbleMode" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VRSmoothRotationEnabled", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VRSmoothRotationEnabledCustomOption", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VRThirdPersonFollowCamEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VRThirdPersonFollowCamEnabledCustomOption", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VignetteEnabled", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VignetteEnabledCustomOption", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Configuration", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "gaID", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetCameraYInvertValue", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetDefaultFramerateCap", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "GetOnboardingCompleted", - "Parameters": [ - { - "Name": "onboardingId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetTutorialState", - "Parameters": [ - { - "Name": "tutorialId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "InFullScreen", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "InStudioMode", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ResetOnboardingCompleted", - "Parameters": [ - { - "Name": "onboardingId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetCameraYInvertVisible", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetGamepadCameraSensitivityVisible", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Players" - ], - "MemberType": "Function", - "Name": "SetOnboardingCompleted", - "Parameters": [ - { - "Name": "onboardingId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetTutorialState", - "Parameters": [ - { - "Name": "tutorialId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "FullscreenChanged", - "Parameters": [ - { - "Name": "isFullscreen", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PerformanceStatsVisibleChanged", - "Parameters": [ - { - "Name": "isPerformanceStatsVisible", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StudioModeChanged", - "Parameters": [ - { - "Name": "isStudioMode", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UserGameSettings", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "AccelerometerEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "BottomBarSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "GamepadEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "GyroscopeEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "KeyboardEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "LegacyInputEventsEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "ModalEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "TouchControlsEnabled", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MouseBehavior", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "MouseBehavior" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MouseDeltaSensitivity", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MouseEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MouseIcon", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "ContentId" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MouseIconContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "MouseIconEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "NavBarSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OnScreenKeyboardAnimationDuration", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OnScreenKeyboardPosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OnScreenKeyboardSize", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OnScreenKeyboardVisible", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "OverrideMouseIconBehavior", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "OverrideMouseIconBehavior" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "PreferredInput", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "PreferredInput" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "RightBarSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "StatusBarSize", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TouchEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "TouchScreenEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "UserHeadCFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "__api_dump_skipped_class__", - "MemberType": "Property", - "Name": "VREnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GamepadSupports", - "Parameters": [ - { - "Name": "gamepadNum", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Name": "gamepadKeyCode", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetConnectedGamepads", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetDeviceAcceleration", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "InputObject" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetDeviceGravity", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "InputObject" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetDeviceLevel", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "DeviceLevel" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetDeviceRotation", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetDeviceType", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "DeviceType" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetFocusedTextBox", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "TextBox" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetGamepadConnected", - "Parameters": [ - { - "Name": "gamepadNum", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetGamepadState", - "Parameters": [ - { - "Name": "gamepadNum", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetImageForKeyCode", - "Parameters": [ - { - "Name": "keyCode", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "ContentId" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetKeysPressed", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetLastInputType", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "UserInputType" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetMouseButtonsPressed", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetMouseDelta", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetMouseLocation", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector2" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetNavigationGamepads", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetPasteText", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetPlatform", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "Platform" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetStringForKeyCode", - "Parameters": [ - { - "Name": "keyCode", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetSupportedGamepadKeyCodes", - "Parameters": [ - { - "Name": "gamepadNum", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetUserCFrame", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Enum", - "Name": "UserCFrame" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "GetUserCFrame", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "IsGamepadButtonDown", - "Parameters": [ - { - "Name": "gamepadNum", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Name": "gamepadKeyCode", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "IsKeyDown", - "Parameters": [ - { - "Name": "keyCode", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "IsMouseButtonPressed", - "Parameters": [ - { - "Name": "mouseButton", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "IsNavigationGamepad", - "Parameters": [ - { - "Name": "gamepadEnum", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "RecenterUserHeadCFrame", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SendAppUISizes", - "Parameters": [ - { - "Name": "statusBarSize", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "navBarSize", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "bottomBarSize", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "rightBarSize", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetNavigationGamepad", - "Parameters": [ - { - "Name": "gamepadEnum", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - }, - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "DeviceAccelerationChanged", - "Parameters": [ - { - "Name": "acceleration", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "DeviceGravityChanged", - "Parameters": [ - { - "Name": "gravity", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "DeviceRotationChanged", - "Parameters": [ - { - "Name": "rotation", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "GamepadConnected", - "Parameters": [ - { - "Name": "gamepadNum", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "GamepadDisconnected", - "Parameters": [ - { - "Name": "gamepadNum", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "InputBegan", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "InputChanged", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "InputEnded", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "JumpRequest", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "LastInputTypeChanged", - "Parameters": [ - { - "Name": "lastInputType", - "Type": { - "Category": "Enum", - "Name": "UserInputType" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "PointerAction", - "Parameters": [ - { - "Name": "wheel", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "pan", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "pinch", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "StatusBarTapped", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TextBoxFocusReleased", - "Parameters": [ - { - "Name": "textboxReleased", - "Type": { - "Category": "Class", - "Name": "TextBox" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TextBoxFocused", - "Parameters": [ - { - "Name": "textboxFocused", - "Type": { - "Category": "Class", - "Name": "TextBox" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchDrag", - "Parameters": [ - { - "Name": "dragDirection", - "Type": { - "Category": "Enum", - "Name": "SwipeDirection" - } - }, - { - "Name": "numberOfTouches", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchEnded", - "Parameters": [ - { - "Name": "touch", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchLongPress", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "UserInputState" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchMoved", - "Parameters": [ - { - "Name": "touch", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchPan", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "totalTranslation", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "velocity", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "UserInputState" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchPinch", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "scale", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "velocity", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "UserInputState" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchRotate", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "rotation", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "velocity", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "state", - "Type": { - "Category": "Enum", - "Name": "UserInputState" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchStarted", - "Parameters": [ - { - "Name": "touch", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchSwipe", - "Parameters": [ - { - "Name": "swipeDirection", - "Type": { - "Category": "Enum", - "Name": "SwipeDirection" - } - }, - { - "Name": "numberOfTouches", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchTap", - "Parameters": [ - { - "Name": "touchPositions", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "gameProcessedEvent", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchTapInWorld", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Name": "processedByUI", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "UserCFrameChanged", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Enum", - "Name": "UserCFrame" - } - }, - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "UserCFrameChanged", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "WindowFocusReleased", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "WindowFocused", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UserInputService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetUserInfosByUserIdsAsync", - "Parameters": [ - { - "Name": "userIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "UserService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "World", - "MemberType": "Property", - "Name": "AutomaticScaling", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VRScaling" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "AvatarGestures", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "Transparent", - "MemberType": "Property", - "Name": "ControllerModels", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VRControllerModelMode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "DidPointerHit", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "FadeOutViewOnCollision", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "Head", - "MemberType": "Property", - "Name": "GuiInputUserCFrame", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "UserCFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "50", - "MemberType": "Property", - "Name": "LaserDistance", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Behavior", - "Default": "Pointer", - "MemberType": "Property", - "Name": "LaserPointer", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VRLaserPointerMode" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "PointerHitCFrame", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "QuestASWState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "QuestDisplayRefreshRate", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "true", - "MemberType": "Property", - "Name": "ThirdPersonFollowCamEnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "VRDeviceAvailable", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "VRDeviceName", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ], - "Write": [ - "Input" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "VREnabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Input" - ] - }, - "Category": "Data", - "Default": "Undefined", - "MemberType": "Property", - "Name": "VRSessionState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VRSessionState" - } - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetTouchpadMode", - "Parameters": [ - { - "Name": "pad", - "Type": { - "Category": "Enum", - "Name": "VRTouchpad" - } - } - ], - "ReturnType": { - "Category": "Enum", - "Name": "VRTouchpadMode" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetUserCFrame", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Enum", - "Name": "UserCFrame" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "CFrame" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "GetUserCFrameEnabled", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Enum", - "Name": "UserCFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "IsMaquettes", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "IsVRAppBuild", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "RecenterUserHeadCFrame", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "RequestNavigation", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "inputUserCFrame", - "Type": { - "Category": "Enum", - "Name": "UserCFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Function", - "Name": "SetTouchpadMode", - "Parameters": [ - { - "Name": "pad", - "Type": { - "Category": "Enum", - "Name": "VRTouchpad" - } - }, - { - "Name": "mode", - "Type": { - "Category": "Enum", - "Name": "VRTouchpadMode" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "LaserPointerTriggered", - "Parameters": [ - { - "Name": "input", - "Type": { - "Category": "Class", - "Name": "InputObject" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "NavigationRequested", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "inputUserCFrame", - "Type": { - "Category": "Enum", - "Name": "UserCFrame" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "TouchpadModeChanged", - "Parameters": [ - { - "Name": "pad", - "Type": { - "Category": "Enum", - "Name": "VRTouchpad" - } - }, - { - "Name": "mode", - "Type": { - "Category": "Enum", - "Name": "VRTouchpadMode" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "UserCFrameChanged", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Enum", - "Name": "UserCFrame" - } - }, - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Input" - ], - "MemberType": "Event", - "Name": "UserCFrameEnabled", - "Parameters": [ - { - "Name": "type", - "Type": { - "Category": "Enum", - "Name": "UserCFrame" - } - }, - { - "Name": "enabled", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VRService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "VRStatusService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "ValueBase", - "Superclass": "Instance", - "Tags": [ - "NotCreatable" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "BinaryString" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BinaryStringValue", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BoolValue", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BrickColor" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "BrickColor" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "BrickColor" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "BrickColorValue", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "CFrameValue", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Color3" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "Color3" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "Color3" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Color3Value", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "ConstrainedValue", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Data", - "Default": "1", - "MemberType": "Property", - "Name": "MaxValue", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MinValue", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "DoubleConstrainedValue", - "Superclass": "ValueBase", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "ConstrainedValue", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "10", - "MemberType": "Property", - "Name": "MaxValue", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "MinValue", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "IntConstrainedValue", - "Superclass": "ValueBase", - "Tags": [ - "Deprecated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "IntValue", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "double" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "NumberValue", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ObjectValue", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "{0, 0, 0}, {0, 0, 0}", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Ray" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "Ray" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "RayValue", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "StringValue", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Category": "Data", - "Default": "0, 0, 0", - "MemberType": "Property", - "Name": "Value", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector3" - } - }, - { - "MemberType": "Event", - "Name": "Changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "changed", - "Parameters": [ - { - "Name": "value", - "Type": { - "Category": "DataType", - "Name": "Vector3" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated", - { - "PreferredDescriptorName": "Changed", - "ThreadSafety": "Unknown" - } - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Vector3Value", - "Superclass": "ValueBase" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "0", - "MemberType": "Property", - "Name": "Length", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "nil", - "MemberType": "Property", - "Name": "ValueType", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Data", - "Default": "\u0002", - "MemberType": "Property", - "Name": "ValuesAndTimes", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "BinaryString" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetKeyAtIndex", - "Parameters": [ - { - "Name": "index", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "ValueCurveKey" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetKeyIndicesAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetKeys", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetValueAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Variant?" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "InsertKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "DataType", - "Name": "ValueCurveKey" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "InsertKeyValue", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "value", - "Type": { - "Category": "Group", - "Name": "Variant" - } - }, - { - "Default": "Constant", - "Name": "keyInterpolationMode", - "Type": { - "Category": "Enum", - "Name": "KeyInterpolationMode" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RemoveKeyAtIndex", - "Parameters": [ - { - "Name": "startingIndex", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Default": "1", - "Name": "count", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "SetKeys", - "Parameters": [ - { - "Name": "keys", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "ValueCurve", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "GetValueAtTime", - "Parameters": [ - { - "Name": "time", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "X", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "FloatCurve" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Y", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "FloatCurve" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "Z", - "Parameters": [ - ], - "ReturnType": { - "Category": "Class", - "Name": "FloatCurve" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Vector3Curve", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "ScriptCollabEnabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "ScriptCollabVersionHistoryEnabled", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "MemberType": "Event", - "Name": "BroadcastScriptChangesSubmitted", - "Parameters": [ - { - "Name": "scriptGuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "CommitRejectedInfo", - "Parameters": [ - { - "Name": "reason", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "LockedScriptBatchCommit", - "Parameters": [ - { - "Name": "scriptGuidTuple", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - }, - { - "Name": "scriptTextTuple", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - }, - { - "Name": "commitMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RequestAllEditorsSignal", - "Parameters": [ - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptBatchCommit", - "Parameters": [ - { - "Name": "scriptGuidTuple", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - }, - { - "Name": "scriptHashBaseTuple", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - }, - { - "Name": "scriptTextTuple", - "Type": { - "Category": "Group", - "Name": "Tuple" - } - }, - { - "Name": "commitMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptChangesSubmitted", - "Parameters": [ - { - "Name": "scriptGuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "submitted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptEditorAdded", - "Parameters": [ - { - "Name": "scriptGuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "editor", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptEditorRemoved", - "Parameters": [ - { - "Name": "scriptGuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "editor", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptStartEdit", - "Parameters": [ - { - "Name": "scriptGuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ScriptStopEdit", - "Parameters": [ - { - "Name": "scriptGuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "LocalUserSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VersionControlService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "CameraID", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "GetCameraDevices", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Map" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DevicesChanged", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Error", - "Parameters": [ - { - "Name": "cameraid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "errorcode", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Started", - "Parameters": [ - { - "Name": "cameraid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Stopped", - "Parameters": [ - { - "Name": "cameraid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VideoCaptureService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "CameraId", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "Data", - "Default": "Default", - "MemberType": "Property", - "Name": "CaptureQuality", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VideoDeviceCaptureQuality" - } - }, - { - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "IsReady", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "MemoryCategory": "Instances", - "Name": "VideoDeviceInput", - "Superclass": "Instance", - "Tags": [ - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Debug", - "Default": "false", - "MemberType": "Property", - "Name": "AutoLoadInStudio", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Debug", - "Default": "false", - "MemberType": "Property", - "Name": "AutoPlayInStudio", - "Security": { - "Read": "None", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Asset", - "Default": "false", - "MemberType": "Property", - "Name": "IsLoaded", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "IsPlaying", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "Looping", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Playback", - "Default": "1", - "MemberType": "Property", - "Name": "PlaybackSpeed", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Category": "Playback", - "Default": "false", - "MemberType": "Property", - "Name": "PlayingReplicating", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "Asset", - "Default": "0, 0", - "MemberType": "Property", - "Name": "Resolution", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Category": "Asset", - "Default": "0", - "MemberType": "Property", - "Name": "TimeLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Playback", - "Default": "0", - "MemberType": "Property", - "Name": "TimePosition", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Asset", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "VideoContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Category": "State", - "Default": "1", - "MemberType": "Property", - "Name": "Volume", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "MemberType": "Function", - "Name": "GetConnectedWires", - "Parameters": [ - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "Instances" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetInputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetOutputPins", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Pause", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Play", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetStudioPreview", - "Parameters": [ - { - "Name": "isPreview", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Unload", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LoadAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Enum", - "Name": "AssetFetchStatus" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DidEnd", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "DidLoop", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PlayFailed", - "Parameters": [ - { - "Name": "error", - "Type": { - "Category": "Enum", - "Name": "AssetFetchStatus" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "WiringChanged", - "Parameters": [ - { - "Name": "connected", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "pin", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "wire", - "Type": { - "Category": "Class", - "Name": "Wire" - } - }, - { - "Name": "instance", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VideoPlayer", - "Superclass": "Instance", - "Tags": [ - "NotBrowsable" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "VideoScreenCaptureService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CreateVideoSamplerAsync", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary?" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "VideoSampler" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PlaybackReport", - "Parameters": [ - { - "Name": "timePlayedMs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "timeDownloadedMs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "timeVisibleMs", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VideoService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "", - "MemberType": "Property", - "Name": "AdditionalLuaState", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "MemberType": "Function", - "Name": "Dump", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HandleGamepadAxisInput", - "Parameters": [ - { - "Name": "objectId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "keyCode", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HandleGamepadButtonInput", - "Parameters": [ - { - "Name": "deviceId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "keyCode", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Name": "buttonState", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HandleGamepadConnect", - "Parameters": [ - { - "Name": "deviceId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "HandleGamepadDisconnect", - "Parameters": [ - { - "Name": "deviceId", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendAccelerometerEvent", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendGravityEvent", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "z", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendGyroscopeEvent", - "Parameters": [ - { - "Name": "quatX", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "quatY", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "quatZ", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "quatW", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendKeyEvent", - "Parameters": [ - { - "Name": "isPressed", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "keyCode", - "Type": { - "Category": "Enum", - "Name": "KeyCode" - } - }, - { - "Name": "isRepeatedKey", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "layerCollector", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendMouseButtonEvent", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "mouseButton", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "isDown", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "layerCollector", - "Type": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Name": "repeatCount", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendMouseMoveDeltaEvent", - "Parameters": [ - { - "Name": "deltaX", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "deltaY", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "layerCollector", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendMouseMoveEvent", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "layerCollector", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendMouseWheelEvent", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "isForwardScroll", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "layerCollector", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendScroll", - "Parameters": [ - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "deltaX", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "deltaY", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "options", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - }, - { - "Name": "layerCollector", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendTextInputCharacterEvent", - "Parameters": [ - { - "Name": "str", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "layerCollector", - "Type": { - "Category": "Class", - "Name": "Instance" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SendTouchEvent", - "Parameters": [ - { - "Name": "touchId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "state", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "x", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "y", - "Type": { - "Category": "Primitive", - "Name": "float" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetInputTypesToIgnore", - "Parameters": [ - { - "Name": "inputTypesToIgnore", - "Type": { - "Category": "Group", - "Name": "Variant" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartPlaying", - "Parameters": [ - { - "Name": "fileName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartPlayingJSON", - "Parameters": [ - { - "Name": "string", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StopPlaying", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StopRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "sendRobloxEvent", - "Parameters": [ - { - "Name": "namespace", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "detail", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "detailType", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "sendThemeChangeEvent", - "Parameters": [ - { - "Name": "themeName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "WaitForInputEventsProcessed", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PlaybackCompleted", - "Parameters": [ - { - "Name": "additionalLuaState", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "RecordingCompleted", - "Parameters": [ - { - "Name": "result", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VirtualInputManager", - "Superclass": "Instance", - "Tags": [ - "Service" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "Button1Down", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Default": "Identity", - "Name": "camera", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Button1Up", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Default": "Identity", - "Name": "camera", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Button2Down", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Default": "Identity", - "Name": "camera", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Button2Up", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Default": "Identity", - "Name": "camera", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "CaptureController", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ClickButton1", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Default": "Identity", - "Name": "camera", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ClickButton2", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Default": "Identity", - "Name": "camera", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "MoveMouse", - "Parameters": [ - { - "Name": "position", - "Type": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Default": "Identity", - "Name": "camera", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetKeyDown", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetKeyUp", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StartRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "StopRecording", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "TypeKey", - "Parameters": [ - { - "Name": "key", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "LocalUserSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VirtualUser", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "VisibilityCheckDispatcher", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "Visit", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "", - "MemberType": "Property", - "Name": "Title", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Category": "State", - "Default": "", - "MemberType": "Property", - "Name": "ToolTip", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "VisualizationMode", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Category": "State", - "Default": "", - "MemberType": "Property", - "Name": "Title", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "MemoryCategory": "Instances", - "Name": "VisualizationModeCategory", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "VisualizationModeService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "State", - "Default": "Idle", - "MemberType": "Property", - "Name": "VoiceChatState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden", - "ReadOnly", - "NotReplicated", - "Deprecated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VoiceChatState" - } - }, - { - "MemberType": "Function", - "Name": "GetAndClearCallFailureMessage", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetAudioProcessingSettings", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetChannelId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetGroupId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetMicDevices", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetParticipants", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSessionId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetSpeakerDevices", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Tuple" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetVoiceChatApiVersion", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetVoiceChatAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetVoiceExperienceId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsContextVoiceEnabled", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsPublishPaused", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsSubscribePaused", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "JoinByGroupId", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Default": "false", - "Name": "isMicMuted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "JoinByGroupIdToken", - "Parameters": [ - { - "Name": "groupId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "isMicMuted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Default": "false", - "Name": "isRetry", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Leave", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogPublisherWebRTCStats", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "LogSubscriptionWebRTCStats", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "PublishPause", - "Parameters": [ - { - "Name": "paused", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetMicDevice", - "Parameters": [ - { - "Name": "micDeviceName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "micDeviceGuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SetSpeakerDevice", - "Parameters": [ - { - "Name": "speakerDeviceName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "speakerDeviceGuid", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SubscribeBlock", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SubscribePause", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "paused", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SubscribePauseAll", - "Parameters": [ - { - "Name": "paused", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SubscribeRetry", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "SubscribeUnblock", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsVoiceEnabledForUserIdAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "LocalPlayerModerated", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "ParticipantsStateChanged", - "Parameters": [ - { - "Name": "participantsLeft", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "participantsJoined", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "updatedStates", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "PlayerMicActivitySignalChange", - "Parameters": [ - { - "Name": "activityInfo", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "RobloxScriptSecurity", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "StateChanged", - "Parameters": [ - { - "Name": "old", - "Type": { - "Category": "Enum", - "Name": "VoiceChatState" - } - }, - { - "Name": "new", - "Type": { - "Category": "Enum", - "Name": "VoiceChatState" - } - } - ], - "Security": "None", - "Tags": [ - "Deprecated" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "TempSetMicMutedToggleMic", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VoiceChatInternal", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotBrowsable" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Audio", - "Chat" - ] - }, - "Category": "Behavior", - "Default": "Inverse", - "MemberType": "Property", - "Name": "DefaultDistanceAttenuation", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "VoiceChatDistanceAttenuationType" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Chat" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "EnableDefaultVoice", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Chat" - ] - }, - "Category": "Behavior", - "Default": "Automatic", - "MemberType": "Property", - "Name": "UseAudioApi", - "Security": { - "Read": "PluginSecurity", - "Write": "PluginSecurity" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "AudioApiRollout" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "UseNewAudioApi", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "UseNewControlPaths", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "UseNewJoinFlow", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Chat" - ] - }, - "Category": "Data", - "Default": "false", - "MemberType": "Property", - "Name": "UseStreamSwitching", - "Security": { - "Read": "RobloxSecurity", - "Write": "RobloxSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Chat" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "VoiceChatEnabledForPlaceOnRcc", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Audio", - "Chat" - ] - }, - "Category": "State", - "Default": "false", - "MemberType": "Property", - "Name": "VoiceChatEnabledForUniverseOnRcc", - "Security": { - "Read": "RobloxScriptSecurity", - "Write": "RobloxScriptSecurity" - }, - "Serialization": { - "CanLoad": false, - "CanSave": false - }, - "Tags": [ - "Hidden" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "getInternalChannelId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "getInternalGroupId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "getInternalPublishPause", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "getInternalSessionId", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "string" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "getInternalSubscribePause", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "getInternalSubscribePauseAll", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "getInternalVoiceChatApiVersion", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "int" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "isInternalPublishPaused", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "joinVoice", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "lastVoiceChatStats", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "leaveVoice", - "Parameters": [ - { - "Default": "LuaInitiated", - "Name": "leaveReason", - "Type": { - "Category": "Enum", - "Name": "VoiceClientLeaveReasons" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "notifyServerACSCleanup", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "rejoinVoice", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "GetChatGroupsAsync", - "Parameters": [ - { - "Name": "players", - "Type": { - "Category": "DataType", - "Name": "Instances" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Function", - "Name": "IsVoiceEnabledForUserIdAsync", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "ACSCleanup", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "ClientRetryJoin", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "ClientRetryJoinWithConfig", - "Parameters": [ - { - "Name": "sessionConfigFlags", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "ClientStreamSwitchAck", - "Parameters": [ - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "FetchUserTurnAuthOperationFailed", - "Parameters": [ - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "JoinedVoice", - "Parameters": [ - { - "Name": "channelName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "participantId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "channelId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "PublishStateChange", - "Parameters": [ - { - "Name": "muteState", - "Type": { - "Category": "Enum", - "Name": "MuteState" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "PublishingHandshakeAcked", - "Parameters": [ - { - "Name": "handshakeAnswer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "PublishingHandshakeAckedWithBothSdp", - "Parameters": [ - { - "Name": "fullHandshakeAnswer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressedHandshakeAnswer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressMode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "PublishingHandshakeAckedWithCompressedSdp", - "Parameters": [ - { - "Name": "compressedHandshakeAnswer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressMode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "PublishingHandshakeCompleted", - "Parameters": [ - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "PublishingHandshakeInitiated", - "Parameters": [ - { - "Name": "handshakeOffer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "muteState", - "Type": { - "Category": "Enum", - "Name": "MuteState" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "PublishingHandshakeInitiatedWithBothSdp", - "Parameters": [ - { - "Name": "fullHandshakeOffer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressedHandshakeOffer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "muteState", - "Type": { - "Category": "Enum", - "Name": "MuteState" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressMode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "PublishingHandshakeInitiatedWithCompressedSdp", - "Parameters": [ - { - "Name": "compressedHandshakeOffer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "muteState", - "Type": { - "Category": "Enum", - "Name": "MuteState" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressMode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "ReJoinedVoice", - "Parameters": [ - { - "Name": "channelName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "participantId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "channelId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "RelayCandidatesGathered", - "Parameters": [ - { - "Name": "voiceControlPath", - "Type": { - "Category": "Enum", - "Name": "VoiceControlPath" - } - }, - { - "Name": "serializedIceCandidates", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "isLast", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "clientIp", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "clientPort", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SsrcUserIdMappingUpdate", - "Parameters": [ - { - "Name": "ssrcs", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "userIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscribeStateChange", - "Parameters": [ - { - "Name": "muteState", - "Type": { - "Category": "Enum", - "Name": "MuteState" - } - }, - { - "Name": "userIds", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscriptionFeedStarted", - "Parameters": [ - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscriptionHandshakeAcked", - "Parameters": [ - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "handshakeAnswer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "usersToMute", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscriptionHandshakeAckedWithBothSdp", - "Parameters": [ - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "fullHandshakeAnswer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressedSdpAnswer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "usersToMute", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressMode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscriptionHandshakeAckedWithCompressedSdp", - "Parameters": [ - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "compressedSdpAnswer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "usersToMute", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressMode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscriptionHandshakeCompleted", - "Parameters": [ - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscriptionHandshakeInitiated", - "Parameters": [ - { - "Name": "handshakeOffer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newSubscriptionStates", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "isNewConnection", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscriptionHandshakeInitiatedWithBothSdp", - "Parameters": [ - { - "Name": "fullHandshakeOffer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "compressedHandshakeOffer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newSubscriptionStates", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "isNewConnection", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "compressMode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscriptionHandshakeInitiatedWithCompressedSdp", - "Parameters": [ - { - "Name": "compressedHandshakeOffer", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "newSubscriptionStates", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "isNewConnection", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "eventTag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "compressMode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "SubscriptionReset", - "Parameters": [ - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "UpdateTurnAuthInfoRequest", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "UserTurnAuth", - "Parameters": [ - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "userName", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "password", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "ttl", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "uris", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceChatClientVoiceCapability", - "Parameters": [ - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceChatClientVoiceCapabilityWithConfig", - "Parameters": [ - { - "Name": "sessionConfigFlags", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceChatPlayerMuteStateChangedClientToServer", - "Parameters": [ - { - "Name": "muteState", - "Type": { - "Category": "Enum", - "Name": "MuteState" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceChatPlayerMuteStateChangedServerToClient", - "Parameters": [ - { - "Name": "muteState", - "Type": { - "Category": "Enum", - "Name": "MuteState" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceChatSampleTaggedEventClientToServer", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceChatSampleTaggedEventServerToClient", - "Parameters": [ - { - "Name": "tag", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "value", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceChatStatsCollected", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceChatSubscriptionInitialBatchEmpty", - "Parameters": [ - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceChatplayerMuteStatusChangedEvent", - "Parameters": [ - { - "Name": "userId", - "Type": { - "Category": "Primitive", - "Name": "int64" - } - }, - { - "Name": "muted", - "Type": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceMigration", - "Parameters": [ - { - "Name": "reason", - "Type": { - "Category": "Enum", - "Name": "VoiceRccReconnectReason" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - }, - { - "Capabilities": [ - "Audio", - "Chat" - ], - "MemberType": "Event", - "Name": "VoiceSetupFailed", - "Parameters": [ - { - "Name": "voiceControlPath", - "Type": { - "Category": "Enum", - "Name": "VoiceControlPath" - } - }, - { - "Name": "serializedFailure", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "sessionId", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxSecurity", - "Tags": [ - "Hidden" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VoiceChatService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ConnectionState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "WebSocketState" - } - }, - { - "MemberType": "Function", - "Name": "Close", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Send", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Closed", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "MessageReceived", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Opened", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "WebSocketClient", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CreateClient", - "Parameters": [ - { - "Name": "uri", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Class", - "Name": "WebSocketClient" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "WebSocketService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CloseWindow", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "MutateWindow", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "title", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "isVisible", - "Type": { - "Category": "Primitive", - "Name": "bool?" - } - }, - { - "Name": "searchType", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "transitionAnimation", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "showDomainAsTitle", - "Type": { - "Category": "Primitive", - "Name": "bool?" - } - }, - { - "Name": "backButtonVisible", - "Type": { - "Category": "Primitive", - "Name": "bool?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "OpenWindow", - "Parameters": [ - { - "Name": "url", - "Type": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Name": "title", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "isVisible", - "Type": { - "Category": "Primitive", - "Name": "bool?" - } - }, - { - "Name": "searchType", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "transitionAnimation", - "Type": { - "Category": "Primitive", - "Name": "string?" - } - }, - { - "Name": "showDomainAsTitle", - "Type": { - "Category": "Primitive", - "Name": "bool?" - } - }, - { - "Name": "backButtonVisible", - "Type": { - "Category": "Primitive", - "Name": "bool?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "IsAvailable", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "bool" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnJavaScriptCall", - "Parameters": [ - { - "Name": "content", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "OnWindowClosed", - "Parameters": [ - ], - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "WebViewService", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Behavior", - "Default": "false", - "MemberType": "Property", - "Name": "Active", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Parts", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "CFrame0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Parts", - "Default": "0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1", - "MemberType": "Property", - "Name": "CFrame1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "Hidden", - "NotReplicated", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Behavior", - "Default": "true", - "MemberType": "Property", - "Name": "Enabled", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Parts", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Part0", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Parts", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Part0Internal", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Parts", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Part1", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": false - }, - "Tags": [ - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Parts", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "Part1Internal", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "BasePart" - } - }, - { - "Capabilities": { - "Read": [ - "Physics" - ] - }, - "Category": "Behavior", - "Default": "3", - "MemberType": "Property", - "Name": "State", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "Tags": [ - "Hidden", - "NotScriptable" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "MemoryCategory": "BaseParts", - "Name": "WeldConstraint", - "Superclass": "Instance" - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Connections", - "Default": "false", - "MemberType": "Property", - "Name": "Connected", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "bool" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Connections", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "SourceInstance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Connections", - "Default": "Output", - "MemberType": "Property", - "Name": "SourceName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Connections", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "TargetInstance", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Class", - "Name": "Instance" - } - }, - { - "Capabilities": { - "Read": [ - "Basic" - ] - }, - "Category": "Connections", - "Default": "Input", - "MemberType": "Property", - "Name": "TargetName", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "string" - } - }, - { - "Capabilities": [ - "Basic" - ], - "MemberType": "Function", - "Name": "RenameToDefault", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "Wire", - "Superclass": "Instance" - }, - { - "Members": [ - ], - "MemoryCategory": "Instances", - "Name": "WrapDeformMeshProvider", - "Superclass": "Instance", - "Tags": [ - "NotCreatable", - "Service", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "ReferenceCageMeshContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "-INF, -INF", - "MemberType": "Property", - "Name": "UVMaxBound", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - }, - { - "Capabilities": { - "Read": [ - "Avatar" - ] - }, - "Category": "Appearance", - "Default": "INF, INF", - "MemberType": "Property", - "Name": "UVMinBound", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": true, - "CanSave": true - }, - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Vector2" - } - } - ], - "MemoryCategory": "Instances", - "Name": "WrapTextureTransfer", - "Superclass": "Instance", - "Tags": [ - "NotBrowsable" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "ForwardAsync", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "MLSession", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CommitBlock", - "Parameters": [ - { - "Name": "block", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Ready", - "Parameters": [ - { - "Name": "block", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TerrainIterateOperation", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CommitBlock", - "Parameters": [ - { - "Name": "block", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Ready", - "Parameters": [ - { - "Name": "block", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TerrainModifyOperation", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Event", - "Name": "Ready", - "Parameters": [ - { - "Name": "block", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TerrainReadOperation", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "CommitBlock", - "Parameters": [ - { - "Name": "block", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "DataType", - "Name": "RBXScriptSignal" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "GetBlock", - "Parameters": [ - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "None", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "TerrainWriteOperation", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_failed_to_create_class__", - "MemberType": "Property", - "Name": "TimeLength", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Primitive", - "Name": "double" - } - }, - { - "Category": "Data", - "Default": "__api_dump_no_string_value__", - "MemberType": "Property", - "Name": "VideoContent", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "DataType", - "Name": "Content" - } - }, - { - "MemberType": "Function", - "Name": "GetSamplesAtTimesAsync", - "Parameters": [ - { - "Name": "times", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Array" - }, - "Security": "None", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VideoSampler", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "MemberType": "Function", - "Name": "GetSizeInVoxels", - "Parameters": [ - ], - "ReturnType": { - "Category": "DataType", - "Name": "Vector3" - }, - "Security": "RobloxScriptSecurity", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ReadVoxels", - "Parameters": [ - { - "Name": "channelIds", - "Type": { - "Category": "Group", - "Name": "Array" - } - } - ], - "ReturnType": { - "Category": "Group", - "Name": "Dictionary" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "WriteVoxels", - "Parameters": [ - { - "Name": "channels", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "CustomLuaState" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "ClearAsync", - "Parameters": [ - { - "Name": "sizeInVoxels", - "Type": { - "Category": "DataType", - "Name": "Vector3?" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "DrawBufferAsync", - "Parameters": [ - { - "Name": "cframe", - "Type": { - "Category": "DataType", - "Name": "CFrame" - } - }, - { - "Name": "scale", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "source", - "Type": { - "Category": "Class", - "Name": "VoxelBuffer" - } - }, - { - "Name": "mergeConfig", - "Type": { - "Category": "Group", - "Name": "Dictionary" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "FromHeightmapAsync", - "Parameters": [ - { - "Name": "heightMap", - "Type": { - "Category": "DataType", - "Name": "buffer" - } - }, - { - "Name": "width", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "height", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "heightMapRect", - "Type": { - "Category": "DataType", - "Name": "Rect" - } - }, - { - "Name": "offset", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "scale", - "Type": { - "Category": "Primitive", - "Name": "float" - } - }, - { - "Name": "material", - "Type": { - "Category": "Primitive", - "Name": "int" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "NormalizeAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "UnclampAsync", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "RobloxScriptSecurity", - "Tags": [ - "Yields" - ], - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "VoxelBuffer", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - }, - { - "Members": [ - { - "Category": "Data", - "Default": "__api_dump_class_not_creatable__", - "MemberType": "Property", - "Name": "ConnectionState", - "Security": { - "Read": "None", - "Write": "None" - }, - "Serialization": { - "CanLoad": false, - "CanSave": true - }, - "Tags": [ - "ReadOnly", - "NotReplicated" - ], - "ThreadSafety": "ReadSafe", - "ValueType": { - "Category": "Enum", - "Name": "WebStreamClientState" - } - }, - { - "MemberType": "Function", - "Name": "Close", - "Parameters": [ - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Function", - "Name": "Send", - "Parameters": [ - { - "Name": "data", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "ReturnType": { - "Category": "Primitive", - "Name": "null" - }, - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Closed", - "Parameters": [ - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Error", - "Parameters": [ - { - "Name": "responseStatusCode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "errorMessage", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "MessageReceived", - "Parameters": [ - { - "Name": "message", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - }, - { - "MemberType": "Event", - "Name": "Opened", - "Parameters": [ - { - "Name": "responseStatusCode", - "Type": { - "Category": "Primitive", - "Name": "int" - } - }, - { - "Name": "headers", - "Type": { - "Category": "Primitive", - "Name": "string" - } - } - ], - "Security": "None", - "ThreadSafety": "Unsafe" - } - ], - "MemoryCategory": "Instances", - "Name": "WebStreamClient", - "Superclass": "Object", - "Tags": [ - "NotCreatable", - "NotReplicated" - ] - } - ], - "Enums": [ - { - "Items": [ - { - "Name": "Allow", - "Value": 0 - }, - { - "Name": "Deny", - "Value": 1 - } - ], - "Name": "AccessModifierType" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "Hat", - "Value": 1 - }, - { - "Name": "Hair", - "Value": 2 - }, - { - "Name": "Face", - "Value": 3 - }, - { - "Name": "Neck", - "Value": 4 - }, - { - "Name": "Shoulder", - "Value": 5 - }, - { - "Name": "Front", - "Value": 6 - }, - { - "Name": "Back", - "Value": 7 - }, - { - "Name": "Waist", - "Value": 8 - }, - { - "LegacyNames": [ - "TeeShirt" - ], - "Name": "TShirt", - "Value": 9 - }, - { - "Name": "Shirt", - "Value": 10 - }, - { - "Name": "Pants", - "Value": 11 - }, - { - "Name": "Jacket", - "Value": 12 - }, - { - "Name": "Sweater", - "Value": 13 - }, - { - "Name": "Shorts", - "Value": 14 - }, - { - "Name": "LeftShoe", - "Value": 15 - }, - { - "Name": "RightShoe", - "Value": 16 - }, - { - "Name": "DressSkirt", - "Value": 17 - }, - { - "Name": "Eyebrow", - "Value": 18 - }, - { - "Name": "Eyelash", - "Value": 19 - } - ], - "Name": "AccessoryType" - }, - { - "Items": [ - { - "Name": "DontResume", - "Value": 0 - }, - { - "Name": "KeepStudio", - "Value": 1 - }, - { - "Name": "KeepLocal", - "Value": 2 - } - ], - "Name": "ActionOnAutoResumeSync" - }, - { - "Items": [ - { - "Name": "AlwaysAsk", - "Value": 0 - }, - { - "Name": "KeepLocalFiles", - "Value": 1 - }, - { - "Name": "DeleteLocalFiles", - "Value": 2 - } - ], - "Name": "ActionOnStopSync" - }, - { - "Items": [ - { - "Name": "Nothing", - "Value": 0 - }, - { - "Name": "Pause", - "Value": 1 - }, - { - "Name": "Lose", - "Value": 2 - }, - { - "Name": "Draw", - "Value": 3 - }, - { - "Name": "Win", - "Value": 4 - } - ], - "Name": "ActionType" - }, - { - "Items": [ - { - "Name": "Attachment0", - "Value": 0 - }, - { - "Name": "Attachment1", - "Value": 1 - }, - { - "Name": "World", - "Value": 2 - } - ], - "Name": "ActuatorRelativeTo" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Motor", - "Value": 1 - }, - { - "Name": "Servo", - "Value": 2 - } - ], - "Name": "ActuatorType" - }, - { - "Items": [ - { - "Name": "IsAvailable", - "Value": 1 - }, - { - "Name": "DeviceIneligible", - "Value": 2 - }, - { - "Name": "ExperienceIneligible", - "Value": 3 - }, - { - "Name": "InternalError", - "Value": 4 - }, - { - "Name": "NoFill", - "Value": 5 - }, - { - "Name": "PlayerIneligible", - "Value": 6 - }, - { - "Name": "PublisherIneligible", - "Value": 7 - } - ], - "Name": "AdAvailabilityResult" - }, - { - "Items": [ - { - "Name": "RewardedAdLoaded", - "Value": 3 - }, - { - "Name": "RewardedAdGrant", - "Value": 4 - }, - { - "Name": "RewardedAdUnloaded", - "Value": 5 - }, - { - "Name": "VideoLoaded", - "Tags": [ - "Deprecated" - ], - "Value": 0 - }, - { - "Name": "VideoRemoved", - "Tags": [ - "Deprecated" - ], - "Value": 1 - }, - { - "Name": "UserCompletedVideo", - "Tags": [ - "Deprecated" - ], - "Value": 2 - } - ], - "Name": "AdEventType" - }, - { - "Items": [ - { - "Name": "RewardedVideo", - "Value": 0 - } - ], - "Name": "AdFormat" - }, - { - "Items": [ - { - "Name": "HorizontalRectangle", - "Value": 1 - } - ], - "Name": "AdShape" - }, - { - "Items": [ - { - "Name": "Undefined", - "Value": 0 - }, - { - "Name": "PortalForward", - "Value": 1 - }, - { - "Name": "InGameMenuBackButton", - "Value": 2 - }, - { - "Name": "UIBackButton", - "Value": 3 - } - ], - "Name": "AdTeleportMethod" - }, - { - "Items": [ - { - "Name": "AdLabelClicked", - "Value": 0 - }, - { - "Name": "VolumeButtonClicked", - "Value": 1 - }, - { - "Name": "FullscreenButtonClicked", - "Value": 2 - }, - { - "Name": "PlayButtonClicked", - "Value": 3 - }, - { - "Name": "PauseButtonClicked", - "Value": 4 - }, - { - "Name": "CloseButtonClicked", - "Value": 5 - }, - { - "Name": "WhyThisAdClicked", - "Value": 6 - }, - { - "Name": "PlayEventTriggered", - "Value": 7 - }, - { - "Name": "PauseEventTriggered", - "Value": 8 - } - ], - "Name": "AdUIEventType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Image", - "Value": 1 - }, - { - "Name": "Video", - "Value": 2 - } - ], - "Name": "AdUIType" - }, - { - "Items": [ - { - "Name": "Inactive", - "Value": 0 - }, - { - "Name": "Active", - "Value": 1 - } - ], - "Name": "AdUnitStatus" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "Never", - "Value": 1 - } - ], - "Name": "AdornCullingMode" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Shaded", - "Value": 1 - }, - { - "Name": "XRay", - "Value": 2 - }, - { - "Name": "XRayShaded", - "Value": 3 - }, - { - "Name": "AlwaysOnTop", - "Value": 4 - } - ], - "Name": "AdornShading" - }, - { - "Items": [ - { - "Name": "PrimaryAxisParallel", - "Value": 2 - }, - { - "Name": "PrimaryAxisPerpendicular", - "Value": 3 - }, - { - "Name": "PrimaryAxisLookAt", - "Value": 4 - }, - { - "Name": "AllAxes", - "Value": 5 - }, - { - "Name": "Parallel", - "Tags": [ - "Deprecated" - ], - "Value": 0 - }, - { - "Name": "Perpendicular", - "Tags": [ - "Deprecated" - ], - "Value": 1 - } - ], - "Name": "AlignType" - }, - { - "Items": [ - { - "Name": "Overlay", - "Value": 0 - }, - { - "Name": "Transparency", - "Value": 1 - }, - { - "Name": "TintMask", - "Value": 2 - }, - { - "Name": "Opaque", - "Tags": [ - "NotBrowsable" - ], - "Value": 3 - } - ], - "Name": "AlphaMode" - }, - { - "Items": [ - { - "Name": "CustomField01", - "Value": 0 - }, - { - "Name": "CustomField02", - "Value": 1 - }, - { - "Name": "CustomField03", - "Value": 2 - } - ], - "Name": "AnalyticsCustomFieldKeys" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Acquire", - "Value": 1 - }, - { - "Name": "Spend", - "Value": 2 - } - ], - "Name": "AnalyticsEconomyAction" - }, - { - "Items": [ - { - "Name": "Sink", - "Value": 0 - }, - { - "Name": "Source", - "Value": 1 - } - ], - "Name": "AnalyticsEconomyFlowType" - }, - { - "Items": [ - { - "Name": "IAP", - "Value": 0 - }, - { - "Name": "Shop", - "Value": 1 - }, - { - "Name": "Gameplay", - "Value": 2 - }, - { - "Name": "ContextualPurchase", - "Value": 3 - }, - { - "Name": "TimedReward", - "Value": 4 - }, - { - "Name": "Onboarding", - "Value": 5 - } - ], - "Name": "AnalyticsEconomyTransactionType" - }, - { - "Items": [ - { - "Name": "Trace", - "Value": 0 - }, - { - "Name": "Debug", - "Value": 1 - }, - { - "Name": "Information", - "Value": 2 - }, - { - "Name": "Warning", - "Value": 3 - }, - { - "Name": "Error", - "Value": 4 - }, - { - "Name": "Fatal", - "Value": 5 - } - ], - "Name": "AnalyticsLogLevel" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Begin", - "Value": 1 - }, - { - "Name": "Complete", - "Value": 2 - }, - { - "Name": "Abandon", - "Value": 3 - }, - { - "Name": "Fail", - "Value": 4 - } - ], - "Name": "AnalyticsProgressionStatus" - }, - { - "Items": [ - { - "Name": "Custom", - "Value": 0 - }, - { - "Name": "Start", - "Value": 1 - }, - { - "Name": "Fail", - "Value": 2 - }, - { - "Name": "Complete", - "Value": 3 - } - ], - "Name": "AnalyticsProgressionType" - }, - { - "Items": [ - { - "Name": "Initializing", - "Value": 0 - }, - { - "Name": "Pending", - "Value": 1 - }, - { - "Name": "Processing", - "Value": 2 - }, - { - "Name": "ErrorGeneric", - "Value": 4 - }, - { - "Name": "Success", - "Value": 6 - }, - { - "Name": "ErrorVideoTooLong", - "Value": 7 - }, - { - "Name": "ErrorNoPersonDetected", - "Value": 8 - }, - { - "Name": "ErrorVideoUnstable", - "Value": 9 - }, - { - "Name": "Timeout", - "Value": 10 - }, - { - "Name": "Cancelled", - "Value": 11 - }, - { - "Name": "ErrorMultiplePeople", - "Value": 12 - }, - { - "Name": "ErrorUploadingVideo", - "Value": 2001 - } - ], - "Name": "AnimationClipFromVideoStatus" - }, - { - "Items": [ - { - "Name": "Cartesian", - "Value": 0 - }, - { - "Name": "Polar", - "Value": 1 - } - ], - "Name": "AnimationNodeBlend2DInputMode" - }, - { - "Items": [ - { - "Name": "Always", - "Value": 0 - }, - { - "Name": "ClipFinished", - "Value": 1 - }, - { - "Name": "Expression", - "Value": 2 - } - ], - "Name": "AnimationNodeInterruptible" - }, - { - "Items": [ - { - "Name": "Loop", - "Value": 0 - }, - { - "Name": "PingPong", - "Value": 1 - }, - { - "Name": "OnceAndHold", - "Value": 2 - }, - { - "Name": "OnceAndReset", - "Value": 3 - } - ], - "Name": "AnimationNodePlayMode" - }, - { - "Items": [ - { - "Name": "CrossFade", - "Value": 0 - }, - { - "Name": "InertialBlend", - "Value": 1 - }, - { - "Name": "DeadBlend", - "Value": 2 - } - ], - "Name": "AnimationNodeTransitionType" - }, - { - "Items": [ - { - "Name": "InvalidNode", - "Value": 0 - }, - { - "Name": "AddNode", - "Value": 1 - }, - { - "Name": "BlendNode", - "Value": 2 - }, - { - "Name": "Blend1DNode", - "Value": 3 - }, - { - "Name": "Blend2DNode", - "Value": 4 - }, - { - "Name": "ClipNode", - "Value": 5 - }, - { - "Name": "GraphOutput", - "Value": 6 - }, - { - "Name": "MaskNode", - "Value": 7 - }, - { - "Name": "PrioritySelectNode", - "Value": 8 - }, - { - "Name": "RandomSequenceNode", - "Value": 9 - }, - { - "Name": "SelectNode", - "Value": 10 - }, - { - "Name": "SequenceNode", - "Value": 11 - }, - { - "Name": "SpeedNode", - "Value": 12 - }, - { - "Name": "SubtractNode", - "Value": 13 - } - ], - "Name": "AnimationNodeType" - }, - { - "Items": [ - { - "Name": "ClipFinished", - "Value": 0 - }, - { - "Name": "Expression", - "Value": 1 - } - ], - "Name": "AnimationNodeWaitFor" - }, - { - "Items": [ - { - "Name": "Core", - "Value": 1000 - }, - { - "Name": "Idle", - "Value": 0 - }, - { - "Name": "Movement", - "Value": 1 - }, - { - "Name": "Action", - "Value": 2 - }, - { - "Name": "Action2", - "Value": 3 - }, - { - "Name": "Action3", - "Value": 4 - }, - { - "Name": "Action4", - "Value": 5 - } - ], - "Name": "AnimationPriority" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "AnimatorRetargetingMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "All", - "Value": 1 - }, - { - "Name": "Unknown", - "Value": 2 - } - ], - "Name": "AnnotationChannelContentPreference" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "PlacingNew", - "Value": 1 - }, - { - "Name": "WritingNew", - "Value": 2 - } - ], - "Name": "AnnotationEditingMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "All", - "Value": 1 - }, - { - "Name": "MentionsAndReplies", - "Value": 2 - }, - { - "Name": "Unknown", - "Value": 3 - } - ], - "Name": "AnnotationPlaceContentPreference" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "Loading", - "Value": 1 - }, - { - "Name": "ErrorInternalFailure", - "Value": 2 - }, - { - "Name": "ErrorNotFound", - "Value": 3 - }, - { - "Name": "ErrorModerated", - "Value": 4 - } - ], - "Name": "AnnotationRequestStatus" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "Create", - "Value": 1 - }, - { - "Name": "Resolve", - "Value": 2 - }, - { - "Name": "Delete", - "Value": 3 - }, - { - "Name": "Edit", - "Value": 4 - } - ], - "Name": "AnnotationRequestType" - }, - { - "Items": [ - { - "Name": "Detached", - "Value": 0 - }, - { - "Name": "Active", - "Value": 1 - }, - { - "Name": "Inactive", - "Value": 2 - }, - { - "Name": "Hidden", - "Value": 3 - } - ], - "Name": "AppLifecycleManagerState" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "OpenApp", - "Value": 1 - }, - { - "Name": "TapChatTab", - "Value": 2 - }, - { - "Name": "TapConversationEntry", - "Value": 3 - }, - { - "Name": "TapAvatarTab", - "Value": 4 - }, - { - "Name": "ReadConversation", - "Value": 5 - }, - { - "Name": "TapGamePageTab", - "Value": 6 - }, - { - "Name": "TapHomePageTab", - "Value": 7 - }, - { - "Name": "GamePageLoaded", - "Value": 8 - }, - { - "Name": "HomePageLoaded", - "Value": 9 - }, - { - "Name": "AvatarEditorPageLoaded", - "Value": 10 - } - ], - "Name": "AppShellActionType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Chat", - "Value": 1 - }, - { - "Name": "AvatarEditor", - "Value": 2 - }, - { - "Name": "GamePage", - "Value": 3 - }, - { - "Name": "HomePage", - "Value": 4 - }, - { - "Name": "More", - "Value": 5 - }, - { - "Name": "Landing", - "Value": 6 - } - ], - "Name": "AppShellFeature" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "NotSupported", - "Value": 1 - }, - { - "Name": "Failed", - "Value": 2 - }, - { - "Name": "NotAvailable", - "Value": 3 - }, - { - "Name": "Available", - "Value": 4 - }, - { - "Name": "AvailableBoundChannel", - "Value": 5 - }, - { - "Name": "AvailableBetaProgram", - "Value": 6 - } - ], - "Name": "AppUpdateStatus" - }, - { - "Items": [ - { - "Name": "Contextual", - "Value": 0 - }, - { - "Name": "Border", - "Value": 1 - } - ], - "Name": "ApplyStrokeMode" - }, - { - "Items": [ - { - "Name": "FitWithinMaxSize", - "Value": 0 - }, - { - "Name": "ScaleWithParentSize", - "Value": 1 - } - ], - "Name": "AspectType" - }, - { - "Items": [ - { - "Name": "User", - "Value": 0 - }, - { - "Name": "Group", - "Value": 1 - } - ], - "Name": "AssetCreatorType" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "Failure", - "Value": 1 - }, - { - "Name": "None", - "Value": 2 - }, - { - "Name": "Loading", - "Value": 3 - }, - { - "Name": "TimedOut", - "Value": 4 - } - ], - "Name": "AssetFetchStatus" - }, - { - "Items": [ - { - "Name": "Image", - "Value": 1 - }, - { - "LegacyNames": [ - "TeeShirt" - ], - "Name": "TShirt", - "Value": 2 - }, - { - "Name": "Audio", - "Value": 3 - }, - { - "Name": "Mesh", - "Value": 4 - }, - { - "Name": "Lua", - "Value": 5 - }, - { - "Name": "Hat", - "Value": 8 - }, - { - "Name": "Place", - "Value": 9 - }, - { - "Name": "Model", - "Value": 10 - }, - { - "Name": "Shirt", - "Value": 11 - }, - { - "Name": "Pants", - "Value": 12 - }, - { - "Name": "Decal", - "Value": 13 - }, - { - "Name": "Head", - "Value": 17 - }, - { - "Name": "Face", - "Value": 18 - }, - { - "Name": "Gear", - "Value": 19 - }, - { - "Name": "Badge", - "Value": 21 - }, - { - "Name": "Animation", - "Value": 24 - }, - { - "Name": "Torso", - "Value": 27 - }, - { - "Name": "RightArm", - "Value": 28 - }, - { - "Name": "LeftArm", - "Value": 29 - }, - { - "Name": "LeftLeg", - "Value": 30 - }, - { - "Name": "RightLeg", - "Value": 31 - }, - { - "Name": "Package", - "Value": 32 - }, - { - "Name": "GamePass", - "Value": 34 - }, - { - "Name": "Plugin", - "Value": 38 - }, - { - "Name": "MeshPart", - "Value": 40 - }, - { - "Name": "HairAccessory", - "Value": 41 - }, - { - "Name": "FaceAccessory", - "Value": 42 - }, - { - "Name": "NeckAccessory", - "Value": 43 - }, - { - "Name": "ShoulderAccessory", - "Value": 44 - }, - { - "Name": "FrontAccessory", - "Value": 45 - }, - { - "Name": "BackAccessory", - "Value": 46 - }, - { - "Name": "WaistAccessory", - "Value": 47 - }, - { - "Name": "ClimbAnimation", - "Value": 48 - }, - { - "Name": "DeathAnimation", - "Value": 49 - }, - { - "Name": "FallAnimation", - "Value": 50 - }, - { - "Name": "IdleAnimation", - "Value": 51 - }, - { - "Name": "JumpAnimation", - "Value": 52 - }, - { - "Name": "RunAnimation", - "Value": 53 - }, - { - "Name": "SwimAnimation", - "Value": 54 - }, - { - "Name": "WalkAnimation", - "Value": 55 - }, - { - "Name": "PoseAnimation", - "Value": 56 - }, - { - "Name": "EmoteAnimation", - "Value": 61 - }, - { - "Name": "Video", - "Value": 62 - }, - { - "LegacyNames": [ - "TeeShirtAccessory" - ], - "Name": "TShirtAccessory", - "Value": 64 - }, - { - "Name": "ShirtAccessory", - "Value": 65 - }, - { - "Name": "PantsAccessory", - "Value": 66 - }, - { - "Name": "JacketAccessory", - "Value": 67 - }, - { - "Name": "SweaterAccessory", - "Value": 68 - }, - { - "Name": "ShortsAccessory", - "Value": 69 - }, - { - "Name": "LeftShoeAccessory", - "Value": 70 - }, - { - "Name": "RightShoeAccessory", - "Value": 71 - }, - { - "Name": "DressSkirtAccessory", - "Value": 72 - }, - { - "Name": "FontFamily", - "Value": 73 - }, - { - "Name": "EyebrowAccessory", - "Value": 76 - }, - { - "Name": "EyelashAccessory", - "Value": 77 - }, - { - "Name": "MoodAnimation", - "Value": 78 - }, - { - "Name": "DynamicHead", - "Value": 79 - }, - { - "Name": "FaceMakeup", - "Value": 88 - }, - { - "Name": "LipMakeup", - "Value": 89 - }, - { - "Name": "EyeMakeup", - "Value": 90 - }, - { - "Name": "EarAccessory", - "Value": 57 - }, - { - "Name": "EyeAccessory", - "Value": 58 - } - ], - "Name": "AssetType" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 1 - }, - { - "Name": "ClientOnly", - "Value": 2 - }, - { - "Name": "Always", - "Value": 3 - } - ], - "Name": "AssetTypeVerification" - }, - { - "Items": [ - { - "Name": "Disabled", - "Value": 0 - }, - { - "Name": "Automatic", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "AudioApiRollout" - }, - { - "Items": [ - ], - "Name": "AudioCaptureMode" - }, - { - "Items": [ - { - "Name": "Mono", - "Value": 0 - }, - { - "Name": "Stereo", - "Value": 1 - }, - { - "Name": "Quad", - "Value": 2 - }, - { - "Name": "Surround_5", - "Value": 3 - }, - { - "Name": "Surround_5_1", - "Value": 4 - }, - { - "Name": "Surround_7_1", - "Value": 5 - }, - { - "Name": "Surround_7_1_4", - "Value": 6 - } - ], - "Name": "AudioChannelLayout" - }, - { - "Items": [ - { - "Name": "Peak", - "Value": 0 - }, - { - "Name": "LowShelf", - "Value": 1 - }, - { - "Name": "HighShelf", - "Value": 2 - }, - { - "Name": "Lowpass12dB", - "Value": 3 - }, - { - "Name": "Lowpass24dB", - "Value": 4 - }, - { - "Name": "Lowpass48dB", - "Value": 5 - }, - { - "Name": "Highpass12dB", - "Value": 6 - }, - { - "Name": "Highpass24dB", - "Value": 7 - }, - { - "Name": "Highpass48dB", - "Value": 8 - }, - { - "Name": "Bandpass", - "Value": 9 - }, - { - "Name": "Notch", - "Value": 10 - }, - { - "Name": "Lowpass6dB", - "Value": 11 - } - ], - "Name": "AudioFilterType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Automatic", - "Value": 1 - } - ], - "Name": "AudioSimulationFidelity" - }, - { - "Items": [ - { - "Name": "Music", - "Value": 1 - }, - { - "Name": "SoundEffect", - "Value": 2 - } - ], - "Name": "AudioSubType" - }, - { - "Items": [ - { - "Name": "Small", - "Value": 0 - }, - { - "Name": "Medium", - "Value": 1 - }, - { - "Name": "Large", - "Value": 2 - } - ], - "Name": "AudioWindowSize" - }, - { - "Items": [ - { - "Name": "Server", - "Value": 0 - }, - { - "Name": "Automatic", - "Value": 1 - } - ], - "Name": "AuthorityMode" - }, - { - "Items": [ - { - "Name": "Off", - "Value": 0 - }, - { - "Name": "Absolute", - "Value": 1 - }, - { - "Name": "Relative", - "Value": 2 - } - ], - "Name": "AutoIndentRule" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "X", - "Value": 1 - }, - { - "Name": "Y", - "Value": 2 - }, - { - "Name": "XY", - "Value": 3 - } - ], - "Name": "AutomaticSize" - }, - { - "Items": [ - { - "Name": "TShirt", - "Value": 2 - }, - { - "Name": "Hat", - "Value": 8 - }, - { - "Name": "Shirt", - "Value": 11 - }, - { - "Name": "Pants", - "Value": 12 - }, - { - "Name": "Head", - "Value": 17 - }, - { - "Name": "Face", - "Value": 18 - }, - { - "Name": "Gear", - "Value": 19 - }, - { - "Name": "Torso", - "Value": 27 - }, - { - "Name": "RightArm", - "Value": 28 - }, - { - "Name": "LeftArm", - "Value": 29 - }, - { - "Name": "LeftLeg", - "Value": 30 - }, - { - "Name": "RightLeg", - "Value": 31 - }, - { - "Name": "HairAccessory", - "Value": 41 - }, - { - "Name": "FaceAccessory", - "Value": 42 - }, - { - "Name": "NeckAccessory", - "Value": 43 - }, - { - "Name": "ShoulderAccessory", - "Value": 44 - }, - { - "Name": "FrontAccessory", - "Value": 45 - }, - { - "Name": "BackAccessory", - "Value": 46 - }, - { - "Name": "WaistAccessory", - "Value": 47 - }, - { - "Name": "ClimbAnimation", - "Value": 48 - }, - { - "Name": "FallAnimation", - "Value": 50 - }, - { - "Name": "IdleAnimation", - "Value": 51 - }, - { - "Name": "JumpAnimation", - "Value": 52 - }, - { - "Name": "RunAnimation", - "Value": 53 - }, - { - "Name": "SwimAnimation", - "Value": 54 - }, - { - "Name": "WalkAnimation", - "Value": 55 - }, - { - "Name": "MoodAnimation", - "Value": 78 - }, - { - "Name": "EmoteAnimation", - "Value": 61 - }, - { - "LegacyNames": [ - "TeeShirtAccessory" - ], - "Name": "TShirtAccessory", - "Value": 64 - }, - { - "Name": "ShirtAccessory", - "Value": 65 - }, - { - "Name": "PantsAccessory", - "Value": 66 - }, - { - "Name": "JacketAccessory", - "Value": 67 - }, - { - "Name": "SweaterAccessory", - "Value": 68 - }, - { - "Name": "ShortsAccessory", - "Value": 69 - }, - { - "Name": "LeftShoeAccessory", - "Value": 70 - }, - { - "Name": "RightShoeAccessory", - "Value": 71 - }, - { - "Name": "DressSkirtAccessory", - "Value": 72 - }, - { - "Name": "EyebrowAccessory", - "Value": 76 - }, - { - "Name": "EyelashAccessory", - "Value": 77 - }, - { - "Name": "DynamicHead", - "Value": 79 - }, - { - "Name": "FaceMakeup", - "Value": 88 - }, - { - "Name": "LipMakeup", - "Value": 89 - }, - { - "Name": "EyeMakeup", - "Value": 90 - } - ], - "Name": "AvatarAssetType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "UniverseAudio", - "Value": 1 - }, - { - "Name": "UniverseVideo", - "Value": 2 - }, - { - "Name": "PlaceAudio", - "Value": 4 - }, - { - "Name": "PlaceVideo", - "Value": 8 - }, - { - "Name": "UserAudioEligible", - "Value": 16 - }, - { - "Name": "UserAudio", - "Value": 32 - }, - { - "Name": "UserVideoEligible", - "Value": 64 - }, - { - "Name": "UserVideo", - "Value": 128 - }, - { - "Name": "UserBanned", - "Value": 256 - }, - { - "Name": "UserVerifiedForVoice", - "Value": 512 - } - ], - "Name": "AvatarChatServiceFeature" - }, - { - "Items": [ - { - "Name": "Friend", - "Value": 0 - }, - { - "Name": "Chat", - "Value": 1 - }, - { - "Name": "Emote", - "Value": 2 - }, - { - "Name": "InspectMenu", - "Value": 3 - } - ], - "Name": "AvatarContextMenuOption" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Unknown", - "Value": 1 - }, - { - "Name": "DownloadFailed", - "Value": 2 - }, - { - "Name": "Canceled", - "Value": 3 - }, - { - "Name": "Offensive", - "Value": 4 - }, - { - "Name": "Timeout", - "Value": 5 - }, - { - "Name": "JobNotFound", - "Value": 6 - } - ], - "Name": "AvatarGenerationError" - }, - { - "Items": [ - { - "Name": "Asset", - "Value": 1 - }, - { - "Name": "Bundle", - "Value": 2 - } - ], - "Name": "AvatarItemType" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 1 - }, - { - "Name": "PermissionDenied", - "Value": 2 - }, - { - "Name": "Failed", - "Value": 3 - } - ], - "Name": "AvatarPromptResult" - }, - { - "Items": [ - { - "Name": "Scale", - "Value": 0 - }, - { - "Name": "Remove", - "Value": 1 - }, - { - "Name": "PreviewScale", - "Value": 2 - }, - { - "Name": "PreviewRemove", - "Value": 3 - } - ], - "Name": "AvatarSettingsAccessoryLimitMethod" - }, - { - "Items": [ - { - "Name": "PlayerChoice", - "Value": 0 - }, - { - "Name": "CustomLimit", - "Value": 1 - } - ], - "Name": "AvatarSettingsAccessoryMode" - }, - { - "Items": [ - { - "Name": "PlayerChoice", - "Value": 0 - }, - { - "Name": "CustomClips", - "Value": 1 - } - ], - "Name": "AvatarSettingsAnimationClipsMode" - }, - { - "Items": [ - { - "Name": "PlayerChoice", - "Value": 0 - }, - { - "Name": "StandardR15", - "Value": 1 - }, - { - "Name": "StandardR6", - "Value": 2 - } - ], - "Name": "AvatarSettingsAnimationPacksMode" - }, - { - "Items": [ - { - "Name": "PlayerChoice", - "Value": 0 - }, - { - "Name": "CustomParts", - "Value": 1 - }, - { - "Name": "CustomBody", - "Value": 2 - } - ], - "Name": "AvatarSettingsAppearanceMode" - }, - { - "Items": [ - { - "Name": "PlayerChoice", - "Value": 0 - }, - { - "Name": "CustomBuild", - "Value": 1 - } - ], - "Name": "AvatarSettingsBuildMode" - }, - { - "Items": [ - { - "Name": "PlayerChoice", - "Value": 0 - }, - { - "Name": "CustomLimit", - "Value": 1 - } - ], - "Name": "AvatarSettingsClothingMode" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "SingleCollider", - "Value": 1 - }, - { - "Name": "Legacy", - "Value": 2 - } - ], - "Name": "AvatarSettingsCollisionMode" - }, - { - "Items": [ - { - "Name": "PlayerChoice", - "Value": 0 - }, - { - "Name": "CustomAccessories", - "Value": 1 - } - ], - "Name": "AvatarSettingsCustomAccessoryMode" - }, - { - "Items": [ - { - "Name": "AvatarReference", - "Value": 0 - }, - { - "Name": "BundleId", - "Value": 1 - } - ], - "Name": "AvatarSettingsCustomBodyType" - }, - { - "Items": [ - { - "Name": "PlayerChoice", - "Value": 0 - }, - { - "Name": "CustomClothing", - "Value": 1 - } - ], - "Name": "AvatarSettingsCustomClothingMode" - }, - { - "Items": [ - { - "Name": "UseParts", - "Value": 0 - }, - { - "Name": "UseCollider", - "Value": 1 - } - ], - "Name": "AvatarSettingsHitAndTouchDetectionMode" - }, - { - "Items": [ - { - "Name": "JumpHeight", - "Value": 0 - }, - { - "Name": "JumpPower", - "Value": 1 - } - ], - "Name": "AvatarSettingsJumpMode" - }, - { - "Items": [ - { - "Name": "R6Colliders", - "Value": 0 - }, - { - "Name": "InnerBoxColliders", - "Value": 1 - } - ], - "Name": "AvatarSettingsLegacyCollisionMode" - }, - { - "Items": [ - { - "Name": "PlayerChoice", - "Value": 0 - }, - { - "Name": "CustomScale", - "Value": 1 - } - ], - "Name": "AvatarSettingsScaleMode" - }, - { - "Items": [ - { - "Name": "Closeup", - "Value": 1 - }, - { - "Name": "FullBody", - "Value": 2 - } - ], - "Name": "AvatarThumbnailCustomizationType" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "AvatarUnificationMode" - }, - { - "Items": [ - { - "LegacyNames": [ - "Left", - "Right" - ], - "Name": "X", - "Value": 0 - }, - { - "LegacyNames": [ - "Bottom", - "Top" - ], - "Name": "Y", - "Value": 1 - }, - { - "LegacyNames": [ - "Back", - "Front" - ], - "Name": "Z", - "Value": 2 - } - ], - "Name": "Axis" - }, - { - "Items": [ - { - "Name": "DeveloperProduct", - "Value": 0 - }, - { - "Name": "AvatarAsset", - "Value": 1 - }, - { - "Name": "AvatarBundle", - "Value": 2 - } - ], - "Name": "BenefitType" - }, - { - "Items": [ - { - "LegacyNames": [ - "Laser", - "Rocket", - "Slingshot" - ], - "Name": "Script", - "Value": 0 - }, - { - "Name": "GameTool", - "Value": 1 - }, - { - "Name": "Grab", - "Value": 2 - }, - { - "Name": "Clone", - "Value": 3 - }, - { - "Name": "Hammer", - "Value": 4 - } - ], - "Name": "BinType" - }, - { - "Items": [ - { - "Name": "Head", - "Value": 0 - }, - { - "Name": "Torso", - "Value": 1 - }, - { - "Name": "LeftArm", - "Value": 2 - }, - { - "Name": "RightArm", - "Value": 3 - }, - { - "Name": "LeftLeg", - "Value": 4 - }, - { - "Name": "RightLeg", - "Value": 5 - } - ], - "Name": "BodyPart" - }, - { - "Items": [ - { - "Name": "Head", - "Value": 0 - }, - { - "Name": "UpperTorso", - "Value": 1 - }, - { - "Name": "LowerTorso", - "Value": 2 - }, - { - "Name": "LeftFoot", - "Value": 3 - }, - { - "Name": "LeftLowerLeg", - "Value": 4 - }, - { - "Name": "LeftUpperLeg", - "Value": 5 - }, - { - "Name": "RightFoot", - "Value": 6 - }, - { - "Name": "RightLowerLeg", - "Value": 7 - }, - { - "Name": "RightUpperLeg", - "Value": 8 - }, - { - "Name": "LeftHand", - "Value": 9 - }, - { - "Name": "LeftLowerArm", - "Value": 10 - }, - { - "Name": "LeftUpperArm", - "Value": 11 - }, - { - "Name": "RightHand", - "Value": 12 - }, - { - "Name": "RightLowerArm", - "Value": 13 - }, - { - "Name": "RightUpperArm", - "Value": 14 - }, - { - "Name": "RootPart", - "Value": 15 - }, - { - "Name": "Unknown", - "Value": 17 - } - ], - "Name": "BodyPartR15" - }, - { - "Items": [ - { - "Name": "Outline", - "Value": 0 - }, - { - "Name": "Middle", - "Value": 1 - }, - { - "Name": "Inset", - "Value": 2 - } - ], - "Name": "BorderMode" - }, - { - "Items": [ - { - "Name": "Outer", - "Value": 0 - }, - { - "Name": "Center", - "Value": 1 - }, - { - "Name": "Inner", - "Value": 2 - } - ], - "Name": "BorderStrokePosition" - }, - { - "Items": [ - { - "Name": "Other", - "Value": 0 - }, - { - "Name": "Error", - "Value": 1 - }, - { - "Name": "SpecialBreakpoint", - "Value": 2 - }, - { - "Name": "UserBreakpoint", - "Value": 3 - } - ], - "Name": "BreakReason" - }, - { - "Items": [ - { - "Name": "Requested", - "Value": 0 - }, - { - "Name": "ScriptChanged", - "Value": 1 - }, - { - "Name": "ScriptRemoved", - "Value": 2 - } - ], - "Name": "BreakpointRemoveReason" - }, - { - "Items": [ - { - "Name": "FireAllEvents", - "Value": 0 - }, - { - "Name": "FireCFrameChanged", - "Value": 1 - } - ], - "Name": "BulkMoveMode" - }, - { - "Items": [ - { - "Name": "BodyParts", - "Value": 1 - }, - { - "Name": "Animations", - "Value": 2 - }, - { - "Name": "Shoes", - "Value": 3 - }, - { - "Name": "DynamicHead", - "Value": 4 - }, - { - "Name": "DynamicHeadAvatar", - "Value": 5 - } - ], - "Name": "BundleType" - }, - { - "Items": [ - { - "Name": "Jump", - "Value": 32 - }, - { - "Name": "Dismount", - "Value": 8 - } - ], - "Name": "Button" - }, - { - "Items": [ - { - "Name": "Custom", - "Value": 0 - }, - { - "Name": "RobloxButtonDefault", - "Value": 1 - }, - { - "Name": "RobloxButton", - "Value": 2 - }, - { - "Name": "RobloxRoundButton", - "Value": 3 - }, - { - "Name": "RobloxRoundDefaultButton", - "Value": 4 - }, - { - "Name": "RobloxRoundDropdownButton", - "Value": 5 - } - ], - "Name": "ButtonStyle" - }, - { - "Items": [ - { - "Name": "Inner", - "Value": 0 - }, - { - "Name": "Outer", - "Value": 1 - } - ], - "Name": "CageType" - }, - { - "Items": [ - { - "Name": "Classic", - "Value": 0 - }, - { - "Name": "LockFirstPerson", - "Value": 1 - } - ], - "Name": "CameraMode" - }, - { - "Items": [ - { - "Name": "Roblox", - "Value": 0 - }, - { - "Name": "IndustryCompatible", - "Value": 1 - } - ], - "Name": "CameraNavigationModel" - }, - { - "Items": [ - { - "Name": "Classic", - "Value": 0 - }, - { - "Name": "EdgeBump", - "Value": 1 - } - ], - "Name": "CameraPanMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "RmbScroll", - "Value": 1 - }, - { - "Name": "AltScroll", - "Value": 2 - } - ], - "Name": "CameraSpeedAdjustBinding" - }, - { - "Items": [ - { - "Name": "Fixed", - "Value": 0 - }, - { - "Name": "Attach", - "Value": 1 - }, - { - "Name": "Watch", - "Value": 2 - }, - { - "Name": "Track", - "Value": 3 - }, - { - "Name": "Follow", - "Value": 4 - }, - { - "Name": "Custom", - "Value": 5 - }, - { - "Name": "Scriptable", - "Value": 6 - }, - { - "Name": "Orbital", - "Value": 7 - } - ], - "Name": "CameraType" - }, - { - "Items": [ - { - "Name": "ReadAndUpload", - "Value": 0 - } - ], - "Name": "CaptureGalleryPermission" - }, - { - "Items": [ - { - "Name": "Screenshot", - "Value": 1 - }, - { - "Name": "Video", - "Value": 2 - } - ], - "Name": "CaptureType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 1 - }, - { - "Name": "Featured", - "Value": 2 - }, - { - "Name": "Collectibles", - "Value": 3 - }, - { - "Name": "CommunityCreations", - "Value": 4 - }, - { - "Name": "Premium", - "Value": 5 - }, - { - "Name": "Recommended", - "Value": 6 - } - ], - "Name": "CatalogCategoryFilter" - }, - { - "Items": [ - { - "Name": "Past12Hours", - "Value": 1 - }, - { - "Name": "PastDay", - "Value": 2 - }, - { - "Name": "Past3Days", - "Value": 3 - }, - { - "Name": "PastWeek", - "Value": 4 - }, - { - "Name": "PastMonth", - "Value": 5 - }, - { - "Name": "AllTime", - "Value": 6 - } - ], - "Name": "CatalogSortAggregation" - }, - { - "Items": [ - { - "Name": "Relevance", - "Value": 1 - }, - { - "Name": "PriceHighToLow", - "Value": 2 - }, - { - "Name": "PriceLowToHigh", - "Value": 3 - }, - { - "Name": "MostFavorited", - "Value": 5 - }, - { - "LegacyNames": [ - "RecentlyUpdated" - ], - "Name": "RecentlyCreated", - "Value": 6 - }, - { - "Name": "Bestselling", - "Value": 7 - } - ], - "Name": "CatalogSortType" - }, - { - "Items": [ - { - "Name": "Solid", - "Value": 0 - }, - { - "Name": "VerticalWedge", - "Value": 1 - }, - { - "Name": "CornerWedge", - "Value": 2 - }, - { - "Name": "InverseCornerWedge", - "Value": 3 - }, - { - "Name": "HorizontalWedge", - "Value": 4 - } - ], - "Name": "CellBlock" - }, - { - "Items": [ - { - "Name": "Empty", - "Value": 0 - }, - { - "Name": "Grass", - "Value": 1 - }, - { - "Name": "Sand", - "Value": 2 - }, - { - "Name": "Brick", - "Value": 3 - }, - { - "Name": "Granite", - "Value": 4 - }, - { - "Name": "Asphalt", - "Value": 5 - }, - { - "Name": "Iron", - "Value": 6 - }, - { - "Name": "Aluminum", - "Value": 7 - }, - { - "Name": "Gold", - "Value": 8 - }, - { - "Name": "WoodPlank", - "Value": 9 - }, - { - "Name": "WoodLog", - "Value": 10 - }, - { - "Name": "Gravel", - "Value": 11 - }, - { - "Name": "CinderBlock", - "Value": 12 - }, - { - "Name": "MossyStone", - "Value": 13 - }, - { - "Name": "Cement", - "Value": 14 - }, - { - "Name": "RedPlastic", - "Value": 15 - }, - { - "Name": "BluePlastic", - "Value": 16 - }, - { - "Name": "Water", - "Value": 17 - } - ], - "Name": "CellMaterial" - }, - { - "Items": [ - { - "Name": "NegZ", - "Value": 0 - }, - { - "Name": "X", - "Value": 1 - }, - { - "Name": "Z", - "Value": 2 - }, - { - "Name": "NegX", - "Value": 3 - } - ], - "Name": "CellOrientation" - }, - { - "Items": [ - { - "Name": "UnsolicitedDialog", - "Value": 1 - }, - { - "Name": "PlayerInitiatedDialog", - "Value": 2 - }, - { - "Name": "ModalDialog", - "Value": 3 - }, - { - "Name": "QuitDialog", - "Value": 4 - } - ], - "Name": "CenterDialogType" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Legacy", - "Value": 1 - }, - { - "Name": "NoCharacterController", - "Value": 2 - }, - { - "Name": "LuaCharacterController", - "Value": 3 - } - ], - "Name": "CharacterControlMode" - }, - { - "Items": [ - { - "Name": "OnCreatingChatWindow", - "Value": 1 - }, - { - "Name": "OnClientSendingMessage", - "Value": 2 - }, - { - "Name": "OnClientFormattingMessage", - "Value": 3 - }, - { - "Name": "OnServerReceivingMessage", - "Value": 17 - } - ], - "Name": "ChatCallbackType" - }, - { - "Items": [ - { - "Name": "Blue", - "Value": 0 - }, - { - "Name": "Green", - "Value": 1 - }, - { - "Name": "Red", - "Value": 2 - }, - { - "Name": "White", - "Value": 3 - } - ], - "Name": "ChatColor" - }, - { - "Items": [ - { - "Name": "Menu", - "Value": 0 - }, - { - "Name": "TextAndMenu", - "Value": 1 - } - ], - "Name": "ChatMode" - }, - { - "Items": [ - { - "Name": "AllUsers", - "Value": 0 - }, - { - "Name": "NoOne", - "Value": 1 - }, - { - "Name": "Friends", - "Value": 2 - } - ], - "Name": "ChatPrivacyMode" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "NotRestricted", - "Value": 1 - }, - { - "Name": "Restricted", - "Value": 2 - } - ], - "Name": "ChatRestrictionStatus" - }, - { - "Items": [ - { - "Name": "Classic", - "Value": 0 - }, - { - "Name": "Bubble", - "Value": 1 - }, - { - "Name": "ClassicAndBubble", - "Value": 2 - } - ], - "Name": "ChatStyle" - }, - { - "Items": [ - { - "Name": "LegacyChatService", - "Value": 0 - }, - { - "Name": "TextChatService", - "Value": 1 - } - ], - "Name": "ChatVersion" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "ClientAnimatorThrottlingMode" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "RobloxMaintenance", - "Value": 1 - }, - { - "Name": "DeveloperShutdown", - "Value": 2 - }, - { - "Name": "DeveloperUpdate", - "Value": 3 - }, - { - "Name": "ServerEmpty", - "Value": 4 - }, - { - "Name": "OutOfMemory", - "Value": 5 - } - ], - "Name": "CloseReason" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Editing3D", - "Value": 1 - }, - { - "Name": "Scripting", - "Value": 2 - }, - { - "Name": "PrivateScripting", - "Value": 3 - } - ], - "Name": "CollaboratorStatus" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Hull", - "Value": 1 - }, - { - "Name": "Box", - "Value": 2 - }, - { - "Name": "PreciseConvexDecomposition", - "Value": 3 - } - ], - "Name": "CollisionFidelity" - }, - { - "Items": [ - { - "Name": "Plugin", - "Value": 0 - }, - { - "Name": "LocalUser", - "Value": 1 - } - ], - "Name": "CommandPermission" - }, - { - "Items": [ - { - "Name": "Client", - "Value": 0 - }, - { - "Name": "CoreScript", - "Value": 1 - }, - { - "Name": "Studio", - "Value": 2 - }, - { - "Name": "CoreScriptRaw", - "Value": 3 - } - ], - "Name": "CompileTarget" - }, - { - "Items": [ - { - "Name": "Insert", - "Value": 0 - }, - { - "Name": "Replace", - "Value": 1 - }, - { - "Name": "ReplaceOnEnterInsertOnTab", - "Value": 2 - }, - { - "Name": "InsertOnEnterReplaceOnTab", - "Value": 3 - } - ], - "Name": "CompletionAcceptanceBehavior" - }, - { - "Items": [ - { - "Name": "Text", - "Value": 1 - }, - { - "Name": "Method", - "Value": 2 - }, - { - "Name": "Function", - "Value": 3 - }, - { - "Name": "Constructor", - "Value": 4 - }, - { - "Name": "Field", - "Value": 5 - }, - { - "Name": "Variable", - "Value": 6 - }, - { - "Name": "Class", - "Value": 7 - }, - { - "Name": "Interface", - "Value": 8 - }, - { - "Name": "Module", - "Value": 9 - }, - { - "Name": "Property", - "Value": 10 - }, - { - "Name": "Unit", - "Value": 11 - }, - { - "Name": "Value", - "Value": 12 - }, - { - "Name": "Enum", - "Value": 13 - }, - { - "Name": "Keyword", - "Value": 14 - }, - { - "Name": "Snippet", - "Value": 15 - }, - { - "Name": "Color", - "Value": 16 - }, - { - "Name": "File", - "Value": 17 - }, - { - "Name": "Reference", - "Value": 18 - }, - { - "Name": "Folder", - "Value": 19 - }, - { - "Name": "EnumMember", - "Value": 20 - }, - { - "Name": "Constant", - "Value": 21 - }, - { - "Name": "Struct", - "Value": 22 - }, - { - "Name": "Event", - "Value": 23 - }, - { - "Name": "Operator", - "Value": 24 - }, - { - "Name": "TypeParameter", - "Value": 25 - } - ], - "Name": "CompletionItemKind" - }, - { - "Items": [ - { - "Name": "Deprecated", - "Value": 1 - }, - { - "Name": "IncorrectIndexType", - "Value": 2 - }, - { - "Name": "PluginPermissions", - "Value": 3 - }, - { - "Name": "CommandLinePermissions", - "Value": 4 - }, - { - "Name": "RobloxPermissions", - "Value": 5 - }, - { - "Name": "AddParens", - "Value": 6 - }, - { - "Name": "PutCursorInParens", - "Value": 7 - }, - { - "Name": "TypeCorrect", - "Value": 8 - }, - { - "Name": "ClientServerBoundaryViolation", - "Value": 9 - }, - { - "Name": "Invalidated", - "Value": 10 - }, - { - "Name": "PutCursorBeforeEnd", - "Value": 11 - } - ], - "Name": "CompletionItemTag" - }, - { - "Items": [ - { - "Name": "Invoked", - "Value": 1 - }, - { - "Name": "TriggerCharacter", - "Value": 2 - }, - { - "Name": "TriggerForIncompleteCompletions", - "Value": 3 - } - ], - "Name": "CompletionTriggerKind" - }, - { - "Items": [ - { - "Name": "ColorRGB", - "Value": 0 - }, - { - "Name": "ColorHSV", - "Value": 1 - }, - { - "Name": "NumberRange", - "Value": 2 - }, - { - "Name": "Rect", - "Value": 3 - }, - { - "Name": "UDim", - "Value": 4 - }, - { - "Name": "UDim2", - "Value": 5 - }, - { - "Name": "Vector2", - "Value": 6 - }, - { - "Name": "Vector3", - "Value": 7 - } - ], - "Name": "CompositeValueCurveType" - }, - { - "Items": [ - { - "Name": "Zstd", - "Value": 0 - } - ], - "Name": "CompressionAlgorithm" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Classic", - "Value": 1 - }, - { - "Name": "Follow", - "Value": 2 - }, - { - "Name": "Orbital", - "Value": 3 - }, - { - "Name": "CameraToggle", - "Value": 4 - } - ], - "Name": "ComputerCameraMovementMode" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "KeyboardMouse", - "Value": 1 - }, - { - "Name": "ClickToMove", - "Value": 2 - } - ], - "Name": "ComputerMovementMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "LoadFailed", - "Value": 1 - } - ], - "Name": "ConfigSnapshotErrorState" - }, - { - "Items": [ - { - "Name": "OK", - "Value": 0 - }, - { - "Name": "Unknown", - "Value": 1 - }, - { - "Name": "ConnectErrors", - "Value": 2 - }, - { - "Name": "AlreadyConnected", - "Value": 3 - }, - { - "Name": "NoFreeIncomingConnections", - "Value": 4 - }, - { - "Name": "ConnectionBanned", - "Value": 5 - }, - { - "Name": "InvalidPassword", - "Value": 6 - }, - { - "Name": "IncompatibleProtocolVersion", - "Value": 7 - }, - { - "Name": "IPRecentlyConnected", - "Value": 8 - }, - { - "Name": "OurSystemRequiresSecurity", - "Value": 9 - }, - { - "Name": "SecurityKeyMismatch", - "Value": 10 - }, - { - "Name": "DisconnectErrors", - "Value": 256 - }, - { - "Name": "DisconnectBadhash", - "Value": 257 - }, - { - "Name": "DisconnectSecurityKeyMismatch", - "Value": 258 - }, - { - "Name": "DisconnectProtocolMismatch", - "Value": 259 - }, - { - "Name": "DisconnectReceivePacketError", - "Value": 260 - }, - { - "Name": "DisconnectReceivePacketStreamError", - "Value": 261 - }, - { - "Name": "DisconnectSendPacketError", - "Value": 262 - }, - { - "Name": "DisconnectIllegalTeleport", - "Value": 263 - }, - { - "Name": "DisconnectDuplicatePlayer", - "Value": 264 - }, - { - "Name": "DisconnectDuplicateTicket", - "Value": 265 - }, - { - "Name": "DisconnectTimeout", - "Value": 266 - }, - { - "Name": "DisconnectLuaKick", - "Value": 267 - }, - { - "Name": "DisconnectOnRemoteSysStats", - "Value": 268 - }, - { - "Name": "DisconnectHashTimeout", - "Value": 269 - }, - { - "Name": "DisconnectCloudEditKick", - "Value": 270 - }, - { - "Name": "DisconnectPlayerless", - "Value": 271 - }, - { - "Name": "DisconnectNewSecurityKeyMismatch", - "Value": 272 - }, - { - "Name": "DisconnectEvicted", - "Value": 273 - }, - { - "Name": "DisconnectDevMaintenance", - "Value": 274 - }, - { - "Name": "DisconnectRobloxMaintenance", - "Value": 275 - }, - { - "Name": "DisconnectRejoin", - "Value": 276 - }, - { - "Name": "DisconnectConnectionLost", - "Value": 277 - }, - { - "Name": "DisconnectIdle", - "Value": 278 - }, - { - "LegacyNames": [ - "DisconnectNoResponse" - ], - "Name": "DisconnectRaknetErrors", - "Value": 279 - }, - { - "Name": "DisconnectWrongVersion", - "Value": 280 - }, - { - "Name": "DisconnectBySecurityPolicy", - "Value": 281 - }, - { - "Name": "DisconnectBlockedIP", - "Value": 282 - }, - { - "Name": "DisconnectClientFailure", - "Value": 284 - }, - { - "Name": "DisconnectClientRequest", - "Value": 285 - }, - { - "Name": "DisconnectPrivateServerKickout", - "Value": 286 - }, - { - "Name": "DisconnectModeratedGame", - "Value": 287 - }, - { - "Name": "ServerShutdown", - "Value": 288 - }, - { - "Name": "ReplicatorTimeout", - "Value": 290 - }, - { - "Name": "PlayerRemoved", - "Value": 291 - }, - { - "Name": "DisconnectOutOfMemoryKeepPlayingLeave", - "Value": 292 - }, - { - "Name": "DisconnectRomarkEndOfTest", - "Value": 293 - }, - { - "Name": "DisconnectCollaboratorPermissionRevoked", - "Value": 294 - }, - { - "Name": "DisconnectCollaboratorUnderage", - "Value": 295 - }, - { - "Name": "NetworkInternal", - "Value": 296 - }, - { - "Name": "NetworkSend", - "Value": 297 - }, - { - "Name": "NetworkTimeout", - "Value": 298 - }, - { - "Name": "NetworkMisbehavior", - "Value": 299 - }, - { - "Name": "NetworkSecurity", - "Value": 300 - }, - { - "Name": "ReplacementReady", - "Value": 301 - }, - { - "Name": "ServerEmpty", - "Value": 302 - }, - { - "Name": "PhantomFreeze", - "Value": 303 - }, - { - "Name": "AndroidAnticheatKick", - "Value": 304 - }, - { - "Name": "AndroidEmulatorKick", - "Value": 305 - }, - { - "Name": "AndroidRootedKick", - "Value": 306 - }, - { - "Name": "ScreentimeLockoutKick", - "Value": 307 - }, - { - "Name": "DisconnectionNotification", - "Value": 308 - }, - { - "Name": "DisconnectVerboselyModeratedGame", - "Value": 309 - }, - { - "Name": "DisconnectCollaboratorNotAgeVerified", - "Value": 310 - }, - { - "Name": "DisconnectCollaboratorTrustedConnectionsRequired", - "Value": 311 - }, - { - "Name": "DisconnectCollaboratorOwnerActionRequired", - "Value": 312 - }, - { - "Name": "DisconnectCollaboratorTooManyCollaborators", - "Value": 313 - }, - { - "Name": "DisconnectCollaboratorUnknownError", - "Value": 314 - }, - { - "Name": "PlacelaunchErrors", - "Value": 512 - }, - { - "Name": "PlacelaunchDisabled", - "Value": 515 - }, - { - "Name": "PlacelaunchError", - "Value": 516 - }, - { - "Name": "PlacelaunchGameEnded", - "Value": 517 - }, - { - "Name": "PlacelaunchGameFull", - "Value": 518 - }, - { - "Name": "PlacelaunchUserLeft", - "Value": 522 - }, - { - "Name": "PlacelaunchRestricted", - "Value": 523 - }, - { - "Name": "PlacelaunchUnauthorized", - "Value": 524 - }, - { - "Name": "PlacelaunchFlooded", - "Value": 525 - }, - { - "Name": "PlacelaunchHashExpired", - "Value": 526 - }, - { - "Name": "PlacelaunchHashException", - "Value": 527 - }, - { - "Name": "PlacelaunchPartyCannotFit", - "Value": 528 - }, - { - "Name": "PlacelaunchHttpError", - "Value": 529 - }, - { - "Name": "PlacelaunchUserPrivacyUnauthorized", - "Value": 533 - }, - { - "Name": "PlacelaunchCreatorBan", - "Value": 600 - }, - { - "Name": "PlacelaunchCustomMessage", - "Value": 610 - }, - { - "Name": "PlacelaunchOtherError", - "Value": 611 - }, - { - "Name": "TeleportErrors", - "Value": 768 - }, - { - "Name": "TeleportFailure", - "Value": 769 - }, - { - "Name": "TeleportGameNotFound", - "Value": 770 - }, - { - "Name": "TeleportGameEnded", - "Value": 771 - }, - { - "Name": "TeleportGameFull", - "Value": 772 - }, - { - "Name": "TeleportUnauthorized", - "Value": 773 - }, - { - "Name": "TeleportFlooded", - "Value": 774 - }, - { - "Name": "TeleportIsTeleporting", - "Value": 775 - } - ], - "Name": "ConnectionError" - }, - { - "Items": [ - { - "Name": "Connected", - "Value": 0 - }, - { - "Name": "Disconnected", - "Value": 1 - } - ], - "Name": "ConnectionState" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Uri", - "Value": 1 - }, - { - "Name": "Object", - "Value": 2 - }, - { - "Name": "Opaque", - "Value": 3 - } - ], - "Name": "ContentSourceType" - }, - { - "Items": [ - { - "Name": "Low", - "Value": 1000 - }, - { - "LegacyNames": [ - "Default" - ], - "Name": "Medium", - "Value": 2000 - }, - { - "Name": "High", - "Value": 3000 - } - ], - "Name": "ContextActionPriority" - }, - { - "Items": [ - { - "Name": "Sink", - "Value": 0 - }, - { - "Name": "Pass", - "Value": 1 - } - ], - "Name": "ContextActionResult" - }, - { - "Items": [ - { - "Name": "Classic", - "Value": 0 - }, - { - "LegacyNames": [ - "Mouse Lock Switch" - ], - "Name": "MouseLockSwitch", - "Value": 1 - } - ], - "Name": "ControlMode" - }, - { - "Items": [ - { - "Name": "PlayerList", - "Value": 0 - }, - { - "Name": "Health", - "Value": 1 - }, - { - "Name": "Backpack", - "Value": 2 - }, - { - "Name": "Chat", - "Value": 3 - }, - { - "Name": "All", - "Value": 4 - }, - { - "Name": "EmotesMenu", - "Value": 5 - }, - { - "Name": "SelfView", - "Value": 6 - }, - { - "Name": "Captures", - "Value": 7 - }, - { - "Name": "AvatarSwitcher", - "Value": 8 - } - ], - "Name": "CoreGuiType" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 1 - }, - { - "Name": "PermissionDenied", - "Value": 2 - }, - { - "Name": "UploadFailed", - "Value": 3 - }, - { - "Name": "Unknown", - "Value": 4 - } - ], - "Name": "CreateAssetResult" - }, - { - "Items": [ - { - "Name": "InvalidName", - "Value": 1 - }, - { - "Name": "OutfitLimitReached", - "Value": 2 - }, - { - "Name": "Other", - "Value": 3 - } - ], - "Name": "CreateOutfitFailure" - }, - { - "Items": [ - { - "Name": "User", - "Value": 0 - }, - { - "Name": "Group", - "Value": 1 - } - ], - "Name": "CreatorType" - }, - { - "Items": [ - { - "Name": "User", - "Value": 0 - }, - { - "Name": "Group", - "Value": 1 - }, - { - "Name": "All", - "Value": 2 - } - ], - "Name": "CreatorTypeFilter" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Robux", - "Value": 1 - }, - { - "Name": "Tix", - "Value": 2 - } - ], - "Name": "CurrencyType" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Classic", - "Value": 1 - }, - { - "Name": "Follow", - "Value": 2 - } - ], - "Name": "CustomCameraMode" - }, - { - "Items": [ - { - "Name": "PlaceFile", - "Value": 0 - }, - { - "Name": "FirstSlice", - "Value": 1 - }, - { - "Name": "NonFirstSlice", - "Value": 2 - } - ], - "Name": "DataModelExtractorFileType" - }, - { - "Items": [ - { - "Name": "GetAsync", - "Value": 0 - }, - { - "Name": "SetIncrementAsync", - "Value": 1 - }, - { - "Name": "UpdateAsync", - "Value": 2 - }, - { - "Name": "GetSortedAsync", - "Value": 3 - }, - { - "Name": "SetIncrementSortedAsync", - "Value": 4 - }, - { - "Name": "OnUpdate", - "Value": 5 - }, - { - "Name": "ListAsync", - "Value": 6 - }, - { - "Name": "GetVersionAsync", - "Value": 7 - }, - { - "Name": "RemoveVersionAsync", - "Value": 8 - }, - { - "Name": "StandardRead", - "Value": 9 - }, - { - "Name": "StandardWrite", - "Value": 10 - }, - { - "Name": "StandardList", - "Value": 11 - }, - { - "Name": "StandardRemove", - "Value": 12 - }, - { - "Name": "OrderedRead", - "Value": 13 - }, - { - "Name": "OrderedWrite", - "Value": 14 - }, - { - "Name": "OrderedList", - "Value": 15 - }, - { - "Name": "OrderedRemove", - "Value": 16 - } - ], - "Name": "DataStoreRequestType" - }, - { - "Items": [ - { - "Name": "ClientRequest", - "Value": 0 - }, - { - "Name": "Timeout", - "Value": 1 - }, - { - "Name": "InvalidHost", - "Value": 2 - }, - { - "Name": "Disconnected", - "Value": 3 - }, - { - "Name": "ServerShutdown", - "Value": 4 - }, - { - "Name": "ServerProtocolMismatch", - "Value": 5 - }, - { - "Name": "ConfigurationFailed", - "Value": 6 - }, - { - "Name": "RpcError", - "Value": 7 - } - ], - "Name": "DebuggerEndReason" - }, - { - "Items": [ - { - "Name": "Never", - "Value": 0 - }, - { - "Name": "Always", - "Value": 1 - }, - { - "Name": "Unhandled", - "Value": 2 - } - ], - "Name": "DebuggerExceptionBreakMode" - }, - { - "Items": [ - { - "Name": "C", - "Value": 0 - }, - { - "Name": "Lua", - "Value": 1 - } - ], - "Name": "DebuggerFrameType" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "Requested", - "Value": 1 - }, - { - "Name": "Breakpoint", - "Value": 2 - }, - { - "Name": "Exception", - "Value": 3 - }, - { - "Name": "SingleStep", - "Value": 4 - }, - { - "Name": "Entrypoint", - "Value": 5 - } - ], - "Name": "DebuggerPauseReason" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "Timeout", - "Value": 1 - }, - { - "Name": "ConnectionLost", - "Value": 2 - }, - { - "Name": "InvalidResponse", - "Value": 3 - }, - { - "Name": "InternalError", - "Value": 4 - }, - { - "Name": "InvalidState", - "Value": 5 - }, - { - "Name": "RpcError", - "Value": 6 - }, - { - "Name": "InvalidArgument", - "Value": 7 - }, - { - "Name": "ConnectionClosed", - "Value": 8 - } - ], - "Name": "DebuggerStatus" - }, - { - "Items": [ - { - "Name": "Lua", - "Value": 0 - }, - { - "Name": "Luau", - "Value": 1 - } - ], - "Name": "DefaultScriptSyncFileType" - }, - { - "Items": [ - { - "Name": "Zoom", - "Value": 0 - }, - { - "Name": "Invisicam", - "Value": 1 - } - ], - "Name": "DevCameraOcclusionMode" - }, - { - "Items": [ - { - "Name": "UserChoice", - "Value": 0 - }, - { - "Name": "Classic", - "Value": 1 - }, - { - "Name": "Follow", - "Value": 2 - }, - { - "Name": "Orbital", - "Value": 3 - }, - { - "Name": "CameraToggle", - "Value": 4 - } - ], - "Name": "DevComputerCameraMovementMode" - }, - { - "Items": [ - { - "Name": "UserChoice", - "Value": 0 - }, - { - "Name": "KeyboardMouse", - "Value": 1 - }, - { - "Name": "ClickToMove", - "Value": 2 - }, - { - "Name": "Scriptable", - "Value": 3 - } - ], - "Name": "DevComputerMovementMode" - }, - { - "Items": [ - { - "Name": "UserChoice", - "Value": 0 - }, - { - "Name": "Classic", - "Value": 1 - }, - { - "Name": "Follow", - "Value": 2 - }, - { - "Name": "Orbital", - "Value": 3 - } - ], - "Name": "DevTouchCameraMovementMode" - }, - { - "Items": [ - { - "Name": "UserChoice", - "Value": 0 - }, - { - "Name": "Thumbstick", - "Value": 1 - }, - { - "Name": "DPad", - "Value": 2 - }, - { - "Name": "Thumbpad", - "Value": 3 - }, - { - "Name": "ClickToMove", - "Value": 4 - }, - { - "Name": "Scriptable", - "Value": 5 - }, - { - "Name": "DynamicThumbstick", - "Value": 6 - } - ], - "Name": "DevTouchMovementMode" - }, - { - "Items": [ - { - "Name": "Internal", - "Value": 0 - }, - { - "Name": "HttpCache", - "Value": 1 - }, - { - "Name": "Instances", - "Value": 2 - }, - { - "Name": "Signals", - "Value": 3 - }, - { - "Name": "LuaHeap", - "Value": 4 - }, - { - "Name": "Script", - "Value": 5 - }, - { - "Name": "PhysicsCollision", - "Value": 6 - }, - { - "LegacyNames": [ - "PhysicsParts" - ], - "Name": "BaseParts", - "Value": 7 - }, - { - "Name": "GraphicsSolidModels", - "Value": 8 - }, - { - "Name": "GraphicsMeshParts", - "Value": 10 - }, - { - "Name": "GraphicsParticles", - "Value": 11 - }, - { - "Name": "GraphicsParts", - "Value": 12 - }, - { - "Name": "GraphicsSpatialHash", - "Value": 13 - }, - { - "Name": "GraphicsTerrain", - "Value": 14 - }, - { - "Name": "GraphicsTexture", - "Value": 15 - }, - { - "Name": "GraphicsTextureCharacter", - "Value": 16 - }, - { - "Name": "Sounds", - "Value": 17 - }, - { - "Name": "StreamingSounds", - "Value": 18 - }, - { - "Name": "TerrainVoxels", - "Value": 19 - }, - { - "Name": "Gui", - "Value": 21 - }, - { - "Name": "Animation", - "Value": 22 - }, - { - "Name": "Navigation", - "Value": 23 - }, - { - "Name": "GeometryCSG", - "Value": 24 - }, - { - "Name": "GraphicsSlimModels", - "Value": 25 - } - ], - "Name": "DeveloperMemoryTag" - }, - { - "Items": [ - { - "Name": "DeviceCapture", - "Value": 0 - }, - { - "Name": "InExperienceFAE", - "Value": 1 - } - ], - "Name": "DeviceFeatureType" - }, - { - "Items": [ - { - "Name": "Console", - "Value": 0 - }, - { - "Name": "Phone", - "Value": 1 - }, - { - "Name": "Tablet", - "Value": 2 - }, - { - "Name": "Desktop", - "Value": 3 - }, - { - "Name": "VR", - "Value": 4 - } - ], - "Name": "DeviceForm" - }, - { - "Items": [ - { - "Name": "Low", - "Value": 0 - }, - { - "Name": "Medium", - "Value": 1 - }, - { - "Name": "High", - "Value": 2 - } - ], - "Name": "DeviceLevel" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "Desktop", - "Value": 1 - }, - { - "Name": "Tablet", - "Value": 2 - }, - { - "Name": "Phone", - "Value": 3 - } - ], - "Name": "DeviceType" - }, - { - "Items": [ - { - "Name": "SinglePlayer", - "Value": 0 - }, - { - "Name": "MultiplePlayers", - "Value": 1 - } - ], - "Name": "DialogBehaviorType" - }, - { - "Items": [ - { - "Name": "Quest", - "Value": 0 - }, - { - "Name": "Help", - "Value": 1 - }, - { - "Name": "Shop", - "Value": 2 - } - ], - "Name": "DialogPurpose" - }, - { - "Items": [ - { - "Name": "Neutral", - "Value": 0 - }, - { - "Name": "Friendly", - "Value": 1 - }, - { - "Name": "Enemy", - "Value": 2 - } - ], - "Name": "DialogTone" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Legacy", - "Value": 1 - }, - { - "Name": "Responsive", - "Value": 2 - } - ], - "Name": "DisplayScalingMode" - }, - { - "Items": [ - { - "Name": "Small", - "Value": 0 - }, - { - "Name": "Medium", - "Value": 1 - }, - { - "Name": "Large", - "Value": 2 - } - ], - "Name": "DisplaySize" - }, - { - "Items": [ - { - "Name": "Width", - "Value": 0 - }, - { - "Name": "Height", - "Value": 1 - } - ], - "Name": "DominantAxis" - }, - { - "Items": [ - { - "Name": "OK", - "Value": 0 - }, - { - "Name": "DraftOutdated", - "Value": 1 - }, - { - "Name": "ScriptRemoved", - "Value": 2 - }, - { - "Name": "DraftCommitted", - "Value": 3 - } - ], - "Name": "DraftStatusCode" - }, - { - "Items": [ - { - "Name": "TranslateLine", - "Value": 0 - }, - { - "Name": "TranslatePlane", - "Value": 1 - }, - { - "Name": "TranslatePlaneOrLine", - "Value": 2 - }, - { - "Name": "TranslateLineOrPlane", - "Value": 3 - }, - { - "Name": "TranslateViewPlane", - "Value": 4 - }, - { - "Name": "RotateAxis", - "Value": 5 - }, - { - "Name": "RotateTrackball", - "Value": 6 - }, - { - "Name": "Scriptable", - "Value": 7 - }, - { - "Name": "BestForDevice", - "Value": 8 - } - ], - "Name": "DragDetectorDragStyle" - }, - { - "Items": [ - { - "Name": "Nobody", - "Value": 0 - }, - { - "Name": "Everybody", - "Value": 1 - }, - { - "Name": "Scriptable", - "Value": 2 - } - ], - "Name": "DragDetectorPermissionPolicy" - }, - { - "Items": [ - { - "Name": "Geometric", - "Value": 0 - }, - { - "Name": "Physical", - "Value": 1 - }, - { - "Name": "Custom", - "Value": 2 - } - ], - "Name": "DragDetectorResponseStyle" - }, - { - "Items": [ - { - "Name": "Object", - "Value": 0 - }, - { - "Name": "World", - "Value": 1 - } - ], - "Name": "DraggerCoordinateSpace" - }, - { - "Items": [ - { - "Name": "Geometric", - "Value": 0 - }, - { - "Name": "Physical", - "Value": 1 - } - ], - "Name": "DraggerMovementMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Horizontal", - "Value": 1 - }, - { - "Name": "Vertical", - "Value": 2 - } - ], - "Name": "DraggingScrollBar" - }, - { - "Items": [ - { - "Name": "In", - "Value": 0 - }, - { - "Name": "Out", - "Value": 1 - }, - { - "Name": "InOut", - "Value": 2 - } - ], - "Name": "EasingDirection" - }, - { - "Items": [ - { - "Name": "Linear", - "Value": 0 - }, - { - "Name": "Sine", - "Value": 1 - }, - { - "Name": "Back", - "Value": 2 - }, - { - "Name": "Quad", - "Value": 3 - }, - { - "Name": "Quart", - "Value": 4 - }, - { - "Name": "Quint", - "Value": 5 - }, - { - "Name": "Bounce", - "Value": 6 - }, - { - "Name": "Elastic", - "Value": 7 - }, - { - "Name": "Exponential", - "Value": 8 - }, - { - "Name": "Circular", - "Value": 9 - }, - { - "Name": "Cubic", - "Value": 10 - } - ], - "Name": "EasingStyle" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "Allowed", - "Value": 1 - }, - { - "Name": "Disallowed", - "Value": 2 - } - ], - "Name": "EditableStatus" - }, - { - "Items": [ - { - "Name": "WhenScrollable", - "Value": 0 - }, - { - "Name": "Always", - "Value": 1 - }, - { - "Name": "Never", - "Value": 2 - } - ], - "Name": "ElasticBehavior" - }, - { - "Items": [ - { - "Name": "Screenshots", - "Value": 0 - }, - { - "Name": "Videos", - "Value": 1 - }, - { - "Name": "Logs", - "Value": 2 - } - ], - "Name": "EngineFolder" - }, - { - "Items": [ - { - "Name": "DefaultAuto", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Always", - "Value": 2 - }, - { - "Name": "Skip2", - "Value": 3 - }, - { - "Name": "Skip4", - "Value": 4 - }, - { - "Name": "Skip8", - "Value": 5 - }, - { - "Name": "Skip16", - "Value": 6 - } - ], - "Name": "EnviromentalPhysicsThrottle" - }, - { - "Items": [ - { - "Name": "DefaultScope", - "Value": 0 - }, - { - "Name": "CreatorAssetsCreate", - "Value": 1 - } - ], - "Name": "ExperienceAuthScope" - }, - { - "Items": [ - { - "Name": "Active", - "Value": 0 - }, - { - "Name": "Cancelled", - "Value": 1 - }, - { - "Name": "Moderated", - "Value": 2 - }, - { - "Name": "Unpublished", - "Value": 3 - }, - { - "Name": "Unknown", - "Value": 4 - } - ], - "Name": "ExperienceEventStatus" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "SafetyHighlightMode", - "Value": 1 - } - ], - "Name": "ExperienceStateCaptureSelectionMode" - }, - { - "Items": [ - { - "Name": "NewReplay", - "Value": 0 - }, - { - "Name": "ContiguousSlice", - "Value": 1 - }, - { - "Name": "NoncontiguousSlice", - "Value": 2 - } - ], - "Name": "ExperienceStateRecordingLoadMode" - }, - { - "Items": [ - { - "Name": "S3Url", - "Value": 0 - }, - { - "Name": "File", - "Value": 1 - } - ], - "Name": "ExperienceStateRecordingLoadSourceType" - }, - { - "Items": [ - { - "Name": "Undefined", - "Value": 0 - }, - { - "Name": "Stopped", - "Value": 1 - }, - { - "Name": "Playing", - "Value": 2 - }, - { - "Name": "Rewinding", - "Value": 3 - } - ], - "Name": "ExperienceStateRecordingPlaybackMode" - }, - { - "Items": [ - { - "Name": "NoCraters", - "Value": 0 - }, - { - "LegacyNames": [ - "CratersAndDebris" - ], - "Name": "Craters", - "Value": 1 - } - ], - "Name": "ExplosionType" - }, - { - "Items": [ - { - "Name": "LOD0", - "Value": 0 - }, - { - "Name": "LOD1", - "Value": 1 - }, - { - "Name": "LODCount", - "Value": 2 - } - ], - "Name": "FACSDataLod" - }, - { - "Items": [ - { - "Name": "Complete", - "Value": 0 - }, - { - "Name": "Cancel", - "Value": 1 - }, - { - "Name": "Error", - "Value": 2 - } - ], - "Name": "FacialAgeEstimationResultType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Audio", - "Value": 1 - }, - { - "Name": "Video", - "Value": 2 - }, - { - "Name": "Place", - "Value": 4 - }, - { - "Name": "Server", - "Value": 8 - } - ], - "Name": "FacialAnimationStreamingState" - }, - { - "Items": [ - { - "Name": "ChinRaiserUpperLip", - "Value": 0 - }, - { - "Name": "ChinRaiser", - "Value": 1 - }, - { - "Name": "FlatPucker", - "Value": 2 - }, - { - "Name": "Funneler", - "Value": 3 - }, - { - "Name": "LowerLipSuck", - "Value": 4 - }, - { - "Name": "LipPresser", - "Value": 5 - }, - { - "Name": "LipsTogether", - "Value": 6 - }, - { - "Name": "MouthLeft", - "Value": 7 - }, - { - "Name": "MouthRight", - "Value": 8 - }, - { - "Name": "Pucker", - "Value": 9 - }, - { - "Name": "UpperLipSuck", - "Value": 10 - }, - { - "Name": "LeftCheekPuff", - "Value": 11 - }, - { - "Name": "LeftDimpler", - "Value": 12 - }, - { - "Name": "LeftLipCornerDown", - "Value": 13 - }, - { - "Name": "LeftLowerLipDepressor", - "Value": 14 - }, - { - "Name": "LeftLipCornerPuller", - "Value": 15 - }, - { - "Name": "LeftLipStretcher", - "Value": 16 - }, - { - "Name": "LeftUpperLipRaiser", - "Value": 17 - }, - { - "Name": "RightCheekPuff", - "Value": 18 - }, - { - "Name": "RightDimpler", - "Value": 19 - }, - { - "Name": "RightLipCornerDown", - "Value": 20 - }, - { - "Name": "RightLowerLipDepressor", - "Value": 21 - }, - { - "Name": "RightLipCornerPuller", - "Value": 22 - }, - { - "Name": "RightLipStretcher", - "Value": 23 - }, - { - "Name": "RightUpperLipRaiser", - "Value": 24 - }, - { - "Name": "JawDrop", - "Value": 25 - }, - { - "Name": "JawLeft", - "Value": 26 - }, - { - "Name": "JawRight", - "Value": 27 - }, - { - "Name": "Corrugator", - "Value": 28 - }, - { - "Name": "LeftBrowLowerer", - "Value": 29 - }, - { - "Name": "LeftOuterBrowRaiser", - "Value": 30 - }, - { - "Name": "LeftNoseWrinkler", - "Value": 31 - }, - { - "Name": "LeftInnerBrowRaiser", - "Value": 32 - }, - { - "Name": "RightBrowLowerer", - "Value": 33 - }, - { - "Name": "RightOuterBrowRaiser", - "Value": 34 - }, - { - "Name": "RightInnerBrowRaiser", - "Value": 35 - }, - { - "Name": "RightNoseWrinkler", - "Value": 36 - }, - { - "Name": "EyesLookDown", - "Value": 37 - }, - { - "Name": "EyesLookLeft", - "Value": 38 - }, - { - "Name": "EyesLookUp", - "Value": 39 - }, - { - "Name": "EyesLookRight", - "Value": 40 - }, - { - "Name": "LeftCheekRaiser", - "Value": 41 - }, - { - "Name": "LeftEyeUpperLidRaiser", - "Value": 42 - }, - { - "Name": "LeftEyeClosed", - "Value": 43 - }, - { - "Name": "RightCheekRaiser", - "Value": 44 - }, - { - "Name": "RightEyeUpperLidRaiser", - "Value": 45 - }, - { - "Name": "RightEyeClosed", - "Value": 46 - }, - { - "Name": "TongueDown", - "Value": 47 - }, - { - "Name": "TongueOut", - "Value": 48 - }, - { - "Name": "TongueUp", - "Value": 49 - } - ], - "Name": "FacsActionUnit" - }, - { - "Items": [ - { - "Name": "ExperienceChat", - "Value": 0 - }, - { - "Name": "Communication", - "Value": 1 - } - ], - "Name": "FeatureRestrictionAbuseVector" - }, - { - "Items": [ - { - "Name": "Vertical", - "Value": 0 - }, - { - "Name": "Diagonal", - "Value": 1 - }, - { - "Name": "MaxAxis", - "Value": 2 - } - ], - "Name": "FieldOfViewMode" - }, - { - "Items": [ - { - "Name": "Horizontal", - "Value": 0 - }, - { - "Name": "Vertical", - "Value": 1 - } - ], - "Name": "FillDirection" - }, - { - "Items": [ - { - "Name": "BackslashNotEscapingAnything", - "Value": 0 - }, - { - "Name": "BadBespokeFilter", - "Value": 1 - }, - { - "Name": "BadName", - "Value": 2 - }, - { - "Name": "IncompleteOr", - "Value": 3 - }, - { - "Name": "IncompleteParenthesis", - "Value": 4 - }, - { - "Name": "InvalidDoubleStar", - "Value": 5 - }, - { - "Name": "InvalidTilde", - "Value": 6 - }, - { - "Name": "PropertyBadOperator", - "Value": 7 - }, - { - "Name": "PropertyDoesNotExist", - "Value": 8 - }, - { - "Name": "PropertyInvalidField", - "Value": 9 - }, - { - "Name": "PropertyInvalidValue", - "Value": 10 - }, - { - "Name": "PropertyUnsupportedFields", - "Value": 11 - }, - { - "Name": "PropertyUnsupportedProperty", - "Value": 12 - }, - { - "Name": "UnexpectedNameIndex", - "Value": 13 - }, - { - "Name": "UnexpectedToken", - "Value": 14 - }, - { - "Name": "UnfinishedBinaryOperator", - "Value": 15 - }, - { - "Name": "UnfinishedQuote", - "Value": 16 - }, - { - "Name": "UnknownBespokeFilter", - "Value": 17 - }, - { - "Name": "WildcardInProperty", - "Value": 18 - } - ], - "Name": "FilterErrorType" - }, - { - "Items": [ - { - "Name": "Accepted", - "Value": 0 - }, - { - "Name": "Rejected", - "Value": 1 - } - ], - "Name": "FilterResult" - }, - { - "Items": [ - { - "Name": "Exclude", - "Value": 0 - }, - { - "Name": "Include", - "Value": 1 - } - ], - "Name": "FilterType" - }, - { - "Items": [ - { - "Name": "Cancel", - "Value": 0 - }, - { - "Name": "Commit", - "Value": 1 - }, - { - "Name": "Append", - "Value": 2 - } - ], - "Name": "FinishRecordingOperation" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "UseCollisionGeometry", - "Value": 1 - }, - { - "Name": "UsePreciseGeometry", - "Value": 2 - } - ], - "Name": "FluidFidelity" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Experimental", - "Value": 1 - } - ], - "Name": "FluidForces" - }, - { - "Items": [ - { - "Name": "Legacy", - "Value": 0 - }, - { - "Name": "Arial", - "Value": 1 - }, - { - "Name": "ArialBold", - "Value": 2 - }, - { - "Name": "SourceSans", - "Value": 3 - }, - { - "Name": "SourceSansBold", - "Value": 4 - }, - { - "Name": "SourceSansLight", - "Value": 5 - }, - { - "Name": "SourceSansItalic", - "Value": 6 - }, - { - "Name": "Bodoni", - "Value": 7 - }, - { - "Name": "Garamond", - "Value": 8 - }, - { - "Name": "Cartoon", - "Value": 9 - }, - { - "Name": "Code", - "Value": 10 - }, - { - "Name": "Highway", - "Value": 11 - }, - { - "Name": "SciFi", - "Value": 12 - }, - { - "Name": "Arcade", - "Value": 13 - }, - { - "Name": "Fantasy", - "Value": 14 - }, - { - "Name": "Antique", - "Value": 15 - }, - { - "Name": "SourceSansSemibold", - "Value": 16 - }, - { - "LegacyNames": [ - "Montserrat" - ], - "Name": "Gotham", - "Value": 17 - }, - { - "LegacyNames": [ - "GothamSemibold", - "MontserratMedium" - ], - "Name": "GothamMedium", - "Value": 18 - }, - { - "LegacyNames": [ - "MontserratBold" - ], - "Name": "GothamBold", - "Value": 19 - }, - { - "LegacyNames": [ - "MontserratBlack" - ], - "Name": "GothamBlack", - "Value": 20 - }, - { - "Name": "AmaticSC", - "Value": 21 - }, - { - "Name": "Bangers", - "Value": 22 - }, - { - "Name": "Creepster", - "Value": 23 - }, - { - "Name": "DenkOne", - "Value": 24 - }, - { - "Name": "Fondamento", - "Value": 25 - }, - { - "Name": "FredokaOne", - "Value": 26 - }, - { - "Name": "GrenzeGotisch", - "Value": 27 - }, - { - "Name": "IndieFlower", - "Value": 28 - }, - { - "Name": "JosefinSans", - "Value": 29 - }, - { - "Name": "Jura", - "Value": 30 - }, - { - "Name": "Kalam", - "Value": 31 - }, - { - "Name": "LuckiestGuy", - "Value": 32 - }, - { - "Name": "Merriweather", - "Value": 33 - }, - { - "Name": "Michroma", - "Value": 34 - }, - { - "Name": "Nunito", - "Value": 35 - }, - { - "Name": "Oswald", - "Value": 36 - }, - { - "Name": "PatrickHand", - "Value": 37 - }, - { - "Name": "PermanentMarker", - "Value": 38 - }, - { - "Name": "Roboto", - "Value": 39 - }, - { - "Name": "RobotoCondensed", - "Value": 40 - }, - { - "Name": "RobotoMono", - "Value": 41 - }, - { - "Name": "Sarpanch", - "Value": 42 - }, - { - "Name": "SpecialElite", - "Value": 43 - }, - { - "Name": "TitilliumWeb", - "Value": 44 - }, - { - "Name": "Ubuntu", - "Value": 45 - }, - { - "Name": "BuilderSans", - "Value": 46 - }, - { - "Name": "BuilderSansMedium", - "Value": 47 - }, - { - "Name": "BuilderSansBold", - "Value": 48 - }, - { - "Name": "BuilderSansExtraBold", - "Value": 49 - }, - { - "Name": "Arimo", - "Value": 50 - }, - { - "Name": "ArimoBold", - "Value": 51 - }, - { - "Name": "Unknown", - "Value": 100 - } - ], - "Name": "Font" - }, - { - "Items": [ - { - "Name": "Size8", - "Value": 0 - }, - { - "Name": "Size9", - "Value": 1 - }, - { - "Name": "Size10", - "Value": 2 - }, - { - "Name": "Size11", - "Value": 3 - }, - { - "Name": "Size12", - "Value": 4 - }, - { - "Name": "Size14", - "Value": 5 - }, - { - "Name": "Size18", - "Value": 6 - }, - { - "Name": "Size24", - "Value": 7 - }, - { - "Name": "Size36", - "Value": 8 - }, - { - "Name": "Size48", - "Value": 9 - }, - { - "Name": "Size28", - "Value": 10 - }, - { - "Name": "Size32", - "Value": 11 - }, - { - "Name": "Size42", - "Value": 12 - }, - { - "Name": "Size60", - "Value": 13 - }, - { - "Name": "Size96", - "Value": 14 - } - ], - "Name": "FontSize" - }, - { - "Items": [ - { - "Name": "Normal", - "Value": 0 - }, - { - "Name": "Italic", - "Value": 1 - } - ], - "Name": "FontStyle" - }, - { - "Items": [ - { - "Name": "Thin", - "Value": 100 - }, - { - "Name": "ExtraLight", - "Value": 200 - }, - { - "Name": "Light", - "Value": 300 - }, - { - "Name": "Regular", - "Value": 400 - }, - { - "Name": "Medium", - "Value": 500 - }, - { - "Name": "SemiBold", - "Value": 600 - }, - { - "Name": "Bold", - "Value": 700 - }, - { - "Name": "ExtraBold", - "Value": 800 - }, - { - "Name": "Heavy", - "Value": 900 - } - ], - "Name": "FontWeight" - }, - { - "Items": [ - { - "Name": "Magnitude", - "Value": 0 - }, - { - "Name": "PerAxis", - "Value": 1 - } - ], - "Name": "ForceLimitMode" - }, - { - "Items": [ - { - "Name": "Symmetric", - "Value": 0 - }, - { - "LegacyNames": [ - "Block" - ], - "Name": "Brick", - "Value": 1 - }, - { - "Name": "Plate", - "Value": 2 - }, - { - "Name": "Custom", - "Value": 3 - } - ], - "Name": "FormFactor" - }, - { - "Items": [ - { - "Name": "Custom", - "Value": 0 - }, - { - "Name": "ChatBlue", - "Value": 1 - }, - { - "Name": "RobloxSquare", - "Value": 2 - }, - { - "Name": "RobloxRound", - "Value": 3 - }, - { - "Name": "ChatGreen", - "Value": 4 - }, - { - "Name": "ChatRed", - "Value": 5 - }, - { - "Name": "DropShadow", - "Value": 6 - } - ], - "Name": "FrameStyle" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "On", - "Value": 1 - }, - { - "Name": "Off", - "Value": 2 - } - ], - "Name": "FramerateManagerMode" - }, - { - "Items": [ - { - "Name": "Issue", - "Value": 0 - }, - { - "Name": "Revoke", - "Value": 1 - }, - { - "Name": "Accept", - "Value": 2 - }, - { - "Name": "Deny", - "Value": 3 - } - ], - "Name": "FriendRequestEvent" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "NotFriend", - "Value": 1 - }, - { - "Name": "Friend", - "Value": 2 - }, - { - "Name": "FriendRequestSent", - "Value": 3 - }, - { - "Name": "FriendRequestReceived", - "Value": 4 - } - ], - "Name": "FriendStatus" - }, - { - "Items": [ - { - "Name": "Passed", - "Value": 0 - }, - { - "Name": "Warning", - "Value": 1 - }, - { - "Name": "Error", - "Value": 2 - } - ], - "Name": "FunctionalTestResult" - }, - { - "Items": [ - { - "Name": "R6", - "Value": 0 - }, - { - "Name": "R15", - "Value": 1 - }, - { - "Name": "PlayerChoice", - "Value": 2 - } - ], - "Name": "GameAvatarType" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "PS4", - "Value": 1 - }, - { - "Name": "PS5", - "Value": 2 - }, - { - "Name": "XboxOne", - "Value": 3 - } - ], - "Name": "GamepadType" - }, - { - "Items": [ - { - "Name": "AllGenres", - "Tags": [ - "Deprecated" - ], - "Value": 0 - }, - { - "Name": "MatchingGenreOnly", - "Tags": [ - "Deprecated" - ], - "Value": 1 - } - ], - "Name": "GearGenreSetting", - "Tags": [ - "Deprecated" - ] - }, - { - "Items": [ - { - "Name": "MeleeWeapons", - "Tags": [ - "Deprecated" - ], - "Value": 0 - }, - { - "Name": "RangedWeapons", - "Tags": [ - "Deprecated" - ], - "Value": 1 - }, - { - "Name": "Explosives", - "Tags": [ - "Deprecated" - ], - "Value": 2 - }, - { - "Name": "PowerUps", - "Tags": [ - "Deprecated" - ], - "Value": 3 - }, - { - "Name": "NavigationEnhancers", - "Tags": [ - "Deprecated" - ], - "Value": 4 - }, - { - "Name": "MusicalInstruments", - "Tags": [ - "Deprecated" - ], - "Value": 5 - }, - { - "Name": "SocialItems", - "Tags": [ - "Deprecated" - ], - "Value": 6 - }, - { - "Name": "BuildingTools", - "Tags": [ - "Deprecated" - ], - "Value": 7 - }, - { - "Name": "Transport", - "Tags": [ - "Deprecated" - ], - "Value": 8 - } - ], - "Name": "GearType", - "Tags": [ - "Deprecated" - ] - }, - { - "Items": [ - { - "Name": "All", - "Value": 0 - }, - { - "Name": "TownAndCity", - "Value": 1 - }, - { - "Name": "Fantasy", - "Value": 2 - }, - { - "Name": "SciFi", - "Value": 3 - }, - { - "Name": "Ninja", - "Value": 4 - }, - { - "Name": "Scary", - "Value": 5 - }, - { - "Name": "Pirate", - "Value": 6 - }, - { - "Name": "Adventure", - "Value": 7 - }, - { - "Name": "Sports", - "Value": 8 - }, - { - "Name": "Funny", - "Value": 9 - }, - { - "Name": "WildWest", - "Value": 10 - }, - { - "Name": "War", - "Value": 11 - }, - { - "Name": "SkatePark", - "Value": 12 - }, - { - "Name": "Tutorial", - "Value": 13 - } - ], - "Name": "Genre", - "Tags": [ - "Deprecated" - ] - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 1 - }, - { - "Name": "Direct3D11", - "Value": 2 - }, - { - "Name": "OpenGL", - "Value": 4 - }, - { - "Name": "Metal", - "Value": 5 - }, - { - "Name": "Vulkan", - "Value": 6 - }, - { - "Name": "NoGraphics", - "Value": 9 - } - ], - "Name": "GraphicsMode" - }, - { - "Items": [ - { - "Name": "Performance", - "Value": 0 - }, - { - "Name": "Balanced", - "Value": 1 - }, - { - "Name": "Quality", - "Value": 2 - } - ], - "Name": "GraphicsOptimizationMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Joined", - "Value": 1 - }, - { - "Name": "JoinRequestPending", - "Value": 2 - }, - { - "Name": "AlreadyMember", - "Value": 3 - } - ], - "Name": "GroupMembershipStatus" - }, - { - "Items": [ - { - "Name": "Idle", - "Value": 0 - }, - { - "Name": "Hover", - "Value": 1 - }, - { - "Name": "Press", - "Value": 2 - }, - { - "Name": "NonInteractable", - "Value": 3 - } - ], - "Name": "GuiState" - }, - { - "Items": [ - { - "Name": "Core", - "Value": 0 - }, - { - "Name": "Custom", - "Value": 1 - }, - { - "Name": "PlayerNameplates", - "Value": 2 - }, - { - "Name": "CustomBillboards", - "Value": 3 - }, - { - "Name": "CoreBillboards", - "Value": 4 - } - ], - "Name": "GuiType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Left", - "Value": 1 - }, - { - "Name": "Right", - "Value": 2 - } - ], - "Name": "HandRigDescriptionSide" - }, - { - "Items": [ - { - "Name": "Resize", - "Value": 0 - }, - { - "Name": "Movement", - "Value": 1 - } - ], - "Name": "HandlesStyle" - }, - { - "Items": [ - { - "Name": "Custom", - "Value": 0 - }, - { - "Name": "UIHover", - "Value": 1 - }, - { - "Name": "UIClick", - "Value": 2 - }, - { - "Name": "UINotification", - "Value": 3 - }, - { - "Name": "GameplayExplosion", - "Value": 4 - }, - { - "Name": "GameplayCollision", - "Value": 5 - } - ], - "Name": "HapticEffectType" - }, - { - "Items": [ - { - "Name": "Blake2b", - "Value": 0 - }, - { - "Name": "Blake3", - "Value": 1 - }, - { - "Name": "Md5", - "Value": 2 - }, - { - "Name": "Sha1", - "Value": 3 - }, - { - "Name": "Sha256", - "Value": 4 - } - ], - "Name": "HashAlgorithm" - }, - { - "Items": [ - { - "Name": "AlwaysOnTop", - "Value": 0 - }, - { - "Name": "Occluded", - "Value": 1 - } - ], - "Name": "HighlightDepthMode" - }, - { - "Items": [ - { - "Name": "Center", - "Value": 0 - }, - { - "Name": "Left", - "Value": 1 - }, - { - "Name": "Right", - "Value": 2 - } - ], - "Name": "HorizontalAlignment" - }, - { - "Items": [ - { - "Name": "VerySlow", - "Value": 0 - }, - { - "Name": "Slow", - "Value": 1 - }, - { - "Name": "Medium", - "Value": 2 - }, - { - "Name": "Fast", - "Value": 3 - }, - { - "Name": "VeryFast", - "Value": 4 - } - ], - "Name": "HoverAnimateSpeed" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Full", - "Value": 1 - }, - { - "Name": "DataOnly", - "Value": 2 - }, - { - "Name": "Default", - "Value": 3 - }, - { - "Name": "InternalRedirectRefresh", - "Value": 4 - } - ], - "Name": "HttpCachePolicy" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Gzip", - "Value": 1 - } - ], - "Name": "HttpCompression" - }, - { - "Items": [ - { - "Name": "ApplicationJson", - "Value": 0 - }, - { - "Name": "ApplicationXml", - "Value": 1 - }, - { - "Name": "ApplicationUrlEncoded", - "Value": 2 - }, - { - "Name": "TextPlain", - "Value": 3 - }, - { - "Name": "TextXml", - "Value": 4 - } - ], - "Name": "HttpContentType" - }, - { - "Items": [ - { - "Name": "OK", - "Value": 0 - }, - { - "Name": "InvalidUrl", - "Value": 1 - }, - { - "Name": "DnsResolve", - "Value": 2 - }, - { - "Name": "ConnectFail", - "Value": 3 - }, - { - "Name": "OutOfMemory", - "Value": 4 - }, - { - "Name": "TimedOut", - "Value": 5 - }, - { - "Name": "TooManyRedirects", - "Value": 6 - }, - { - "Name": "InvalidRedirect", - "Value": 7 - }, - { - "Name": "NetFail", - "Value": 8 - }, - { - "Name": "Aborted", - "Value": 9 - }, - { - "Name": "SslConnectFail", - "Value": 10 - }, - { - "Name": "SslVerificationFail", - "Value": 11 - }, - { - "Name": "Unknown", - "Value": 12 - }, - { - "Name": "ConnectionClosed", - "Value": 13 - }, - { - "Name": "ServerProtocolError", - "Value": 14 - }, - { - "Name": "CreatorEnvironmentsNotSupportedByService", - "Value": 15 - }, - { - "Name": "InactivityTimeout", - "Value": 16 - }, - { - "Name": "TooManyOutstandingRequests", - "Value": 17 - } - ], - "Name": "HttpError" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "MarketplaceService", - "Value": 2 - }, - { - "Name": "Players", - "Value": 7 - }, - { - "Name": "Chat", - "Value": 15 - }, - { - "Name": "Avatar", - "Value": 16 - }, - { - "Name": "Analytics", - "Value": 23 - }, - { - "Name": "Localization", - "Value": 25 - } - ], - "Name": "HttpRequestType" - }, - { - "Items": [ - { - "Name": "OuterBox", - "Value": 0 - }, - { - "Name": "InnerBox", - "Value": 1 - } - ], - "Name": "HumanoidCollisionType" - }, - { - "Items": [ - { - "Name": "Viewer", - "Value": 0 - }, - { - "Name": "Subject", - "Value": 1 - }, - { - "Name": "None", - "Value": 2 - } - ], - "Name": "HumanoidDisplayDistanceType" - }, - { - "Items": [ - { - "Name": "DisplayWhenDamaged", - "Value": 0 - }, - { - "Name": "AlwaysOn", - "Value": 1 - }, - { - "Name": "AlwaysOff", - "Value": 2 - } - ], - "Name": "HumanoidHealthDisplayType" - }, - { - "Items": [ - { - "Name": "R6", - "Value": 0 - }, - { - "Name": "R15", - "Value": 1 - } - ], - "Name": "HumanoidRigType" - }, - { - "Items": [ - { - "Name": "FallingDown", - "Value": 0 - }, - { - "Name": "Ragdoll", - "Value": 1 - }, - { - "Name": "GettingUp", - "Value": 2 - }, - { - "Name": "Jumping", - "Value": 3 - }, - { - "Name": "Swimming", - "Value": 4 - }, - { - "Name": "Freefall", - "Value": 5 - }, - { - "Name": "Flying", - "Value": 6 - }, - { - "Name": "Landed", - "Value": 7 - }, - { - "Name": "Running", - "Value": 8 - }, - { - "Name": "RunningNoPhysics", - "Value": 10 - }, - { - "Name": "StrafingNoPhysics", - "Value": 11 - }, - { - "Name": "Climbing", - "Value": 12 - }, - { - "Name": "Seated", - "Value": 13 - }, - { - "Name": "PlatformStanding", - "Value": 14 - }, - { - "Name": "Dead", - "Value": 15 - }, - { - "Name": "Physics", - "Value": 16 - }, - { - "Name": "None", - "Value": 18 - } - ], - "Name": "HumanoidStateType" - }, - { - "Items": [ - { - "Name": "NoCollisions", - "Value": 0 - }, - { - "Name": "OtherMechanismsAnchored", - "Value": 1 - }, - { - "Name": "IncludeContactedMechanisms", - "Value": 2 - } - ], - "Name": "IKCollisionsMode" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "IKControlConstraintSupport" - }, - { - "Items": [ - { - "Name": "Transform", - "Value": 0 - }, - { - "Name": "Position", - "Value": 1 - }, - { - "Name": "Rotation", - "Value": 2 - }, - { - "Name": "LookAt", - "Value": 3 - } - ], - "Name": "IKControlType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Pending", - "Value": 1 - }, - { - "Name": "Initialized", - "Value": 2 - }, - { - "Name": "ErrorInvalidUser", - "Value": 3 - }, - { - "Name": "ErrorConnection", - "Value": 4 - }, - { - "Name": "ErrorJsonParse", - "Value": 5 - }, - { - "Name": "ErrorTimedOut", - "Value": 6 - } - ], - "Name": "IXPLoadingStatus" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 1 - }, - { - "Name": "LockCanvasAlpha", - "Value": 2 - }, - { - "Name": "LockCanvasColor", - "Value": 3 - } - ], - "Name": "ImageAlphaType" - }, - { - "Items": [ - { - "Name": "BlendSourceOver", - "Value": 1 - }, - { - "Name": "Overwrite", - "Value": 2 - }, - { - "Name": "Add", - "Value": 3 - }, - { - "Name": "Multiply", - "Value": 4 - }, - { - "Name": "AlphaBlend", - "Value": 5 - } - ], - "Name": "ImageCombineType" - }, - { - "Items": [ - { - "Name": "Edge", - "Value": 0 - }, - { - "Name": "Inset", - "Value": 1 - }, - { - "Name": "Center", - "Value": 2 - } - ], - "Name": "InOut" - }, - { - "Items": [ - { - "Name": "Asset", - "Value": 0 - }, - { - "Name": "Product", - "Value": 1 - }, - { - "Name": "GamePass", - "Value": 2 - }, - { - "Name": "Subscription", - "Value": 3 - }, - { - "Name": "Bundle", - "Value": 4 - } - ], - "Name": "InfoType" - }, - { - "Items": [ - { - "Name": "Top", - "Value": 0 - }, - { - "Name": "Bottom", - "Value": 1 - }, - { - "Name": "Left", - "Value": 2 - }, - { - "Name": "Right", - "Value": 3 - }, - { - "Name": "Float", - "Value": 4 - } - ], - "Name": "InitialDockState" - }, - { - "Items": [ - { - "Name": "Bool", - "Value": 0 - }, - { - "Name": "Direction1D", - "Value": 1 - }, - { - "Name": "Direction2D", - "Value": 2 - }, - { - "Name": "Direction3D", - "Value": 3 - }, - { - "Name": "ViewportPosition", - "Value": 4 - } - ], - "Name": "InputActionType" - }, - { - "Items": [ - { - "LegacyNames": [ - "Action1", - "Action2", - "Action3", - "Action4", - "Action5", - "LeftTread", - "RightTread", - "Steer", - "Throtle", - "Throttle", - "UpDown" - ], - "Name": "NoInput", - "Value": 0 - }, - { - "Name": "Constant", - "Value": 12 - }, - { - "Name": "Sin", - "Value": 13 - } - ], - "Name": "InputType" - }, - { - "Items": [ - { - "Name": "NotSynced", - "Value": 0 - }, - { - "Name": "Errored", - "Value": 1 - }, - { - "Name": "SyncedAsRoot", - "Value": 2 - }, - { - "Name": "SyncedAsDescendant", - "Value": 3 - }, - { - "Name": "AncestorErrored", - "Value": 4 - } - ], - "Name": "InstanceFileSyncStatus" - }, - { - "Items": [ - { - "Name": "HighQualityMesh", - "Value": 0 - } - ], - "Name": "IntermediateMeshGenerationResult" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "InterpolationThrottlingMode" - }, - { - "Items": [ - { - "Name": "Placed", - "Value": 0 - }, - { - "Name": "Accepted", - "Value": 1 - }, - { - "Name": "Declined", - "Value": 2 - }, - { - "Name": "Missed", - "Value": 3 - } - ], - "Name": "InviteState" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "Start", - "Value": 1 - }, - { - "Name": "Center", - "Value": 2 - }, - { - "Name": "End", - "Value": 3 - }, - { - "Name": "Stretch", - "Value": 4 - } - ], - "Name": "ItemLineAlignment" - }, - { - "Items": [ - { - "Name": "CreatedItemAttribution", - "Value": 1 - } - ], - "Name": "JoinSource" - }, - { - "Items": [ - { - "Name": "All", - "Value": 0 - }, - { - "Name": "Surface", - "Value": 1 - }, - { - "Name": "None", - "Value": 2 - } - ], - "Name": "JointCreationMode" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "Backspace", - "Value": 8 - }, - { - "Name": "Tab", - "Value": 9 - }, - { - "Name": "Clear", - "Value": 12 - }, - { - "Name": "Return", - "Value": 13 - }, - { - "Name": "Pause", - "Value": 19 - }, - { - "Name": "Escape", - "Value": 27 - }, - { - "Name": "Space", - "Value": 32 - }, - { - "Name": "QuotedDouble", - "Value": 34 - }, - { - "Name": "Hash", - "Value": 35 - }, - { - "Name": "Dollar", - "Value": 36 - }, - { - "Name": "Percent", - "Value": 37 - }, - { - "Name": "Ampersand", - "Value": 38 - }, - { - "Name": "Quote", - "Value": 39 - }, - { - "Name": "LeftParenthesis", - "Value": 40 - }, - { - "Name": "RightParenthesis", - "Value": 41 - }, - { - "Name": "Asterisk", - "Value": 42 - }, - { - "Name": "Plus", - "Value": 43 - }, - { - "Name": "Comma", - "Value": 44 - }, - { - "Name": "Minus", - "Value": 45 - }, - { - "Name": "Period", - "Value": 46 - }, - { - "Name": "Slash", - "Value": 47 - }, - { - "Name": "Zero", - "Value": 48 - }, - { - "Name": "One", - "Value": 49 - }, - { - "Name": "Two", - "Value": 50 - }, - { - "Name": "Three", - "Value": 51 - }, - { - "Name": "Four", - "Value": 52 - }, - { - "Name": "Five", - "Value": 53 - }, - { - "Name": "Six", - "Value": 54 - }, - { - "Name": "Seven", - "Value": 55 - }, - { - "Name": "Eight", - "Value": 56 - }, - { - "Name": "Nine", - "Value": 57 - }, - { - "Name": "Colon", - "Value": 58 - }, - { - "Name": "Semicolon", - "Value": 59 - }, - { - "Name": "LessThan", - "Value": 60 - }, - { - "Name": "Equals", - "Value": 61 - }, - { - "Name": "GreaterThan", - "Value": 62 - }, - { - "Name": "Question", - "Value": 63 - }, - { - "Name": "At", - "Value": 64 - }, - { - "Name": "LeftBracket", - "Value": 91 - }, - { - "Name": "BackSlash", - "Value": 92 - }, - { - "Name": "RightBracket", - "Value": 93 - }, - { - "Name": "Caret", - "Value": 94 - }, - { - "Name": "Underscore", - "Value": 95 - }, - { - "Name": "Backquote", - "Value": 96 - }, - { - "Name": "A", - "Value": 97 - }, - { - "Name": "B", - "Value": 98 - }, - { - "Name": "C", - "Value": 99 - }, - { - "Name": "D", - "Value": 100 - }, - { - "Name": "E", - "Value": 101 - }, - { - "Name": "F", - "Value": 102 - }, - { - "Name": "G", - "Value": 103 - }, - { - "Name": "H", - "Value": 104 - }, - { - "Name": "I", - "Value": 105 - }, - { - "Name": "J", - "Value": 106 - }, - { - "Name": "K", - "Value": 107 - }, - { - "Name": "L", - "Value": 108 - }, - { - "Name": "M", - "Value": 109 - }, - { - "Name": "N", - "Value": 110 - }, - { - "Name": "O", - "Value": 111 - }, - { - "Name": "P", - "Value": 112 - }, - { - "Name": "Q", - "Value": 113 - }, - { - "Name": "R", - "Value": 114 - }, - { - "Name": "S", - "Value": 115 - }, - { - "Name": "T", - "Value": 116 - }, - { - "Name": "U", - "Value": 117 - }, - { - "Name": "V", - "Value": 118 - }, - { - "Name": "W", - "Value": 119 - }, - { - "Name": "X", - "Value": 120 - }, - { - "Name": "Y", - "Value": 121 - }, - { - "Name": "Z", - "Value": 122 - }, - { - "Name": "LeftCurly", - "Value": 123 - }, - { - "Name": "Pipe", - "Value": 124 - }, - { - "Name": "RightCurly", - "Value": 125 - }, - { - "Name": "Tilde", - "Value": 126 - }, - { - "Name": "Delete", - "Value": 127 - }, - { - "Name": "KeypadZero", - "Value": 256 - }, - { - "Name": "KeypadOne", - "Value": 257 - }, - { - "Name": "KeypadTwo", - "Value": 258 - }, - { - "Name": "KeypadThree", - "Value": 259 - }, - { - "Name": "KeypadFour", - "Value": 260 - }, - { - "Name": "KeypadFive", - "Value": 261 - }, - { - "Name": "KeypadSix", - "Value": 262 - }, - { - "Name": "KeypadSeven", - "Value": 263 - }, - { - "Name": "KeypadEight", - "Value": 264 - }, - { - "Name": "KeypadNine", - "Value": 265 - }, - { - "Name": "KeypadPeriod", - "Value": 266 - }, - { - "Name": "KeypadDivide", - "Value": 267 - }, - { - "Name": "KeypadMultiply", - "Value": 268 - }, - { - "Name": "KeypadMinus", - "Value": 269 - }, - { - "Name": "KeypadPlus", - "Value": 270 - }, - { - "Name": "KeypadEnter", - "Value": 271 - }, - { - "Name": "KeypadEquals", - "Value": 272 - }, - { - "Name": "Up", - "Value": 273 - }, - { - "Name": "Down", - "Value": 274 - }, - { - "Name": "Right", - "Value": 275 - }, - { - "Name": "Left", - "Value": 276 - }, - { - "Name": "Insert", - "Value": 277 - }, - { - "Name": "Home", - "Value": 278 - }, - { - "Name": "End", - "Value": 279 - }, - { - "Name": "PageUp", - "Value": 280 - }, - { - "Name": "PageDown", - "Value": 281 - }, - { - "Name": "F1", - "Value": 282 - }, - { - "Name": "F2", - "Value": 283 - }, - { - "Name": "F3", - "Value": 284 - }, - { - "Name": "F4", - "Value": 285 - }, - { - "Name": "F5", - "Value": 286 - }, - { - "Name": "F6", - "Value": 287 - }, - { - "Name": "F7", - "Value": 288 - }, - { - "Name": "F8", - "Value": 289 - }, - { - "Name": "F9", - "Value": 290 - }, - { - "Name": "F10", - "Value": 291 - }, - { - "Name": "F11", - "Value": 292 - }, - { - "Name": "F12", - "Value": 293 - }, - { - "Name": "F13", - "Value": 294 - }, - { - "Name": "F14", - "Value": 295 - }, - { - "Name": "F15", - "Value": 296 - }, - { - "Name": "NumLock", - "Value": 300 - }, - { - "Name": "CapsLock", - "Value": 301 - }, - { - "Name": "ScrollLock", - "Value": 302 - }, - { - "Name": "RightShift", - "Value": 303 - }, - { - "Name": "LeftShift", - "Value": 304 - }, - { - "Name": "RightControl", - "Value": 305 - }, - { - "Name": "LeftControl", - "Value": 306 - }, - { - "Name": "RightAlt", - "Value": 307 - }, - { - "Name": "LeftAlt", - "Value": 308 - }, - { - "Name": "RightMeta", - "Value": 309 - }, - { - "Name": "LeftMeta", - "Value": 310 - }, - { - "Name": "LeftSuper", - "Value": 311 - }, - { - "Name": "RightSuper", - "Value": 312 - }, - { - "Name": "Mode", - "Value": 313 - }, - { - "Name": "Compose", - "Value": 314 - }, - { - "Name": "Help", - "Value": 315 - }, - { - "Name": "Print", - "Value": 316 - }, - { - "Name": "SysReq", - "Value": 317 - }, - { - "Name": "Break", - "Value": 318 - }, - { - "Name": "Menu", - "Value": 319 - }, - { - "Name": "Power", - "Value": 320 - }, - { - "Name": "Euro", - "Value": 321 - }, - { - "Name": "Undo", - "Value": 322 - }, - { - "Name": "ButtonX", - "Value": 1000 - }, - { - "Name": "ButtonY", - "Value": 1001 - }, - { - "Name": "ButtonA", - "Value": 1002 - }, - { - "Name": "ButtonB", - "Value": 1003 - }, - { - "Name": "ButtonR1", - "Value": 1004 - }, - { - "Name": "ButtonL1", - "Value": 1005 - }, - { - "Name": "ButtonR2", - "Value": 1006 - }, - { - "Name": "ButtonL2", - "Value": 1007 - }, - { - "Name": "ButtonR3", - "Value": 1008 - }, - { - "Name": "ButtonL3", - "Value": 1009 - }, - { - "Name": "ButtonStart", - "Value": 1010 - }, - { - "Name": "ButtonSelect", - "Value": 1011 - }, - { - "Name": "DPadLeft", - "Value": 1012 - }, - { - "Name": "DPadRight", - "Value": 1013 - }, - { - "Name": "DPadUp", - "Value": 1014 - }, - { - "Name": "DPadDown", - "Value": 1015 - }, - { - "Name": "Thumbstick1", - "Value": 1016 - }, - { - "Name": "Thumbstick2", - "Value": 1017 - }, - { - "Name": "Thumbstick1Up", - "Value": 1018 - }, - { - "Name": "Thumbstick1Down", - "Value": 1019 - }, - { - "Name": "Thumbstick1Left", - "Value": 1020 - }, - { - "Name": "Thumbstick1Right", - "Value": 1021 - }, - { - "Name": "Thumbstick2Up", - "Value": 1022 - }, - { - "Name": "Thumbstick2Down", - "Value": 1023 - }, - { - "Name": "Thumbstick2Left", - "Value": 1024 - }, - { - "Name": "Thumbstick2Right", - "Value": 1025 - }, - { - "Name": "MouseLeftButton", - "Value": 1026 - }, - { - "Name": "MouseRightButton", - "Value": 1027 - }, - { - "Name": "MouseMiddleButton", - "Value": 1028 - }, - { - "Name": "MousePosition", - "Value": 1033 - }, - { - "Name": "Touch", - "Value": 1034 - }, - { - "Name": "MouseWheel", - "Value": 1035 - }, - { - "Name": "TrackpadPan", - "Value": 1040 - }, - { - "Name": "TrackpadPinch", - "Value": 1045 - }, - { - "Name": "MouseDelta", - "Value": 1048 - }, - { - "Name": "World0", - "Tags": [ - "Deprecated" - ], - "Value": 160 - }, - { - "Name": "World1", - "Tags": [ - "Deprecated" - ], - "Value": 161 - }, - { - "Name": "World2", - "Tags": [ - "Deprecated" - ], - "Value": 162 - }, - { - "Name": "World3", - "Tags": [ - "Deprecated" - ], - "Value": 163 - }, - { - "Name": "World4", - "Tags": [ - "Deprecated" - ], - "Value": 164 - }, - { - "Name": "World5", - "Tags": [ - "Deprecated" - ], - "Value": 165 - }, - { - "Name": "World6", - "Tags": [ - "Deprecated" - ], - "Value": 166 - }, - { - "Name": "World7", - "Tags": [ - "Deprecated" - ], - "Value": 167 - }, - { - "Name": "World8", - "Tags": [ - "Deprecated" - ], - "Value": 168 - }, - { - "Name": "World9", - "Tags": [ - "Deprecated" - ], - "Value": 169 - }, - { - "Name": "World10", - "Tags": [ - "Deprecated" - ], - "Value": 170 - }, - { - "Name": "World11", - "Tags": [ - "Deprecated" - ], - "Value": 171 - }, - { - "Name": "World12", - "Tags": [ - "Deprecated" - ], - "Value": 172 - }, - { - "Name": "World13", - "Tags": [ - "Deprecated" - ], - "Value": 173 - }, - { - "Name": "World14", - "Tags": [ - "Deprecated" - ], - "Value": 174 - }, - { - "Name": "World15", - "Tags": [ - "Deprecated" - ], - "Value": 175 - }, - { - "Name": "World16", - "Tags": [ - "Deprecated" - ], - "Value": 176 - }, - { - "Name": "World17", - "Tags": [ - "Deprecated" - ], - "Value": 177 - }, - { - "Name": "World18", - "Tags": [ - "Deprecated" - ], - "Value": 178 - }, - { - "Name": "World19", - "Tags": [ - "Deprecated" - ], - "Value": 179 - }, - { - "Name": "World20", - "Tags": [ - "Deprecated" - ], - "Value": 180 - }, - { - "Name": "World21", - "Tags": [ - "Deprecated" - ], - "Value": 181 - }, - { - "Name": "World22", - "Tags": [ - "Deprecated" - ], - "Value": 182 - }, - { - "Name": "World23", - "Tags": [ - "Deprecated" - ], - "Value": 183 - }, - { - "Name": "World24", - "Tags": [ - "Deprecated" - ], - "Value": 184 - }, - { - "Name": "World25", - "Tags": [ - "Deprecated" - ], - "Value": 185 - }, - { - "Name": "World26", - "Tags": [ - "Deprecated" - ], - "Value": 186 - }, - { - "Name": "World27", - "Tags": [ - "Deprecated" - ], - "Value": 187 - }, - { - "Name": "World28", - "Tags": [ - "Deprecated" - ], - "Value": 188 - }, - { - "Name": "World29", - "Tags": [ - "Deprecated" - ], - "Value": 189 - }, - { - "Name": "World30", - "Tags": [ - "Deprecated" - ], - "Value": 190 - }, - { - "Name": "World31", - "Tags": [ - "Deprecated" - ], - "Value": 191 - }, - { - "Name": "World32", - "Tags": [ - "Deprecated" - ], - "Value": 192 - }, - { - "Name": "World33", - "Tags": [ - "Deprecated" - ], - "Value": 193 - }, - { - "Name": "World34", - "Tags": [ - "Deprecated" - ], - "Value": 194 - }, - { - "Name": "World35", - "Tags": [ - "Deprecated" - ], - "Value": 195 - }, - { - "Name": "World36", - "Tags": [ - "Deprecated" - ], - "Value": 196 - }, - { - "Name": "World37", - "Tags": [ - "Deprecated" - ], - "Value": 197 - }, - { - "Name": "World38", - "Tags": [ - "Deprecated" - ], - "Value": 198 - }, - { - "Name": "World39", - "Tags": [ - "Deprecated" - ], - "Value": 199 - }, - { - "Name": "World40", - "Tags": [ - "Deprecated" - ], - "Value": 200 - }, - { - "Name": "World41", - "Tags": [ - "Deprecated" - ], - "Value": 201 - }, - { - "Name": "World42", - "Tags": [ - "Deprecated" - ], - "Value": 202 - }, - { - "Name": "World43", - "Tags": [ - "Deprecated" - ], - "Value": 203 - }, - { - "Name": "World44", - "Tags": [ - "Deprecated" - ], - "Value": 204 - }, - { - "Name": "World45", - "Tags": [ - "Deprecated" - ], - "Value": 205 - }, - { - "Name": "World46", - "Tags": [ - "Deprecated" - ], - "Value": 206 - }, - { - "Name": "World47", - "Tags": [ - "Deprecated" - ], - "Value": 207 - }, - { - "Name": "World48", - "Tags": [ - "Deprecated" - ], - "Value": 208 - }, - { - "Name": "World49", - "Tags": [ - "Deprecated" - ], - "Value": 209 - }, - { - "Name": "World50", - "Tags": [ - "Deprecated" - ], - "Value": 210 - }, - { - "Name": "World51", - "Tags": [ - "Deprecated" - ], - "Value": 211 - }, - { - "Name": "World52", - "Tags": [ - "Deprecated" - ], - "Value": 212 - }, - { - "Name": "World53", - "Tags": [ - "Deprecated" - ], - "Value": 213 - }, - { - "Name": "World54", - "Tags": [ - "Deprecated" - ], - "Value": 214 - }, - { - "Name": "World55", - "Tags": [ - "Deprecated" - ], - "Value": 215 - }, - { - "Name": "World56", - "Tags": [ - "Deprecated" - ], - "Value": 216 - }, - { - "Name": "World57", - "Tags": [ - "Deprecated" - ], - "Value": 217 - }, - { - "Name": "World58", - "Tags": [ - "Deprecated" - ], - "Value": 218 - }, - { - "Name": "World59", - "Tags": [ - "Deprecated" - ], - "Value": 219 - }, - { - "Name": "World60", - "Tags": [ - "Deprecated" - ], - "Value": 220 - }, - { - "Name": "World61", - "Tags": [ - "Deprecated" - ], - "Value": 221 - }, - { - "Name": "World62", - "Tags": [ - "Deprecated" - ], - "Value": 222 - }, - { - "Name": "World63", - "Tags": [ - "Deprecated" - ], - "Value": 223 - }, - { - "Name": "World64", - "Tags": [ - "Deprecated" - ], - "Value": 224 - }, - { - "Name": "World65", - "Tags": [ - "Deprecated" - ], - "Value": 225 - }, - { - "Name": "World66", - "Tags": [ - "Deprecated" - ], - "Value": 226 - }, - { - "Name": "World67", - "Tags": [ - "Deprecated" - ], - "Value": 227 - }, - { - "Name": "World68", - "Tags": [ - "Deprecated" - ], - "Value": 228 - }, - { - "Name": "World69", - "Tags": [ - "Deprecated" - ], - "Value": 229 - }, - { - "Name": "World70", - "Tags": [ - "Deprecated" - ], - "Value": 230 - }, - { - "Name": "World71", - "Tags": [ - "Deprecated" - ], - "Value": 231 - }, - { - "Name": "World72", - "Tags": [ - "Deprecated" - ], - "Value": 232 - }, - { - "Name": "World73", - "Tags": [ - "Deprecated" - ], - "Value": 233 - }, - { - "Name": "World74", - "Tags": [ - "Deprecated" - ], - "Value": 234 - }, - { - "Name": "World75", - "Tags": [ - "Deprecated" - ], - "Value": 235 - }, - { - "Name": "World76", - "Tags": [ - "Deprecated" - ], - "Value": 236 - }, - { - "Name": "World77", - "Tags": [ - "Deprecated" - ], - "Value": 237 - }, - { - "Name": "World78", - "Tags": [ - "Deprecated" - ], - "Value": 238 - }, - { - "Name": "World79", - "Tags": [ - "Deprecated" - ], - "Value": 239 - }, - { - "Name": "World80", - "Tags": [ - "Deprecated" - ], - "Value": 240 - }, - { - "Name": "World81", - "Tags": [ - "Deprecated" - ], - "Value": 241 - }, - { - "Name": "World82", - "Tags": [ - "Deprecated" - ], - "Value": 242 - }, - { - "Name": "World83", - "Tags": [ - "Deprecated" - ], - "Value": 243 - }, - { - "Name": "World84", - "Tags": [ - "Deprecated" - ], - "Value": 244 - }, - { - "Name": "World85", - "Tags": [ - "Deprecated" - ], - "Value": 245 - }, - { - "Name": "World86", - "Tags": [ - "Deprecated" - ], - "Value": 246 - }, - { - "Name": "World87", - "Tags": [ - "Deprecated" - ], - "Value": 247 - }, - { - "Name": "World88", - "Tags": [ - "Deprecated" - ], - "Value": 248 - }, - { - "Name": "World89", - "Tags": [ - "Deprecated" - ], - "Value": 249 - }, - { - "Name": "World90", - "Tags": [ - "Deprecated" - ], - "Value": 250 - }, - { - "Name": "World91", - "Tags": [ - "Deprecated" - ], - "Value": 251 - }, - { - "Name": "World92", - "Tags": [ - "Deprecated" - ], - "Value": 252 - }, - { - "Name": "World93", - "Tags": [ - "Deprecated" - ], - "Value": 253 - }, - { - "Name": "World94", - "Tags": [ - "Deprecated" - ], - "Value": 254 - }, - { - "Name": "World95", - "Tags": [ - "Deprecated" - ], - "Value": 255 - }, - { - "Name": "MouseBackButton", - "Tags": [ - "Deprecated" - ], - "Value": 1029 - }, - { - "Name": "MouseNoButton", - "Tags": [ - "Deprecated" - ], - "Value": 1030 - }, - { - "Name": "MouseX", - "Tags": [ - "Deprecated" - ], - "Value": 1031 - }, - { - "Name": "MouseY", - "Tags": [ - "Deprecated" - ], - "Value": 1032 - } - ], - "Name": "KeyCode" - }, - { - "Items": [ - { - "Name": "Constant", - "Value": 0 - }, - { - "Name": "Linear", - "Value": 1 - }, - { - "Name": "Cubic", - "Value": 2 - } - ], - "Name": "KeyInterpolationMode" - }, - { - "Items": [ - { - "Name": "Include", - "Value": 0 - }, - { - "Name": "Exclude", - "Value": 1 - } - ], - "Name": "KeywordFilterType" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - } - ], - "Name": "Language" - }, - { - "Items": [ - { - "Name": "Left", - "Value": 0 - }, - { - "Name": "Center", - "Value": 1 - }, - { - "Name": "Right", - "Value": 2 - } - ], - "Name": "LeftRight" - }, - { - "Items": [ - { - "Name": "Eof", - "Value": 0 - }, - { - "Name": "Name", - "Value": 1 - }, - { - "Name": "QuotedString", - "Value": 2 - }, - { - "Name": "Number", - "Value": 3 - }, - { - "Name": "And", - "Value": 4 - }, - { - "Name": "Or", - "Value": 5 - }, - { - "Name": "Equal", - "Value": 6 - }, - { - "Name": "TildeEqual", - "Value": 7 - }, - { - "Name": "GreaterThan", - "Value": 8 - }, - { - "Name": "GreaterThanEqual", - "Value": 9 - }, - { - "Name": "LessThan", - "Value": 10 - }, - { - "Name": "LessThanEqual", - "Value": 11 - }, - { - "Name": "Colon", - "Value": 12 - }, - { - "Name": "Dot", - "Value": 13 - }, - { - "Name": "LeftParenthesis", - "Value": 14 - }, - { - "Name": "RightParenthesis", - "Value": 15 - }, - { - "Name": "Star", - "Value": 16 - }, - { - "Name": "DoubleStar", - "Value": 17 - }, - { - "Name": "ReservedSpecial", - "Value": 18 - } - ], - "Name": "LexemeType" - }, - { - "Items": [ - { - "Name": "Realistic", - "Value": 0 - }, - { - "Name": "Soft", - "Value": 1 - } - ], - "Name": "LightingStyle" - }, - { - "Items": [ - { - "Name": "Head", - "Value": 0 - }, - { - "Name": "Torso", - "Value": 1 - }, - { - "Name": "LeftArm", - "Value": 2 - }, - { - "Name": "RightArm", - "Value": 3 - }, - { - "Name": "LeftLeg", - "Value": 4 - }, - { - "Name": "RightLeg", - "Value": 5 - }, - { - "Name": "Unknown", - "Value": 6 - } - ], - "Name": "Limb" - }, - { - "Items": [ - { - "Name": "Round", - "Value": 0 - }, - { - "Name": "Bevel", - "Value": 1 - }, - { - "Name": "Miter", - "Value": 2 - } - ], - "Name": "LineJoinMode" - }, - { - "Items": [ - { - "Name": "Horizontal", - "Value": 0 - }, - { - "Name": "Vertical", - "Value": 1 - } - ], - "Name": "ListDisplayMode" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "None", - "Value": 1 - }, - { - "Name": "Character", - "Value": 2 - }, - { - "Name": "Camera", - "Value": 3 - } - ], - "Name": "ListenerLocation" - }, - { - "Items": [ - { - "Name": "Camera", - "Value": 0 - }, - { - "Name": "CFrame", - "Value": 1 - }, - { - "Name": "ObjectPosition", - "Value": 2 - }, - { - "Name": "ObjectCFrame", - "Value": 3 - } - ], - "Name": "ListenerType" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "FailureGuidNotFound", - "Value": 1 - }, - { - "Name": "FailureHashMismatch", - "Value": 2 - }, - { - "Name": "FailureOperationIllegal", - "Value": 3 - } - ], - "Name": "LiveEditingAtomicUpdateResponse" - }, - { - "Items": [ - { - "Name": "Normal", - "Value": 0 - }, - { - "Name": "Warning", - "Value": 1 - }, - { - "Name": "Error", - "Value": 2 - } - ], - "Name": "LiveEditingBroadcastMessageType" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "LoadCharacterLayeredClothing" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "LoadDynamicHeads" - }, - { - "Items": [ - { - "Name": "Character", - "Value": 0 - }, - { - "Name": "Camera", - "Value": 1 - }, - { - "Name": "ObjectPosition", - "Value": 2 - } - ], - "Name": "LocationType" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "NoCheck", - "Value": 1 - }, - { - "Name": "Nonstrict", - "Value": 2 - }, - { - "Name": "Strict", - "Value": 3 - } - ], - "Name": "LuauTypeCheckMode" - }, - { - "Items": [ - { - "Name": "Face", - "Value": 0 - }, - { - "Name": "Lip", - "Value": 1 - }, - { - "Name": "Eye", - "Value": 2 - } - ], - "Name": "MakeupType" - }, - { - "Items": [ - { - "Name": "Completed", - "Value": 1 - }, - { - "Name": "Aborted", - "Value": 2 - }, - { - "Name": "Error", - "Value": 3 - } - ], - "Name": "MarketplaceBulkPurchasePromptStatus" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 1 - }, - { - "Name": "SystemError", - "Value": 2 - }, - { - "Name": "AlreadyOwned", - "Value": 3 - }, - { - "Name": "InsufficientRobux", - "Value": 4 - }, - { - "Name": "QuantityLimitExceeded", - "Value": 5 - }, - { - "Name": "QuotaExceeded", - "Value": 6 - }, - { - "Name": "NotForSale", - "Value": 7 - }, - { - "Name": "NotAvailableForPurchaser", - "Value": 8 - }, - { - "Name": "PriceMismatch", - "Value": 9 - }, - { - "Name": "SoldOut", - "Value": 10 - }, - { - "Name": "PurchaserIsSeller", - "Value": 11 - }, - { - "Name": "InsufficientMembership", - "Value": 12 - }, - { - "Name": "PlaceInvalid", - "Value": 13 - } - ], - "Name": "MarketplaceItemPurchaseStatus" - }, - { - "Items": [ - { - "Name": "AvatarAsset", - "Value": 1 - }, - { - "Name": "AvatarBundle", - "Value": 2 - } - ], - "Name": "MarketplaceProductType" - }, - { - "Items": [ - { - "Name": "PlainText", - "Value": 0 - }, - { - "Name": "Markdown", - "Value": 1 - } - ], - "Name": "MarkupKind" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 1 - }, - { - "Name": "XboxOnly", - "Value": 2 - }, - { - "Name": "PlayStationOnly", - "Value": 3 - } - ], - "Name": "MatchmakingType" - }, - { - "Items": [ - { - "Name": "Plastic", - "Value": 256 - }, - { - "Name": "SmoothPlastic", - "Value": 272 - }, - { - "Name": "Neon", - "Value": 288 - }, - { - "Name": "Wood", - "Value": 512 - }, - { - "Name": "WoodPlanks", - "Value": 528 - }, - { - "Name": "Marble", - "Value": 784 - }, - { - "Name": "Slate", - "Value": 800 - }, - { - "Name": "Concrete", - "Value": 816 - }, - { - "Name": "Granite", - "Value": 832 - }, - { - "Name": "Brick", - "Value": 848 - }, - { - "Name": "Pebble", - "Value": 864 - }, - { - "Name": "Cobblestone", - "Value": 880 - }, - { - "Name": "Rock", - "Value": 896 - }, - { - "Name": "Sandstone", - "Value": 912 - }, - { - "Name": "Basalt", - "Value": 788 - }, - { - "Name": "CrackedLava", - "Value": 804 - }, - { - "Name": "Limestone", - "Value": 820 - }, - { - "Name": "Pavement", - "Value": 836 - }, - { - "LegacyNames": [ - "Corroded Metal" - ], - "Name": "CorrodedMetal", - "Value": 1040 - }, - { - "Name": "DiamondPlate", - "Value": 1056 - }, - { - "LegacyNames": [ - "Aluminum" - ], - "Name": "Foil", - "Value": 1072 - }, - { - "Name": "Metal", - "Value": 1088 - }, - { - "Name": "Grass", - "Value": 1280 - }, - { - "Name": "LeafyGrass", - "Value": 1284 - }, - { - "Name": "Sand", - "Value": 1296 - }, - { - "Name": "Fabric", - "Value": 1312 - }, - { - "Name": "Snow", - "Value": 1328 - }, - { - "Name": "Mud", - "Value": 1344 - }, - { - "Name": "Ground", - "Value": 1360 - }, - { - "Name": "Asphalt", - "Value": 1376 - }, - { - "Name": "Salt", - "Value": 1392 - }, - { - "Name": "Ice", - "Value": 1536 - }, - { - "Name": "Glacier", - "Value": 1552 - }, - { - "Name": "Glass", - "Value": 1568 - }, - { - "Name": "ForceField", - "Value": 1584 - }, - { - "Name": "Air", - "Tags": [ - "NotBrowsable" - ], - "Value": 1792 - }, - { - "Name": "Water", - "Tags": [ - "NotBrowsable" - ], - "Value": 2048 - }, - { - "Name": "Cardboard", - "Value": 2304 - }, - { - "Name": "Carpet", - "Value": 2305 - }, - { - "Name": "CeramicTiles", - "Value": 2306 - }, - { - "Name": "ClayRoofTiles", - "Value": 2307 - }, - { - "Name": "RoofShingles", - "Value": 2308 - }, - { - "Name": "Leather", - "Value": 2309 - }, - { - "Name": "Plaster", - "Value": 2310 - }, - { - "Name": "Rubber", - "Value": 2311 - } - ], - "Name": "Material" - }, - { - "Items": [ - { - "Name": "Regular", - "Value": 0 - }, - { - "Name": "Organic", - "Value": 1 - } - ], - "Name": "MaterialPattern" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "BuildersClub", - "Value": 1 - }, - { - "Name": "TurboBuildersClub", - "Value": 2 - }, - { - "Name": "OutrageousBuildersClub", - "Value": 3 - }, - { - "Name": "Premium", - "Value": 4 - } - ], - "Name": "MembershipType" - }, - { - "Items": [ - { - "Name": "DistanceBased", - "Value": 0 - }, - { - "Name": "Level00", - "Value": 1 - }, - { - "Name": "Level01", - "Value": 2 - }, - { - "Name": "Level02", - "Value": 3 - }, - { - "Name": "Level03", - "Value": 4 - }, - { - "Name": "Level04", - "Value": 5 - } - ], - "Name": "MeshPartDetailLevel" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "MeshPartHeadsAndAccessories" - }, - { - "Items": [ - { - "Name": "Stud", - "Value": 0 - }, - { - "Name": "Meter", - "Value": 1 - }, - { - "Name": "CM", - "Value": 2 - }, - { - "Name": "MM", - "Value": 3 - }, - { - "Name": "Foot", - "Value": 4 - }, - { - "Name": "Inch", - "Value": 5 - } - ], - "Name": "MeshScaleUnit" - }, - { - "Items": [ - { - "Name": "Head", - "Value": 0 - }, - { - "Name": "Torso", - "Value": 1 - }, - { - "Name": "Wedge", - "Value": 2 - }, - { - "Name": "Sphere", - "Value": 3 - }, - { - "Name": "Cylinder", - "Value": 4 - }, - { - "Name": "FileMesh", - "Value": 5 - }, - { - "Name": "Brick", - "Value": 6 - }, - { - "Name": "Prism", - "Tags": [ - "Deprecated" - ], - "Value": 7 - }, - { - "Name": "Pyramid", - "Tags": [ - "Deprecated" - ], - "Value": 8 - }, - { - "Name": "ParallelRamp", - "Tags": [ - "Deprecated" - ], - "Value": 9 - }, - { - "Name": "RightAngleRamp", - "Tags": [ - "Deprecated" - ], - "Value": 10 - }, - { - "Name": "CornerWedge", - "Tags": [ - "Deprecated" - ], - "Value": 11 - } - ], - "Name": "MeshType" - }, - { - "Items": [ - { - "Name": "MessageOutput", - "Value": 0 - }, - { - "Name": "MessageInfo", - "Value": 1 - }, - { - "Name": "MessageWarning", - "Value": 2 - }, - { - "Name": "MessageError", - "Value": 3 - } - ], - "Name": "MessageType" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "StreamingMesh", - "Value": 1 - }, - { - "LegacyNames": [ - "Deactivated" - ], - "Name": "Disabled", - "Value": 2 - }, - { - "Name": "SLIM", - "Value": 4 - } - ], - "Name": "ModelLevelOfDetail" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Legacy", - "Value": 1 - }, - { - "Name": "Improved", - "Value": 2 - } - ], - "Name": "ModelStreamingBehavior" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Atomic", - "Value": 1 - }, - { - "Name": "Persistent", - "Value": 2 - }, - { - "Name": "PersistentPerPlayer", - "Value": 3 - }, - { - "Name": "Nonatomic", - "Value": 4 - } - ], - "Name": "ModelStreamingMode" - }, - { - "Items": [ - { - "Name": "ViolationDetected", - "Value": 0 - }, - { - "Name": "Borderline", - "Value": 1 - }, - { - "Name": "NoViolationDetected", - "Value": 2 - } - ], - "Name": "ModerationResultCategory" - }, - { - "Items": [ - { - "Name": "ChildExploitation", - "Value": 0 - }, - { - "Name": "SuicideSelfInjuryAndHarmfulBehavior", - "Value": 1 - }, - { - "Name": "ThreatsBullyingAndHarassment", - "Value": 2 - }, - { - "Name": "TerrorismAndViolentExtremism", - "Value": 3 - }, - { - "Name": "DiscriminationSlursAndHateSpeech", - "Value": 4 - }, - { - "Name": "RealWorldSensitiveEvents", - "Value": 5 - }, - { - "Name": "ViolentContentAndGore", - "Value": 6 - }, - { - "Name": "RomanticAndSexualContent", - "Value": 7 - }, - { - "Name": "IllegalAndRegulatedGoodsAndActivities", - "Value": 8 - }, - { - "Name": "Profanity", - "Value": 9 - }, - { - "Name": "Other", - "Value": 100 - } - ], - "Name": "ModerationResultLabel" - }, - { - "Items": [ - { - "Name": "ReviewedApproved", - "Value": 1 - }, - { - "Name": "ReviewedRejected", - "Value": 2 - }, - { - "Name": "NotReviewed", - "Value": 3 - }, - { - "Name": "NotApplicable", - "Value": 4 - }, - { - "Name": "Invalid", - "Value": 5 - } - ], - "Name": "ModerationStatus" - }, - { - "Items": [ - { - "Name": "Shift", - "Value": 0 - }, - { - "Name": "Ctrl", - "Value": 1 - }, - { - "Name": "Alt", - "Value": 2 - }, - { - "Name": "Meta", - "Value": 3 - } - ], - "Name": "ModifierKey" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "LockCenter", - "Value": 1 - }, - { - "Name": "LockCurrentPosition", - "Value": 2 - } - ], - "Name": "MouseBehavior" - }, - { - "Items": [ - { - "Name": "Stopped", - "Value": 0 - }, - { - "Name": "Coasting", - "Value": 1 - }, - { - "Name": "Pushing", - "Value": 2 - }, - { - "Name": "Stopping", - "Value": 3 - }, - { - "Name": "AirFree", - "Value": 4 - } - ], - "Name": "MoveState" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "MoverConstraintRootBehaviorMode" - }, - { - "Items": [ - { - "Name": "Unmuted", - "Value": 0 - }, - { - "Name": "Muted", - "Value": 1 - } - ], - "Name": "MuteState" - }, - { - "Items": [ - { - "Name": "NoOcclusion", - "Value": 0 - }, - { - "Name": "EnemyOcclusion", - "Value": 1 - }, - { - "Name": "OccludeAll", - "Value": 2 - } - ], - "Name": "NameOcclusion" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "NegatedUnion", - "Value": 1 - }, - { - "Name": "NegatedIntersection", - "Value": 2 - } - ], - "Name": "NegateOperationHiddenHistory" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "Manual", - "Value": 1 - }, - { - "Name": "OnContact", - "Value": 2 - } - ], - "Name": "NetworkOwnership" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "Connected", - "Value": 1 - }, - { - "Name": "Disconnected", - "Value": 2 - } - ], - "Name": "NetworkStatus" - }, - { - "Items": [ - { - "Name": "SimplexGabor", - "Value": 0 - } - ], - "Name": "NoiseType" - }, - { - "Items": [ - { - "Name": "Right", - "Value": 0 - }, - { - "Name": "Top", - "Value": 1 - }, - { - "Name": "Back", - "Value": 2 - }, - { - "Name": "Left", - "Value": 3 - }, - { - "Name": "Bottom", - "Value": 4 - }, - { - "Name": "Front", - "Value": 5 - } - ], - "Name": "NormalId" - }, - { - "Items": [ - { - "Name": "Primary", - "Value": 0 - }, - { - "Name": "Secondary", - "Value": 1 - } - ], - "Name": "NotificationButtonType" - }, - { - "Items": [ - { - "Name": "Null", - "Value": 0 - }, - { - "Name": "Union", - "Value": 1 - }, - { - "Name": "Subtraction", - "Value": 2 - }, - { - "Name": "Intersection", - "Value": 3 - }, - { - "Name": "Primitive", - "Value": 4 - } - ], - "Name": "OperationType" - }, - { - "Items": [ - { - "Name": "OneAttachment", - "Value": 0 - }, - { - "Name": "TwoAttachment", - "Value": 1 - } - ], - "Name": "OrientationAlignmentMode" - }, - { - "Items": [ - { - "Name": "All", - "Value": 1 - }, - { - "Name": "Created", - "Value": 2 - }, - { - "Name": "Purchased", - "Value": 3 - } - ], - "Name": "OutfitSource" - }, - { - "Items": [ - { - "Name": "All", - "Value": 1 - }, - { - "Name": "Avatar", - "Value": 2 - }, - { - "Name": "DynamicHead", - "Value": 3 - }, - { - "Name": "Shoes", - "Value": 4 - } - ], - "Name": "OutfitType" - }, - { - "Items": [ - { - "Name": "Horizontal", - "Value": 0 - }, - { - "Name": "Vertical", - "Value": 1 - } - ], - "Name": "OutputLayoutMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "ForceShow", - "Value": 1 - }, - { - "Name": "ForceHide", - "Value": 2 - } - ], - "Name": "OverrideMouseIconBehavior" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "NoAccess", - "Value": 1 - }, - { - "Name": "Revoked", - "Value": 2 - }, - { - "Name": "UseView", - "Value": 3 - }, - { - "Name": "Edit", - "Value": 4 - }, - { - "Name": "Own", - "Value": 5 - } - ], - "Name": "PackagePermission" - }, - { - "Items": [ - { - "Name": "Ball", - "Value": 0 - }, - { - "Name": "Block", - "Value": 1 - }, - { - "Name": "Cylinder", - "Value": 2 - }, - { - "Name": "Wedge", - "Value": 3 - }, - { - "Name": "CornerWedge", - "Value": 4 - } - ], - "Name": "PartType" - }, - { - "Items": [ - { - "Name": "Box", - "Value": 0 - }, - { - "Name": "Sphere", - "Value": 1 - }, - { - "Name": "Cylinder", - "Value": 2 - }, - { - "Name": "Disc", - "Value": 3 - } - ], - "Name": "ParticleEmitterShape" - }, - { - "Items": [ - { - "Name": "Outward", - "Value": 0 - }, - { - "Name": "Inward", - "Value": 1 - }, - { - "Name": "InAndOut", - "Value": 2 - } - ], - "Name": "ParticleEmitterShapeInOut" - }, - { - "Items": [ - { - "Name": "Volume", - "Value": 0 - }, - { - "Name": "Surface", - "Value": 1 - } - ], - "Name": "ParticleEmitterShapeStyle" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Grid2x2", - "Value": 1 - }, - { - "Name": "Grid4x4", - "Value": 2 - }, - { - "Name": "Grid8x8", - "Value": 3 - }, - { - "Name": "Custom", - "Value": 4 - } - ], - "Name": "ParticleFlipbookLayout" - }, - { - "Items": [ - { - "Name": "Loop", - "Value": 0 - }, - { - "Name": "OneShot", - "Value": 1 - }, - { - "Name": "PingPong", - "Value": 2 - }, - { - "Name": "Random", - "Value": 3 - } - ], - "Name": "ParticleFlipbookMode" - }, - { - "Items": [ - { - "Name": "NotCompatible", - "Value": 0 - }, - { - "Name": "Compatible", - "Value": 1 - }, - { - "Name": "Unknown", - "Value": 2 - } - ], - "Name": "ParticleFlipbookTextureCompatible" - }, - { - "Items": [ - { - "Name": "FacingCamera", - "Value": 0 - }, - { - "Name": "FacingCameraWorldUp", - "Value": 1 - }, - { - "Name": "VelocityParallel", - "Value": 2 - }, - { - "Name": "VelocityPerpendicular", - "Value": 3 - } - ], - "Name": "ParticleOrientation" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "NoPath", - "Value": 5 - }, - { - "Name": "ClosestNoPath", - "Tags": [ - "Deprecated" - ], - "Value": 1 - }, - { - "Name": "ClosestOutOfRange", - "Tags": [ - "Deprecated" - ], - "Value": 2 - }, - { - "Name": "FailStartNotEmpty", - "Tags": [ - "Deprecated" - ], - "Value": 3 - }, - { - "Name": "FailFinishNotEmpty", - "Tags": [ - "Deprecated" - ], - "Value": 4 - } - ], - "Name": "PathStatus" - }, - { - "Items": [ - { - "Name": "Walk", - "Value": 0 - }, - { - "Name": "Jump", - "Value": 1 - }, - { - "Name": "Custom", - "Value": 2 - } - ], - "Name": "PathWaypointAction" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "PathfindingUseImprovedSearch" - }, - { - "Items": [ - { - "Name": "Card", - "Value": 0 - }, - { - "Name": "List", - "Value": 1 - } - ], - "Name": "PeoplePageLayout" - }, - { - "Items": [ - { - "Name": "Overdraw", - "Value": 0 - }, - { - "Name": "Transparent", - "Value": 1 - }, - { - "Name": "Decals", - "Value": 2 - }, - { - "Name": "Lights", - "Value": 3 - } - ], - "Name": "PerformanceOverlayMode" - }, - { - "Items": [ - { - "Name": "Game", - "Value": 0 - }, - { - "Name": "RobloxGame", - "Value": 1 - }, - { - "Name": "RobloxScript", - "Value": 2 - }, - { - "Name": "Studio", - "Value": 3 - }, - { - "Name": "Roblox", - "Value": 4 - } - ], - "Name": "PermissionLevelShown" - }, - { - "Items": [ - { - "Name": "Fixed240Hz", - "Value": 0 - }, - { - "Name": "Fixed120Hz", - "Value": 1 - }, - { - "Name": "Fixed60Hz", - "Value": 2 - } - ], - "Name": "PhysicsSimulationRate" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Fixed", - "Value": 1 - }, - { - "Name": "Adaptive", - "Value": 2 - } - ], - "Name": "PhysicsSteppingMethod" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "All", - "Value": 1 - }, - { - "Name": "MentionsAndReplies", - "Value": 2 - }, - { - "Name": "Unknown", - "Value": 3 - } - ], - "Name": "PlaceContentPreference" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Publish", - "Value": 1 - }, - { - "Name": "Save", - "Value": 2 - } - ], - "Name": "PlacePublishType" - }, - { - "Items": [ - { - "Name": "Windows", - "Value": 0 - }, - { - "Name": "OSX", - "Value": 1 - }, - { - "Name": "IOS", - "Value": 2 - }, - { - "Name": "Android", - "Value": 3 - }, - { - "Name": "XBoxOne", - "Value": 4 - }, - { - "Name": "PS4", - "Value": 5 - }, - { - "Name": "PS3", - "Value": 6 - }, - { - "Name": "XBox360", - "Value": 7 - }, - { - "Name": "WiiU", - "Value": 8 - }, - { - "Name": "NX", - "Value": 9 - }, - { - "Name": "Ouya", - "Value": 10 - }, - { - "Name": "AndroidTV", - "Value": 11 - }, - { - "Name": "Chromecast", - "Value": 12 - }, - { - "Name": "Linux", - "Value": 13 - }, - { - "Name": "SteamOS", - "Value": 14 - }, - { - "Name": "WebOS", - "Value": 15 - }, - { - "Name": "DOS", - "Value": 16 - }, - { - "Name": "BeOS", - "Value": 17 - }, - { - "Name": "UWP", - "Value": 18 - }, - { - "Name": "PS5", - "Value": 19 - }, - { - "Name": "MetaOS", - "Value": 20 - }, - { - "Name": "Web", - "Value": 21 - }, - { - "Name": "None", - "Value": 22 - } - ], - "Name": "Platform" - }, - { - "Items": [ - { - "Name": "Begin", - "Value": 0 - }, - { - "Name": "Delayed", - "Value": 1 - }, - { - "Name": "Playing", - "Value": 2 - }, - { - "Name": "Paused", - "Value": 3 - }, - { - "Name": "Completed", - "Value": 4 - }, - { - "Name": "Cancelled", - "Value": 5 - } - ], - "Name": "PlaybackState" - }, - { - "Items": [ - { - "Name": "CharacterForward", - "Value": 0 - }, - { - "Name": "CharacterBackward", - "Value": 1 - }, - { - "Name": "CharacterLeft", - "Value": 2 - }, - { - "Name": "CharacterRight", - "Value": 3 - }, - { - "Name": "CharacterJump", - "Value": 4 - } - ], - "Name": "PlayerActions" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "PlayerCharacterDestroyBehavior" - }, - { - "Items": [ - { - "Name": "All", - "Value": 0 - }, - { - "Name": "Team", - "Value": 1 - }, - { - "Name": "Whisper", - "Value": 2 - } - ], - "Name": "PlayerChatType" - }, - { - "Items": [ - { - "Name": "LoadFailed", - "Value": 0 - }, - { - "Name": "FlushFailed", - "Value": 1 - }, - { - "Name": "ReleaseFailed", - "Value": 2 - }, - { - "Name": "None", - "Value": 3 - } - ], - "Name": "PlayerDataErrorState" - }, - { - "Items": [ - { - "Name": "Failure", - "Value": 0 - }, - { - "Name": "FallbackToDefault", - "Value": 1 - }, - { - "Name": "Kick", - "Value": 2 - } - ], - "Name": "PlayerDataLoadFailureBehavior" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "PlatformKick", - "Value": 1 - }, - { - "Name": "CreatorKick", - "Value": 2 - } - ], - "Name": "PlayerExitReason" - }, - { - "Items": [ - { - "Name": "In", - "Value": 0 - }, - { - "Name": "Out", - "Value": 1 - }, - { - "Name": "InOut", - "Value": 2 - } - ], - "Name": "PoseEasingDirection" - }, - { - "Items": [ - { - "Name": "Linear", - "Value": 0 - }, - { - "Name": "Constant", - "Value": 1 - }, - { - "Name": "Elastic", - "Value": 2 - }, - { - "Name": "Cubic", - "Value": 3 - }, - { - "Name": "Bounce", - "Value": 4 - }, - { - "Name": "CubicV2", - "Value": 5 - } - ], - "Name": "PoseEasingStyle" - }, - { - "Items": [ - { - "Name": "OneAttachment", - "Value": 0 - }, - { - "Name": "TwoAttachment", - "Value": 1 - } - ], - "Name": "PositionAlignmentMode" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "On", - "Value": 1 - }, - { - "Name": "Off", - "Value": 2 - } - ], - "Name": "PredictionMode" - }, - { - "Items": [ - { - "Name": "Authoritative", - "Value": 0 - }, - { - "Name": "Predicted", - "Value": 1 - }, - { - "Name": "None", - "Value": 2 - } - ], - "Name": "PredictionStatus" - }, - { - "Items": [ - { - "Name": "KeyboardAndMouse", - "Value": 0 - }, - { - "Name": "Gamepad", - "Value": 1 - }, - { - "Name": "Touch", - "Value": 2 - } - ], - "Name": "PreferredInput" - }, - { - "Items": [ - { - "Name": "Medium", - "Value": 1 - }, - { - "Name": "Large", - "Value": 2 - }, - { - "Name": "Larger", - "Value": 3 - }, - { - "Name": "Largest", - "Value": 4 - } - ], - "Name": "PreferredTextSize" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Experimental", - "Value": 1 - }, - { - "Name": "Disabled", - "Value": 2 - } - ], - "Name": "PrimalPhysicsSolver" - }, - { - "Items": [ - { - "Name": "Null", - "Value": 0 - }, - { - "Name": "Ball", - "Value": 1 - }, - { - "Name": "Cylinder", - "Value": 2 - }, - { - "Name": "Block", - "Value": 3 - }, - { - "Name": "Wedge", - "Value": 4 - }, - { - "Name": "CornerWedge", - "Value": 5 - } - ], - "Name": "PrimitiveType" - }, - { - "Items": [ - { - "Name": "Owner", - "Value": 255 - }, - { - "Name": "Admin", - "Value": 240 - }, - { - "Name": "Member", - "Value": 128 - }, - { - "Name": "Visitor", - "Value": 10 - }, - { - "Name": "Banned", - "Value": 0 - } - ], - "Name": "PrivilegeType", - "Tags": [ - "Deprecated" - ] - }, - { - "Items": [ - { - "Name": "AvatarShop", - "Value": 0 - }, - { - "Name": "AllowedGames", - "Value": 1 - }, - { - "Name": "AllGames", - "Value": 2 - } - ], - "Name": "ProductLocationRestriction" - }, - { - "Items": [ - { - "Name": "InExperience", - "Value": 1 - }, - { - "Name": "ExperienceDetailsPage", - "Value": 2 - }, - { - "Name": "AdReward", - "Value": 3 - }, - { - "Name": "CommerceProduct", - "Value": 4 - } - ], - "Name": "ProductPurchaseChannel" - }, - { - "Items": [ - { - "Name": "NotProcessedYet", - "Value": 0 - }, - { - "Name": "PurchaseGranted", - "Value": 1 - } - ], - "Name": "ProductPurchaseDecision" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 1 - }, - { - "Name": "PermissionDenied", - "Value": 2 - }, - { - "Name": "Timeout", - "Value": 3 - }, - { - "Name": "UploadFailed", - "Value": 4 - }, - { - "Name": "NoUserInput", - "Value": 5 - }, - { - "Name": "UnknownFailure", - "Value": 6 - }, - { - "Name": "UGCValidationFailed", - "Value": 7 - }, - { - "Name": "ModeratedName", - "Value": 8 - }, - { - "Name": "PurchaseFailure", - "Value": 9 - }, - { - "Name": "TokenInvalid", - "Value": 10 - } - ], - "Name": "PromptCreateAssetResult" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 1 - }, - { - "Name": "PermissionDenied", - "Value": 2 - }, - { - "Name": "Timeout", - "Value": 3 - }, - { - "Name": "UploadFailed", - "Value": 4 - }, - { - "Name": "NoUserInput", - "Value": 5 - }, - { - "Name": "InvalidHumanoidDescription", - "Value": 6 - }, - { - "Name": "UGCValidationFailed", - "Value": 7 - }, - { - "Name": "ModeratedName", - "Value": 8 - }, - { - "Name": "MaxOutfits", - "Value": 9 - }, - { - "Name": "PurchaseFailure", - "Value": 10 - }, - { - "Name": "UnknownFailure", - "Value": 11 - }, - { - "Name": "TokenInvalid", - "Value": 12 - } - ], - "Name": "PromptCreateAvatarResult" - }, - { - "Items": [ - { - "Name": "PromptClosed", - "Value": 0 - }, - { - "Name": "TeleportAttempted", - "Value": 1 - } - ], - "Name": "PromptExperienceDetailsResult" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 1 - }, - { - "Name": "PlayerLeft", - "Value": 2 - }, - { - "Name": "InvalidLaunchData", - "Value": 3 - } - ], - "Name": "PromptLinkSharingResult" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 1 - }, - { - "Name": "PermissionDenied", - "Value": 2 - }, - { - "Name": "Timeout", - "Value": 3 - }, - { - "Name": "UploadFailed", - "Value": 4 - }, - { - "Name": "NoUserInput", - "Value": 5 - }, - { - "Name": "UnknownFailure", - "Value": 6 - } - ], - "Name": "PromptPublishAssetResult" - }, - { - "Items": [ - { - "Name": "Ok", - "Value": 0 - }, - { - "Name": "Warning", - "Value": 1 - }, - { - "Name": "Error", - "Value": 2 - } - ], - "Name": "PropertyStatus" - }, - { - "Items": [ - { - "Name": "OnePerButton", - "Value": 0 - }, - { - "Name": "OneGlobally", - "Value": 1 - }, - { - "Name": "AlwaysShow", - "Value": 2 - } - ], - "Name": "ProximityPromptExclusivity" - }, - { - "Items": [ - { - "Name": "Keyboard", - "Value": 0 - }, - { - "Name": "Gamepad", - "Value": 1 - }, - { - "Name": "Touch", - "Value": 2 - } - ], - "Name": "ProximityPromptInputType" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Custom", - "Value": 1 - } - ], - "Name": "ProximityPromptStyle" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "LegacyNames": [ - "Level 1" - ], - "Name": "Level01", - "Value": 1 - }, - { - "LegacyNames": [ - "Level 2" - ], - "Name": "Level02", - "Value": 2 - }, - { - "LegacyNames": [ - "Level 3" - ], - "Name": "Level03", - "Value": 3 - }, - { - "LegacyNames": [ - "Level 4" - ], - "Name": "Level04", - "Value": 4 - }, - { - "LegacyNames": [ - "Level 5" - ], - "Name": "Level05", - "Value": 5 - }, - { - "LegacyNames": [ - "Level 6" - ], - "Name": "Level06", - "Value": 6 - }, - { - "LegacyNames": [ - "Level 7" - ], - "Name": "Level07", - "Value": 7 - }, - { - "LegacyNames": [ - "Level 8" - ], - "Name": "Level08", - "Value": 8 - }, - { - "LegacyNames": [ - "Level 9" - ], - "Name": "Level09", - "Value": 9 - }, - { - "LegacyNames": [ - "Level 10" - ], - "Name": "Level10", - "Value": 10 - }, - { - "LegacyNames": [ - "Level 11" - ], - "Name": "Level11", - "Value": 11 - }, - { - "LegacyNames": [ - "Level 12" - ], - "Name": "Level12", - "Value": 12 - }, - { - "LegacyNames": [ - "Level 13" - ], - "Name": "Level13", - "Value": 13 - }, - { - "LegacyNames": [ - "Level 14" - ], - "Name": "Level14", - "Value": 14 - }, - { - "LegacyNames": [ - "Level 15" - ], - "Name": "Level15", - "Value": 15 - }, - { - "LegacyNames": [ - "Level 16" - ], - "Name": "Level16", - "Value": 16 - }, - { - "LegacyNames": [ - "Level 17" - ], - "Name": "Level17", - "Value": 17 - }, - { - "LegacyNames": [ - "Level 18" - ], - "Name": "Level18", - "Value": 18 - }, - { - "LegacyNames": [ - "Level 19" - ], - "Name": "Level19", - "Value": 19 - }, - { - "LegacyNames": [ - "Level 20" - ], - "Name": "Level20", - "Value": 20 - }, - { - "LegacyNames": [ - "Level 21" - ], - "Name": "Level21", - "Value": 21 - } - ], - "Name": "QualityLevel" - }, - { - "Items": [ - { - "Name": "OuterBox", - "Value": 0 - }, - { - "Name": "InnerBox", - "Value": 1 - } - ], - "Name": "R15CollisionType" - }, - { - "Items": [ - { - "LegacyNames": [ - "Blacklist" - ], - "Name": "Exclude", - "Value": 0 - }, - { - "LegacyNames": [ - "Whitelist" - ], - "Name": "Include", - "Value": 1 - } - ], - "Name": "RaycastFilterType" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "NeedPermission", - "Value": 1 - } - ], - "Name": "ReadCapturesFromGalleryResult" - }, - { - "Items": [ - { - "Name": "AddReaction", - "Value": 0 - }, - { - "Name": "RemoveReaction", - "Value": 1 - }, - { - "Name": "Share", - "Value": 2 - }, - { - "Name": "Report", - "Value": 3 - }, - { - "Name": "Comment", - "Value": 4 - }, - { - "Name": "Play", - "Value": 5 - }, - { - "Name": "Purchase", - "Value": 6 - } - ], - "Name": "RecommendationActionType" - }, - { - "Items": [ - { - "Name": "Neutral", - "Value": 0 - }, - { - "Name": "Positive", - "Value": 1 - }, - { - "Name": "Negative", - "Value": 2 - } - ], - "Name": "RecommendationDepartureIntent" - }, - { - "Items": [ - { - "Name": "View", - "Value": 0 - }, - { - "Name": "NotViewable", - "Value": 1 - } - ], - "Name": "RecommendationImpressionType" - }, - { - "Items": [ - { - "Name": "Static", - "Value": 0 - }, - { - "Name": "Dynamic", - "Value": 1 - }, - { - "Name": "Interactive", - "Value": 2 - } - ], - "Name": "RecommendationItemContentType" - }, - { - "Items": [ - { - "Name": "Private", - "Value": 0 - }, - { - "Name": "Public", - "Value": 1 - } - ], - "Name": "RecommendationItemVisibility" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "RejectCharacterDeletions" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "Precise", - "Value": 1 - }, - { - "Name": "Performance", - "Value": 2 - } - ], - "Name": "RenderFidelity" - }, - { - "Items": [ - { - "Name": "First", - "Value": 0 - }, - { - "Name": "Input", - "Value": 100 - }, - { - "Name": "Camera", - "Value": 200 - }, - { - "Name": "Character", - "Value": 300 - }, - { - "Name": "Last", - "Value": 2000 - } - ], - "Name": "RenderPriority" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "RenderingCacheOptimizationMode" - }, - { - "Items": [ - { - "Name": "psnr", - "Value": 0 - }, - { - "Name": "diff", - "Value": 1 - } - ], - "Name": "RenderingTestComparisonMethod" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "ReplicateInstanceDestroySetting" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Pixelated", - "Value": 1 - } - ], - "Name": "ResamplerMode" - }, - { - "Items": [ - { - "Name": "Standard", - "Value": 0 - }, - { - "Name": "Selection", - "Value": 524288 - }, - { - "Name": "Hover", - "Value": 262144 - }, - { - "Name": "Active", - "Value": 131072 - }, - { - "Name": "NegatedPart", - "Value": 1048576 - } - ], - "Name": "ReservedHighlightId" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "RotationsReset", - "Value": 1 - }, - { - "Name": "Custom", - "Value": 2 - } - ], - "Name": "RestPose" - }, - { - "Items": [ - { - "Name": "FromRigInACE", - "Value": 0 - }, - { - "Name": "FromRigInFile", - "Value": 1 - } - ], - "Name": "RestPoseModel" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Done", - "Value": 1 - }, - { - "Name": "Go", - "Value": 2 - }, - { - "Name": "Next", - "Value": 3 - }, - { - "Name": "Search", - "Value": 4 - }, - { - "Name": "Send", - "Value": 5 - } - ], - "Name": "ReturnKeyType" - }, - { - "Items": [ - { - "Name": "NoReverb", - "Value": 0 - }, - { - "Name": "GenericReverb", - "Value": 1 - }, - { - "Name": "PaddedCell", - "Value": 2 - }, - { - "Name": "Room", - "Value": 3 - }, - { - "Name": "Bathroom", - "Value": 4 - }, - { - "Name": "LivingRoom", - "Value": 5 - }, - { - "Name": "StoneRoom", - "Value": 6 - }, - { - "Name": "Auditorium", - "Value": 7 - }, - { - "Name": "ConcertHall", - "Value": 8 - }, - { - "Name": "Cave", - "Value": 9 - }, - { - "Name": "Arena", - "Value": 10 - }, - { - "Name": "Hangar", - "Value": 11 - }, - { - "Name": "CarpettedHallway", - "Value": 12 - }, - { - "Name": "Hallway", - "Value": 13 - }, - { - "Name": "StoneCorridor", - "Value": 14 - }, - { - "Name": "Alley", - "Value": 15 - }, - { - "Name": "Forest", - "Value": 16 - }, - { - "Name": "City", - "Value": 17 - }, - { - "Name": "Mountains", - "Value": 18 - }, - { - "Name": "Quarry", - "Value": 19 - }, - { - "Name": "Plain", - "Value": 20 - }, - { - "Name": "ParkingLot", - "Value": 21 - }, - { - "Name": "SewerPipe", - "Value": 22 - }, - { - "Name": "UnderWater", - "Value": 23 - } - ], - "Name": "ReverbType" - }, - { - "Items": [ - { - "Name": "Pending", - "Value": 0 - }, - { - "Name": "Completed", - "Value": 1 - }, - { - "Name": "Failed", - "Value": 2 - } - ], - "Name": "ReviewableContentState" - }, - { - "Items": [ - { - "Name": "Select", - "Value": 0 - }, - { - "Name": "Scale", - "Value": 1 - }, - { - "Name": "Rotate", - "Value": 2 - }, - { - "Name": "Move", - "Value": 3 - }, - { - "Name": "Transform", - "Value": 4 - }, - { - "Name": "ColorPicker", - "Value": 5 - }, - { - "Name": "MaterialPicker", - "Value": 6 - }, - { - "Name": "Group", - "Value": 7 - }, - { - "Name": "Ungroup", - "Value": 8 - }, - { - "Name": "None", - "Value": 9 - }, - { - "Name": "PivotEditor", - "Value": 10 - } - ], - "Name": "RibbonTool" - }, - { - "Items": [ - { - "Name": "Invalid", - "Value": 0 - }, - { - "Name": "Root", - "Value": 2 - }, - { - "Name": "LeftHip", - "Value": 3 - }, - { - "Name": "LeftKnee", - "Value": 4 - }, - { - "Name": "LeftAnkle", - "Value": 5 - }, - { - "Name": "RightHip", - "Value": 7 - }, - { - "Name": "RightKnee", - "Value": 8 - }, - { - "Name": "RightAnkle", - "Value": 9 - }, - { - "Name": "Waist", - "Value": 11 - }, - { - "Name": "LeftShoulder", - "Value": 12 - }, - { - "Name": "LeftElbow", - "Value": 13 - }, - { - "Name": "LeftWrist", - "Value": 14 - }, - { - "Name": "RightShoulder", - "Value": 16 - }, - { - "Name": "RightElbow", - "Value": 17 - }, - { - "Name": "RightWrist", - "Value": 18 - }, - { - "Name": "Neck", - "Value": 20 - }, - { - "Name": "Pelvis", - "Value": 23 - }, - { - "Name": "Chest", - "Value": 24 - }, - { - "Name": "HeadBase", - "Value": 25 - }, - { - "Name": "LeftClavicle", - "Value": 26 - }, - { - "Name": "RightClavicle", - "Value": 27 - }, - { - "Name": "LeftToes", - "Value": 28 - }, - { - "Name": "RightToes", - "Value": 29 - } - ], - "Name": "RigLabel" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Rthro", - "Value": 1 - }, - { - "Name": "RthroNarrow", - "Value": 2 - } - ], - "Name": "RigScale" - }, - { - "Items": [ - { - "Name": "R15", - "Value": 0 - }, - { - "Name": "CustomHumanoid", - "Value": 1 - }, - { - "Name": "Custom", - "Value": 2 - }, - { - "Name": "None", - "Value": 3 - } - ], - "Name": "RigType" - }, - { - "Items": [ - { - "Name": "Inverse", - "Value": 0 - }, - { - "Name": "Linear", - "Value": 1 - }, - { - "Name": "LinearSquare", - "Value": 2 - }, - { - "Name": "InverseTapered", - "Value": 3 - } - ], - "Name": "RollOffMode" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "RolloutState" - }, - { - "Items": [ - { - "Name": "XYZ", - "Value": 0 - }, - { - "Name": "XZY", - "Value": 1 - }, - { - "Name": "YZX", - "Value": 2 - }, - { - "Name": "YXZ", - "Value": 3 - }, - { - "Name": "ZXY", - "Value": 4 - }, - { - "Name": "ZYX", - "Value": 5 - } - ], - "Name": "RotationOrder" - }, - { - "Items": [ - { - "Name": "MovementRelative", - "Value": 0 - }, - { - "Name": "CameraRelative", - "Value": 1 - } - ], - "Name": "RotationType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Going", - "Value": 1 - }, - { - "Name": "NotGoing", - "Value": 2 - } - ], - "Name": "RsvpStatus" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "RtlTextSupport" - }, - { - "Items": [ - { - "Name": "Legacy", - "Value": 0 - }, - { - "Name": "Server", - "Value": 1 - }, - { - "Name": "Client", - "Value": 2 - }, - { - "Name": "Plugin", - "Value": 3 - } - ], - "Name": "RunContext" - }, - { - "Items": [ - { - "Name": "Stopped", - "Value": 0 - }, - { - "Name": "Running", - "Value": 1 - }, - { - "Name": "Paused", - "Value": 2 - } - ], - "Name": "RunState" - }, - { - "Items": [ - { - "Name": "Aggregate", - "Value": 0 - }, - { - "Name": "Snapshot", - "Value": 1 - }, - { - "Name": "Hybrid", - "Value": 2 - } - ], - "Name": "RuntimeUndoBehavior" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "FullscreenExtension", - "Value": 1 - } - ], - "Name": "SafeAreaCompatibility" - }, - { - "Items": [ - { - "Name": "All", - "Value": 1 - }, - { - "Name": "Collectibles", - "Value": 2 - }, - { - "Name": "Premium", - "Value": 3 - }, - { - "Name": "TimedOptions", - "Value": 4 - } - ], - "Name": "SalesTypeFilter" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Experimental", - "Value": 1 - } - ], - "Name": "SandboxedInstanceMode" - }, - { - "Items": [ - { - "Name": "BadThumbnailType", - "Value": 1 - }, - { - "Name": "BadYRotDeg", - "Value": 2 - }, - { - "Name": "BadFieldOfViewDeg", - "Value": 3 - }, - { - "Name": "BadDistanceScale", - "Value": 4 - }, - { - "Name": "Other", - "Value": 5 - }, - { - "Name": "Throttled", - "Value": 6 - } - ], - "Name": "SaveAvatarThumbnailCustomizationFailure" - }, - { - "Items": [ - { - "Name": "SaveWorld", - "Value": 0 - }, - { - "Name": "SaveGame", - "Value": 1 - }, - { - "Name": "SaveAll", - "Value": 2 - } - ], - "Name": "SaveFilter", - "Tags": [ - "Deprecated" - ] - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "QualityLevel1", - "Value": 1 - }, - { - "Name": "QualityLevel2", - "Value": 2 - }, - { - "Name": "QualityLevel3", - "Value": 3 - }, - { - "Name": "QualityLevel4", - "Value": 4 - }, - { - "Name": "QualityLevel5", - "Value": 5 - }, - { - "Name": "QualityLevel6", - "Value": 6 - }, - { - "Name": "QualityLevel7", - "Value": 7 - }, - { - "Name": "QualityLevel8", - "Value": 8 - }, - { - "Name": "QualityLevel9", - "Value": 9 - }, - { - "Name": "QualityLevel10", - "Value": 10 - } - ], - "Name": "SavedQualitySetting" - }, - { - "Items": [ - { - "Name": "Stretch", - "Value": 0 - }, - { - "Name": "Slice", - "Value": 1 - }, - { - "Name": "Tile", - "Value": 2 - }, - { - "Name": "Fit", - "Value": 3 - }, - { - "Name": "Crop", - "Value": 4 - } - ], - "Name": "ScaleType" - }, - { - "Items": [ - { - "Name": "ConsentAccepted", - "Value": 0 - }, - { - "Name": "InvalidScopes", - "Value": 1 - }, - { - "Name": "Timeout", - "Value": 2 - }, - { - "Name": "NoUserInput", - "Value": 3 - }, - { - "Name": "BackendError", - "Value": 4 - }, - { - "Name": "UnexpectedError", - "Value": 5 - }, - { - "Name": "InvalidArgument", - "Value": 6 - }, - { - "Name": "ConsentDenied", - "Value": 7 - } - ], - "Name": "ScopeCheckResult" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "DeviceSafeInsets", - "Value": 1 - }, - { - "Name": "CoreUISafeInsets", - "Value": 2 - }, - { - "Name": "TopbarSafeInsets", - "Value": 3 - } - ], - "Name": "ScreenInsets" - }, - { - "Items": [ - { - "Name": "LandscapeLeft", - "Value": 0 - }, - { - "Name": "LandscapeRight", - "Value": 1 - }, - { - "Name": "LandscapeSensor", - "Value": 2 - }, - { - "Name": "Portrait", - "Value": 3 - }, - { - "Name": "Sensor", - "Value": 4 - } - ], - "Name": "ScreenOrientation" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "OtherError", - "Value": 1 - }, - { - "Name": "NoDeviceSupport", - "Value": 2 - }, - { - "Name": "NoSpaceOnDevice", - "Value": 3 - } - ], - "Name": "ScreenshotCaptureResult" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "ScrollBar", - "Value": 1 - }, - { - "Name": "Always", - "Value": 2 - } - ], - "Name": "ScrollBarInset" - }, - { - "Items": [ - { - "Name": "X", - "Value": 1 - }, - { - "Name": "Y", - "Value": 2 - }, - { - "Name": "XY", - "Value": 4 - } - ], - "Name": "ScrollingDirection" - }, - { - "Items": [ - { - "Name": "RunClientScript", - "Value": 0 - }, - { - "Name": "RunServerScript", - "Value": 1 - }, - { - "Name": "AccessOutsideWrite", - "Value": 2 - }, - { - "Name": "AssetRequire", - "Value": 3 - }, - { - "Name": "LoadString", - "Value": 4 - }, - { - "Name": "ScriptGlobals", - "Value": 5 - }, - { - "Name": "CreateInstances", - "Value": 6 - }, - { - "Name": "Basic", - "Value": 7 - }, - { - "Name": "Audio", - "Value": 8 - }, - { - "Name": "DataStore", - "Value": 9 - }, - { - "Name": "Network", - "Value": 10 - }, - { - "Name": "Physics", - "Value": 11 - }, - { - "Name": "UI", - "Value": 12 - }, - { - "Name": "CSG", - "Value": 13 - }, - { - "Name": "Chat", - "Value": 14 - }, - { - "Name": "Animation", - "Value": 15 - }, - { - "Name": "Avatar", - "Value": 16 - }, - { - "Name": "Input", - "Value": 17 - }, - { - "Name": "Environment", - "Value": 18 - }, - { - "Name": "RemoteEvent", - "Value": 19 - }, - { - "Name": "LegacySound", - "Value": 20 - }, - { - "Name": "Players", - "Value": 21 - }, - { - "Name": "CapabilityControl", - "Value": 22 - }, - { - "Name": "Plugin", - "Value": 23 - }, - { - "Name": "LocalUser", - "Value": 24 - }, - { - "Name": "WritePlayer", - "Value": 25 - }, - { - "Name": "RobloxScript", - "Value": 26 - }, - { - "Name": "RobloxEngine", - "Value": 27 - }, - { - "Name": "Unassigned", - "Value": 28 - }, - { - "Name": "InternalTest", - "Value": 29 - }, - { - "Name": "PluginOrOpenCloud", - "Value": 30 - }, - { - "Name": "Assistant", - "Value": 31 - }, - { - "Name": "RemoteCommand", - "Value": 32 - }, - { - "Name": "AssetRead", - "Value": 33 - }, - { - "Name": "AssetManagement", - "Value": 34 - }, - { - "Name": "DynamicGeneration", - "Value": 35 - }, - { - "Name": "PlatformAvatarEditing", - "Value": 36 - }, - { - "Name": "AssetCreateUpdate", - "Value": 37 - }, - { - "Name": "Capture", - "Value": 38 - }, - { - "Name": "SensitiveInput", - "Value": 39 - }, - { - "Name": "Monetization", - "Value": 40 - }, - { - "Name": "LoadOwnedAsset", - "Value": 41 - }, - { - "Name": "Social", - "Value": 42 - }, - { - "Name": "ServerCommunication", - "Value": 43 - }, - { - "Name": "Logging", - "Value": 44 - }, - { - "Name": "PromptExternalPurchase", - "Value": 45 - }, - { - "Name": "Groups", - "Value": 46 - }, - { - "Name": "Teleport", - "Value": 47 - }, - { - "Name": "Consequences", - "Value": 48 - }, - { - "Name": "Material", - "Value": 49 - }, - { - "Name": "AvatarBehavior", - "Value": 50 - } - ], - "Name": "SecurityCapability" - }, - { - "Items": [ - { - "Name": "Escape", - "Value": 0 - }, - { - "Name": "Stop", - "Value": 1 - } - ], - "Name": "SelectionBehavior" - }, - { - "Items": [ - { - "Name": "Outlines", - "Value": 0 - }, - { - "Name": "BoundingBoxes", - "Value": 1 - }, - { - "Name": "Both", - "Value": 2 - } - ], - "Name": "SelectionRenderMode" - }, - { - "Items": [ - { - "Name": "LastPosition", - "Value": 0 - }, - { - "Name": "TopLeft", - "Value": 1 - }, - { - "Name": "TopRight", - "Value": 2 - }, - { - "Name": "BottomLeft", - "Value": 3 - }, - { - "Name": "BottomRight", - "Value": 4 - } - ], - "Name": "SelfViewPosition" - }, - { - "Items": [ - { - "Name": "Floor", - "Value": 0 - }, - { - "Name": "Ladder", - "Value": 1 - } - ], - "Name": "SensorMode" - }, - { - "Items": [ - { - "Name": "OnRead", - "Value": 0 - }, - { - "Name": "Manual", - "Value": 1 - } - ], - "Name": "SensorUpdateType" - }, - { - "Items": [ - { - "Name": "Uninitialized", - "Value": 0 - }, - { - "Name": "Enabled", - "Value": 1 - }, - { - "Name": "Disabled", - "Value": 2 - } - ], - "Name": "ServerLiveEditingMode" - }, - { - "Items": [ - { - "Name": "Always", - "Value": 0 - }, - { - "Name": "Off", - "Value": 1 - }, - { - "Name": "WithChildren", - "Value": 2 - } - ], - "Name": "ServiceVisibility" - }, - { - "Items": [ - { - "Name": "Error", - "Value": 1 - }, - { - "Name": "Warning", - "Value": 2 - }, - { - "Name": "Information", - "Value": 3 - }, - { - "Name": "Hint", - "Value": 4 - } - ], - "Name": "Severity" - }, - { - "Items": [ - { - "Name": "ShowCompleted", - "Value": 1 - }, - { - "Name": "AdNotReady", - "Value": 2 - }, - { - "Name": "AdAlreadyShowing", - "Value": 3 - }, - { - "Name": "InternalError", - "Value": 4 - }, - { - "Name": "ShowInterrupted", - "Value": 5 - }, - { - "Name": "InsufficientMemory", - "Value": 6 - } - ], - "Name": "ShowAdResult" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Immediate", - "Value": 1 - }, - { - "Name": "Deferred", - "Value": 2 - }, - { - "Name": "AncestryDeferred", - "Value": 3 - } - ], - "Name": "SignalBehavior" - }, - { - "Items": [ - { - "Name": "RelativeXY", - "Value": 0 - }, - { - "Name": "RelativeXX", - "Value": 1 - }, - { - "Name": "RelativeYY", - "Value": 2 - } - ], - "Name": "SizeConstraint" - }, - { - "Items": [ - { - "Name": "IterationBased", - "Value": 0 - }, - { - "Name": "AlgorithmAgnostic", - "Value": 1 - } - ], - "Name": "SolverConvergenceMetricType" - }, - { - "Items": [ - { - "Name": "Disabled", - "Value": 0 - }, - { - "Name": "PerIsland", - "Value": 1 - }, - { - "Name": "PerEdge", - "Value": 2 - } - ], - "Name": "SolverConvergenceVisualizationMode" - }, - { - "Items": [ - { - "Name": "Ascending", - "Value": 0 - }, - { - "Name": "Descending", - "Value": 1 - } - ], - "Name": "SortDirection" - }, - { - "Items": [ - { - "Name": "Name", - "Value": 0 - }, - { - "Name": "Custom", - "Tags": [ - "Deprecated" - ], - "Value": 1 - }, - { - "Name": "LayoutOrder", - "Value": 2 - } - ], - "Name": "SortOrder" - }, - { - "Items": [ - { - "Name": "Insert", - "Value": 0 - }, - { - "Name": "Home", - "Value": 1 - }, - { - "Name": "End", - "Value": 2 - }, - { - "Name": "PageUp", - "Value": 3 - }, - { - "Name": "PageDown", - "Value": 4 - }, - { - "Name": "ChatHotkey", - "Value": 5 - } - ], - "Name": "SpecialKey" - }, - { - "Items": [ - { - "Name": "TopLeft", - "Value": 0 - }, - { - "Name": "TopRight", - "Value": 1 - }, - { - "Name": "BottomLeft", - "Value": 2 - }, - { - "Name": "BottomRight", - "Value": 3 - } - ], - "Name": "StartCorner" - }, - { - "Items": [ - { - "Name": "Boolean", - "Tags": [ - "Deprecated" - ], - "Value": 0 - }, - { - "Name": "CFrame", - "Tags": [ - "Deprecated" - ], - "Value": 1 - }, - { - "Name": "Color3", - "Tags": [ - "Deprecated" - ], - "Value": 2 - }, - { - "Name": "Float", - "Tags": [ - "Deprecated" - ], - "Value": 3 - }, - { - "Name": "Instance", - "Tags": [ - "Deprecated" - ], - "Value": 4 - }, - { - "Name": "Random", - "Tags": [ - "Deprecated" - ], - "Value": 5 - }, - { - "Name": "Vector2", - "Tags": [ - "Deprecated" - ], - "Value": 6 - }, - { - "Name": "Vector3", - "Tags": [ - "Deprecated" - ], - "Value": 7 - }, - { - "Name": "INVALID", - "Tags": [ - "Deprecated" - ], - "Value": 8 - } - ], - "Name": "StateObjectFieldType" - }, - { - "Items": [ - { - "Name": "Poison", - "Tags": [ - "Deprecated" - ], - "Value": 0 - }, - { - "Name": "Confusion", - "Tags": [ - "Deprecated" - ], - "Value": 1 - } - ], - "Name": "Status", - "Tags": [ - "Deprecated" - ] - }, - { - "Items": [ - { - "Name": "Hz60", - "Value": 0 - }, - { - "Name": "Hz30", - "Value": 1 - }, - { - "Name": "Hz15", - "Value": 2 - }, - { - "Name": "Hz10", - "Value": 3 - }, - { - "Name": "Hz5", - "Value": 4 - }, - { - "Name": "Hz1", - "Value": 5 - } - ], - "Name": "StepFrequency" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "LowMemory", - "Value": 1 - }, - { - "Name": "Opportunistic", - "Value": 2 - } - ], - "Name": "StreamOutBehavior" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "MinimumRadiusPause", - "Value": 2 - }, - { - "Name": "PauseOutsideLoadedArea", - "Value": 3 - } - ], - "Name": "StreamingIntegrityMode" - }, - { - "Items": [ - { - "Name": "Default", - "Tags": [ - "Deprecated" - ], - "Value": 0 - }, - { - "Name": "Disabled", - "Tags": [ - "Deprecated" - ], - "Value": 1 - }, - { - "Name": "ClientPhysicsPause", - "Tags": [ - "Deprecated" - ], - "Value": 2 - } - ], - "Name": "StreamingPauseMode" - }, - { - "Items": [ - { - "Name": "FixedSize", - "Value": 0 - }, - { - "Name": "ScaledSize", - "Value": 1 - } - ], - "Name": "StrokeSizingMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "CloseStudio", - "Value": 1 - }, - { - "Name": "CloseDoc", - "Value": 2 - }, - { - "Name": "LogOut", - "Value": 3 - } - ], - "Name": "StudioCloseMode" - }, - { - "Items": [ - { - "Name": "Edit", - "Value": 0 - }, - { - "Name": "PlayClient", - "Value": 1 - }, - { - "Name": "PlayServer", - "Value": 2 - }, - { - "Name": "Standalone", - "Value": 3 - }, - { - "Name": "None", - "Value": 4 - } - ], - "Name": "StudioDataModelType" - }, - { - "Items": [ - { - "Name": "Other", - "Value": 0 - }, - { - "Name": "TeamCreateConflict", - "Value": 1 - } - ], - "Name": "StudioPlaceUpdateFailureReason" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Operator", - "Value": 1 - }, - { - "Name": "Number", - "Value": 2 - }, - { - "Name": "String", - "Value": 3 - }, - { - "Name": "Comment", - "Value": 4 - }, - { - "Name": "Keyword", - "Value": 5 - }, - { - "Name": "Builtin", - "Value": 6 - }, - { - "Name": "Method", - "Value": 7 - }, - { - "Name": "Property", - "Value": 8 - }, - { - "Name": "Nil", - "Value": 9 - }, - { - "Name": "Bool", - "Value": 10 - }, - { - "Name": "Function", - "Value": 11 - }, - { - "Name": "Local", - "Value": 12 - }, - { - "Name": "Self", - "Value": 13 - }, - { - "Name": "LuauKeyword", - "Value": 14 - }, - { - "Name": "FunctionName", - "Value": 15 - }, - { - "Name": "TODO", - "Value": 16 - }, - { - "Name": "Background", - "Value": 17 - }, - { - "Name": "SelectionText", - "Value": 18 - }, - { - "Name": "SelectionBackground", - "Value": 19 - }, - { - "Name": "FindSelectionBackground", - "Value": 20 - }, - { - "Name": "MatchingWordBackground", - "Value": 21 - }, - { - "Name": "Warning", - "Value": 22 - }, - { - "Name": "Error", - "Value": 23 - }, - { - "Name": "Info", - "Value": 24 - }, - { - "Name": "Hint", - "Value": 25 - }, - { - "Name": "Whitespace", - "Value": 26 - }, - { - "Name": "ActiveLine", - "Value": 27 - }, - { - "Name": "DebuggerCurrentLine", - "Value": 28 - }, - { - "Name": "DebuggerErrorLine", - "Value": 29 - }, - { - "Name": "Ruler", - "Value": 30 - }, - { - "Name": "Bracket", - "Value": 31 - }, - { - "Name": "Type", - "Value": 32 - }, - { - "Name": "MenuPrimaryText", - "Value": 33 - }, - { - "Name": "MenuSecondaryText", - "Value": 34 - }, - { - "Name": "MenuSelectedText", - "Value": 35 - }, - { - "Name": "MenuBackground", - "Value": 36 - }, - { - "Name": "MenuSelectedBackground", - "Value": 37 - }, - { - "Name": "MenuScrollbarBackground", - "Value": 38 - }, - { - "Name": "MenuScrollbarHandle", - "Value": 39 - }, - { - "Name": "MenuBorder", - "Value": 40 - }, - { - "Name": "DocViewCodeBackground", - "Value": 41 - }, - { - "Name": "AICOOverlayText", - "Value": 42 - }, - { - "Name": "AICOOverlayButtonBackground", - "Value": 43 - }, - { - "Name": "AICOOverlayButtonBackgroundHover", - "Value": 44 - }, - { - "Name": "AICOOverlayButtonBackgroundPressed", - "Value": 45 - }, - { - "Name": "IndentationRuler", - "Value": 46 - } - ], - "Name": "StudioScriptEditorColorCategories" - }, - { - "Items": [ - { - "Name": "RobloxDefault", - "Value": 0 - }, - { - "Name": "Extra1", - "Value": 1 - }, - { - "Name": "Extra2", - "Value": 2 - }, - { - "Name": "Custom", - "Value": 3 - } - ], - "Name": "StudioScriptEditorColorPresets" - }, - { - "Items": [ - { - "Name": "MainBackground", - "Value": 0 - }, - { - "Name": "Titlebar", - "Value": 1 - }, - { - "Name": "Dropdown", - "Value": 2 - }, - { - "Name": "Tooltip", - "Value": 3 - }, - { - "Name": "Notification", - "Value": 4 - }, - { - "Name": "ScrollBar", - "Value": 5 - }, - { - "Name": "ScrollBarBackground", - "Value": 6 - }, - { - "Name": "TabBar", - "Value": 7 - }, - { - "Name": "Tab", - "Value": 8 - }, - { - "Name": "FilterButtonDefault", - "Value": 9 - }, - { - "Name": "FilterButtonHover", - "Value": 10 - }, - { - "Name": "FilterButtonChecked", - "Value": 11 - }, - { - "Name": "FilterButtonAccent", - "Value": 12 - }, - { - "Name": "FilterButtonBorder", - "Value": 13 - }, - { - "Name": "FilterButtonBorderAlt", - "Value": 14 - }, - { - "Name": "RibbonTab", - "Value": 15 - }, - { - "Name": "RibbonTabTopBar", - "Value": 16 - }, - { - "Name": "Button", - "Value": 17 - }, - { - "Name": "MainButton", - "Value": 18 - }, - { - "Name": "RibbonButton", - "Value": 19 - }, - { - "Name": "ViewPortBackground", - "Value": 20 - }, - { - "Name": "InputFieldBackground", - "Value": 21 - }, - { - "Name": "Item", - "Value": 22 - }, - { - "Name": "TableItem", - "Value": 23 - }, - { - "Name": "CategoryItem", - "Value": 24 - }, - { - "Name": "GameSettingsTableItem", - "Value": 25 - }, - { - "Name": "GameSettingsTooltip", - "Value": 26 - }, - { - "Name": "EmulatorBar", - "Value": 27 - }, - { - "Name": "EmulatorDropDown", - "Value": 28 - }, - { - "Name": "ColorPickerFrame", - "Value": 29 - }, - { - "Name": "CurrentMarker", - "Value": 30 - }, - { - "Name": "Border", - "Value": 31 - }, - { - "Name": "DropShadow", - "Value": 32 - }, - { - "Name": "Shadow", - "Value": 33 - }, - { - "Name": "Light", - "Value": 34 - }, - { - "Name": "Dark", - "Value": 35 - }, - { - "Name": "Mid", - "Value": 36 - }, - { - "Name": "MainText", - "Value": 37 - }, - { - "Name": "SubText", - "Value": 38 - }, - { - "Name": "TitlebarText", - "Value": 39 - }, - { - "Name": "BrightText", - "Value": 40 - }, - { - "Name": "DimmedText", - "Value": 41 - }, - { - "Name": "LinkText", - "Value": 42 - }, - { - "Name": "WarningText", - "Value": 43 - }, - { - "Name": "ErrorText", - "Value": 44 - }, - { - "Name": "InfoText", - "Value": 45 - }, - { - "Name": "SensitiveText", - "Value": 46 - }, - { - "Name": "ScriptSideWidget", - "Value": 47 - }, - { - "Name": "ScriptBackground", - "Value": 48 - }, - { - "Name": "ScriptText", - "Value": 49 - }, - { - "Name": "ScriptSelectionText", - "Value": 50 - }, - { - "Name": "ScriptSelectionBackground", - "Value": 51 - }, - { - "Name": "ScriptFindSelectionBackground", - "Value": 52 - }, - { - "Name": "ScriptMatchingWordSelectionBackground", - "Value": 53 - }, - { - "Name": "ScriptOperator", - "Value": 54 - }, - { - "Name": "ScriptNumber", - "Value": 55 - }, - { - "Name": "ScriptString", - "Value": 56 - }, - { - "Name": "ScriptComment", - "Value": 57 - }, - { - "Name": "ScriptKeyword", - "Value": 58 - }, - { - "Name": "ScriptBuiltInFunction", - "Value": 59 - }, - { - "Name": "ScriptWarning", - "Value": 60 - }, - { - "Name": "ScriptError", - "Value": 61 - }, - { - "Name": "ScriptInformation", - "Value": 62 - }, - { - "Name": "ScriptHint", - "Value": 63 - }, - { - "Name": "ScriptWhitespace", - "Value": 64 - }, - { - "Name": "ScriptRuler", - "Value": 65 - }, - { - "Name": "DocViewCodeBackground", - "Value": 66 - }, - { - "Name": "DebuggerCurrentLine", - "Value": 67 - }, - { - "Name": "DebuggerErrorLine", - "Value": 68 - }, - { - "Name": "DiffFilePathText", - "Value": 69 - }, - { - "Name": "DiffTextHunkInfo", - "Value": 70 - }, - { - "Name": "DiffTextNoChange", - "Value": 71 - }, - { - "Name": "DiffTextAddition", - "Value": 72 - }, - { - "Name": "DiffTextDeletion", - "Value": 73 - }, - { - "Name": "DiffTextSeparatorBackground", - "Value": 74 - }, - { - "Name": "DiffTextNoChangeBackground", - "Value": 75 - }, - { - "Name": "DiffTextAdditionBackground", - "Value": 76 - }, - { - "Name": "DiffTextDeletionBackground", - "Value": 77 - }, - { - "Name": "DiffLineNum", - "Value": 78 - }, - { - "Name": "DiffLineNumSeparatorBackground", - "Value": 79 - }, - { - "Name": "DiffLineNumNoChangeBackground", - "Value": 80 - }, - { - "Name": "DiffLineNumAdditionBackground", - "Value": 81 - }, - { - "Name": "DiffLineNumDeletionBackground", - "Value": 82 - }, - { - "Name": "DiffFilePathBackground", - "Value": 83 - }, - { - "Name": "DiffFilePathBorder", - "Value": 84 - }, - { - "Name": "ChatIncomingBgColor", - "Value": 85 - }, - { - "Name": "ChatIncomingTextColor", - "Value": 86 - }, - { - "Name": "ChatOutgoingBgColor", - "Value": 87 - }, - { - "Name": "ChatOutgoingTextColor", - "Value": 88 - }, - { - "Name": "ChatModeratedMessageColor", - "Value": 89 - }, - { - "Name": "Separator", - "Value": 90 - }, - { - "Name": "ButtonBorder", - "Value": 91 - }, - { - "Name": "ButtonText", - "Value": 92 - }, - { - "Name": "InputFieldBorder", - "Value": 93 - }, - { - "Name": "CheckedFieldBackground", - "Value": 94 - }, - { - "Name": "CheckedFieldBorder", - "Value": 95 - }, - { - "Name": "CheckedFieldIndicator", - "Value": 96 - }, - { - "Name": "HeaderSection", - "Value": 97 - }, - { - "Name": "Midlight", - "Value": 98 - }, - { - "Name": "StatusBar", - "Value": 99 - }, - { - "Name": "DialogButton", - "Value": 100 - }, - { - "Name": "DialogButtonText", - "Value": 101 - }, - { - "Name": "DialogButtonBorder", - "Value": 102 - }, - { - "Name": "DialogMainButton", - "Value": 103 - }, - { - "Name": "DialogMainButtonText", - "Value": 104 - }, - { - "Name": "InfoBarWarningBackground", - "Value": 105 - }, - { - "Name": "InfoBarWarningText", - "Value": 106 - }, - { - "Name": "ScriptEditorCurrentLine", - "Value": 107 - }, - { - "Name": "ScriptMethod", - "Value": 108 - }, - { - "Name": "ScriptProperty", - "Value": 109 - }, - { - "Name": "ScriptNil", - "Value": 110 - }, - { - "Name": "ScriptBool", - "Value": 111 - }, - { - "Name": "ScriptFunction", - "Value": 112 - }, - { - "Name": "ScriptLocal", - "Value": 113 - }, - { - "Name": "ScriptSelf", - "Value": 114 - }, - { - "Name": "ScriptLuauKeyword", - "Value": 115 - }, - { - "Name": "ScriptFunctionName", - "Value": 116 - }, - { - "Name": "ScriptTodo", - "Value": 117 - }, - { - "Name": "ScriptBracket", - "Value": 118 - }, - { - "Name": "AttributeCog", - "Value": 119 - }, - { - "Name": "AICOOverlayText", - "Value": 128 - }, - { - "Name": "AICOOverlayButtonBackground", - "Value": 129 - }, - { - "Name": "AICOOverlayButtonBackgroundHover", - "Value": 130 - }, - { - "Name": "AICOOverlayButtonBackgroundPressed", - "Value": 131 - }, - { - "Name": "OnboardingCover", - "Value": 132 - }, - { - "Name": "OnboardingHighlight", - "Value": 133 - }, - { - "Name": "OnboardingShadow", - "Value": 134 - }, - { - "Name": "BreakpointMarker", - "Value": 136 - }, - { - "Name": "DiffLineNumHover", - "Value": 137 - }, - { - "Name": "DiffLineNumSeparatorBackgroundHover", - "Value": 138 - } - ], - "Name": "StudioStyleGuideColor" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Selected", - "Value": 1 - }, - { - "Name": "Pressed", - "Value": 2 - }, - { - "Name": "Disabled", - "Value": 3 - }, - { - "Name": "Hover", - "Value": 4 - } - ], - "Name": "StudioStyleGuideModifier" - }, - { - "Items": [ - { - "LegacyNames": [ - "Alternating Supports" - ], - "Name": "AlternatingSupports", - "Value": 0 - }, - { - "LegacyNames": [ - "Bridge Style Supports" - ], - "Name": "BridgeStyleSupports", - "Value": 1 - }, - { - "LegacyNames": [ - "No Supports" - ], - "Name": "NoSupports", - "Value": 2 - } - ], - "Name": "Style" - }, - { - "Items": [ - { - "Name": "ProductInactive", - "Value": 0 - }, - { - "Name": "ProductDeleted", - "Value": 1 - }, - { - "Name": "SubscriberCancelled", - "Value": 2 - }, - { - "Name": "SubscriberRefunded", - "Value": 3 - }, - { - "Name": "Lapsed", - "Value": 4 - } - ], - "Name": "SubscriptionExpirationReason" - }, - { - "Items": [ - { - "Name": "Paid", - "Value": 0 - }, - { - "Name": "Refunded", - "Value": 1 - } - ], - "Name": "SubscriptionPaymentStatus" - }, - { - "Items": [ - { - "Name": "Month", - "Value": 0 - } - ], - "Name": "SubscriptionPeriod" - }, - { - "Items": [ - { - "Name": "NeverSubscribed", - "Value": 0 - }, - { - "Name": "SubscribedWillRenew", - "Value": 1 - }, - { - "Name": "SubscribedWillNotRenew", - "Value": 2 - }, - { - "Name": "SubscribedRenewalPaymentPending", - "Value": 3 - }, - { - "Name": "Expired", - "Value": 4 - } - ], - "Name": "SubscriptionState" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Hinge", - "Value": 1 - }, - { - "Name": "SteppingMotor", - "Value": 2 - }, - { - "Name": "Motor", - "Value": 3 - } - ], - "Name": "SurfaceConstraint" - }, - { - "Items": [ - { - "Name": "Flat", - "Value": 0 - }, - { - "Name": "CurvedHorizontally", - "Value": 1 - } - ], - "Name": "SurfaceGuiShape" - }, - { - "Items": [ - { - "Name": "FixedSize", - "Value": 0 - }, - { - "Name": "PixelsPerStud", - "Value": 1 - } - ], - "Name": "SurfaceGuiSizingMode" - }, - { - "Items": [ - { - "LegacyNames": [ - "Spawn", - "Unjoinable" - ], - "Name": "Smooth", - "Value": 0 - }, - { - "LegacyNames": [ - "Bumps" - ], - "Name": "Glue", - "Value": 1 - }, - { - "Name": "Weld", - "Value": 2 - }, - { - "Name": "Studs", - "Value": 3 - }, - { - "Name": "Inlet", - "Value": 4 - }, - { - "Name": "Universal", - "Value": 5 - }, - { - "Name": "Hinge", - "Value": 6 - }, - { - "Name": "Motor", - "Value": 7 - }, - { - "Name": "SteppingMotor", - "Value": 8 - }, - { - "Name": "SmoothNoOutlines", - "Value": 10 - } - ], - "Name": "SurfaceType" - }, - { - "Items": [ - { - "Name": "Right", - "Value": 0 - }, - { - "Name": "Left", - "Value": 1 - }, - { - "Name": "Up", - "Value": 2 - }, - { - "Name": "Down", - "Value": 3 - }, - { - "Name": "None", - "Value": 4 - } - ], - "Name": "SwipeDirection" - }, - { - "Items": [ - { - "Name": "error", - "Value": 0 - }, - { - "Name": "light", - "Value": 1 - }, - { - "Name": "dark", - "Value": 2 - }, - { - "Name": "systemLight", - "Value": 3 - }, - { - "Name": "systemDark", - "Value": 4 - } - ], - "Name": "SystemThemeValue" - }, - { - "Items": [ - { - "Name": "RowMajor", - "Value": 0 - }, - { - "Name": "ColumnMajor", - "Value": 1 - } - ], - "Name": "TableMajorAxis" - }, - { - "Items": [ - { - "Name": "PlaceSizeTooLarge", - "Value": 0 - }, - { - "Name": "PlaceSizeApproachingLimit", - "Value": 1 - }, - { - "Name": "PlaceUploadFailing", - "Value": 2 - }, - { - "Name": "NoError", - "Value": 3 - } - ], - "Name": "TeamCreateErrorState" - }, - { - "Items": [ - { - "Name": "Voxel", - "Value": 1 - }, - { - "Name": "Compatibility", - "Value": 2 - }, - { - "Name": "ShadowMap", - "Value": 3 - }, - { - "Name": "Future", - "Value": 4 - }, - { - "Name": "Legacy", - "Tags": [ - "Deprecated" - ], - "Value": 0 - }, - { - "Name": "Unified", - "Tags": [ - "Deprecated" - ], - "Value": 5 - } - ], - "Name": "Technology" - }, - { - "Items": [ - { - "Name": "UNSPECIFIED", - "Value": 0 - }, - { - "Name": "EventIngest", - "Value": 1 - }, - { - "Name": "Points", - "Value": 2 - }, - { - "Name": "Teletune", - "Value": 3 - }, - { - "Name": "EphemeralCounter", - "Value": 4 - }, - { - "Name": "EphemeralStat", - "Value": 5 - }, - { - "Name": "Counter", - "Value": 6 - }, - { - "Name": "Stat", - "Value": 7 - } - ], - "Name": "TelemetryBackend" - }, - { - "Items": [ - { - "Name": "AddDatacenterId", - "Value": 0 - }, - { - "Name": "AddPlaceId", - "Value": 1 - }, - { - "Name": "AddUniverseId", - "Value": 2 - }, - { - "Name": "AddPlaceInstanceId", - "Value": 3 - }, - { - "Name": "AddPlaySessionId", - "Value": 4 - }, - { - "Name": "AddCurrentContextName", - "Value": 5 - }, - { - "Name": "AddOsInfo", - "Value": 6 - }, - { - "Name": "AddArchitectureInfo", - "Value": 7 - }, - { - "Name": "AddCpuInfo", - "Value": 8 - }, - { - "Name": "AddMemoryInfo", - "Value": 9 - }, - { - "Name": "AddSessionInfo", - "Value": 10 - } - ], - "Name": "TelemetryStandardizedField" - }, - { - "Items": [ - { - "Name": "TeleportToSpawnByName", - "Value": 0 - }, - { - "Name": "TeleportToPlaceInstance", - "Value": 1 - }, - { - "Name": "TeleportToPrivateServer", - "Value": 2 - }, - { - "Name": "TeleportPartyAsync", - "Value": 3 - }, - { - "Name": "TeleportToVIPServer", - "Value": 4 - }, - { - "Name": "TeleportToInstanceBack", - "Value": 5 - }, - { - "Name": "TeleportUnknown", - "Value": 6 - } - ], - "Name": "TeleportMethod" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "Failure", - "Value": 1 - }, - { - "Name": "GameNotFound", - "Value": 2 - }, - { - "Name": "GameEnded", - "Value": 3 - }, - { - "Name": "GameFull", - "Value": 4 - }, - { - "Name": "Unauthorized", - "Value": 5 - }, - { - "Name": "Flooded", - "Value": 6 - }, - { - "Name": "IsTeleporting", - "Value": 7 - } - ], - "Name": "TeleportResult" - }, - { - "Items": [ - { - "Name": "RequestedFromServer", - "Value": 0 - }, - { - "Name": "Started", - "Value": 1 - }, - { - "Name": "WaitingForServer", - "Value": 2 - }, - { - "Name": "Failed", - "Value": 3 - }, - { - "Name": "InProgress", - "Value": 4 - } - ], - "Name": "TeleportState" - }, - { - "Items": [ - { - "Name": "ToPlace", - "Value": 0 - }, - { - "Name": "ToInstance", - "Value": 1 - }, - { - "Name": "ToReservedServer", - "Value": 2 - }, - { - "Name": "ToVIPServer", - "Value": 3 - }, - { - "Name": "ToInstanceBack", - "Value": 4 - } - ], - "Name": "TeleportType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Legacy", - "Value": 1 - }, - { - "Name": "Template", - "Value": 2 - }, - { - "Name": "Generate", - "Value": 3 - }, - { - "Name": "Import", - "Value": 4 - }, - { - "Name": "Convert", - "Value": 5 - }, - { - "Name": "EditAddTool", - "Value": 6 - }, - { - "Name": "EditSeaLevelTool", - "Value": 7 - }, - { - "Name": "EditReplaceTool", - "Value": 8 - }, - { - "Name": "RegionFillTool", - "Value": 9 - }, - { - "Name": "RegionPasteTool", - "Value": 10 - }, - { - "Name": "Other", - "Value": 11 - } - ], - "Name": "TerrainAcquisitionMethod" - }, - { - "Items": [ - { - "Name": "Top", - "Value": 0 - }, - { - "Name": "Side", - "Value": 1 - }, - { - "Name": "Bottom", - "Value": 2 - } - ], - "Name": "TerrainFace" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Source", - "Value": 1 - }, - { - "Name": "Union", - "Value": 2 - }, - { - "Name": "Difference", - "Value": 3 - }, - { - "Name": "Intersect", - "Value": 4 - } - ], - "Name": "TerrainLiquidMergeOperation" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Paint", - "Value": 1 - }, - { - "Name": "Source", - "Value": 2 - }, - { - "Name": "Union", - "Value": 3 - }, - { - "Name": "Dig", - "Value": 4 - }, - { - "Name": "Difference", - "Value": 5 - }, - { - "Name": "Intersect", - "Value": 6 - }, - { - "Name": "Cut", - "Value": 7 - }, - { - "Name": "Place", - "Value": 8 - } - ], - "Name": "TerrainSolidMergeOperation" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 1 - }, - { - "Name": "Success", - "Value": 2 - }, - { - "Name": "Sending", - "Value": 3 - }, - { - "Name": "TextFilterFailed", - "Value": 4 - }, - { - "Name": "Floodchecked", - "Value": 5 - }, - { - "Name": "InvalidPrivacySettings", - "Value": 6 - }, - { - "Name": "InvalidTextChannelPermissions", - "Value": 7 - }, - { - "Name": "MessageTooLong", - "Value": 8 - }, - { - "Name": "ModerationTimeout", - "Value": 9 - } - ], - "Name": "TextChatMessageStatus" - }, - { - "Items": [ - { - "Name": "Auto", - "Value": 0 - }, - { - "Name": "LeftToRight", - "Value": 1 - }, - { - "Name": "RightToLeft", - "Value": 2 - } - ], - "Name": "TextDirection" - }, - { - "Items": [ - { - "Name": "PublicChat", - "Value": 1 - }, - { - "Name": "PrivateChat", - "Value": 2 - } - ], - "Name": "TextFilterContext" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "NoSuggestions", - "Value": 1 - }, - { - "Name": "Number", - "Value": 2 - }, - { - "Name": "Email", - "Value": 3 - }, - { - "Name": "Phone", - "Value": 4 - }, - { - "Name": "Password", - "Value": 5 - }, - { - "Name": "PasswordShown", - "Value": 6 - }, - { - "Name": "Username", - "Value": 7 - }, - { - "Name": "OneTimePassword", - "Value": 8 - }, - { - "Name": "NewPassword", - "Value": 9 - }, - { - "Name": "NewPasswordShown", - "Value": 10 - } - ], - "Name": "TextInputType" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "AtEnd", - "Value": 1 - }, - { - "Name": "SplitWord", - "Value": 2 - } - ], - "Name": "TextTruncate" - }, - { - "Items": [ - { - "Name": "Left", - "Value": 0 - }, - { - "Name": "Right", - "Value": 1 - }, - { - "Name": "Center", - "Value": 2 - } - ], - "Name": "TextXAlignment" - }, - { - "Items": [ - { - "Name": "Top", - "Value": 0 - }, - { - "Name": "Center", - "Value": 1 - }, - { - "Name": "Bottom", - "Value": 2 - } - ], - "Name": "TextYAlignment" - }, - { - "Items": [ - { - "Name": "Stretch", - "Value": 0 - }, - { - "Name": "Wrap", - "Value": 1 - }, - { - "Name": "Static", - "Value": 2 - } - ], - "Name": "TextureMode" - }, - { - "Items": [ - { - "Name": "NonHumanoid", - "Value": 0 - }, - { - "Name": "NonHumanoidOrphaned", - "Value": 1 - }, - { - "Name": "Humanoid", - "Value": 2 - }, - { - "Name": "HumanoidOrphaned", - "Value": 3 - } - ], - "Name": "TextureQueryType" - }, - { - "Items": [ - { - "Name": "PerCore4", - "Value": 104 - }, - { - "Name": "PerCore3", - "Value": 103 - }, - { - "Name": "PerCore2", - "Value": 102 - }, - { - "Name": "PerCore1", - "Value": 101 - }, - { - "LegacyNames": [ - "PartialThread" - ], - "Name": "Auto", - "Value": 0 - }, - { - "Name": "Threads1", - "Value": 1 - }, - { - "Name": "Threads2", - "Value": 2 - }, - { - "Name": "Threads3", - "Value": 3 - }, - { - "Name": "Threads4", - "Value": 4 - }, - { - "Name": "Threads8", - "Value": 8 - }, - { - "Name": "Threads16", - "Value": 16 - } - ], - "Name": "ThreadPoolConfig" - }, - { - "Items": [ - { - "Name": "Extreme", - "Value": 2 - }, - { - "Name": "ElevatedOnServer", - "Value": 1 - }, - { - "Name": "Default", - "Value": 0 - } - ], - "Name": "ThrottlingPriority" - }, - { - "Items": [ - { - "Name": "Size48x48", - "Value": 0 - }, - { - "Name": "Size180x180", - "Value": 1 - }, - { - "Name": "Size420x420", - "Value": 2 - }, - { - "Name": "Size60x60", - "Value": 3 - }, - { - "Name": "Size100x100", - "Value": 4 - }, - { - "Name": "Size150x150", - "Value": 5 - }, - { - "Name": "Size352x352", - "Value": 6 - } - ], - "Name": "ThumbnailSize" - }, - { - "Items": [ - { - "Name": "HeadShot", - "Value": 0 - }, - { - "Name": "AvatarBust", - "Value": 1 - }, - { - "Name": "AvatarThumbnail", - "Value": 2 - } - ], - "Name": "ThumbnailType" - }, - { - "Items": [ - { - "Name": "Fast", - "Value": 0 - }, - { - "Name": "Benchmark", - "Value": 1 - }, - { - "Name": "Precise", - "Value": 2 - } - ], - "Name": "TickCountSampleMethod" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Retro", - "Value": 1 - } - ], - "Name": "TonemapperPreset" - }, - { - "Items": [ - { - "Name": "Top", - "Value": 0 - }, - { - "Name": "Center", - "Value": 1 - }, - { - "Name": "Bottom", - "Value": 2 - } - ], - "Name": "TopBottom" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Classic", - "Value": 1 - }, - { - "Name": "Follow", - "Value": 2 - }, - { - "Name": "Orbital", - "Value": 3 - } - ], - "Name": "TouchCameraMovementMode" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Thumbstick", - "Value": 1 - }, - { - "Name": "DPad", - "Value": 2 - }, - { - "Name": "Thumbpad", - "Value": 3 - }, - { - "Name": "ClickToMove", - "Value": 4 - }, - { - "Name": "DynamicThumbstick", - "Value": 5 - } - ], - "Name": "TouchMovementMode" - }, - { - "Items": [ - { - "Name": "Ok", - "Value": 0 - }, - { - "Name": "NoService", - "Value": 1 - }, - { - "Name": "InitFailed", - "Value": 2 - }, - { - "Name": "NoVideo", - "Value": 3 - }, - { - "Name": "VideoError", - "Value": 4 - }, - { - "Name": "VideoNoPermission", - "Value": 5 - }, - { - "Name": "VideoUnsupported", - "Value": 6 - }, - { - "Name": "NoAudio", - "Value": 7 - }, - { - "Name": "AudioError", - "Value": 8 - }, - { - "Name": "AudioNoPermission", - "Value": 9 - }, - { - "Name": "UnsupportedDevice", - "Value": 10 - } - ], - "Name": "TrackerError" - }, - { - "Items": [ - { - "Name": "Auto", - "Value": 3 - }, - { - "Name": "ForceDisabled", - "Value": 0 - }, - { - "Name": "ExtrapolateFacsAndPose", - "Value": 1 - }, - { - "Name": "ExtrapolateFacsOnly", - "Value": 2 - } - ], - "Name": "TrackerExtrapolationFlagMode" - }, - { - "Items": [ - { - "Name": "FaceTrackingSuccess", - "Value": 0 - }, - { - "Name": "FaceTrackingNoFaceFound", - "Value": 1 - }, - { - "Name": "FaceTrackingUnknown", - "Value": 2 - }, - { - "Name": "FaceTrackingLost", - "Value": 3 - }, - { - "Name": "FaceTrackingHasTrackingError", - "Value": 4 - }, - { - "Name": "FaceTrackingIsOccluded", - "Value": 5 - }, - { - "Name": "FaceTrackingUninitialized", - "Value": 6 - } - ], - "Name": "TrackerFaceTrackingStatus" - }, - { - "Items": [ - { - "Name": "Auto", - "Value": 2 - }, - { - "Name": "ForceFalse", - "Value": 0 - }, - { - "Name": "ForceTrue", - "Value": 1 - } - ], - "Name": "TrackerLodFlagMode" - }, - { - "Items": [ - { - "Name": "Auto", - "Value": 2 - }, - { - "Name": "Force0", - "Value": 0 - }, - { - "Name": "Force1", - "Value": 1 - } - ], - "Name": "TrackerLodValueMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Audio", - "Value": 1 - }, - { - "Name": "Video", - "Value": 2 - }, - { - "Name": "AudioVideo", - "Value": 3 - } - ], - "Name": "TrackerMode" - }, - { - "Items": [ - { - "Name": "LODCameraRecommendDisable", - "Value": 0 - } - ], - "Name": "TrackerPromptEvent" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Face", - "Value": 1 - }, - { - "Name": "UpperBody", - "Value": 2 - } - ], - "Name": "TrackerType" - }, - { - "Items": [ - { - "Name": "False", - "Value": 2 - }, - { - "Name": "True", - "Value": 1 - }, - { - "Name": "Unknown", - "Value": 0 - } - ], - "Name": "TriStateBoolean" - }, - { - "Items": [ - { - "Name": "Canceled", - "Value": 0 - }, - { - "Name": "Completed", - "Value": 1 - } - ], - "Name": "TweenStatus" - }, - { - "Items": [ - { - "Name": "All", - "Value": 0 - }, - { - "Name": "None", - "Value": 1 - } - ], - "Name": "UICaptureMode" - }, - { - "Items": [ - { - "Name": "Automatic", - "Value": 0 - }, - { - "Name": "EntireObject", - "Value": 1 - }, - { - "Name": "HitPoint", - "Value": 2 - } - ], - "Name": "UIDragDetectorBoundingBehavior" - }, - { - "Items": [ - { - "Name": "Absolute", - "Value": 0 - }, - { - "Name": "Relative", - "Value": 1 - } - ], - "Name": "UIDragDetectorDragRelativity" - }, - { - "Items": [ - { - "Name": "Parent", - "Value": 0 - }, - { - "Name": "LayerCollector", - "Value": 1 - }, - { - "Name": "Reference", - "Value": 2 - } - ], - "Name": "UIDragDetectorDragSpace" - }, - { - "Items": [ - { - "Name": "TranslatePlane", - "Value": 0 - }, - { - "Name": "TranslateLine", - "Value": 1 - }, - { - "Name": "Rotate", - "Value": 2 - }, - { - "Name": "Scriptable", - "Value": 3 - } - ], - "Name": "UIDragDetectorDragStyle" - }, - { - "Items": [ - { - "Name": "Offset", - "Value": 0 - }, - { - "Name": "Scale", - "Value": 1 - }, - { - "Name": "CustomOffset", - "Value": 2 - }, - { - "Name": "CustomScale", - "Value": 3 - } - ], - "Name": "UIDragDetectorResponseStyle" - }, - { - "Items": [ - { - "Name": "XY", - "Value": 0 - }, - { - "Name": "XX", - "Value": 1 - }, - { - "Name": "YY", - "Value": 2 - } - ], - "Name": "UIDragSpeedAxisMapping" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Fill", - "Value": 1 - }, - { - "Name": "SpaceAround", - "Value": 2 - }, - { - "Name": "SpaceBetween", - "Value": 3 - }, - { - "Name": "SpaceEvenly", - "Value": 4 - } - ], - "Name": "UIFlexAlignment" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Grow", - "Value": 1 - }, - { - "Name": "Shrink", - "Value": 2 - }, - { - "Name": "Fill", - "Value": 3 - }, - { - "Name": "Custom", - "Value": 4 - } - ], - "Name": "UIFlexMode" - }, - { - "Items": [ - { - "Name": "Light", - "Tags": [ - "Deprecated" - ], - "Value": 0 - }, - { - "Name": "Dark", - "Tags": [ - "Deprecated" - ], - "Value": 1 - } - ], - "Name": "UITheme" - }, - { - "Items": [ - { - "Name": "UiMessageError", - "Value": 0 - }, - { - "Name": "UiMessageInfo", - "Value": 1 - } - ], - "Name": "UiMessageType" - }, - { - "Items": [ - { - "Name": "UpdateNotAvailable", - "Value": 0 - }, - { - "Name": "UpdateAvailable", - "Value": 1 - }, - { - "Name": "UpdateInProgress", - "Value": 2 - }, - { - "Name": "UpdateReady", - "Value": 3 - }, - { - "Name": "UpdateFailed", - "Value": 4 - } - ], - "Name": "UpdateState" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "NeedPermission", - "Value": 1 - }, - { - "Name": "CaptureModerated", - "Value": 2 - }, - { - "Name": "CaptureNotInGallery", - "Value": 3 - }, - { - "Name": "IneligibleCapture", - "Value": 4 - }, - { - "Name": "UploadQuotaReached", - "Value": 5 - } - ], - "Name": "UploadCaptureResult" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Preview", - "Value": 1 - } - ], - "Name": "UsageContext" - }, - { - "Items": [ - { - "Name": "Head", - "Value": 0 - }, - { - "Name": "LeftHand", - "Value": 1 - }, - { - "Name": "RightHand", - "Value": 2 - }, - { - "Name": "Floor", - "Value": 3 - } - ], - "Name": "UserCFrame" - }, - { - "Items": [ - { - "Name": "Begin", - "Value": 0 - }, - { - "Name": "Change", - "Value": 1 - }, - { - "Name": "End", - "Value": 2 - }, - { - "Name": "Cancel", - "Value": 3 - }, - { - "Name": "None", - "Value": 4 - } - ], - "Name": "UserInputState" - }, - { - "Items": [ - { - "Name": "MouseButton1", - "Value": 0 - }, - { - "Name": "MouseButton2", - "Value": 1 - }, - { - "Name": "MouseButton3", - "Value": 2 - }, - { - "Name": "MouseWheel", - "Value": 3 - }, - { - "Name": "MouseMovement", - "Value": 4 - }, - { - "Name": "Touch", - "Value": 7 - }, - { - "Name": "Keyboard", - "Value": 8 - }, - { - "Name": "Focus", - "Value": 9 - }, - { - "Name": "Accelerometer", - "Value": 10 - }, - { - "Name": "Gyro", - "Value": 11 - }, - { - "Name": "Gamepad1", - "Value": 12 - }, - { - "Name": "Gamepad2", - "Value": 13 - }, - { - "Name": "Gamepad3", - "Value": 14 - }, - { - "Name": "Gamepad4", - "Value": 15 - }, - { - "Name": "Gamepad5", - "Value": 16 - }, - { - "Name": "Gamepad6", - "Value": 17 - }, - { - "Name": "Gamepad7", - "Value": 18 - }, - { - "Name": "Gamepad8", - "Value": 19 - }, - { - "Name": "TextInput", - "Value": 20 - }, - { - "Name": "InputMethod", - "Value": 21 - }, - { - "Name": "None", - "Value": 22 - } - ], - "Name": "UserInputType" - }, - { - "Items": [ - { - "Name": "Comfort", - "Value": 0 - }, - { - "Name": "Normal", - "Value": 1 - }, - { - "Name": "Expert", - "Value": 2 - }, - { - "Name": "Custom", - "Value": 3 - } - ], - "Name": "VRComfortSetting" - }, - { - "Items": [ - { - "Name": "Disabled", - "Value": 0 - }, - { - "Name": "Transparent", - "Value": 1 - } - ], - "Name": "VRControllerModelMode" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "OculusRift", - "Value": 1 - }, - { - "Name": "HTCVive", - "Value": 2 - }, - { - "Name": "ValveIndex", - "Value": 3 - }, - { - "Name": "OculusQuest", - "Value": 4 - } - ], - "Name": "VRDeviceType" - }, - { - "Items": [ - { - "Name": "Disabled", - "Value": 0 - }, - { - "Name": "Pointer", - "Value": 1 - }, - { - "Name": "DualPointer", - "Value": 2 - } - ], - "Name": "VRLaserPointerMode" - }, - { - "Items": [ - { - "Name": "NoOne", - "Value": 0 - }, - { - "Name": "OnlyFriends", - "Value": 1 - }, - { - "Name": "Anyone", - "Value": 2 - } - ], - "Name": "VRSafetyBubbleMode" - }, - { - "Items": [ - { - "Name": "World", - "Value": 0 - }, - { - "Name": "Off", - "Value": 1 - } - ], - "Name": "VRScaling" - }, - { - "Items": [ - { - "Name": "Undefined", - "Value": 0 - }, - { - "Name": "Idle", - "Value": 1 - }, - { - "Name": "Visible", - "Value": 2 - }, - { - "Name": "Focused", - "Value": 3 - }, - { - "Name": "Stopping", - "Value": 4 - } - ], - "Name": "VRSessionState" - }, - { - "Items": [ - { - "Name": "Left", - "Value": 0 - }, - { - "Name": "Right", - "Value": 1 - } - ], - "Name": "VRTouchpad" - }, - { - "Items": [ - { - "Name": "Touch", - "Value": 0 - }, - { - "Name": "VirtualThumbstick", - "Value": 1 - }, - { - "Name": "ABXY", - "Value": 2 - } - ], - "Name": "VRTouchpadMode" - }, - { - "Items": [ - { - "Name": "Line", - "Value": 0 - }, - { - "Name": "Plane", - "Value": 1 - }, - { - "Name": "Vector", - "Value": 2 - } - ], - "Name": "VelocityConstraintMode" - }, - { - "Items": [ - { - "Name": "Center", - "Value": 0 - }, - { - "Name": "Top", - "Value": 1 - }, - { - "Name": "Bottom", - "Value": 2 - } - ], - "Name": "VerticalAlignment" - }, - { - "Items": [ - { - "Name": "Right", - "Value": 0 - }, - { - "Name": "Left", - "Value": 1 - } - ], - "Name": "VerticalScrollBarPosition" - }, - { - "Items": [ - { - "Name": "Large", - "Value": 0 - }, - { - "Name": "Small", - "Value": 1 - }, - { - "Name": "LeftTrigger", - "Value": 2 - }, - { - "Name": "RightTrigger", - "Value": 3 - }, - { - "Name": "LeftHand", - "Value": 4 - }, - { - "Name": "RightHand", - "Value": 5 - } - ], - "Name": "VibrationMotor" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "OtherError", - "Value": 1 - }, - { - "Name": "ScreenSizeChanged", - "Value": 2 - }, - { - "Name": "TimeLimitReached", - "Value": 3 - } - ], - "Name": "VideoCaptureResult" - }, - { - "Items": [ - { - "Name": "Success", - "Value": 0 - }, - { - "Name": "OtherError", - "Value": 1 - }, - { - "Name": "CapturingAlready", - "Value": 2 - }, - { - "Name": "NoDeviceSupport", - "Value": 3 - }, - { - "Name": "NoSpaceOnDevice", - "Value": 4 - } - ], - "Name": "VideoCaptureStartedResult" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Low", - "Value": 1 - }, - { - "Name": "Medium", - "Value": 2 - }, - { - "Name": "High", - "Value": 3 - } - ], - "Name": "VideoDeviceCaptureQuality" - }, - { - "Items": [ - { - "Name": "Ok", - "Value": 0 - }, - { - "Name": "Eof", - "Value": 1 - }, - { - "Name": "EAgain", - "Value": 2 - }, - { - "Name": "BadParameter", - "Value": 3 - }, - { - "Name": "AllocFailed", - "Value": 4 - }, - { - "Name": "CodecInitFailed", - "Value": 5 - }, - { - "Name": "CodecCloseFailed", - "Value": 6 - }, - { - "Name": "DecodeFailed", - "Value": 7 - }, - { - "Name": "ParsingFailed", - "Value": 8 - }, - { - "Name": "Unsupported", - "Value": 9 - }, - { - "Name": "Generic", - "Value": 10 - }, - { - "Name": "DownloadFailed", - "Value": 11 - }, - { - "Name": "StreamNotFound", - "Value": 12 - }, - { - "Name": "EncodeFailed", - "Value": 13 - }, - { - "Name": "CreateFailed", - "Value": 14 - }, - { - "Name": "NoPermission", - "Value": 15 - }, - { - "Name": "NoService", - "Value": 16 - }, - { - "Name": "ReleaseFailed", - "Value": 17 - }, - { - "Name": "Unknown", - "Value": 18 - } - ], - "Name": "VideoError" - }, - { - "Items": [ - { - "Name": "Small", - "Value": 0 - }, - { - "Name": "Medium", - "Value": 1 - }, - { - "Name": "Large", - "Value": 2 - }, - { - "Name": "Full", - "Value": 3 - } - ], - "Name": "VideoSampleSize" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "GeometryComplexity", - "Value": 1 - }, - { - "Name": "Transparent", - "Value": 2 - }, - { - "Name": "Decal", - "Value": 3 - } - ], - "Name": "ViewMode" - }, - { - "Items": [ - { - "Name": "Default", - "Value": 0 - }, - { - "Name": "Disabled", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "VirtualCursorMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Recording", - "Value": 1 - }, - { - "Name": "Playing", - "Value": 2 - } - ], - "Name": "VirtualInputMode" - }, - { - "Items": [ - { - "Name": "Inverse", - "Value": 0 - }, - { - "Name": "Legacy", - "Value": 1 - } - ], - "Name": "VoiceChatDistanceAttenuationType" - }, - { - "Items": [ - { - "Name": "Idle", - "Value": 0 - }, - { - "Name": "Joining", - "Value": 1 - }, - { - "Name": "JoiningRetry", - "Value": 2 - }, - { - "Name": "Joined", - "Value": 3 - }, - { - "Name": "Leaving", - "Value": 4 - }, - { - "Name": "Ended", - "Value": 5 - }, - { - "Name": "Failed", - "Value": 6 - } - ], - "Name": "VoiceChatState" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "ClientNetworkDisconnected", - "Value": 1 - }, - { - "Name": "PlayerLeft", - "Value": 2 - }, - { - "Name": "ClientShutdown", - "Value": 3 - }, - { - "Name": "PublishFailed", - "Value": 4 - }, - { - "Name": "RejoinReceived", - "Value": 5 - }, - { - "Name": "VoiceReboot", - "Value": 6 - }, - { - "Name": "ImguiDebugLeave", - "Value": 7 - }, - { - "Name": "LuaInitiated", - "Value": 8 - } - ], - "Name": "VoiceClientLeaveReasons" - }, - { - "Items": [ - { - "Name": "Publish", - "Value": 0 - }, - { - "Name": "Subscribe", - "Value": 1 - }, - { - "Name": "Join", - "Value": 2 - } - ], - "Name": "VoiceControlPath" - }, - { - "Items": [ - { - "Name": "Unknown", - "Value": 0 - }, - { - "Name": "Migration", - "Value": 1 - }, - { - "Name": "CloseRoom", - "Value": 2 - } - ], - "Name": "VoiceRccReconnectReason" - }, - { - "Items": [ - { - "Name": "Disabled", - "Value": 0 - }, - { - "Name": "Automatic", - "Value": 1 - }, - { - "Name": "Enabled", - "Value": 2 - } - ], - "Name": "VolumetricAudio" - }, - { - "Items": [ - { - "Name": "NegX", - "Value": 0 - }, - { - "Name": "X", - "Value": 1 - }, - { - "Name": "NegY", - "Value": 2 - }, - { - "Name": "Y", - "Value": 3 - }, - { - "Name": "NegZ", - "Value": 4 - }, - { - "Name": "Z", - "Value": 5 - } - ], - "Name": "WaterDirection" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "Small", - "Value": 1 - }, - { - "Name": "Medium", - "Value": 2 - }, - { - "Name": "Strong", - "Value": 3 - }, - { - "Name": "Max", - "Value": 4 - } - ], - "Name": "WaterForce" - }, - { - "Items": [ - { - "Name": "Connecting", - "Value": 0 - }, - { - "Name": "Open", - "Value": 1 - }, - { - "Name": "Closing", - "Value": 2 - }, - { - "Name": "Closed", - "Value": 3 - } - ], - "Name": "WebSocketState" - }, - { - "Items": [ - { - "Name": "Connecting", - "Value": 0 - }, - { - "Name": "Open", - "Value": 1 - }, - { - "Name": "Error", - "Value": 2 - }, - { - "Name": "Closed", - "Value": 3 - } - ], - "Name": "WebStreamClientState" - }, - { - "Items": [ - { - "Name": "SSE", - "Value": 0 - }, - { - "Name": "RawStream", - "Value": 1 - }, - { - "Name": "WebSocket", - "Value": 2 - } - ], - "Name": "WebStreamClientType" - }, - { - "Items": [ - { - "Name": "All", - "Value": 0 - }, - { - "Name": "None", - "Value": 1 - }, - { - "Name": "Touching", - "Value": 2 - } - ], - "Name": "WeldConstraintPreserve" - }, - { - "Items": [ - { - "Name": "AllUsers", - "Value": 0 - }, - { - "Name": "NoOne", - "Value": 1 - } - ], - "Name": "WhisperChatPrivacyMode" - }, - { - "Items": [ - { - "Name": "Disabled", - "Value": 0 - }, - { - "Name": "EnabledPreserve", - "Value": 1 - }, - { - "Name": "EnabledOverride", - "Value": 2 - } - ], - "Name": "WrapLayerAutoSkin" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "BoundCage", - "Value": 1 - }, - { - "Name": "LayerCage", - "Value": 2 - }, - { - "Name": "BoundCageAndLinks", - "Value": 3 - }, - { - "Name": "Reference", - "Value": 4 - }, - { - "Name": "Rbf", - "Value": 5 - }, - { - "Name": "OuterCage", - "Value": 6 - }, - { - "Name": "ReferenceMeshAfterMorph", - "Value": 7 - }, - { - "Name": "HSROuterDetail", - "Value": 8 - }, - { - "Name": "HSROuter", - "Value": 9 - }, - { - "Name": "HSRInner", - "Value": 10 - }, - { - "Name": "HSRInnerReverse", - "Value": 11 - }, - { - "Name": "LayerCageFittedToBase", - "Value": 12 - }, - { - "Name": "LayerCageFittedToPrev", - "Value": 13 - }, - { - "Name": "PreWrapDeformerOuterCage", - "Value": 14 - } - ], - "Name": "WrapLayerDebugMode" - }, - { - "Items": [ - { - "Name": "None", - "Value": 0 - }, - { - "Name": "TargetCageOriginal", - "Value": 1 - }, - { - "Name": "TargetCageCompressed", - "Value": 2 - }, - { - "Name": "TargetCageInterface", - "Value": 3 - }, - { - "Name": "TargetLayerCageOriginal", - "Value": 4 - }, - { - "Name": "TargetLayerCageCompressed", - "Value": 5 - }, - { - "Name": "TargetLayerInterface", - "Value": 6 - }, - { - "Name": "Rbf", - "Value": 7 - }, - { - "Name": "OuterCageDetail", - "Value": 8 - }, - { - "Name": "PreWrapDeformerCage", - "Value": 9 - } - ], - "Name": "WrapTargetDebugMode" - }, - { - "Items": [ - { - "Name": "Global", - "Value": 0 - }, - { - "Name": "Sibling", - "Value": 1 - } - ], - "Name": "ZIndexBehavior" - } - ], - "Version": 1 -} diff --git a/.cursor/rules/roblox.mdc b/.cursor/rules/roblox.mdc deleted file mode 100644 index 01b33f8b..00000000 --- a/.cursor/rules/roblox.mdc +++ /dev/null @@ -1,223 +0,0 @@ ---- -alwaysApply: true ---- - -# Roblox Documentation Reference - -When you need information about Roblox APIs, features, or best practices, reference the documentation in `.cursor/rules/roblox/`. - -## Directory Structure - -Documentation is organized under `roblox/en-us/` with shared data in `roblox/common/`. - -| Path | Content | -|------|---------| -| `roblox/common/` | Shared YAML data files | -| `roblox/en-us/animation/` | Animation system | -| `roblox/en-us/art/` | Art and modeling (accessories, characters, meshes, textures, etc.) | -| `roblox/en-us/assistant/` | Roblox Assistant documentation | -| `roblox/en-us/audio/` | Audio system | -| `roblox/en-us/avatar/` | Avatar system | -| `roblox/en-us/avatar-setup/` | Avatar setup and configuration | -| `roblox/en-us/characters/` | Character system | -| `roblox/en-us/chat/` | Chat system | -| `roblox/en-us/cloud/` | Cloud services | -| `roblox/en-us/cloud-services/` | Open Cloud APIs | -| `roblox/en-us/creator-programs/` | Creator programs and partnerships | -| `roblox/en-us/education/` | Educational content and lessons | -| `roblox/en-us/effects/` | Visual effects (beams, particles, trails, lighting) | -| `roblox/en-us/environment/` | Environment (atmosphere, clouds, lighting, skybox) | -| `roblox/en-us/includes/` | Reusable documentation snippets | -| `roblox/en-us/input/` | Input handling | -| `roblox/en-us/ip-licensing/` | IP licensing information | -| `roblox/en-us/luau/` | Luau language basics (tables, strings, functions, type-checking, etc.) | -| `roblox/en-us/makeup/` | Makeup and cosmetics system | -| `roblox/en-us/marketplace/` | Marketplace and economy | -| `roblox/en-us/matchmaking/` | Matchmaking system | -| `roblox/en-us/parts/` | Parts and meshes | -| `roblox/en-us/performance-optimization/` | Performance best practices | -| `roblox/en-us/physics/` | Physics system (constraints, assemblies, network ownership, etc.) | -| `roblox/en-us/players/` | Player management | -| `roblox/en-us/production/` | Publishing, monetization, analytics, localization | -| `roblox/en-us/projects/` | Project management and collaboration | -| `roblox/en-us/reference/` | API reference (YAML format) | -| `roblox/en-us/resources/` | Feature packages, modules, templates | -| `roblox/en-us/scripting/` | Scripting concepts (scripts, modules, events, coroutines, etc.) | -| `roblox/en-us/sound/` | Sound design and implementation | -| `roblox/en-us/studio/` | Studio features and tools | -| `roblox/en-us/tutorials/` | Step-by-step tutorials | -| `roblox/en-us/ui/` | UI components (buttons, frames, layouts, styling, etc.) | -| `roblox/en-us/workspace/` | Workspace concepts (CFrames, raycasting, collisions, streaming) | - -Standalone files in `roblox/en-us/`: -- `unity.md` - Unity to Roblox migration guide -- `unreal.md` - Unreal to Roblox migration guide -- `what-is-roblox.md` - Introduction to Roblox - -## Finding Documentation - -Use glob and grep to search `.cursor/rules/roblox/` for Roblox-specific documentation files. - -**Tip:** Check `roblox/common/navigation/` for YAML files that organize documentation by category (analytics, avatar, cloud, engine, monetization, etc.). These navigation files help locate relevant docs quickly. - -## Roblox Full API Dump - -The file `.cursor/rules/roblox-api/Full-API-Dump.json` is the authoritative source for every Roblox API class, member, and enum. It is pulled directly from the [RobloxAPI/build-archive](https://github.com/RobloxAPI/build-archive) on each sync and reflects the current production build. - -**File facts:** -- ~206,000 lines, ~7.5 MB -- `"Classes"` section: lines 1–189,995 (863 classes, 7,690 members) -- `"Enums"` section: starts at line 189,996 (552 enums) - -### Field order in the file - -The JSON fields within each object appear in alphabetical order on disk. This is critical for understanding grep results: - -``` -Class object (fields in file order): - "Members": [...] ← member array comes FIRST - "MemoryCategory": "Instances" - "Name": "ClassName" ← ALWAYS immediately after MemoryCategory - "Superclass": "ParentClass" ← ALWAYS immediately after Name - "Tags": [...] - -Property member (fields in file order): - "Category": "Part" - "Default": "value" - "MemberType": "Property" - "Name": "MemberName" ← ALWAYS immediately after MemberType - "Security": "None" | { "Read": "...", "Write": "..." } - "Serialization": { "CanLoad": bool, "CanSave": bool } - "ThreadSafety": "ReadSafe" - "ValueType": { "Category": "Primitive|DataType|Enum|Class", "Name": "typeName" } - "Tags": [...] (optional) - -Function / Event / Callback member (fields in file order): - "MemberType": "Function" (or "Event" or "Callback") - "Name": "MethodName" ← ALWAYS immediately after MemberType - "Parameters": [ { "Name": "param", "Type": { "Category": "...", "Name": "..." } } ] - "ReturnType": { "Category": "...", "Name": "..." } (Function/Callback only) - "Security": "None" - "ThreadSafety": "..." - -Enum object (fields in file order): - "Items": [ { "Name": "ItemName", "Value": N }, ... ] ← items come FIRST - "Name": "EnumName" ← enum name comes LAST, after all items -``` - -### Disambiguating "Name" entries - -The line directly **before** a `"Name":` entry tells you what kind of entry it is: - -- `"MemoryCategory": "...",` before `"Name":` → **class definition** -- `"MemberType": "...",` before `"Name":` → **member definition** (Property/Function/Event/Callback) -- `"Value": N` after `"Name":` → **enum item** -- Everything else → a type reference inside `"Type":`, `"ValueType":`, or `"ReturnType":` — not a top-level entity - -### Grep patterns - -**1. Look up a class definition** - -``` -rg -n '"Name": "BasePart"' .cursor/rules/roblox-api/Full-API-Dump.json -``` - -Find the result where the line above contains `"MemoryCategory":`. Read forward 6 lines to get `Superclass` and `Tags`. Note: the class's `Members` array begins thousands of lines above that line — large classes like `BasePart` span 2,500+ lines of members. - -**2. Look up a specific member by name** - -``` -rg -n '"Name": "Anchored"' .cursor/rules/roblox-api/Full-API-Dump.json -``` - -Find results where the line 1–3 lines above contains `"MemberType":` — those are member definitions. Use Read at that line ±15 lines to capture the full member object (Security, ThreadSafety, ValueType or Parameters/ReturnType, and Tags). - -**3. Identify which class owns a member** - -From the member's line number N, search backward through the file for the nearest `"MemoryCategory":` line. The `"Name":` on the very next line is the owning class name. Many common members (like `Anchored`) appear in multiple classes — check the owning class to confirm you have the right one. - -**4. Check whether a member is defined on a class vs inherited** - -Grep for the class Name to get its definition line number L (where `"MemoryCategory":` is on the line above). Then grep for the member Name and find the match whose line number is closest to and **below** L — that is the member as defined directly on that class. - -**5. List all Functions available on a class** - -``` -rg -n '"MemberType": "Function"' .cursor/rules/roblox-api/Full-API-Dump.json -A 1 -``` - -Each `-A 1` line is the function name. To scope to a specific class, find the class's definition line L from pattern 1, then find the previous class's definition line P. Members for the target class fall between lines P and L. Filter the `rg` output to that line range. Alternatively, use Read on the class's member block directly. - -**6. List all Events available on a class** - -``` -rg -n '"MemberType": "Event"' .cursor/rules/roblox-api/Full-API-Dump.json -A 1 -``` - -Same scoping approach as functions above. - -**7. List all Properties available on a class** - -``` -rg -n '"MemberType": "Property"' .cursor/rules/roblox-api/Full-API-Dump.json -A 1 -``` - -Same scoping approach. The `-A 1` line is always the property name since `"MemberType"` is always the line directly before `"Name"` in a member object. - -**8. Look up an enum and all its values** - -Enum names appear **after** their items in the file, so use `-B` to read upward: - -``` -rg -n -B 150 '"Name": "Material"' .cursor/rules/roblox-api/Full-API-Dump.json -``` - -Use the result in the Enums section (line 189,996+). Increase to `-B 300` for large enums. - -**9. Find all direct subclasses of a class** - -``` -rg -n '"Superclass": "BasePart"' .cursor/rules/roblox-api/Full-API-Dump.json -A 1 -``` - -The `-A 1` line after each match is the subclass `Name`. - -### Cross-referencing the dump with the docs - -The dump and the docs in `.cursor/rules/roblox/` are complementary — use either as the entry point: - -- **Dump → Docs:** You confirmed a class or member exists in the dump (name, types, security level). Now search the docs to understand correct usage patterns, recommended approaches, and gotchas the API signature alone does not convey. -- **Docs → Dump:** The docs mention a class, function, or concept. Look it up in the dump to get the exact parameter types, return type, thread safety, security level, and deprecation status — detail the docs often omit or leave vague. - -To find relevant docs after identifying a class or member: -- `Glob` into the relevant subdirectory: e.g. `roblox/en-us/physics/**` for physics, `roblox/en-us/scripting/**` for scripting patterns -- `Grep` across all docs: e.g. `rg "TweenService" .cursor/rules/roblox/` to find every file that discusses a class -- `roblox/en-us/reference/` contains YAML-format API reference files with additional context -- `roblox/common/navigation/` YAML files map topics to doc files — a fast way to find which doc covers a given system - -The docs explain intent and usage; the dump is the ground truth for the API contract. Consult both before writing code against an unfamiliar API. - -### Security levels - -| Value | Accessible from | -|---|---| -| `"None"` | Any script | -| `"LocalUserSecurity"` | LocalScript only | -| `"PluginSecurity"` | Plugin scripts only | -| `"RobloxScriptSecurity"` | CoreScript / internal — **not accessible** from user scripts | - -Security can be split per operation: `{ "Read": "None", "Write": "RobloxScriptSecurity" }` means readable but not writable from user scripts. - -### Tags to check before using a member - -| Tag | Meaning | -|---|---| -| `"Deprecated"` | Avoid — check for `"PreferredDescriptorName"` in the same Tags array for the replacement | -| `"NotCreatable"` | Cannot use `Instance.new()` — must obtain from the DataModel | -| `"Service"` | Obtain via `game:GetService("ServiceName")` | -| `"ReadOnly"` | Property cannot be set | -| `"NotReplicated"` | Changes do not sync across the client/server boundary | - -### Large class warning - -Classes like `BasePart`, `Instance`, and `Humanoid` have 500–2,500 lines of members. Never attempt to read an entire class block. Always grep for the specific member, function, or event you need. diff --git a/.cursor/rules/roblox/common/navigation/analytics.yaml b/.cursor/rules/roblox/common/navigation/analytics.yaml deleted file mode 100644 index 4125de9b..00000000 --- a/.cursor/rules/roblox/common/navigation/analytics.yaml +++ /dev/null @@ -1,51 +0,0 @@ -navigation: - - heading: Analytics - - title: Overview - path: /production/analytics/ - - - title: Insights - path: /production/analytics/insights - - - title: Monitor - section: - - title: Performance - path: /production/analytics/performance - - title: Error report - path: /production/analytics/error-report - - - heading: Adjust and experiment - - title: Configs - path: /production/configs - - title: Experiments - path: /production/experiments - - - heading: Dashboards - - title: Overview - path: /production/analytics/analytics-dashboard - - title: Retention - path: /production/analytics/retention - - title: Engagement - path: /production/analytics/engagement - - title: Acquisition - path: /production/analytics/acquisition - - title: Demographics - path: /production/analytics/demographics - - title: Feedback - path: /production/analytics/feedback - - title: Monetization - path: /production/analytics/monetization - - title: Bans - path: /production/bans - - - title: Event types - section: - - title: Overview - path: /production/analytics/event-types - - title: Economy events - path: /production/analytics/economy-events - - title: Funnel events - path: /production/analytics/funnel-events - - title: Custom events - path: /production/analytics/custom-events - - title: Custom fields - path: /production/analytics/custom-fields diff --git a/.cursor/rules/roblox/common/navigation/assets.yaml b/.cursor/rules/roblox/common/navigation/assets.yaml deleted file mode 100644 index 075f219e..00000000 --- a/.cursor/rules/roblox/common/navigation/assets.yaml +++ /dev/null @@ -1,79 +0,0 @@ -navigation: - - heading: Overview - - title: Overview - path: /assets - - title: Assets - path: /projects/assets/ - - title: Manage - path: /projects/assets/manager - section: - - title: Asset Manager - path: /projects/assets/manager - - title: Toolbox - path: /projects/assets/toolbox - - title: External catalog queries - path: /projects/assets/api - - title: Packages - path: /projects/assets/packages - - title: Asset privacy - path: /projects/assets/privacy - - title: Creator Store - path: /production/creator-store - - title: Monetize models and plugins - path: /production/sell-on-creator-store - - - heading: Creation tools - - title: Studio - path: /art/overview-studio - - title: Third-party software - section: - - title: Overview - path: /art/overview-dcc - - title: Blender - path: /art/blender - - title: Reaper - path: /art/reaper - - title: In-experience - path: /projects/assets/in-experience-asset-creation - - heading: 3D Art - - title: Overview - path: /art/ - - title: Modeling - section: - - title: Overview - path: /art/modeling/ - - title: Modeling specifications - path: /art/modeling/specifications - - title: Reference assets - path: /art/modeling/project-files - - title: Rigging and skinning - path: /art/modeling/rigging - - title: Blender / Maya export settings - path: /art/modeling/export-requirements - - - title: Texturing - section: - - title: Texture specifications - path: /art/modeling/texture-specifications - - title: Blender / Maya texture settings - path: /art/modeling/assign-textures - - title: Physically-based rendering (PBR) - path: /art/modeling/surface-appearance - - title: PBR material references - path: /art/modeling/material-reference - - - title: Animation - section: - - title: Export from Maya - path: /art/characters/export-avatar-animations-from-maya - - title: Head animation - path: /art/characters/facial-animation/animate-heads - - - title: 3D Importer - path: /art/modeling/3d-importer - - title: Reimport - path: /art/modeling/reimport - - title: glTF Export - path: /art/modeling/gltf-export - - title: Roblox Blender plugin - path: /art/modeling/roblox-blender-plugin diff --git a/.cursor/rules/roblox/common/navigation/avatar/guides.yaml b/.cursor/rules/roblox/common/navigation/avatar/guides.yaml deleted file mode 100644 index 1d73a73d..00000000 --- a/.cursor/rules/roblox/common/navigation/avatar/guides.yaml +++ /dev/null @@ -1,155 +0,0 @@ -navigation: - - heading: Overview - - title: Get started - path: /avatar/ - - title: Resources - path: /avatar/resources - - heading: Create - - title: Classic clothing - section: - - title: Overview - path: /art/classic-clothing - - title: Test in Studio - path: /art/test-classic-clothing - - title: Upload and sell - path: /art/upload-classic-clothing - - title: Accessories - section: - - title: Overview - path: /art/accessories/ - - title: Specifications - path: /art/accessories/specifications - - title: Body scale - path: /art/accessories/body-scale - - title: Export settings - path: /art/accessories/export-settings - - title: Import into Studio - path: /art/accessories/importing - - title: Clothing - section: - - title: Overview - path: /art/accessories/layered-clothing - - title: Specifications - path: /art/accessories/clothing-specifications - - title: Reference files - path: /art/accessories/project-files - - title: Caging - path: /art/accessories/caging-best-practices - - title: Export settings - path: /art/accessories/clothing-export-settings - - title: Import into Studio - path: /art/accessories/import-clothing - - title: Characters - section: - - title: Overview - path: /art/characters/ - - title: Specifications - path: /art/characters/specifications - - title: Reference files - path: /art/characters/project-files - - title: Export settings - path: /art/characters/export-settings - - title: Import into Studio - path: /art/characters/import - - title: Heads - section: - - title: Overview - path: /art/characters/facial-animation/ - - title: Validation process - path: /art/characters/head-validation - - title: Head specifications - path: /art/characters/head-specifications - - title: Face cage optimizations - path: /art/characters/face-caging-best-practices - - title: Testing in Studio - path: /art/characters/facial-animation/use-heads-in-studio - - title: FACS poses reference - path: /art/characters/facial-animation/facs-poses-reference - - title: Emotes - section: - - title: Overview - path: /art/emotes/ - - title: Specifications - path: /art/emotes/specifications - - title: Export settings - path: /art/emotes/export-settings - - title: Import and configure in Studio - path: /art/emotes/import - - title: Makeup (Beta) - section: - - title: Overview - path: /makeup/ - - title: Specifications - path: /makeup/specifications - - title: Reassign textures - path: /makeup/reassign-textures - - title: Import into Studio - path: /makeup/import - - title: Publish - section: - - title: Overview - path: /marketplace/ - - title: Publish to Marketplace - path: /marketplace/publish-to-marketplace - - title: UGC Homestore - path: /marketplace/homestore - - title: Avatar Setup - section: - - title: Overview - path: /avatar-setup/ - - title: Auto-setup - path: /avatar-setup/auto-setup - - title: Auto-setup requirements - path: /avatar-setup/auto-setup-requirements - - title: Preview and edit tools - path: /avatar-setup/tools - - title: More Studio tools - section: - - title: 3D Importer - path: /art/modeling/3d-importer - - title: Accessory Fitting - path: /art/accessories/accessory-fitting-tool - - title: Automatic Skinning Transfer - path: /art/accessories/automatic-skinning-transfer - - title: Thumbnails - path: /marketplace/custom-thumbnails - - title: Validation errors - path: /art/validation-errors - - - title: 3rd party add-ons - section: - - title: Roblox Blender plugin - path: /art/modeling/roblox-blender-plugin - - title: Calisthenics Tool - path: /art/modeling/calisthenics-tool - - title: Clothing Validation Tool - path: /art/accessories/validation-tool - - - title: In-experience creation - path: /avatar/in-experience-creation - - title: Photo-to-Avatar generation - path: /avatar/avatar-generation - - - heading: Monetize - - title: Overview - path: /monetize-avatar - - title: Fees and commissions - path: /marketplace/marketplace-fees-and-commissions - - title: In-experience sales - path: /production/monetization/avatar-items - - title: In-experience creation - path: /production/monetization/avatar-creation-token - - title: Sponsor items - path: /production/promotion/sponsor-items - - title: Randomized items - path: /production/monetization/virtual-items - - - heading: Policies and Guidelines - - title: Marketplace policy - path: /marketplace/marketplace-policy - - title: Intellectual property - path: /marketplace/intellectual-property - - title: Moderation - path: /marketplace/moderation - - title: FAQ - path: /marketplace/frequently-asked-questions diff --git a/.cursor/rules/roblox/common/navigation/avatar/tutorials-accessories.yaml b/.cursor/rules/roblox/common/navigation/avatar/tutorials-accessories.yaml deleted file mode 100644 index 059098b0..00000000 --- a/.cursor/rules/roblox/common/navigation/avatar/tutorials-accessories.yaml +++ /dev/null @@ -1,23 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - title: Overview - path: /art/accessories/creating-rigid/ - - heading: Model - - title: Box modeling - path: /art/accessories/creating-rigid/modeling-setup - - heading: Texture - - title: Texture painting - path: /art/accessories/creating-rigid/texturing - - heading: Export - - title: Export from Blender - path: /art/accessories/creating-rigid/exporting - - heading: Import - - title: Use Studio's 3D importer - path: /art/accessories/creating-rigid/importing - - title: Convert to accessory - path: /art/accessories/creating-rigid/converting - - heading: Publish - - title: Upload and publish - path: /art/accessories/creating-rigid/publishing diff --git a/.cursor/rules/roblox/common/navigation/avatar/tutorials-bodies.yaml b/.cursor/rules/roblox/common/navigation/avatar/tutorials-bodies.yaml deleted file mode 100644 index 9acf5732..00000000 --- a/.cursor/rules/roblox/common/navigation/avatar/tutorials-bodies.yaml +++ /dev/null @@ -1,52 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Overview - - title: Avatar creation - path: /art/characters/creating/ - - heading: Project setup - - title: Template files - path: /art/characters/creating/template-files - - title: Extra head objects - path: /art/characters/creating/head-objects - - title: Blender configurations - path: /art/characters/creating/blender-configurations - - - heading: Modeling - - title: Best practices - path: /art/characters/creating/modeling-best-practices - - title: Tips and settings - path: /art/characters/creating/modeling-tips - - title: Sculpt - path: /art/characters/creating/sculpting - - - heading: Texturing - - title: Texture painting setup - path: /art/characters/creating/texturing-setup - - title: Texturing eyes - path: /art/characters/creating/texturing-eyes - - title: Texturing face - path: /art/characters/creating/texturing-face - - title: PBR textures (optional) - path: /art/characters/creating/texturing-pbr - - - heading: Caging - - title: Caging character head - path: /art/characters/creating/caging - - - heading: Cleanup - - title: Combine head geometry - path: /art/characters/creating/combine-head-geometry - - title: Remove extra bones - path: /art/characters/creating/remove-extra-bones - - title: Verify attachments - path: /art/characters/creating/verify-attachments - - title: Final checks - path: /art/characters/creating/final-checks - - - heading: Export - - title: Embed and export textures - path: /art/characters/creating/export-textures - - title: Export character model - path: /art/characters/creating/export-character diff --git a/.cursor/rules/roblox/common/navigation/avatar/tutorials-clothing.yaml b/.cursor/rules/roblox/common/navigation/avatar/tutorials-clothing.yaml deleted file mode 100644 index 33f16ea2..00000000 --- a/.cursor/rules/roblox/common/navigation/avatar/tutorials-clothing.yaml +++ /dev/null @@ -1,46 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - title: Overview - path: /art/accessories/creating/ - - - heading: Modeling - - title: Set up mesh - path: /art/accessories/creating/modeling-setup - - title: Trim clothing shape - path: /art/accessories/creating/trimming - - title: Sculpt detail - path: /art/accessories/creating/sculpting - - title: Make mesh watertight - path: /art/accessories/creating/watertight - - - heading: Texturing - - title: Create seams and unwrap - path: /art/accessories/creating/unwrapping - - title: Create a texture map - path: /art/accessories/creating/texture-map - - title: Texture painting - path: /art/accessories/creating/texture-painting - - - heading: Rigging - - title: Armature setup - path: /art/accessories/creating/armature-setup - - title: Test poses - path: /art/accessories/creating/test-poses - - - heading: Caging - - title: Caging setup - path: /art/accessories/creating/caging-setup - - title: Modify outer cage - path: /art/accessories/creating/modify-cage - - - heading: Export - - title: Export FBX - path: /art/accessories/creating/exporting - - - heading: Import and convert - - title: Use Studio's 3D importer - path: /art/accessories/creating/importing - - title: Use the accessory fitting tool - path: /art/accessories/creating/converting diff --git a/.cursor/rules/roblox/common/navigation/avatar/tutorials.yaml b/.cursor/rules/roblox/common/navigation/avatar/tutorials.yaml deleted file mode 100644 index d96eb2c4..00000000 --- a/.cursor/rules/roblox/common/navigation/avatar/tutorials.yaml +++ /dev/null @@ -1,37 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Curriculum paths - - title: Overview - path: /avatar/tutorials - section: - - title: Rigid accessories - path: /art/accessories/creating-rigid/ - navigation: /avatar/tutorials-accessories.yaml - - title: Clothing - path: /art/accessories/creating - navigation: /avatar/tutorials-clothing.yaml - - title: Bodies - path: /art/characters/creating - navigation: /avatar/tutorials-bodies.yaml - - heading: Use cases - - title: Create accessories from an existing model - path: /art/accessories/from-existing - - title: Rig and cage an existing model - path: /art/accessories/rig-and-cage-existing-models - - title: Create basic heads - path: /art/characters/facial-animation/create-basic-heads - - title: Create face accessories - path: /art/characters/facial-animation/create-face-accessories - - title: Publish eyebrows and eyelashes - path: /art/accessories/publish-eyebrows-eyelashes - - title: Test characters - path: /art/characters/testing/ - section: - - title: Overview - path: /art/characters/testing/ - - title: In Blender - path: /art/characters/testing/blender - - title: In Studio - path: /art/characters/testing/studio diff --git a/.cursor/rules/roblox/common/navigation/cloud/guides.yaml b/.cursor/rules/roblox/common/navigation/cloud/guides.yaml deleted file mode 100644 index c4bfa13e..00000000 --- a/.cursor/rules/roblox/common/navigation/cloud/guides.yaml +++ /dev/null @@ -1,37 +0,0 @@ -backTo: - title: Back to Open Cloud - path: /cloud/ -navigation: - - title: Overview - path: /cloud/guides/ - - heading: Guides - - title: Data stores - path: /cloud/guides/data-stores/ - section: - - title: Overview - path: /cloud/guides/data-stores/ - - title: Handle requests - path: /cloud/guides/data-stores/request-handling - - title: Rate limits and throttling - path: /cloud/guides/data-stores/throttling - - title: Assets - path: /cloud/guides/usage-assets - - title: Configs - path: /cloud/guides/configs - - title: Secrets stores - path: /cloud/guides/secrets-store - - title: User inventories - path: /cloud/guides/inventory - - title: Engine instances - path: /cloud/guides/instance - - title: User notifications - path: /cloud/guides/experience-notifications - - title: Messaging - path: /cloud/guides/usage-messaging - - title: Place publishing - path: /cloud/guides/usage-place-publishing - - heading: Webhooks - - title: Webhook notifications - path: /cloud/webhooks/webhook-notifications - - title: Right to erasure requests - path: /cloud/webhooks/automate-right-to-erasure diff --git a/.cursor/rules/roblox/common/navigation/cloud/reference.yaml b/.cursor/rules/roblox/common/navigation/cloud/reference.yaml deleted file mode 100644 index 4ebc5440..00000000 --- a/.cursor/rules/roblox/common/navigation/cloud/reference.yaml +++ /dev/null @@ -1,467 +0,0 @@ -navigation: - - heading: Overview - - title: Reference - path: /cloud/ - - title: Guides - path: /cloud/guides/ - navigation: /cloud/guides.yaml - - title: Common components - path: /cloud/reference/patterns - section: - - title: Patterns - path: /cloud/reference/patterns - - title: Types - path: /cloud/reference/types - - title: Errors - path: /cloud/reference/errors - - title: Rate limits - path: /cloud/reference/rate-limits - - title: OpenAPI document - path: /cloud/reference/openapi - - title: Scopes - path: /cloud/reference/scopes - - title: Risk levels - path: /cloud/reference/risk-levels - - heading: Authentication - - title: API keys - path: /cloud/auth/api-keys - - title: OAuth 2.0 - path: /cloud/auth/oauth2-overview - section: - - title: Overview - path: /cloud/auth/oauth2-overview - - title: Registration - path: /cloud/auth/oauth2-registration - - title: Implementation - path: /cloud/auth/oauth2-develop - - title: Sample app - path: /cloud/auth/oauth2-sample - - title: Reference - path: /cloud/auth/oauth2-reference - - heading: Features - - title: '' # doesn't show anywhere - path: /cloud/reference/features/ - type: cloudfeature - source: /reference/cloud/openapi.json - - heading: Domains - - title: '' # doesn't show anywhere - path: /cloud/reference/domains/ - type: clouddomain - source: /reference/cloud/openapi.json - - - heading: Features - - title: Accounts - path: /cloud/features/accounts - - title: Assets - path: /cloud/features/assets - - title: Avatars - path: /cloud/features/avatars - - title: Badges - path: /cloud/features/badges - - title: Bans and blocks - path: /cloud/features/bans-and-blocks - - title: Connections - path: /cloud/features/friends - - title: Creator Store - path: /cloud/features/creator-store - - title: Data and memory stores - path: /cloud/features/storage - - title: Developer products - path: /cloud/features/developer-products - - title: Game passes - path: /cloud/features/game-passes - - title: Generative AI - path: /cloud/features/generative-ai - - title: Groups - path: /cloud/features/groups - - title: Interactions - path: /cloud/features/interactions - - title: Inventories - path: /cloud/features/inventories - - title: Localization - path: /cloud/features/localization - - title: Luau execution - path: /cloud/features/luau-execution - - title: Metadata - path: /cloud/features/metadata - - title: Notifications - path: /cloud/features/notifications - - title: Places - path: /cloud/features/places - - title: Private servers - path: /cloud/features/private-servers - - title: Sponsored campaigns - path: /cloud/features/sponsored-campaigns - - title: Team Create - path: /cloud/features/team-create - - title: Thumbnails - path: /cloud/features/thumbnails - - title: Trades - path: /cloud/features/trades - - title: Universes - path: /cloud/features/universes - - title: User profiles - path: /cloud/features/user-profiles - - title: Users - path: /cloud/features/users - - heading: Open Cloud API Reference - - title: Cloud - section: - - title: Asset delivery - path: /cloud/api/asset-delivery - - title: Asset permissions - path: /cloud/api/asset-permissions - - title: Badges - path: /cloud/api/badges - - title: Develop - path: /cloud/api/develop - - title: Developer products - path: /cloud/api/developer-products - - title: Followings - path: /cloud/api/followings - - title: Game internationalization - path: /cloud/api/game-internationalization - - title: Game passes - path: /cloud/api/game-passes - - title: Groups - path: /cloud/api/groups - - title: Localization tables - path: /cloud/api/localization - - title: Open eval - path: /cloud/api/open-eval - - title: Publish - path: /cloud/api/publish - - title: Secrets store service - path: /cloud/api/secrets-store - - title: Toolbox service - path: /cloud/api/toolbox-service - - title: Open Cloud v2 - section: - - title: All Cloud API # doesn't show anywhere - path: /cloud/reference/ - type: cloudapi2 - source: /reference/cloud/cloud.docs.json - - title: Open Cloud v1 - section: - - title: Assets - type: cloudapi - versions: - - name: v1 - path: /reference/cloud/assets/v1 - - title: Standard data stores - type: cloudapi - versions: - - name: v1 - path: /reference/cloud/datastores-api/v1 - - title: Ordered data stores - type: cloudapi - versions: - - name: v1 - path: /reference/cloud/datastores-api/ordered-v1 - - title: Messaging - type: cloudapi - versions: - - name: v1 - path: /reference/cloud/messaging-service/v1 - - title: Place publishing - type: cloudapi - versions: - - name: v1 - path: /reference/cloud/universes-api/v1 - - heading: Cookie-based API Reference - - title: Legacy APIs - section: - - title: Account information - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/accountinformation/v1 - - title: Account settings - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/accountsettings/v1 - - title: Ad configuration - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/adconfiguration/v2 - - title: Asset delivery v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/assetdelivery/v2 - - title: Asset delivery v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/assetdelivery/v1 - - title: Authentication v3 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v3 - path: /cloud/legacy/auth/v3 - - title: Authentication v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/auth/v2 - - title: Authentication v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/auth/v1 - - title: Avatar v3 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v3 - path: /cloud/legacy/avatar/v3 - - title: Avatar v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/avatar/v2 - - title: Avatar v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/avatar/v1 - - title: Badges - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/badges/v1 - - title: Catalog v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/catalog/v2 - - title: Catalog v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/catalog/v1 - - title: Client settings v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/clientsettings/v2 - - title: Client settings v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/clientsettings/v1 - - title: Contacts - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/contacts/v1 - - title: Develop v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/develop/v2 - - title: Develop v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/develop/v1 - - title: Economy - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/economy/v1 - - title: Economy creator stats - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/economycreatorstats/v1 - - title: Engagement payouts - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/engagementpayouts/v1 - - title: Followings v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/followings/v2 - - title: Followings v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/followings/v1 - - title: Friends - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/friends/v1 - - title: Game internationalization v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/gameinternationalization/v2 - - title: Game internationalization v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/gameinternationalization/v1 - - title: Games v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/games/v2 - - title: Games v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/games/v1 - - title: Groups v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/groups/v2 - - title: Groups v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/groups/v1 - - title: Inventory v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/inventory/v2 - - title: Inventory v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/inventory/v1 - - title: Item configuration - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/itemconfiguration/v1 - - title: Locale - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/locale/v1 - - title: Localization tables - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/localizationtables/v1 - - title: Matchmaking - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/matchmaking/v1 - - title: Notifications - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/notifications/v2 - - title: Premium features - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/premiumfeatures/v1 - - title: Presence - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/presence/v1 - - title: Private messages - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/privatemessages/v1 - - title: Publish - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/publish/v1 - - title: Thumbnails - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/thumbnails/v1 - - title: Thumbnails resizer - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/thumbnailsresizer/v1 - - title: Trades v2 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v2 - path: /cloud/legacy/trades/v2 - - title: Trades v1 - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/trades/v1 - - title: Translation roles - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/translationroles/v1 - - title: Two-step verification - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/twostepverification/v1 - - title: Users - type: cloudlegacy - ignoreTranslation: true - versions: - - name: v1 - path: /cloud/legacy/users/v1 diff --git a/.cursor/rules/roblox/common/navigation/documentation.yaml b/.cursor/rules/roblox/common/navigation/documentation.yaml deleted file mode 100644 index e3853add..00000000 --- a/.cursor/rules/roblox/common/navigation/documentation.yaml +++ /dev/null @@ -1,43 +0,0 @@ -columns: - - - title: Learn - path: / - items: - - title: Experiences - navigation: /engine/guides.yaml - path: /experiences - - title: Avatar - navigation: /avatar/guides.yaml - path: /avatar - - title: Assets - navigation: /assets.yaml - path: /assets - - title: Samples and projects - navigation: /engine/resources.yaml - path: /samples - - title: Engine API - path: /reference/engine - navigation: /engine/reference.yaml - - title: Open Cloud API - navigation: /cloud/reference.yaml - path: /cloud/ - - title: Studio - path: /studio/ - navigation: /engine/studio.yaml - - title: Analytics - path: /production/analytics/ - navigation: analytics.yaml - - title: Platform - path: /get-started/ - navigation: /platform.yaml - - title: Tutorials - navigation: /engine/tutorials.yaml - path: /tutorials - - title: Creator programs - path: /creator-programs/ - navigation: /programs.yaml - - title: Education - navigation: /education.yaml - path: /education/educator-onboarding/landing - - title: Courses - navigation: /courses/courses.yaml - path: /courses diff --git a/.cursor/rules/roblox/common/navigation/education.yaml b/.cursor/rules/roblox/common/navigation/education.yaml deleted file mode 100644 index eb13454e..00000000 --- a/.cursor/rules/roblox/common/navigation/education.yaml +++ /dev/null @@ -1,81 +0,0 @@ -navigation: - - heading: Educator training - - title: Educator onboarding - path: /education/educator-onboarding/landing - section: - - title: Intro to Roblox - path: /education/educator-onboarding/1-intro-to-roblox - - title: Play on Roblox - path: /education/educator-onboarding/2-playing-on-roblox - - title: Set up a classroom - path: /education/educator-onboarding/3-setting-up-a-roblox-classroom - - title: Run a classroom - path: /education/educator-onboarding/4-running-classrooms - - title: Next steps - path: /education/educator-onboarding/5-next-steps - - title: Classroom facilitation - section: - - title: Digital civility - path: /education/resources/intro-to-digital-civility - - title: Digital safety - path: /education/resources/intro-to-digital-safety - - title: Remote teaching - path: /education/resources/teaching-remotely - - title: Private servers - path: /education/support/private-servers-for-classroom-use - - title: Best practices for collaboration - path: /education/resources/collaboration-best-practices - - title: Best practices for classrooms - path: /education/resources/classroom-best-practices - - heading: Lesson plans - - title: Unit lessons - section: - - title: Game design and coding - path: /education/lesson-plans/intro-to-game-and-coding - - title: Digital citizenship - path: /education/lesson-plans/digital-citizenship/landing - section: - - title: Intro to digital safety - path: /education/lesson-plans/digital-citizenship/intro-to-roblox - - title: Be a digital citizen - path: /education/lesson-plans/digital-citizenship/being-a-digital-citizen - - title: Develop civil and safe games - path: /education/lesson-plans/digital-citizenship/civil-and-safe-game - - title: Lights and polish - path: /education/lesson-plans/digital-citizenship/lights-and-polish - - title: Coding fundamentals - path: /education/lesson-plans/digital-citizenship/coding-fundamentals - - title: Character animation - path: /education/lesson-plans/digital-citizenship/animating-characters - - title: Finish projects - path: /education/lesson-plans/digital-citizenship/finishing-projects - - title: Activity lessons - section: - - title: Intro to Building - path: /education/lesson-plans/build-an-obby-lesson - - title: Roblox animations - path: /education/lesson-plans/animate-in-roblox-lesson - - title: Story games - path: /education/lesson-plans/story-games-lesson - - title: Resources - path: /education/resources/resources-landing - section: - - title: List of Roblox educators - path: /education/resources/roblox-educators - - title: Marketing materials - path: /education/resources/marketing-materials - - title: Roblox for AP CSP - path: /education/resources/roblox-for-the-ap-csp-create-performance-task - - title: Bundled installers - path: /education/support/creating-bundled-installers - - title: FAQ - path: /education/resources/frequently-asked-questions-education - - heading: Education developers - - title: Get started for developers - path: /education/resources/getting-started-for-developers-education - - title: Design educational experiences - path: /education/developer/designing-educational-experiences - - title: Plan for educational settings - path: /education/developer/planning-for-educational-settings - - title: Beta test experiences - path: /education/developer/beta-testing-experiences diff --git a/.cursor/rules/roblox/common/navigation/engine/guides.yaml b/.cursor/rules/roblox/common/navigation/engine/guides.yaml deleted file mode 100644 index a71ca53e..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/guides.yaml +++ /dev/null @@ -1,591 +0,0 @@ -defaultType: markdown -navigation: - - heading: Overview - - title: Get started - path: /experiences - - heading: Create - - title: Overview - path: /creation - - title: Projects - path: /projects - section: - - title: Overview - path: /projects/ - - title: Experiences and places - path: /production/publishing/publish-experiences-and-places - section: - - title: Create and publish - path: /production/publishing/publish-experiences-and-places - - title: Configure - path: /projects/configure-experiences - - title: Release updates - path: /projects/update-experiences - - title: Cross-platform development - path: /projects/cross-platform - - title: Architecture - path: /projects/data-model - section: - - title: Data model - path: /projects/data-model - - title: Client-server runtime - path: /projects/client-server - - title: Instance streaming - path: /workspace/streaming - - title: Server authority - path: /projects/server-authority/ - section: - - title: Overview - path: /projects/server-authority/ - - title: Advanced techniques - path: /projects/server-authority/techniques - - title: Manage - path: /projects/experience-ownership-transfer - section: - - title: Experience ownership transfer - path: /projects/experience-ownership-transfer - - title: Place files - path: /projects/place-files - - title: Work in teams - path: /projects/groups - section: - - title: Groups - path: /projects/groups - - title: Collaboration - path: /projects/collaboration - - title: Activity history - path: /projects/activity-history - - title: File-based workflows - path: /scripting/sync - section: - - title: Script Sync - path: /scripting/sync - - title: Third-party tools - path: /projects/external-tools - - title: 3D workspace - path: /workspace/ - section: - - title: Overview - path: /workspace/ - - title: Parts - path: /parts/ - section: - - title: Overview - path: /parts/ - - title: Solid modeling - path: /parts/solid-modeling - - title: Textures and decals - path: /parts/textures-decals - - title: Meshes - path: /parts/meshes - - title: Models - path: /parts/models - - title: Materials - path: /parts/materials - - title: Terrain - path: /parts/terrain - - title: Physics - path: /physics/ - section: - - title: Overview - path: /physics/ - - title: Assemblies - path: /physics/assemblies - - title: Network ownership - path: /physics/network-ownership - #- title: Joints - # path: /physics/joints - - title: Mechanical constraints - path: /physics/mechanical-constraints - section: - - title: Overview - path: /physics/mechanical-constraints - - title: BallSocket - path: /physics/constraints/ball-socket - - title: Hinge - path: /physics/constraints/hinge - - title: Prismatic - path: /physics/constraints/prismatic - - title: Cylindrical - path: /physics/constraints/cylindrical - - title: Spring - path: /physics/constraints/spring - - title: TorsionSpring - path: /physics/constraints/torsion-spring - - title: Universal - path: /physics/constraints/universal - - title: Rope - path: /physics/constraints/rope - - title: Rod - path: /physics/constraints/rod - - title: Plane - path: /physics/constraints/plane - - title: Weld - path: /physics/constraints/weld - - title: Rigid - path: /physics/constraints/rigid - - title: NoCollision - path: /physics/constraints/no-collision - - title: Mover constraints - path: /physics/mover-constraints - section: - - title: Overview - path: /physics/mover-constraints - - title: LinearVelocity - path: /physics/constraints/linear-velocity - - title: AngularVelocity - path: /physics/constraints/angular-velocity - - title: AlignPosition - path: /physics/constraints/align-position - - title: AlignOrientation - path: /physics/constraints/align-orientation - - title: VectorForce - path: /physics/constraints/vector-force - - title: Torque - path: /physics/constraints/torque - - title: LineForce - path: /physics/constraints/line-force - - title: Animation - path: /physics/constraints/animation - - title: Sleep system - path: /physics/sleep-system - - title: Adaptive timestepping - path: /physics/adaptive-timestepping - - title: Character controllers - path: /physics/character-controllers - - title: Roblox units - path: /physics/units - - title: Effects - path: /effects/ - section: - - title: Overview - path: /effects/ - - title: Light sources - path: /effects/light-sources - - title: Particle emitters - path: /effects/particle-emitters - - title: Beams - path: /effects/beams - - title: Trails - path: /effects/trails - - title: Highlighting - path: /effects/highlighting - - title: Camera - path: /workspace/camera - - title: Spatial data - section: - #- title: Object World Space - # path: /workspace/object-world-space - - title: CFrames - path: /workspace/cframes - - title: Collisions - path: /workspace/collisions - - title: Raycasting - path: /workspace/raycasting - - title: Model generation - path: /parts/model-generation - - title: Scripting - path: /scripting/ - section: - - title: Overview - path: /scripting/ - - title: Types and locations - path: /scripting/locations - - title: Reuse code - path: /scripting/module - - title: Services - path: /scripting/services - - title: Properties and attributes - path: /scripting/attributes - - title: Events - path: /scripting/events/ - section: - - title: Overview - path: /scripting/events/ - - title: Deferred - path: /scripting/events/deferred - - title: Bindable - path: /scripting/events/bindable - - title: Remote - path: /scripting/events/remote - - title: Advanced - section: - - title: Scheduler - path: /scripting/scheduler - - title: Multi-threading - path: /scripting/multithreading - - title: Native code generation - path: /luau/native-code-gen - - title: Script capabilities - path: /scripting/capabilities - - title: Security - section: - - title: General principles - path: /scripting/security/security-tactics - - title: Defensive design tactics - path: /scripting/security/defensive-design - - title: Securing the client-server boundary - path: /scripting/security/client-server-boundary - - title: Network ownership - path: /scripting/security/network-ownership - - title: Access control and confidentiality - path: /scripting/security/access-control - - title: Third-party asset vulnerability - path: /scripting/security/third-party-vulnerabilities - - title: Server-side detection and consequencing - path: /scripting/security/server-side-detection - - title: Luau reference - path: /luau/ - section: - - title: Overview - path: /luau/ - - title: Types - section: - - title: Nil - path: /luau/nil - - title: Booleans - path: /luau/booleans - - title: Numbers - path: /luau/numbers - - title: Strings - path: /luau/strings - - title: Tables - path: /luau/tables - - title: Enums - path: /luau/enums - - title: Tuples - path: /luau/tuples - - title: Userdata - path: /luau/userdata - - title: Data structures - section: - - title: Queues - path: /luau/queues - - title: Stacks - path: /luau/stacks - - title: Metatables - path: /luau/metatables - - title: Features - section: - - title: Comments - path: /luau/comments - - title: Variables - path: /luau/variables - - title: Scope - path: /luau/scope - - title: Operators - path: /luau/operators - - title: Control structures - path: /luau/control-structures - - title: Functions - path: /luau/functions - - title: Type coercion - path: /luau/type-coercion - - title: Type checking - path: /luau/type-checking - - title: Environment - path: /environment/ - section: - - title: Overview - path: /environment/ - - title: Global lighting - path: /environment/lighting - - title: Atmosphere - path: /environment/atmosphere - - title: Clouds - path: /environment/clouds - - title: Global wind - path: /environment/global-wind - - title: Post-processing effects - path: /environment/post-processing-effects - - title: Skyboxes - path: /environment/skybox - - title: Characters - path: /characters/ - section: - - title: Overview - path: /characters/ - - title: Appearance - path: /characters/appearance - - title: Adaptive Animation - path: /characters/adaptive-animation - - title: Emotes - path: /characters/emotes - - title: Moods - path: /art/characters/facial-animation/moods - - title: Pathfinding - path: /characters/pathfinding - - title: Name and health display - path: /characters/name-health-display - - title: R6 to R15 adapter - path: /characters/r6-to-r15-adapter - - title: Players - path: /players/ - section: - - title: Overview - path: /players/ - - title: Teleporting - path: /projects/teleport - - title: Teams - path: /players/teams - - title: In-experience tools - path: /players/tools - - title: Leaderboards - path: /players/leaderboards - - title: Loading screens - path: /players/loading-screens - - title: Player UI - section: - - title: Avatar Editor - path: /players/avatar-editor - - title: Avatar Inspect Menu - path: /players/avatar-inspect-menu - - title: Avatar Context Menu - path: /players/avatar-context-menu - - title: Disable default UI - path: /players/disable-ui - - title: Input - path: /input/ - section: - - title: Overview - path: /input/ - - title: Input Action System - path: /input/input-action-system - - title: Mouse & keyboard - path: /input/mouse-and-keyboard - - title: Mobile - path: /input/mobile - - title: Gamepad - path: /input/gamepad - - title: Audio - path: /audio/ - section: - - title: Overview - path: /audio/ - - title: Assets - path: /audio/assets - - title: Objects - path: /audio/objects - - title: Effects - path: /audio/effects - - title: Legacy - section: - - title: Sound - path: /sound/index - - title: Objects - path: /sound/objects - - title: Groups - path: /sound/groups - - title: Dynamic effects - path: /sound/dynamic-effects - - title: User interface - path: /ui/ - section: - - title: Overview - path: /ui/ - - title: On-screen UI - path: /ui/on-screen-containers - - title: In-experience UI - path: /ui/in-experience-containers - - title: UI objects - section: - - title: Labels - path: /ui/labels - - title: Buttons - path: /ui/buttons - - title: Frames - path: /ui/frames - - title: Scrolling frames - path: /ui/scrolling-frames - - title: Viewport frames - path: /ui/viewport-frames - - title: Video frames - path: /ui/video-frames - - title: Text input fields - path: /ui/text-input - - title: 2D paths - path: /ui/2D-paths - - title: Proximity prompts - path: /ui/proximity-prompts - - title: UI drag detectors - path: /ui/ui-drag-detectors - - title: 3D drag detectors - path: /ui/3D-drag-detectors - - title: Position and size - path: /ui/position-and-size - - title: Layout structures - section: - - title: List and flex layouts - path: /ui/list-flex-layouts - - title: Grids and tables - path: /ui/grid-table-layouts - - title: Page layouts - path: /ui/page-layouts - - title: Appearance modifiers - path: /ui/appearance-modifiers - - title: Size modifiers and constraints - path: /ui/size-modifiers - - title: UI animation/tweens - path: /ui/animation - - title: UI styling - section: - - title: Overview - path: /ui/styling/ - - title: Style Editor - path: /ui/styling/editor - - title: Compatibility - path: /ui/styling/compatibility - - title: CSS comparisons - path: /ui/styling/css-comparisons - - title: 9-slice design - path: /ui/9-slice - - title: Rich text markup - path: /ui/rich-text - - title: Text filtering - path: /ui/text-filtering - - title: Animation - path: /animation/ - section: - - title: Overview - path: /animation/ - - title: Create animations - section: - - title: Animation Editor - path: /animation/editor - - title: Animation events - path: /animation/events - - title: Animation capture - path: /animation/capture - - title: Curve editor - path: /animation/curve-editor - - title: Inverse kinematics - path: /animation/inverse-kinematics - - title: Use animations - path: /animation/using - - title: Chat - section: - - title: Voice chat - path: /chat/voice-chat - - title: Text chat - path: /chat/in-experience-text-chat - section: - - title: Overview - path: /chat/in-experience-text-chat - - title: Guidelines - path: /chat/guidelines - - title: Chat window - path: /chat/chat-window - - title: Bubble chat - path: /chat/bubble-chat - - title: Examples - path: /chat/examples/simple-custom-frontend-ui - section: - #- title: Custom System Messages - # path: /chat/examples/custom-system-messages - - title: Chat tags - path: /chat/examples/group-chat-tags - - title: Proximity chat - path: /chat/examples/proximity-chat - - title: Custom UI - path: /chat/examples/simple-custom-frontend-ui - - title: Custom chat commands - path: /chat/examples/custom-text-chat-commands - - title: Rate-limited text inputs - path: /chat/examples/rate-limit-public-text-inputs - - title: Matchmaking - path: /matchmaking/ - section: - - title: Overview - path: /matchmaking/ - - title: Server scoring - path: /matchmaking/scoring - - title: Attributes and signals - path: /matchmaking/attributes-and-signals - - title: Customize your matchmaking configuration - path: /matchmaking/customize-matchmaking - - title: Analytics - path: /matchmaking/analytics - - title: Glossary - path: /matchmaking/glossary - - - title: Performance optimization - path: /performance-optimization/ - section: - - title: Overview - path: /performance-optimization/ - - title: Design for performance - path: /performance-optimization/design - - title: Identify issues - path: /performance-optimization/identify - - title: MicroProfiler - path: /performance-optimization/microprofiler/ - section: - - title: Overview - path: /performance-optimization/microprofiler/ - - title: Modes - path: /performance-optimization/microprofiler/modes - - title: Task scheduler - path: /performance-optimization/microprofiler/task-scheduler - - title: Tag reference - path: /performance-optimization/microprofiler/tag-table - - title: Network usage - path: /performance-optimization/microprofiler/network - - title: Walkthrough - path: /performance-optimization/microprofiler/use-microprofiler - - title: Improve performance - path: /performance-optimization/improve - - title: Monitor performance - path: /performance-optimization/monitor - - title: Cloud services - path: /cloud-services/data-stores-vs-memory-stores - section: - - title: Choose between cloud services - path: /cloud-services/data-stores-vs-memory-stores - - title: Data stores - path: /cloud-services/data-stores/ - section: - - title: Overview - path: /cloud-services/data-stores/ - - title: Data Stores Manager - path: /cloud-services/data-stores/data-stores-manager - - title: Versioning, listing, and caching - path: /cloud-services/data-stores/versioning-listing-and-caching - - title: Error codes and limits - path: /cloud-services/data-stores/error-codes-and-limits - - title: Observability - path: /cloud-services/data-stores/observability - - title: Best practices - path: /cloud-services/data-stores/best-practices - - title: Implement player data and purchase systems - path: /cloud-services/data-stores/player-data-purchasing - - title: Memory stores - path: /cloud-services/memory-stores/ - section: - - title: Overview - path: /cloud-services/memory-stores/ - - title: Sorted map - path: /cloud-services/memory-stores/sorted-map - - title: Queue - path: /cloud-services/memory-stores/queue - - title: Hash map - path: /cloud-services/memory-stores/hash-map - - title: Observability - path: /cloud-services/memory-stores/observability - - title: Per-partition limits - path: /cloud-services/memory-stores/per-partition-limits - - title: Best practices - path: /cloud-services/memory-stores/best-practices - - title: Secrets stores - path: /cloud-services/secrets - - title: In-experience HTTP requests - path: /cloud-services/http-service - - title: Extended Services - path: /cloud-services/extended-services - - title: Cross-server communication - path: /cloud-services/cross-server-messaging - - title: Roblox for Unity developers - path: /unity - - title: Roblox for Unreal developers - path: /unreal - - - include: /scale.yaml - - include: /monetize.yaml diff --git a/.cursor/rules/roblox/common/navigation/engine/reference.yaml b/.cursor/rules/roblox/common/navigation/engine/reference.yaml deleted file mode 100644 index a24dce76..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/reference.yaml +++ /dev/null @@ -1,6233 +0,0 @@ -# Don't edit this navigation file. It's auto-generated and automatically syncs with -# engine reference YAML files in content/en-us/reference/engine/. - -navigation: - - heading: Engine API - - title: Overview - path: /reference/engine - source: /reference/engine/overview.md - - title: Classes - path: /reference/engine/classes - source: /reference/engine/classes.md - section: - - title: Object - path: /reference/engine/classes/Object - type: engineapi - source: /reference/engine/classes/Object.yaml - ignoreTranslation: true - section: - - title: Capture - path: /reference/engine/classes/Capture - type: engineapi - source: /reference/engine/classes/Capture.yaml - ignoreTranslation: true - section: - - title: ScreenshotCapture - path: /reference/engine/classes/ScreenshotCapture - type: engineapi - source: /reference/engine/classes/ScreenshotCapture.yaml - ignoreTranslation: true - - title: VideoCapture - path: /reference/engine/classes/VideoCapture - type: engineapi - source: /reference/engine/classes/VideoCapture.yaml - ignoreTranslation: true - - title: ConfigSnapshot - path: /reference/engine/classes/ConfigSnapshot - type: engineapi - source: /reference/engine/classes/ConfigSnapshot.yaml - ignoreTranslation: true - - title: EditableImage - path: /reference/engine/classes/EditableImage - type: engineapi - source: /reference/engine/classes/EditableImage.yaml - ignoreTranslation: true - - title: EditableMesh - path: /reference/engine/classes/EditableMesh - type: engineapi - source: /reference/engine/classes/EditableMesh.yaml - ignoreTranslation: true - - title: Instance - path: /reference/engine/classes/Instance - type: engineapi - source: /reference/engine/classes/Instance.yaml - ignoreTranslation: true - section: - - title: AccessoryDescription - path: /reference/engine/classes/AccessoryDescription - type: engineapi - source: /reference/engine/classes/AccessoryDescription.yaml - ignoreTranslation: true - - title: Accoutrement - path: /reference/engine/classes/Accoutrement - type: engineapi - source: /reference/engine/classes/Accoutrement.yaml - ignoreTranslation: true - section: - - title: Accessory - path: /reference/engine/classes/Accessory - type: engineapi - source: /reference/engine/classes/Accessory.yaml - ignoreTranslation: true - - title: Hat - path: /reference/engine/classes/Hat - type: engineapi - source: /reference/engine/classes/Hat.yaml - ignoreTranslation: true - - title: AdPortal - path: /reference/engine/classes/AdPortal - type: engineapi - source: /reference/engine/classes/AdPortal.yaml - ignoreTranslation: true - - title: AdService - path: /reference/engine/classes/AdService - type: engineapi - source: /reference/engine/classes/AdService.yaml - ignoreTranslation: true - - title: AdvancedDragger - path: /reference/engine/classes/AdvancedDragger - type: engineapi - source: /reference/engine/classes/AdvancedDragger.yaml - ignoreTranslation: true - - title: AnalyticsService - path: /reference/engine/classes/AnalyticsService - type: engineapi - source: /reference/engine/classes/AnalyticsService.yaml - ignoreTranslation: true - - title: Animation - path: /reference/engine/classes/Animation - type: engineapi - source: /reference/engine/classes/Animation.yaml - ignoreTranslation: true - - title: AnimationClip - path: /reference/engine/classes/AnimationClip - type: engineapi - source: /reference/engine/classes/AnimationClip.yaml - ignoreTranslation: true - section: - - title: CurveAnimation - path: /reference/engine/classes/CurveAnimation - type: engineapi - source: /reference/engine/classes/CurveAnimation.yaml - ignoreTranslation: true - - title: KeyframeSequence - path: /reference/engine/classes/KeyframeSequence - type: engineapi - source: /reference/engine/classes/KeyframeSequence.yaml - ignoreTranslation: true - - title: AnimationClipProvider - path: /reference/engine/classes/AnimationClipProvider - type: engineapi - source: /reference/engine/classes/AnimationClipProvider.yaml - ignoreTranslation: true - - title: AnimationController - path: /reference/engine/classes/AnimationController - type: engineapi - source: /reference/engine/classes/AnimationController.yaml - ignoreTranslation: true - - title: AnimationFromVideoCreatorService - path: /reference/engine/classes/AnimationFromVideoCreatorService - type: engineapi - source: /reference/engine/classes/AnimationFromVideoCreatorService.yaml - ignoreTranslation: true - - title: AnimationNodeDefinition - path: /reference/engine/classes/AnimationNodeDefinition - type: engineapi - source: /reference/engine/classes/AnimationNodeDefinition.yaml - ignoreTranslation: true - - title: AnimationRigData - path: /reference/engine/classes/AnimationRigData - type: engineapi - source: /reference/engine/classes/AnimationRigData.yaml - ignoreTranslation: true - - title: AnimationTrack - path: /reference/engine/classes/AnimationTrack - type: engineapi - source: /reference/engine/classes/AnimationTrack.yaml - ignoreTranslation: true - - title: Animator - path: /reference/engine/classes/Animator - type: engineapi - source: /reference/engine/classes/Animator.yaml - ignoreTranslation: true - - title: Annotation - path: /reference/engine/classes/Annotation - type: engineapi - source: /reference/engine/classes/Annotation.yaml - ignoreTranslation: true - section: - - title: WorkspaceAnnotation - path: /reference/engine/classes/WorkspaceAnnotation - type: engineapi - source: /reference/engine/classes/WorkspaceAnnotation.yaml - ignoreTranslation: true - - title: AssetDeliveryProxy - path: /reference/engine/classes/AssetDeliveryProxy - type: engineapi - source: /reference/engine/classes/AssetDeliveryProxy.yaml - ignoreTranslation: true - - title: AssetPatchSettings - path: /reference/engine/classes/AssetPatchSettings - type: engineapi - source: /reference/engine/classes/AssetPatchSettings.yaml - ignoreTranslation: true - - title: AssetService - path: /reference/engine/classes/AssetService - type: engineapi - source: /reference/engine/classes/AssetService.yaml - ignoreTranslation: true - - title: Atmosphere - path: /reference/engine/classes/Atmosphere - type: engineapi - source: /reference/engine/classes/Atmosphere.yaml - ignoreTranslation: true - - title: Attachment - path: /reference/engine/classes/Attachment - type: engineapi - source: /reference/engine/classes/Attachment.yaml - ignoreTranslation: true - section: - - title: Bone - path: /reference/engine/classes/Bone - type: engineapi - source: /reference/engine/classes/Bone.yaml - ignoreTranslation: true - - title: AudioAnalyzer - path: /reference/engine/classes/AudioAnalyzer - type: engineapi - source: /reference/engine/classes/AudioAnalyzer.yaml - ignoreTranslation: true - - title: AudioChannelMixer - path: /reference/engine/classes/AudioChannelMixer - type: engineapi - source: /reference/engine/classes/AudioChannelMixer.yaml - ignoreTranslation: true - - title: AudioChannelSplitter - path: /reference/engine/classes/AudioChannelSplitter - type: engineapi - source: /reference/engine/classes/AudioChannelSplitter.yaml - ignoreTranslation: true - - title: AudioChorus - path: /reference/engine/classes/AudioChorus - type: engineapi - source: /reference/engine/classes/AudioChorus.yaml - ignoreTranslation: true - - title: AudioCompressor - path: /reference/engine/classes/AudioCompressor - type: engineapi - source: /reference/engine/classes/AudioCompressor.yaml - ignoreTranslation: true - - title: AudioDeviceInput - path: /reference/engine/classes/AudioDeviceInput - type: engineapi - source: /reference/engine/classes/AudioDeviceInput.yaml - ignoreTranslation: true - - title: AudioDeviceOutput - path: /reference/engine/classes/AudioDeviceOutput - type: engineapi - source: /reference/engine/classes/AudioDeviceOutput.yaml - ignoreTranslation: true - - title: AudioDistortion - path: /reference/engine/classes/AudioDistortion - type: engineapi - source: /reference/engine/classes/AudioDistortion.yaml - ignoreTranslation: true - - title: AudioEcho - path: /reference/engine/classes/AudioEcho - type: engineapi - source: /reference/engine/classes/AudioEcho.yaml - ignoreTranslation: true - - title: AudioEmitter - path: /reference/engine/classes/AudioEmitter - type: engineapi - source: /reference/engine/classes/AudioEmitter.yaml - ignoreTranslation: true - - title: AudioEqualizer - path: /reference/engine/classes/AudioEqualizer - type: engineapi - source: /reference/engine/classes/AudioEqualizer.yaml - ignoreTranslation: true - - title: AudioFader - path: /reference/engine/classes/AudioFader - type: engineapi - source: /reference/engine/classes/AudioFader.yaml - ignoreTranslation: true - - title: AudioFilter - path: /reference/engine/classes/AudioFilter - type: engineapi - source: /reference/engine/classes/AudioFilter.yaml - ignoreTranslation: true - - title: AudioFlanger - path: /reference/engine/classes/AudioFlanger - type: engineapi - source: /reference/engine/classes/AudioFlanger.yaml - ignoreTranslation: true - - title: AudioGate - path: /reference/engine/classes/AudioGate - type: engineapi - source: /reference/engine/classes/AudioGate.yaml - ignoreTranslation: true - - title: AudioLimiter - path: /reference/engine/classes/AudioLimiter - type: engineapi - source: /reference/engine/classes/AudioLimiter.yaml - ignoreTranslation: true - - title: AudioListener - path: /reference/engine/classes/AudioListener - type: engineapi - source: /reference/engine/classes/AudioListener.yaml - ignoreTranslation: true - - title: AudioPitchShifter - path: /reference/engine/classes/AudioPitchShifter - type: engineapi - source: /reference/engine/classes/AudioPitchShifter.yaml - ignoreTranslation: true - - title: AudioPlayer - path: /reference/engine/classes/AudioPlayer - type: engineapi - source: /reference/engine/classes/AudioPlayer.yaml - ignoreTranslation: true - - title: AudioRecorder - path: /reference/engine/classes/AudioRecorder - type: engineapi - source: /reference/engine/classes/AudioRecorder.yaml - ignoreTranslation: true - - title: AudioReverb - path: /reference/engine/classes/AudioReverb - type: engineapi - source: /reference/engine/classes/AudioReverb.yaml - ignoreTranslation: true - - title: AudioSearchParams - path: /reference/engine/classes/AudioSearchParams - type: engineapi - source: /reference/engine/classes/AudioSearchParams.yaml - ignoreTranslation: true - - title: AudioSpeechToText - path: /reference/engine/classes/AudioSpeechToText - type: engineapi - source: /reference/engine/classes/AudioSpeechToText.yaml - ignoreTranslation: true - - title: AudioTextToSpeech - path: /reference/engine/classes/AudioTextToSpeech - type: engineapi - source: /reference/engine/classes/AudioTextToSpeech.yaml - ignoreTranslation: true - - title: AudioTremolo - path: /reference/engine/classes/AudioTremolo - type: engineapi - source: /reference/engine/classes/AudioTremolo.yaml - ignoreTranslation: true - - title: AvatarCreationService - path: /reference/engine/classes/AvatarCreationService - type: engineapi - source: /reference/engine/classes/AvatarCreationService.yaml - ignoreTranslation: true - - title: AvatarEditorService - path: /reference/engine/classes/AvatarEditorService - type: engineapi - source: /reference/engine/classes/AvatarEditorService.yaml - ignoreTranslation: true - - title: Backpack - path: /reference/engine/classes/Backpack - type: engineapi - source: /reference/engine/classes/Backpack.yaml - ignoreTranslation: true - - title: BadgeService - path: /reference/engine/classes/BadgeService - type: engineapi - source: /reference/engine/classes/BadgeService.yaml - ignoreTranslation: true - - title: BaseCoreGuiConfiguration - path: /reference/engine/classes/BaseCoreGuiConfiguration - type: engineapi - source: /reference/engine/classes/BaseCoreGuiConfiguration.yaml - ignoreTranslation: true - section: - - title: CapturesViewConfiguration - path: /reference/engine/classes/CapturesViewConfiguration - type: engineapi - source: /reference/engine/classes/CapturesViewConfiguration.yaml - ignoreTranslation: true - - title: PlayerListConfiguration - path: /reference/engine/classes/PlayerListConfiguration - type: engineapi - source: /reference/engine/classes/PlayerListConfiguration.yaml - ignoreTranslation: true - - title: SelfViewConfiguration - path: /reference/engine/classes/SelfViewConfiguration - type: engineapi - source: /reference/engine/classes/SelfViewConfiguration.yaml - ignoreTranslation: true - - title: BasePlayerGui - path: /reference/engine/classes/BasePlayerGui - type: engineapi - source: /reference/engine/classes/BasePlayerGui.yaml - ignoreTranslation: true - section: - - title: CoreGui - path: /reference/engine/classes/CoreGui - type: engineapi - source: /reference/engine/classes/CoreGui.yaml - ignoreTranslation: true - - title: PlayerGui - path: /reference/engine/classes/PlayerGui - type: engineapi - source: /reference/engine/classes/PlayerGui.yaml - ignoreTranslation: true - - title: StarterGui - path: /reference/engine/classes/StarterGui - type: engineapi - source: /reference/engine/classes/StarterGui.yaml - ignoreTranslation: true - - title: BaseRemoteEvent - path: /reference/engine/classes/BaseRemoteEvent - type: engineapi - source: /reference/engine/classes/BaseRemoteEvent.yaml - ignoreTranslation: true - section: - - title: RemoteEvent - path: /reference/engine/classes/RemoteEvent - type: engineapi - source: /reference/engine/classes/RemoteEvent.yaml - ignoreTranslation: true - - title: UnreliableRemoteEvent - path: /reference/engine/classes/UnreliableRemoteEvent - type: engineapi - source: /reference/engine/classes/UnreliableRemoteEvent.yaml - ignoreTranslation: true - - title: BaseWrap - path: /reference/engine/classes/BaseWrap - type: engineapi - source: /reference/engine/classes/BaseWrap.yaml - ignoreTranslation: true - section: - - title: WrapDeformer - path: /reference/engine/classes/WrapDeformer - type: engineapi - source: /reference/engine/classes/WrapDeformer.yaml - ignoreTranslation: true - - title: WrapLayer - path: /reference/engine/classes/WrapLayer - type: engineapi - source: /reference/engine/classes/WrapLayer.yaml - ignoreTranslation: true - - title: WrapTarget - path: /reference/engine/classes/WrapTarget - type: engineapi - source: /reference/engine/classes/WrapTarget.yaml - ignoreTranslation: true - - title: Beam - path: /reference/engine/classes/Beam - type: engineapi - source: /reference/engine/classes/Beam.yaml - ignoreTranslation: true - - title: BindableEvent - path: /reference/engine/classes/BindableEvent - type: engineapi - source: /reference/engine/classes/BindableEvent.yaml - ignoreTranslation: true - - title: BindableFunction - path: /reference/engine/classes/BindableFunction - type: engineapi - source: /reference/engine/classes/BindableFunction.yaml - ignoreTranslation: true - - title: BodyMover - path: /reference/engine/classes/BodyMover - type: engineapi - source: /reference/engine/classes/BodyMover.yaml - ignoreTranslation: true - section: - - title: BodyAngularVelocity - path: /reference/engine/classes/BodyAngularVelocity - type: engineapi - source: /reference/engine/classes/BodyAngularVelocity.yaml - ignoreTranslation: true - - title: BodyForce - path: /reference/engine/classes/BodyForce - type: engineapi - source: /reference/engine/classes/BodyForce.yaml - ignoreTranslation: true - - title: BodyGyro - path: /reference/engine/classes/BodyGyro - type: engineapi - source: /reference/engine/classes/BodyGyro.yaml - ignoreTranslation: true - - title: BodyPosition - path: /reference/engine/classes/BodyPosition - type: engineapi - source: /reference/engine/classes/BodyPosition.yaml - ignoreTranslation: true - - title: BodyThrust - path: /reference/engine/classes/BodyThrust - type: engineapi - source: /reference/engine/classes/BodyThrust.yaml - ignoreTranslation: true - - title: BodyVelocity - path: /reference/engine/classes/BodyVelocity - type: engineapi - source: /reference/engine/classes/BodyVelocity.yaml - ignoreTranslation: true - - title: RocketPropulsion - path: /reference/engine/classes/RocketPropulsion - type: engineapi - source: /reference/engine/classes/RocketPropulsion.yaml - ignoreTranslation: true - - title: BodyPartDescription - path: /reference/engine/classes/BodyPartDescription - type: engineapi - source: /reference/engine/classes/BodyPartDescription.yaml - ignoreTranslation: true - - title: BrowserService - path: /reference/engine/classes/BrowserService - type: engineapi - source: /reference/engine/classes/BrowserService.yaml - ignoreTranslation: true - - title: CacheableContentProvider - path: /reference/engine/classes/CacheableContentProvider - type: engineapi - source: /reference/engine/classes/CacheableContentProvider.yaml - ignoreTranslation: true - section: - - title: HSRDataContentProvider - path: /reference/engine/classes/HSRDataContentProvider - type: engineapi - source: /reference/engine/classes/HSRDataContentProvider.yaml - ignoreTranslation: true - - title: MeshContentProvider - path: /reference/engine/classes/MeshContentProvider - type: engineapi - source: /reference/engine/classes/MeshContentProvider.yaml - ignoreTranslation: true - - title: SlimContentProvider - path: /reference/engine/classes/SlimContentProvider - type: engineapi - source: /reference/engine/classes/SlimContentProvider.yaml - ignoreTranslation: true - - title: SolidModelContentProvider - path: /reference/engine/classes/SolidModelContentProvider - type: engineapi - source: /reference/engine/classes/SolidModelContentProvider.yaml - ignoreTranslation: true - - title: CaptureService - path: /reference/engine/classes/CaptureService - type: engineapi - source: /reference/engine/classes/CaptureService.yaml - ignoreTranslation: true - - title: ChangeHistoryService - path: /reference/engine/classes/ChangeHistoryService - type: engineapi - source: /reference/engine/classes/ChangeHistoryService.yaml - ignoreTranslation: true - - title: CharacterAppearance - path: /reference/engine/classes/CharacterAppearance - type: engineapi - source: /reference/engine/classes/CharacterAppearance.yaml - ignoreTranslation: true - section: - - title: BodyColors - path: /reference/engine/classes/BodyColors - type: engineapi - source: /reference/engine/classes/BodyColors.yaml - ignoreTranslation: true - - title: CharacterMesh - path: /reference/engine/classes/CharacterMesh - type: engineapi - source: /reference/engine/classes/CharacterMesh.yaml - ignoreTranslation: true - - title: Clothing - path: /reference/engine/classes/Clothing - type: engineapi - source: /reference/engine/classes/Clothing.yaml - ignoreTranslation: true - section: - - title: Pants - path: /reference/engine/classes/Pants - type: engineapi - source: /reference/engine/classes/Pants.yaml - ignoreTranslation: true - - title: Shirt - path: /reference/engine/classes/Shirt - type: engineapi - source: /reference/engine/classes/Shirt.yaml - ignoreTranslation: true - - title: ShirtGraphic - path: /reference/engine/classes/ShirtGraphic - type: engineapi - source: /reference/engine/classes/ShirtGraphic.yaml - ignoreTranslation: true - - title: Skin - path: /reference/engine/classes/Skin - type: engineapi - source: /reference/engine/classes/Skin.yaml - ignoreTranslation: true - - title: Chat - path: /reference/engine/classes/Chat - type: engineapi - source: /reference/engine/classes/Chat.yaml - ignoreTranslation: true - - title: ClickDetector - path: /reference/engine/classes/ClickDetector - type: engineapi - source: /reference/engine/classes/ClickDetector.yaml - ignoreTranslation: true - section: - - title: DragDetector - path: /reference/engine/classes/DragDetector - type: engineapi - source: /reference/engine/classes/DragDetector.yaml - ignoreTranslation: true - - title: Clouds - path: /reference/engine/classes/Clouds - type: engineapi - source: /reference/engine/classes/Clouds.yaml - ignoreTranslation: true - - title: ClusterPacketCache - path: /reference/engine/classes/ClusterPacketCache - type: engineapi - source: /reference/engine/classes/ClusterPacketCache.yaml - ignoreTranslation: true - - title: CollectionService - path: /reference/engine/classes/CollectionService - type: engineapi - source: /reference/engine/classes/CollectionService.yaml - ignoreTranslation: true - - title: CommerceService - path: /reference/engine/classes/CommerceService - type: engineapi - source: /reference/engine/classes/CommerceService.yaml - ignoreTranslation: true - - title: CompositeValueCurve - path: /reference/engine/classes/CompositeValueCurve - type: engineapi - source: /reference/engine/classes/CompositeValueCurve.yaml - ignoreTranslation: true - - title: ConfigService - path: /reference/engine/classes/ConfigService - type: engineapi - source: /reference/engine/classes/ConfigService.yaml - ignoreTranslation: true - - title: Configuration - path: /reference/engine/classes/Configuration - type: engineapi - source: /reference/engine/classes/Configuration.yaml - ignoreTranslation: true - - title: ConfigureServerService - path: /reference/engine/classes/ConfigureServerService - type: engineapi - source: /reference/engine/classes/ConfigureServerService.yaml - ignoreTranslation: true - - title: Constraint - path: /reference/engine/classes/Constraint - type: engineapi - source: /reference/engine/classes/Constraint.yaml - ignoreTranslation: true - section: - - title: AlignOrientation - path: /reference/engine/classes/AlignOrientation - type: engineapi - source: /reference/engine/classes/AlignOrientation.yaml - ignoreTranslation: true - - title: AlignPosition - path: /reference/engine/classes/AlignPosition - type: engineapi - source: /reference/engine/classes/AlignPosition.yaml - ignoreTranslation: true - - title: AngularVelocity - path: /reference/engine/classes/AngularVelocity - type: engineapi - source: /reference/engine/classes/AngularVelocity.yaml - ignoreTranslation: true - - title: AnimationConstraint - path: /reference/engine/classes/AnimationConstraint - type: engineapi - source: /reference/engine/classes/AnimationConstraint.yaml - ignoreTranslation: true - - title: BallSocketConstraint - path: /reference/engine/classes/BallSocketConstraint - type: engineapi - source: /reference/engine/classes/BallSocketConstraint.yaml - ignoreTranslation: true - - title: HingeConstraint - path: /reference/engine/classes/HingeConstraint - type: engineapi - source: /reference/engine/classes/HingeConstraint.yaml - ignoreTranslation: true - - title: LineForce - path: /reference/engine/classes/LineForce - type: engineapi - source: /reference/engine/classes/LineForce.yaml - ignoreTranslation: true - - title: LinearVelocity - path: /reference/engine/classes/LinearVelocity - type: engineapi - source: /reference/engine/classes/LinearVelocity.yaml - ignoreTranslation: true - - title: PlaneConstraint - path: /reference/engine/classes/PlaneConstraint - type: engineapi - source: /reference/engine/classes/PlaneConstraint.yaml - ignoreTranslation: true - section: - - title: Plane - path: /reference/engine/classes/Plane - type: engineapi - source: /reference/engine/classes/Plane.yaml - ignoreTranslation: true - - title: RigidConstraint - path: /reference/engine/classes/RigidConstraint - type: engineapi - source: /reference/engine/classes/RigidConstraint.yaml - ignoreTranslation: true - - title: RodConstraint - path: /reference/engine/classes/RodConstraint - type: engineapi - source: /reference/engine/classes/RodConstraint.yaml - ignoreTranslation: true - - title: RopeConstraint - path: /reference/engine/classes/RopeConstraint - type: engineapi - source: /reference/engine/classes/RopeConstraint.yaml - ignoreTranslation: true - - title: SlidingBallConstraint - path: /reference/engine/classes/SlidingBallConstraint - type: engineapi - source: /reference/engine/classes/SlidingBallConstraint.yaml - ignoreTranslation: true - section: - - title: CylindricalConstraint - path: /reference/engine/classes/CylindricalConstraint - type: engineapi - source: /reference/engine/classes/CylindricalConstraint.yaml - ignoreTranslation: true - - title: PrismaticConstraint - path: /reference/engine/classes/PrismaticConstraint - type: engineapi - source: /reference/engine/classes/PrismaticConstraint.yaml - ignoreTranslation: true - - title: SpringConstraint - path: /reference/engine/classes/SpringConstraint - type: engineapi - source: /reference/engine/classes/SpringConstraint.yaml - ignoreTranslation: true - - title: Torque - path: /reference/engine/classes/Torque - type: engineapi - source: /reference/engine/classes/Torque.yaml - ignoreTranslation: true - - title: TorsionSpringConstraint - path: /reference/engine/classes/TorsionSpringConstraint - type: engineapi - source: /reference/engine/classes/TorsionSpringConstraint.yaml - ignoreTranslation: true - - title: UniversalConstraint - path: /reference/engine/classes/UniversalConstraint - type: engineapi - source: /reference/engine/classes/UniversalConstraint.yaml - ignoreTranslation: true - - title: VectorForce - path: /reference/engine/classes/VectorForce - type: engineapi - source: /reference/engine/classes/VectorForce.yaml - ignoreTranslation: true - - title: ContentProvider - path: /reference/engine/classes/ContentProvider - type: engineapi - source: /reference/engine/classes/ContentProvider.yaml - ignoreTranslation: true - - title: ContextActionService - path: /reference/engine/classes/ContextActionService - type: engineapi - source: /reference/engine/classes/ContextActionService.yaml - ignoreTranslation: true - - title: Controller - path: /reference/engine/classes/Controller - type: engineapi - source: /reference/engine/classes/Controller.yaml - ignoreTranslation: true - section: - - title: HumanoidController - path: /reference/engine/classes/HumanoidController - type: engineapi - source: /reference/engine/classes/HumanoidController.yaml - ignoreTranslation: true - - title: SkateboardController - path: /reference/engine/classes/SkateboardController - type: engineapi - source: /reference/engine/classes/SkateboardController.yaml - ignoreTranslation: true - - title: VehicleController - path: /reference/engine/classes/VehicleController - type: engineapi - source: /reference/engine/classes/VehicleController.yaml - ignoreTranslation: true - - title: ControllerBase - path: /reference/engine/classes/ControllerBase - type: engineapi - source: /reference/engine/classes/ControllerBase.yaml - ignoreTranslation: true - section: - - title: AirController - path: /reference/engine/classes/AirController - type: engineapi - source: /reference/engine/classes/AirController.yaml - ignoreTranslation: true - - title: ClimbController - path: /reference/engine/classes/ClimbController - type: engineapi - source: /reference/engine/classes/ClimbController.yaml - ignoreTranslation: true - - title: GroundController - path: /reference/engine/classes/GroundController - type: engineapi - source: /reference/engine/classes/GroundController.yaml - ignoreTranslation: true - - title: SwimController - path: /reference/engine/classes/SwimController - type: engineapi - source: /reference/engine/classes/SwimController.yaml - ignoreTranslation: true - - title: ControllerManager - path: /reference/engine/classes/ControllerManager - type: engineapi - source: /reference/engine/classes/ControllerManager.yaml - ignoreTranslation: true - - title: ControllerService - path: /reference/engine/classes/ControllerService - type: engineapi - source: /reference/engine/classes/ControllerService.yaml - ignoreTranslation: true - - title: CookiesService - path: /reference/engine/classes/CookiesService - type: engineapi - source: /reference/engine/classes/CookiesService.yaml - ignoreTranslation: true - - title: CoreGuiConfiguration - path: /reference/engine/classes/CoreGuiConfiguration - type: engineapi - source: /reference/engine/classes/CoreGuiConfiguration.yaml - ignoreTranslation: true - - title: CoreScriptDebuggingManagerHelper - path: /reference/engine/classes/CoreScriptDebuggingManagerHelper - type: engineapi - source: /reference/engine/classes/CoreScriptDebuggingManagerHelper.yaml - ignoreTranslation: true - - title: CreatorStoreService - path: /reference/engine/classes/CreatorStoreService - type: engineapi - source: /reference/engine/classes/CreatorStoreService.yaml - ignoreTranslation: true - - title: CustomEvent - path: /reference/engine/classes/CustomEvent - type: engineapi - source: /reference/engine/classes/CustomEvent.yaml - ignoreTranslation: true - - title: CustomEventReceiver - path: /reference/engine/classes/CustomEventReceiver - type: engineapi - source: /reference/engine/classes/CustomEventReceiver.yaml - ignoreTranslation: true - - title: CustomLog - path: /reference/engine/classes/CustomLog - type: engineapi - source: /reference/engine/classes/CustomLog.yaml - ignoreTranslation: true - - title: DataModelMesh - path: /reference/engine/classes/DataModelMesh - type: engineapi - source: /reference/engine/classes/DataModelMesh.yaml - ignoreTranslation: true - section: - - title: BevelMesh - path: /reference/engine/classes/BevelMesh - type: engineapi - source: /reference/engine/classes/BevelMesh.yaml - ignoreTranslation: true - section: - - title: BlockMesh - path: /reference/engine/classes/BlockMesh - type: engineapi - source: /reference/engine/classes/BlockMesh.yaml - ignoreTranslation: true - - title: CylinderMesh - path: /reference/engine/classes/CylinderMesh - type: engineapi - source: /reference/engine/classes/CylinderMesh.yaml - ignoreTranslation: true - - title: FileMesh - path: /reference/engine/classes/FileMesh - type: engineapi - source: /reference/engine/classes/FileMesh.yaml - ignoreTranslation: true - section: - - title: SpecialMesh - path: /reference/engine/classes/SpecialMesh - type: engineapi - source: /reference/engine/classes/SpecialMesh.yaml - ignoreTranslation: true - - title: DataModelSession - path: /reference/engine/classes/DataModelSession - type: engineapi - source: /reference/engine/classes/DataModelSession.yaml - ignoreTranslation: true - - title: DataStoreGetOptions - path: /reference/engine/classes/DataStoreGetOptions - type: engineapi - source: /reference/engine/classes/DataStoreGetOptions.yaml - ignoreTranslation: true - - title: DataStoreIncrementOptions - path: /reference/engine/classes/DataStoreIncrementOptions - type: engineapi - source: /reference/engine/classes/DataStoreIncrementOptions.yaml - ignoreTranslation: true - - title: DataStoreInfo - path: /reference/engine/classes/DataStoreInfo - type: engineapi - source: /reference/engine/classes/DataStoreInfo.yaml - ignoreTranslation: true - - title: DataStoreKey - path: /reference/engine/classes/DataStoreKey - type: engineapi - source: /reference/engine/classes/DataStoreKey.yaml - ignoreTranslation: true - - title: DataStoreKeyInfo - path: /reference/engine/classes/DataStoreKeyInfo - type: engineapi - source: /reference/engine/classes/DataStoreKeyInfo.yaml - ignoreTranslation: true - - title: DataStoreObjectVersionInfo - path: /reference/engine/classes/DataStoreObjectVersionInfo - type: engineapi - source: /reference/engine/classes/DataStoreObjectVersionInfo.yaml - ignoreTranslation: true - - title: DataStoreOptions - path: /reference/engine/classes/DataStoreOptions - type: engineapi - source: /reference/engine/classes/DataStoreOptions.yaml - ignoreTranslation: true - - title: DataStoreService - path: /reference/engine/classes/DataStoreService - type: engineapi - source: /reference/engine/classes/DataStoreService.yaml - ignoreTranslation: true - - title: DataStoreSetOptions - path: /reference/engine/classes/DataStoreSetOptions - type: engineapi - source: /reference/engine/classes/DataStoreSetOptions.yaml - ignoreTranslation: true - - title: Debris - path: /reference/engine/classes/Debris - type: engineapi - source: /reference/engine/classes/Debris.yaml - ignoreTranslation: true - - title: DebugSettings - path: /reference/engine/classes/DebugSettings - type: engineapi - source: /reference/engine/classes/DebugSettings.yaml - ignoreTranslation: true - - title: Dialog - path: /reference/engine/classes/Dialog - type: engineapi - source: /reference/engine/classes/Dialog.yaml - ignoreTranslation: true - - title: DialogChoice - path: /reference/engine/classes/DialogChoice - type: engineapi - source: /reference/engine/classes/DialogChoice.yaml - ignoreTranslation: true - - title: DraftsService - path: /reference/engine/classes/DraftsService - type: engineapi - source: /reference/engine/classes/DraftsService.yaml - ignoreTranslation: true - - title: Dragger - path: /reference/engine/classes/Dragger - type: engineapi - source: /reference/engine/classes/Dragger.yaml - ignoreTranslation: true - - title: DraggerService - path: /reference/engine/classes/DraggerService - type: engineapi - source: /reference/engine/classes/DraggerService.yaml - ignoreTranslation: true - - title: EncodingService - path: /reference/engine/classes/EncodingService - type: engineapi - source: /reference/engine/classes/EncodingService.yaml - ignoreTranslation: true - - title: EulerRotationCurve - path: /reference/engine/classes/EulerRotationCurve - type: engineapi - source: /reference/engine/classes/EulerRotationCurve.yaml - ignoreTranslation: true - - title: ExperienceInviteOptions - path: /reference/engine/classes/ExperienceInviteOptions - type: engineapi - source: /reference/engine/classes/ExperienceInviteOptions.yaml - ignoreTranslation: true - - title: ExperienceNotificationService - path: /reference/engine/classes/ExperienceNotificationService - type: engineapi - source: /reference/engine/classes/ExperienceNotificationService.yaml - ignoreTranslation: true - - title: Explosion - path: /reference/engine/classes/Explosion - type: engineapi - source: /reference/engine/classes/Explosion.yaml - ignoreTranslation: true - - title: FaceControls - path: /reference/engine/classes/FaceControls - type: engineapi - source: /reference/engine/classes/FaceControls.yaml - ignoreTranslation: true - - title: FaceInstance - path: /reference/engine/classes/FaceInstance - type: engineapi - source: /reference/engine/classes/FaceInstance.yaml - ignoreTranslation: true - section: - - title: Decal - path: /reference/engine/classes/Decal - type: engineapi - source: /reference/engine/classes/Decal.yaml - ignoreTranslation: true - section: - - title: Texture - path: /reference/engine/classes/Texture - type: engineapi - source: /reference/engine/classes/Texture.yaml - ignoreTranslation: true - - title: Feature - path: /reference/engine/classes/Feature - type: engineapi - source: /reference/engine/classes/Feature.yaml - ignoreTranslation: true - section: - - title: Hole - path: /reference/engine/classes/Hole - type: engineapi - source: /reference/engine/classes/Hole.yaml - ignoreTranslation: true - - title: MotorFeature - path: /reference/engine/classes/MotorFeature - type: engineapi - source: /reference/engine/classes/MotorFeature.yaml - ignoreTranslation: true - - title: FeatureRestrictionManager - path: /reference/engine/classes/FeatureRestrictionManager - type: engineapi - source: /reference/engine/classes/FeatureRestrictionManager.yaml - ignoreTranslation: true - - title: File - path: /reference/engine/classes/File - type: engineapi - source: /reference/engine/classes/File.yaml - ignoreTranslation: true - - title: Fire - path: /reference/engine/classes/Fire - type: engineapi - source: /reference/engine/classes/Fire.yaml - ignoreTranslation: true - - title: FlagStandService - path: /reference/engine/classes/FlagStandService - type: engineapi - source: /reference/engine/classes/FlagStandService.yaml - ignoreTranslation: true - - title: FloatCurve - path: /reference/engine/classes/FloatCurve - type: engineapi - source: /reference/engine/classes/FloatCurve.yaml - ignoreTranslation: true - - title: Folder - path: /reference/engine/classes/Folder - type: engineapi - source: /reference/engine/classes/Folder.yaml - ignoreTranslation: true - - title: ForceField - path: /reference/engine/classes/ForceField - type: engineapi - source: /reference/engine/classes/ForceField.yaml - ignoreTranslation: true - - title: FriendService - path: /reference/engine/classes/FriendService - type: engineapi - source: /reference/engine/classes/FriendService.yaml - ignoreTranslation: true - - title: FunctionalTest - path: /reference/engine/classes/FunctionalTest - type: engineapi - source: /reference/engine/classes/FunctionalTest.yaml - ignoreTranslation: true - - title: GamePassService - path: /reference/engine/classes/GamePassService - type: engineapi - source: /reference/engine/classes/GamePassService.yaml - ignoreTranslation: true - - title: GameSettings - path: /reference/engine/classes/GameSettings - type: engineapi - source: /reference/engine/classes/GameSettings.yaml - ignoreTranslation: true - - title: GamepadService - path: /reference/engine/classes/GamepadService - type: engineapi - source: /reference/engine/classes/GamepadService.yaml - ignoreTranslation: true - - title: GenerationService - path: /reference/engine/classes/GenerationService - type: engineapi - source: /reference/engine/classes/GenerationService.yaml - ignoreTranslation: true - - title: GenericChallengeService - path: /reference/engine/classes/GenericChallengeService - type: engineapi - source: /reference/engine/classes/GenericChallengeService.yaml - ignoreTranslation: true - - title: Geometry - path: /reference/engine/classes/Geometry - type: engineapi - source: /reference/engine/classes/Geometry.yaml - ignoreTranslation: true - - title: GeometryService - path: /reference/engine/classes/GeometryService - type: engineapi - source: /reference/engine/classes/GeometryService.yaml - ignoreTranslation: true - - title: GetTextBoundsParams - path: /reference/engine/classes/GetTextBoundsParams - type: engineapi - source: /reference/engine/classes/GetTextBoundsParams.yaml - ignoreTranslation: true - - title: GlobalDataStore - path: /reference/engine/classes/GlobalDataStore - type: engineapi - source: /reference/engine/classes/GlobalDataStore.yaml - ignoreTranslation: true - section: - - title: DataStore - path: /reference/engine/classes/DataStore - type: engineapi - source: /reference/engine/classes/DataStore.yaml - ignoreTranslation: true - - title: OrderedDataStore - path: /reference/engine/classes/OrderedDataStore - type: engineapi - source: /reference/engine/classes/OrderedDataStore.yaml - ignoreTranslation: true - - title: GroupService - path: /reference/engine/classes/GroupService - type: engineapi - source: /reference/engine/classes/GroupService.yaml - ignoreTranslation: true - - title: GuiBase - path: /reference/engine/classes/GuiBase - type: engineapi - source: /reference/engine/classes/GuiBase.yaml - ignoreTranslation: true - section: - - title: GuiBase2d - path: /reference/engine/classes/GuiBase2d - type: engineapi - source: /reference/engine/classes/GuiBase2d.yaml - ignoreTranslation: true - section: - - title: GuiObject - path: /reference/engine/classes/GuiObject - type: engineapi - source: /reference/engine/classes/GuiObject.yaml - ignoreTranslation: true - section: - - title: CanvasGroup - path: /reference/engine/classes/CanvasGroup - type: engineapi - source: /reference/engine/classes/CanvasGroup.yaml - ignoreTranslation: true - - title: Frame - path: /reference/engine/classes/Frame - type: engineapi - source: /reference/engine/classes/Frame.yaml - ignoreTranslation: true - - title: GuiButton - path: /reference/engine/classes/GuiButton - type: engineapi - source: /reference/engine/classes/GuiButton.yaml - ignoreTranslation: true - section: - - title: ImageButton - path: /reference/engine/classes/ImageButton - type: engineapi - source: /reference/engine/classes/ImageButton.yaml - ignoreTranslation: true - - title: TextButton - path: /reference/engine/classes/TextButton - type: engineapi - source: /reference/engine/classes/TextButton.yaml - ignoreTranslation: true - - title: GuiLabel - path: /reference/engine/classes/GuiLabel - type: engineapi - source: /reference/engine/classes/GuiLabel.yaml - ignoreTranslation: true - section: - - title: ImageLabel - path: /reference/engine/classes/ImageLabel - type: engineapi - source: /reference/engine/classes/ImageLabel.yaml - ignoreTranslation: true - - title: TextLabel - path: /reference/engine/classes/TextLabel - type: engineapi - source: /reference/engine/classes/TextLabel.yaml - ignoreTranslation: true - - title: ScrollingFrame - path: /reference/engine/classes/ScrollingFrame - type: engineapi - source: /reference/engine/classes/ScrollingFrame.yaml - ignoreTranslation: true - - title: TextBox - path: /reference/engine/classes/TextBox - type: engineapi - source: /reference/engine/classes/TextBox.yaml - ignoreTranslation: true - - title: VideoDisplay - path: /reference/engine/classes/VideoDisplay - type: engineapi - source: /reference/engine/classes/VideoDisplay.yaml - ignoreTranslation: true - - title: VideoFrame - path: /reference/engine/classes/VideoFrame - type: engineapi - source: /reference/engine/classes/VideoFrame.yaml - ignoreTranslation: true - - title: ViewportFrame - path: /reference/engine/classes/ViewportFrame - type: engineapi - source: /reference/engine/classes/ViewportFrame.yaml - ignoreTranslation: true - - title: LayerCollector - path: /reference/engine/classes/LayerCollector - type: engineapi - source: /reference/engine/classes/LayerCollector.yaml - ignoreTranslation: true - section: - - title: BillboardGui - path: /reference/engine/classes/BillboardGui - type: engineapi - source: /reference/engine/classes/BillboardGui.yaml - ignoreTranslation: true - - title: PluginGui - path: /reference/engine/classes/PluginGui - type: engineapi - source: /reference/engine/classes/PluginGui.yaml - ignoreTranslation: true - section: - - title: DockWidgetPluginGui - path: /reference/engine/classes/DockWidgetPluginGui - type: engineapi - source: /reference/engine/classes/DockWidgetPluginGui.yaml - ignoreTranslation: true - - title: QWidgetPluginGui - path: /reference/engine/classes/QWidgetPluginGui - type: engineapi - source: /reference/engine/classes/QWidgetPluginGui.yaml - ignoreTranslation: true - - title: ScreenGui - path: /reference/engine/classes/ScreenGui - type: engineapi - source: /reference/engine/classes/ScreenGui.yaml - ignoreTranslation: true - section: - - title: GuiMain - path: /reference/engine/classes/GuiMain - type: engineapi - source: /reference/engine/classes/GuiMain.yaml - ignoreTranslation: true - - title: SurfaceGuiBase - path: /reference/engine/classes/SurfaceGuiBase - type: engineapi - source: /reference/engine/classes/SurfaceGuiBase.yaml - ignoreTranslation: true - section: - - title: AdGui - path: /reference/engine/classes/AdGui - type: engineapi - source: /reference/engine/classes/AdGui.yaml - ignoreTranslation: true - - title: SurfaceGui - path: /reference/engine/classes/SurfaceGui - type: engineapi - source: /reference/engine/classes/SurfaceGui.yaml - ignoreTranslation: true - - title: GuiBase3d - path: /reference/engine/classes/GuiBase3d - type: engineapi - source: /reference/engine/classes/GuiBase3d.yaml - ignoreTranslation: true - section: - - title: FloorWire - path: /reference/engine/classes/FloorWire - type: engineapi - source: /reference/engine/classes/FloorWire.yaml - ignoreTranslation: true - - title: InstanceAdornment - path: /reference/engine/classes/InstanceAdornment - type: engineapi - source: /reference/engine/classes/InstanceAdornment.yaml - ignoreTranslation: true - section: - - title: SelectionBox - path: /reference/engine/classes/SelectionBox - type: engineapi - source: /reference/engine/classes/SelectionBox.yaml - ignoreTranslation: true - - title: PVAdornment - path: /reference/engine/classes/PVAdornment - type: engineapi - source: /reference/engine/classes/PVAdornment.yaml - ignoreTranslation: true - section: - - title: HandleAdornment - path: /reference/engine/classes/HandleAdornment - type: engineapi - source: /reference/engine/classes/HandleAdornment.yaml - ignoreTranslation: true - section: - - title: BoxHandleAdornment - path: /reference/engine/classes/BoxHandleAdornment - type: engineapi - source: /reference/engine/classes/BoxHandleAdornment.yaml - ignoreTranslation: true - - title: ConeHandleAdornment - path: /reference/engine/classes/ConeHandleAdornment - type: engineapi - source: /reference/engine/classes/ConeHandleAdornment.yaml - ignoreTranslation: true - - title: CylinderHandleAdornment - path: /reference/engine/classes/CylinderHandleAdornment - type: engineapi - source: /reference/engine/classes/CylinderHandleAdornment.yaml - ignoreTranslation: true - - title: ImageHandleAdornment - path: /reference/engine/classes/ImageHandleAdornment - type: engineapi - source: /reference/engine/classes/ImageHandleAdornment.yaml - ignoreTranslation: true - - title: LineHandleAdornment - path: /reference/engine/classes/LineHandleAdornment - type: engineapi - source: /reference/engine/classes/LineHandleAdornment.yaml - ignoreTranslation: true - - title: PyramidHandleAdornment - path: /reference/engine/classes/PyramidHandleAdornment - type: engineapi - source: /reference/engine/classes/PyramidHandleAdornment.yaml - ignoreTranslation: true - - title: SphereHandleAdornment - path: /reference/engine/classes/SphereHandleAdornment - type: engineapi - source: /reference/engine/classes/SphereHandleAdornment.yaml - ignoreTranslation: true - - title: WireframeHandleAdornment - path: /reference/engine/classes/WireframeHandleAdornment - type: engineapi - source: /reference/engine/classes/WireframeHandleAdornment.yaml - ignoreTranslation: true - - title: SelectionSphere - path: /reference/engine/classes/SelectionSphere - type: engineapi - source: /reference/engine/classes/SelectionSphere.yaml - ignoreTranslation: true - - title: PartAdornment - path: /reference/engine/classes/PartAdornment - type: engineapi - source: /reference/engine/classes/PartAdornment.yaml - ignoreTranslation: true - section: - - title: HandlesBase - path: /reference/engine/classes/HandlesBase - type: engineapi - source: /reference/engine/classes/HandlesBase.yaml - ignoreTranslation: true - section: - - title: ArcHandles - path: /reference/engine/classes/ArcHandles - type: engineapi - source: /reference/engine/classes/ArcHandles.yaml - ignoreTranslation: true - - title: Handles - path: /reference/engine/classes/Handles - type: engineapi - source: /reference/engine/classes/Handles.yaml - ignoreTranslation: true - - title: SurfaceSelection - path: /reference/engine/classes/SurfaceSelection - type: engineapi - source: /reference/engine/classes/SurfaceSelection.yaml - ignoreTranslation: true - - title: SelectionLasso - path: /reference/engine/classes/SelectionLasso - type: engineapi - source: /reference/engine/classes/SelectionLasso.yaml - ignoreTranslation: true - section: - - title: SelectionPartLasso - path: /reference/engine/classes/SelectionPartLasso - type: engineapi - source: /reference/engine/classes/SelectionPartLasso.yaml - ignoreTranslation: true - - title: SelectionPointLasso - path: /reference/engine/classes/SelectionPointLasso - type: engineapi - source: /reference/engine/classes/SelectionPointLasso.yaml - ignoreTranslation: true - - title: Path2D - path: /reference/engine/classes/Path2D - type: engineapi - source: /reference/engine/classes/Path2D.yaml - ignoreTranslation: true - - title: GuiService - path: /reference/engine/classes/GuiService - type: engineapi - source: /reference/engine/classes/GuiService.yaml - ignoreTranslation: true - - title: GuidRegistryService - path: /reference/engine/classes/GuidRegistryService - type: engineapi - source: /reference/engine/classes/GuidRegistryService.yaml - ignoreTranslation: true - - title: HapticEffect - path: /reference/engine/classes/HapticEffect - type: engineapi - source: /reference/engine/classes/HapticEffect.yaml - ignoreTranslation: true - - title: HapticService - path: /reference/engine/classes/HapticService - type: engineapi - source: /reference/engine/classes/HapticService.yaml - ignoreTranslation: true - - title: HeapProfilerService - path: /reference/engine/classes/HeapProfilerService - type: engineapi - source: /reference/engine/classes/HeapProfilerService.yaml - ignoreTranslation: true - - title: HeightmapImporterService - path: /reference/engine/classes/HeightmapImporterService - type: engineapi - source: /reference/engine/classes/HeightmapImporterService.yaml - ignoreTranslation: true - - title: HiddenSurfaceRemovalAsset - path: /reference/engine/classes/HiddenSurfaceRemovalAsset - type: engineapi - source: /reference/engine/classes/HiddenSurfaceRemovalAsset.yaml - ignoreTranslation: true - - title: Highlight - path: /reference/engine/classes/Highlight - type: engineapi - source: /reference/engine/classes/Highlight.yaml - ignoreTranslation: true - - title: Hopper - path: /reference/engine/classes/Hopper - type: engineapi - source: /reference/engine/classes/Hopper.yaml - ignoreTranslation: true - - title: HttpRbxApiService - path: /reference/engine/classes/HttpRbxApiService - type: engineapi - source: /reference/engine/classes/HttpRbxApiService.yaml - ignoreTranslation: true - - title: HttpService - path: /reference/engine/classes/HttpService - type: engineapi - source: /reference/engine/classes/HttpService.yaml - ignoreTranslation: true - - title: Humanoid - path: /reference/engine/classes/Humanoid - type: engineapi - source: /reference/engine/classes/Humanoid.yaml - ignoreTranslation: true - - title: HumanoidDescription - path: /reference/engine/classes/HumanoidDescription - type: engineapi - source: /reference/engine/classes/HumanoidDescription.yaml - ignoreTranslation: true - - title: HumanoidRigDescription - path: /reference/engine/classes/HumanoidRigDescription - type: engineapi - source: /reference/engine/classes/HumanoidRigDescription.yaml - ignoreTranslation: true - - title: IKControl - path: /reference/engine/classes/IKControl - type: engineapi - source: /reference/engine/classes/IKControl.yaml - ignoreTranslation: true - - title: ILegacyStudioBridge - path: /reference/engine/classes/ILegacyStudioBridge - type: engineapi - source: /reference/engine/classes/ILegacyStudioBridge.yaml - ignoreTranslation: true - - title: IncrementalPatchBuilder - path: /reference/engine/classes/IncrementalPatchBuilder - type: engineapi - source: /reference/engine/classes/IncrementalPatchBuilder.yaml - ignoreTranslation: true - - title: InputAction - path: /reference/engine/classes/InputAction - type: engineapi - source: /reference/engine/classes/InputAction.yaml - ignoreTranslation: true - - title: InputBinding - path: /reference/engine/classes/InputBinding - type: engineapi - source: /reference/engine/classes/InputBinding.yaml - ignoreTranslation: true - - title: InputContext - path: /reference/engine/classes/InputContext - type: engineapi - source: /reference/engine/classes/InputContext.yaml - ignoreTranslation: true - - title: InputObject - path: /reference/engine/classes/InputObject - type: engineapi - source: /reference/engine/classes/InputObject.yaml - ignoreTranslation: true - - title: InsertService - path: /reference/engine/classes/InsertService - type: engineapi - source: /reference/engine/classes/InsertService.yaml - ignoreTranslation: true - - title: InstanceFileSyncService - path: /reference/engine/classes/InstanceFileSyncService - type: engineapi - source: /reference/engine/classes/InstanceFileSyncService.yaml - ignoreTranslation: true - - title: JointInstance - path: /reference/engine/classes/JointInstance - type: engineapi - source: /reference/engine/classes/JointInstance.yaml - ignoreTranslation: true - section: - - title: DynamicRotate - path: /reference/engine/classes/DynamicRotate - type: engineapi - source: /reference/engine/classes/DynamicRotate.yaml - ignoreTranslation: true - section: - - title: RotateP - path: /reference/engine/classes/RotateP - type: engineapi - source: /reference/engine/classes/RotateP.yaml - ignoreTranslation: true - - title: RotateV - path: /reference/engine/classes/RotateV - type: engineapi - source: /reference/engine/classes/RotateV.yaml - ignoreTranslation: true - - title: Glue - path: /reference/engine/classes/Glue - type: engineapi - source: /reference/engine/classes/Glue.yaml - ignoreTranslation: true - - title: ManualSurfaceJointInstance - path: /reference/engine/classes/ManualSurfaceJointInstance - type: engineapi - source: /reference/engine/classes/ManualSurfaceJointInstance.yaml - ignoreTranslation: true - section: - - title: ManualGlue - path: /reference/engine/classes/ManualGlue - type: engineapi - source: /reference/engine/classes/ManualGlue.yaml - ignoreTranslation: true - - title: ManualWeld - path: /reference/engine/classes/ManualWeld - type: engineapi - source: /reference/engine/classes/ManualWeld.yaml - ignoreTranslation: true - - title: Motor - path: /reference/engine/classes/Motor - type: engineapi - source: /reference/engine/classes/Motor.yaml - ignoreTranslation: true - section: - - title: Motor6D - path: /reference/engine/classes/Motor6D - type: engineapi - source: /reference/engine/classes/Motor6D.yaml - ignoreTranslation: true - - title: Rotate - path: /reference/engine/classes/Rotate - type: engineapi - source: /reference/engine/classes/Rotate.yaml - ignoreTranslation: true - - title: Snap - path: /reference/engine/classes/Snap - type: engineapi - source: /reference/engine/classes/Snap.yaml - ignoreTranslation: true - - title: VelocityMotor - path: /reference/engine/classes/VelocityMotor - type: engineapi - source: /reference/engine/classes/VelocityMotor.yaml - ignoreTranslation: true - - title: Weld - path: /reference/engine/classes/Weld - type: engineapi - source: /reference/engine/classes/Weld.yaml - ignoreTranslation: true - - title: JointsService - path: /reference/engine/classes/JointsService - type: engineapi - source: /reference/engine/classes/JointsService.yaml - ignoreTranslation: true - - title: KeyboardService - path: /reference/engine/classes/KeyboardService - type: engineapi - source: /reference/engine/classes/KeyboardService.yaml - ignoreTranslation: true - - title: Keyframe - path: /reference/engine/classes/Keyframe - type: engineapi - source: /reference/engine/classes/Keyframe.yaml - ignoreTranslation: true - - title: KeyframeMarker - path: /reference/engine/classes/KeyframeMarker - type: engineapi - source: /reference/engine/classes/KeyframeMarker.yaml - ignoreTranslation: true - - title: KeyframeSequenceProvider - path: /reference/engine/classes/KeyframeSequenceProvider - type: engineapi - source: /reference/engine/classes/KeyframeSequenceProvider.yaml - ignoreTranslation: true - - title: Light - path: /reference/engine/classes/Light - type: engineapi - source: /reference/engine/classes/Light.yaml - ignoreTranslation: true - section: - - title: PointLight - path: /reference/engine/classes/PointLight - type: engineapi - source: /reference/engine/classes/PointLight.yaml - ignoreTranslation: true - - title: SpotLight - path: /reference/engine/classes/SpotLight - type: engineapi - source: /reference/engine/classes/SpotLight.yaml - ignoreTranslation: true - - title: SurfaceLight - path: /reference/engine/classes/SurfaceLight - type: engineapi - source: /reference/engine/classes/SurfaceLight.yaml - ignoreTranslation: true - - title: Lighting - path: /reference/engine/classes/Lighting - type: engineapi - source: /reference/engine/classes/Lighting.yaml - ignoreTranslation: true - - title: LocalizationService - path: /reference/engine/classes/LocalizationService - type: engineapi - source: /reference/engine/classes/LocalizationService.yaml - ignoreTranslation: true - - title: LocalizationTable - path: /reference/engine/classes/LocalizationTable - type: engineapi - source: /reference/engine/classes/LocalizationTable.yaml - ignoreTranslation: true - - title: LogService - path: /reference/engine/classes/LogService - type: engineapi - source: /reference/engine/classes/LogService.yaml - ignoreTranslation: true - - title: LoginService - path: /reference/engine/classes/LoginService - type: engineapi - source: /reference/engine/classes/LoginService.yaml - ignoreTranslation: true - - title: LuaSettings - path: /reference/engine/classes/LuaSettings - type: engineapi - source: /reference/engine/classes/LuaSettings.yaml - ignoreTranslation: true - - title: LuaSourceContainer - path: /reference/engine/classes/LuaSourceContainer - type: engineapi - source: /reference/engine/classes/LuaSourceContainer.yaml - ignoreTranslation: true - section: - - title: BaseScript - path: /reference/engine/classes/BaseScript - type: engineapi - source: /reference/engine/classes/BaseScript.yaml - ignoreTranslation: true - section: - - title: Script - path: /reference/engine/classes/Script - type: engineapi - source: /reference/engine/classes/Script.yaml - ignoreTranslation: true - section: - - title: LocalScript - path: /reference/engine/classes/LocalScript - type: engineapi - source: /reference/engine/classes/LocalScript.yaml - ignoreTranslation: true - - title: ModuleScript - path: /reference/engine/classes/ModuleScript - type: engineapi - source: /reference/engine/classes/ModuleScript.yaml - ignoreTranslation: true - - title: LuaWebService - path: /reference/engine/classes/LuaWebService - type: engineapi - source: /reference/engine/classes/LuaWebService.yaml - ignoreTranslation: true - - title: MLService - path: /reference/engine/classes/MLService - type: engineapi - source: /reference/engine/classes/MLService.yaml - ignoreTranslation: true - - title: MakeupDescription - path: /reference/engine/classes/MakeupDescription - type: engineapi - source: /reference/engine/classes/MakeupDescription.yaml - ignoreTranslation: true - - title: MarkerCurve - path: /reference/engine/classes/MarkerCurve - type: engineapi - source: /reference/engine/classes/MarkerCurve.yaml - ignoreTranslation: true - - title: MarketplaceService - path: /reference/engine/classes/MarketplaceService - type: engineapi - source: /reference/engine/classes/MarketplaceService.yaml - ignoreTranslation: true - - title: MatchmakingService - path: /reference/engine/classes/MatchmakingService - type: engineapi - source: /reference/engine/classes/MatchmakingService.yaml - ignoreTranslation: true - - title: MaterialService - path: /reference/engine/classes/MaterialService - type: engineapi - source: /reference/engine/classes/MaterialService.yaml - ignoreTranslation: true - - title: MaterialVariant - path: /reference/engine/classes/MaterialVariant - type: engineapi - source: /reference/engine/classes/MaterialVariant.yaml - ignoreTranslation: true - - title: MemStorageConnection - path: /reference/engine/classes/MemStorageConnection - type: engineapi - source: /reference/engine/classes/MemStorageConnection.yaml - ignoreTranslation: true - - title: MemStorageService - path: /reference/engine/classes/MemStorageService - type: engineapi - source: /reference/engine/classes/MemStorageService.yaml - ignoreTranslation: true - - title: MemoryStoreHashMap - path: /reference/engine/classes/MemoryStoreHashMap - type: engineapi - source: /reference/engine/classes/MemoryStoreHashMap.yaml - ignoreTranslation: true - - title: MemoryStoreQueue - path: /reference/engine/classes/MemoryStoreQueue - type: engineapi - source: /reference/engine/classes/MemoryStoreQueue.yaml - ignoreTranslation: true - - title: MemoryStoreService - path: /reference/engine/classes/MemoryStoreService - type: engineapi - source: /reference/engine/classes/MemoryStoreService.yaml - ignoreTranslation: true - - title: MemoryStoreSortedMap - path: /reference/engine/classes/MemoryStoreSortedMap - type: engineapi - source: /reference/engine/classes/MemoryStoreSortedMap.yaml - ignoreTranslation: true - - title: Message - path: /reference/engine/classes/Message - type: engineapi - source: /reference/engine/classes/Message.yaml - ignoreTranslation: true - section: - - title: Hint - path: /reference/engine/classes/Hint - type: engineapi - source: /reference/engine/classes/Hint.yaml - ignoreTranslation: true - - title: MessagingService - path: /reference/engine/classes/MessagingService - type: engineapi - source: /reference/engine/classes/MessagingService.yaml - ignoreTranslation: true - - title: MicroProfilerService - path: /reference/engine/classes/MicroProfilerService - type: engineapi - source: /reference/engine/classes/MicroProfilerService.yaml - ignoreTranslation: true - - title: ModerationService - path: /reference/engine/classes/ModerationService - type: engineapi - source: /reference/engine/classes/ModerationService.yaml - ignoreTranslation: true - - title: Mouse - path: /reference/engine/classes/Mouse - type: engineapi - source: /reference/engine/classes/Mouse.yaml - ignoreTranslation: true - section: - - title: PlayerMouse - path: /reference/engine/classes/PlayerMouse - type: engineapi - source: /reference/engine/classes/PlayerMouse.yaml - ignoreTranslation: true - - title: PluginMouse - path: /reference/engine/classes/PluginMouse - type: engineapi - source: /reference/engine/classes/PluginMouse.yaml - ignoreTranslation: true - - title: MouseService - path: /reference/engine/classes/MouseService - type: engineapi - source: /reference/engine/classes/MouseService.yaml - ignoreTranslation: true - - title: MultipleDocumentInterfaceInstance - path: /reference/engine/classes/MultipleDocumentInterfaceInstance - type: engineapi - source: /reference/engine/classes/MultipleDocumentInterfaceInstance.yaml - ignoreTranslation: true - - title: NetworkMarker - path: /reference/engine/classes/NetworkMarker - type: engineapi - source: /reference/engine/classes/NetworkMarker.yaml - ignoreTranslation: true - - title: NetworkPeer - path: /reference/engine/classes/NetworkPeer - type: engineapi - source: /reference/engine/classes/NetworkPeer.yaml - ignoreTranslation: true - section: - - title: NetworkClient - path: /reference/engine/classes/NetworkClient - type: engineapi - source: /reference/engine/classes/NetworkClient.yaml - ignoreTranslation: true - - title: NetworkServer - path: /reference/engine/classes/NetworkServer - type: engineapi - source: /reference/engine/classes/NetworkServer.yaml - ignoreTranslation: true - - title: NetworkReplicator - path: /reference/engine/classes/NetworkReplicator - type: engineapi - source: /reference/engine/classes/NetworkReplicator.yaml - ignoreTranslation: true - section: - - title: ClientReplicator - path: /reference/engine/classes/ClientReplicator - type: engineapi - source: /reference/engine/classes/ClientReplicator.yaml - ignoreTranslation: true - - title: ServerReplicator - path: /reference/engine/classes/ServerReplicator - type: engineapi - source: /reference/engine/classes/ServerReplicator.yaml - ignoreTranslation: true - - title: NetworkSettings - path: /reference/engine/classes/NetworkSettings - type: engineapi - source: /reference/engine/classes/NetworkSettings.yaml - ignoreTranslation: true - - title: NoCollisionConstraint - path: /reference/engine/classes/NoCollisionConstraint - type: engineapi - source: /reference/engine/classes/NoCollisionConstraint.yaml - ignoreTranslation: true - - title: NotificationService - path: /reference/engine/classes/NotificationService - type: engineapi - source: /reference/engine/classes/NotificationService.yaml - ignoreTranslation: true - - title: OpenCloudApiV1 - path: /reference/engine/classes/OpenCloudApiV1 - type: engineapi - source: /reference/engine/classes/OpenCloudApiV1.yaml - ignoreTranslation: true - - title: OpenCloudService - path: /reference/engine/classes/OpenCloudService - type: engineapi - source: /reference/engine/classes/OpenCloudService.yaml - ignoreTranslation: true - - title: PVInstance - path: /reference/engine/classes/PVInstance - type: engineapi - source: /reference/engine/classes/PVInstance.yaml - ignoreTranslation: true - section: - - title: BasePart - path: /reference/engine/classes/BasePart - type: engineapi - source: /reference/engine/classes/BasePart.yaml - ignoreTranslation: true - section: - - title: CornerWedgePart - path: /reference/engine/classes/CornerWedgePart - type: engineapi - source: /reference/engine/classes/CornerWedgePart.yaml - ignoreTranslation: true - - title: FormFactorPart - path: /reference/engine/classes/FormFactorPart - type: engineapi - source: /reference/engine/classes/FormFactorPart.yaml - ignoreTranslation: true - section: - - title: Part - path: /reference/engine/classes/Part - type: engineapi - source: /reference/engine/classes/Part.yaml - ignoreTranslation: true - section: - - title: FlagStand - path: /reference/engine/classes/FlagStand - type: engineapi - source: /reference/engine/classes/FlagStand.yaml - ignoreTranslation: true - - title: Platform - path: /reference/engine/classes/Platform - type: engineapi - source: /reference/engine/classes/Platform.yaml - ignoreTranslation: true - - title: Seat - path: /reference/engine/classes/Seat - type: engineapi - source: /reference/engine/classes/Seat.yaml - ignoreTranslation: true - - title: SkateboardPlatform - path: /reference/engine/classes/SkateboardPlatform - type: engineapi - source: /reference/engine/classes/SkateboardPlatform.yaml - ignoreTranslation: true - - title: SpawnLocation - path: /reference/engine/classes/SpawnLocation - type: engineapi - source: /reference/engine/classes/SpawnLocation.yaml - ignoreTranslation: true - - title: WedgePart - path: /reference/engine/classes/WedgePart - type: engineapi - source: /reference/engine/classes/WedgePart.yaml - ignoreTranslation: true - - title: Terrain - path: /reference/engine/classes/Terrain - type: engineapi - source: /reference/engine/classes/Terrain.yaml - ignoreTranslation: true - - title: TriangleMeshPart - path: /reference/engine/classes/TriangleMeshPart - type: engineapi - source: /reference/engine/classes/TriangleMeshPart.yaml - ignoreTranslation: true - section: - - title: MeshPart - path: /reference/engine/classes/MeshPart - type: engineapi - source: /reference/engine/classes/MeshPart.yaml - ignoreTranslation: true - - title: PartOperation - path: /reference/engine/classes/PartOperation - type: engineapi - source: /reference/engine/classes/PartOperation.yaml - ignoreTranslation: true - section: - - title: IntersectOperation - path: /reference/engine/classes/IntersectOperation - type: engineapi - source: /reference/engine/classes/IntersectOperation.yaml - ignoreTranslation: true - - title: NegateOperation - path: /reference/engine/classes/NegateOperation - type: engineapi - source: /reference/engine/classes/NegateOperation.yaml - ignoreTranslation: true - - title: UnionOperation - path: /reference/engine/classes/UnionOperation - type: engineapi - source: /reference/engine/classes/UnionOperation.yaml - ignoreTranslation: true - - title: TrussPart - path: /reference/engine/classes/TrussPart - type: engineapi - source: /reference/engine/classes/TrussPart.yaml - ignoreTranslation: true - - title: VehicleSeat - path: /reference/engine/classes/VehicleSeat - type: engineapi - source: /reference/engine/classes/VehicleSeat.yaml - ignoreTranslation: true - - title: Camera - path: /reference/engine/classes/Camera - type: engineapi - source: /reference/engine/classes/Camera.yaml - ignoreTranslation: true - - title: Model - path: /reference/engine/classes/Model - type: engineapi - source: /reference/engine/classes/Model.yaml - ignoreTranslation: true - section: - - title: Actor - path: /reference/engine/classes/Actor - type: engineapi - source: /reference/engine/classes/Actor.yaml - ignoreTranslation: true - - title: BackpackItem - path: /reference/engine/classes/BackpackItem - type: engineapi - source: /reference/engine/classes/BackpackItem.yaml - ignoreTranslation: true - section: - - title: HopperBin - path: /reference/engine/classes/HopperBin - type: engineapi - source: /reference/engine/classes/HopperBin.yaml - ignoreTranslation: true - - title: Tool - path: /reference/engine/classes/Tool - type: engineapi - source: /reference/engine/classes/Tool.yaml - ignoreTranslation: true - section: - - title: Flag - path: /reference/engine/classes/Flag - type: engineapi - source: /reference/engine/classes/Flag.yaml - ignoreTranslation: true - - title: Status - path: /reference/engine/classes/Status - type: engineapi - source: /reference/engine/classes/Status.yaml - ignoreTranslation: true - - title: WorldRoot - path: /reference/engine/classes/WorldRoot - type: engineapi - source: /reference/engine/classes/WorldRoot.yaml - ignoreTranslation: true - section: - - title: Workspace - path: /reference/engine/classes/Workspace - type: engineapi - source: /reference/engine/classes/Workspace.yaml - ignoreTranslation: true - - title: WorldModel - path: /reference/engine/classes/WorldModel - type: engineapi - source: /reference/engine/classes/WorldModel.yaml - ignoreTranslation: true - - title: PackageLink - path: /reference/engine/classes/PackageLink - type: engineapi - source: /reference/engine/classes/PackageLink.yaml - ignoreTranslation: true - - title: PackageService - path: /reference/engine/classes/PackageService - type: engineapi - source: /reference/engine/classes/PackageService.yaml - ignoreTranslation: true - - title: Pages - path: /reference/engine/classes/Pages - type: engineapi - source: /reference/engine/classes/Pages.yaml - ignoreTranslation: true - section: - - title: AudioPages - path: /reference/engine/classes/AudioPages - type: engineapi - source: /reference/engine/classes/AudioPages.yaml - ignoreTranslation: true - - title: BanHistoryPages - path: /reference/engine/classes/BanHistoryPages - type: engineapi - source: /reference/engine/classes/BanHistoryPages.yaml - ignoreTranslation: true - - title: CapturesPages - path: /reference/engine/classes/CapturesPages - type: engineapi - source: /reference/engine/classes/CapturesPages.yaml - ignoreTranslation: true - - title: CatalogPages - path: /reference/engine/classes/CatalogPages - type: engineapi - source: /reference/engine/classes/CatalogPages.yaml - ignoreTranslation: true - - title: DataStoreKeyPages - path: /reference/engine/classes/DataStoreKeyPages - type: engineapi - source: /reference/engine/classes/DataStoreKeyPages.yaml - ignoreTranslation: true - - title: DataStoreListingPages - path: /reference/engine/classes/DataStoreListingPages - type: engineapi - source: /reference/engine/classes/DataStoreListingPages.yaml - ignoreTranslation: true - - title: DataStorePages - path: /reference/engine/classes/DataStorePages - type: engineapi - source: /reference/engine/classes/DataStorePages.yaml - ignoreTranslation: true - - title: DataStoreVersionPages - path: /reference/engine/classes/DataStoreVersionPages - type: engineapi - source: /reference/engine/classes/DataStoreVersionPages.yaml - ignoreTranslation: true - - title: FriendPages - path: /reference/engine/classes/FriendPages - type: engineapi - source: /reference/engine/classes/FriendPages.yaml - ignoreTranslation: true - - title: InventoryPages - path: /reference/engine/classes/InventoryPages - type: engineapi - source: /reference/engine/classes/InventoryPages.yaml - ignoreTranslation: true - section: - - title: EmotesPages - path: /reference/engine/classes/EmotesPages - type: engineapi - source: /reference/engine/classes/EmotesPages.yaml - ignoreTranslation: true - - title: MemoryStoreHashMapPages - path: /reference/engine/classes/MemoryStoreHashMapPages - type: engineapi - source: /reference/engine/classes/MemoryStoreHashMapPages.yaml - ignoreTranslation: true - - title: OutfitPages - path: /reference/engine/classes/OutfitPages - type: engineapi - source: /reference/engine/classes/OutfitPages.yaml - ignoreTranslation: true - - title: RecommendationPages - path: /reference/engine/classes/RecommendationPages - type: engineapi - source: /reference/engine/classes/RecommendationPages.yaml - ignoreTranslation: true - - title: StandardPages - path: /reference/engine/classes/StandardPages - type: engineapi - source: /reference/engine/classes/StandardPages.yaml - ignoreTranslation: true - - title: PartOperationAsset - path: /reference/engine/classes/PartOperationAsset - type: engineapi - source: /reference/engine/classes/PartOperationAsset.yaml - ignoreTranslation: true - - title: ParticleEmitter - path: /reference/engine/classes/ParticleEmitter - type: engineapi - source: /reference/engine/classes/ParticleEmitter.yaml - ignoreTranslation: true - - title: PatchBundlerFileWatch - path: /reference/engine/classes/PatchBundlerFileWatch - type: engineapi - source: /reference/engine/classes/PatchBundlerFileWatch.yaml - ignoreTranslation: true - - title: PatchMapping - path: /reference/engine/classes/PatchMapping - type: engineapi - source: /reference/engine/classes/PatchMapping.yaml - ignoreTranslation: true - - title: Path - path: /reference/engine/classes/Path - type: engineapi - source: /reference/engine/classes/Path.yaml - ignoreTranslation: true - - title: PathfindingLink - path: /reference/engine/classes/PathfindingLink - type: engineapi - source: /reference/engine/classes/PathfindingLink.yaml - ignoreTranslation: true - - title: PathfindingModifier - path: /reference/engine/classes/PathfindingModifier - type: engineapi - source: /reference/engine/classes/PathfindingModifier.yaml - ignoreTranslation: true - - title: PathfindingService - path: /reference/engine/classes/PathfindingService - type: engineapi - source: /reference/engine/classes/PathfindingService.yaml - ignoreTranslation: true - - title: PermissionsService - path: /reference/engine/classes/PermissionsService - type: engineapi - source: /reference/engine/classes/PermissionsService.yaml - ignoreTranslation: true - - title: PhysicsService - path: /reference/engine/classes/PhysicsService - type: engineapi - source: /reference/engine/classes/PhysicsService.yaml - ignoreTranslation: true - - title: PhysicsSettings - path: /reference/engine/classes/PhysicsSettings - type: engineapi - source: /reference/engine/classes/PhysicsSettings.yaml - ignoreTranslation: true - - title: PlacesService - path: /reference/engine/classes/PlacesService - type: engineapi - source: /reference/engine/classes/PlacesService.yaml - ignoreTranslation: true - - title: Player - path: /reference/engine/classes/Player - type: engineapi - source: /reference/engine/classes/Player.yaml - ignoreTranslation: true - - title: PlayerScripts - path: /reference/engine/classes/PlayerScripts - type: engineapi - source: /reference/engine/classes/PlayerScripts.yaml - ignoreTranslation: true - - title: PlayerViewService - path: /reference/engine/classes/PlayerViewService - type: engineapi - source: /reference/engine/classes/PlayerViewService.yaml - ignoreTranslation: true - - title: Players - path: /reference/engine/classes/Players - type: engineapi - source: /reference/engine/classes/Players.yaml - ignoreTranslation: true - - title: Plugin - path: /reference/engine/classes/Plugin - type: engineapi - source: /reference/engine/classes/Plugin.yaml - ignoreTranslation: true - - title: PluginAction - path: /reference/engine/classes/PluginAction - type: engineapi - source: /reference/engine/classes/PluginAction.yaml - ignoreTranslation: true - - title: PluginCapabilities - path: /reference/engine/classes/PluginCapabilities - type: engineapi - source: /reference/engine/classes/PluginCapabilities.yaml - ignoreTranslation: true - - title: PluginDebugService - path: /reference/engine/classes/PluginDebugService - type: engineapi - source: /reference/engine/classes/PluginDebugService.yaml - ignoreTranslation: true - - title: PluginDragEvent - path: /reference/engine/classes/PluginDragEvent - type: engineapi - source: /reference/engine/classes/PluginDragEvent.yaml - ignoreTranslation: true - - title: PluginGuiService - path: /reference/engine/classes/PluginGuiService - type: engineapi - source: /reference/engine/classes/PluginGuiService.yaml - ignoreTranslation: true - - title: PluginManagementService - path: /reference/engine/classes/PluginManagementService - type: engineapi - source: /reference/engine/classes/PluginManagementService.yaml - ignoreTranslation: true - - title: PluginManager - path: /reference/engine/classes/PluginManager - type: engineapi - source: /reference/engine/classes/PluginManager.yaml - ignoreTranslation: true - - title: PluginManagerInterface - path: /reference/engine/classes/PluginManagerInterface - type: engineapi - source: /reference/engine/classes/PluginManagerInterface.yaml - ignoreTranslation: true - - title: PluginMenu - path: /reference/engine/classes/PluginMenu - type: engineapi - source: /reference/engine/classes/PluginMenu.yaml - ignoreTranslation: true - - title: PluginToolbar - path: /reference/engine/classes/PluginToolbar - type: engineapi - source: /reference/engine/classes/PluginToolbar.yaml - ignoreTranslation: true - - title: PluginToolbarButton - path: /reference/engine/classes/PluginToolbarButton - type: engineapi - source: /reference/engine/classes/PluginToolbarButton.yaml - ignoreTranslation: true - - title: PointsService - path: /reference/engine/classes/PointsService - type: engineapi - source: /reference/engine/classes/PointsService.yaml - ignoreTranslation: true - - title: PolicyService - path: /reference/engine/classes/PolicyService - type: engineapi - source: /reference/engine/classes/PolicyService.yaml - ignoreTranslation: true - - title: PoseBase - path: /reference/engine/classes/PoseBase - type: engineapi - source: /reference/engine/classes/PoseBase.yaml - ignoreTranslation: true - section: - - title: NumberPose - path: /reference/engine/classes/NumberPose - type: engineapi - source: /reference/engine/classes/NumberPose.yaml - ignoreTranslation: true - - title: Pose - path: /reference/engine/classes/Pose - type: engineapi - source: /reference/engine/classes/Pose.yaml - ignoreTranslation: true - - title: PostEffect - path: /reference/engine/classes/PostEffect - type: engineapi - source: /reference/engine/classes/PostEffect.yaml - ignoreTranslation: true - section: - - title: BloomEffect - path: /reference/engine/classes/BloomEffect - type: engineapi - source: /reference/engine/classes/BloomEffect.yaml - ignoreTranslation: true - - title: BlurEffect - path: /reference/engine/classes/BlurEffect - type: engineapi - source: /reference/engine/classes/BlurEffect.yaml - ignoreTranslation: true - - title: ColorCorrectionEffect - path: /reference/engine/classes/ColorCorrectionEffect - type: engineapi - source: /reference/engine/classes/ColorCorrectionEffect.yaml - ignoreTranslation: true - - title: ColorGradingEffect - path: /reference/engine/classes/ColorGradingEffect - type: engineapi - source: /reference/engine/classes/ColorGradingEffect.yaml - ignoreTranslation: true - - title: DepthOfFieldEffect - path: /reference/engine/classes/DepthOfFieldEffect - type: engineapi - source: /reference/engine/classes/DepthOfFieldEffect.yaml - ignoreTranslation: true - - title: SunRaysEffect - path: /reference/engine/classes/SunRaysEffect - type: engineapi - source: /reference/engine/classes/SunRaysEffect.yaml - ignoreTranslation: true - - title: ProcessInstancePhysicsService - path: /reference/engine/classes/ProcessInstancePhysicsService - type: engineapi - source: /reference/engine/classes/ProcessInstancePhysicsService.yaml - ignoreTranslation: true - - title: ProximityPrompt - path: /reference/engine/classes/ProximityPrompt - type: engineapi - source: /reference/engine/classes/ProximityPrompt.yaml - ignoreTranslation: true - - title: ProximityPromptService - path: /reference/engine/classes/ProximityPromptService - type: engineapi - source: /reference/engine/classes/ProximityPromptService.yaml - ignoreTranslation: true - - title: PublishService - path: /reference/engine/classes/PublishService - type: engineapi - source: /reference/engine/classes/PublishService.yaml - ignoreTranslation: true - - title: RecommendationService - path: /reference/engine/classes/RecommendationService - type: engineapi - source: /reference/engine/classes/RecommendationService.yaml - ignoreTranslation: true - - title: ReflectionMetadata - path: /reference/engine/classes/ReflectionMetadata - type: engineapi - source: /reference/engine/classes/ReflectionMetadata.yaml - ignoreTranslation: true - - title: ReflectionMetadataCallbacks - path: /reference/engine/classes/ReflectionMetadataCallbacks - type: engineapi - source: /reference/engine/classes/ReflectionMetadataCallbacks.yaml - ignoreTranslation: true - - title: ReflectionMetadataClasses - path: /reference/engine/classes/ReflectionMetadataClasses - type: engineapi - source: /reference/engine/classes/ReflectionMetadataClasses.yaml - ignoreTranslation: true - - title: ReflectionMetadataEnums - path: /reference/engine/classes/ReflectionMetadataEnums - type: engineapi - source: /reference/engine/classes/ReflectionMetadataEnums.yaml - ignoreTranslation: true - - title: ReflectionMetadataEvents - path: /reference/engine/classes/ReflectionMetadataEvents - type: engineapi - source: /reference/engine/classes/ReflectionMetadataEvents.yaml - ignoreTranslation: true - - title: ReflectionMetadataFunctions - path: /reference/engine/classes/ReflectionMetadataFunctions - type: engineapi - source: /reference/engine/classes/ReflectionMetadataFunctions.yaml - ignoreTranslation: true - - title: ReflectionMetadataItem - path: /reference/engine/classes/ReflectionMetadataItem - type: engineapi - source: /reference/engine/classes/ReflectionMetadataItem.yaml - ignoreTranslation: true - section: - - title: ReflectionMetadataClass - path: /reference/engine/classes/ReflectionMetadataClass - type: engineapi - source: /reference/engine/classes/ReflectionMetadataClass.yaml - ignoreTranslation: true - - title: ReflectionMetadataEnum - path: /reference/engine/classes/ReflectionMetadataEnum - type: engineapi - source: /reference/engine/classes/ReflectionMetadataEnum.yaml - ignoreTranslation: true - - title: ReflectionMetadataEnumItem - path: /reference/engine/classes/ReflectionMetadataEnumItem - type: engineapi - source: /reference/engine/classes/ReflectionMetadataEnumItem.yaml - ignoreTranslation: true - - title: ReflectionMetadataMember - path: /reference/engine/classes/ReflectionMetadataMember - type: engineapi - source: /reference/engine/classes/ReflectionMetadataMember.yaml - ignoreTranslation: true - - title: ReflectionMetadataProperties - path: /reference/engine/classes/ReflectionMetadataProperties - type: engineapi - source: /reference/engine/classes/ReflectionMetadataProperties.yaml - ignoreTranslation: true - - title: ReflectionMetadataYieldFunctions - path: /reference/engine/classes/ReflectionMetadataYieldFunctions - type: engineapi - source: /reference/engine/classes/ReflectionMetadataYieldFunctions.yaml - ignoreTranslation: true - - title: ReflectionService - path: /reference/engine/classes/ReflectionService - type: engineapi - source: /reference/engine/classes/ReflectionService.yaml - ignoreTranslation: true - - title: RemoteCommandService - path: /reference/engine/classes/RemoteCommandService - type: engineapi - source: /reference/engine/classes/RemoteCommandService.yaml - ignoreTranslation: true - - title: RemoteDebuggerServer - path: /reference/engine/classes/RemoteDebuggerServer - type: engineapi - source: /reference/engine/classes/RemoteDebuggerServer.yaml - ignoreTranslation: true - - title: RemoteFunction - path: /reference/engine/classes/RemoteFunction - type: engineapi - source: /reference/engine/classes/RemoteFunction.yaml - ignoreTranslation: true - - title: RenderSettings - path: /reference/engine/classes/RenderSettings - type: engineapi - source: /reference/engine/classes/RenderSettings.yaml - ignoreTranslation: true - - title: RenderingTest - path: /reference/engine/classes/RenderingTest - type: engineapi - source: /reference/engine/classes/RenderingTest.yaml - ignoreTranslation: true - - title: ReplicatedFirst - path: /reference/engine/classes/ReplicatedFirst - type: engineapi - source: /reference/engine/classes/ReplicatedFirst.yaml - ignoreTranslation: true - - title: ReplicatedStorage - path: /reference/engine/classes/ReplicatedStorage - type: engineapi - source: /reference/engine/classes/ReplicatedStorage.yaml - ignoreTranslation: true - - title: RotationCurve - path: /reference/engine/classes/RotationCurve - type: engineapi - source: /reference/engine/classes/RotationCurve.yaml - ignoreTranslation: true - - title: RunService - path: /reference/engine/classes/RunService - type: engineapi - source: /reference/engine/classes/RunService.yaml - ignoreTranslation: true - - title: ScreenshotHud - path: /reference/engine/classes/ScreenshotHud - type: engineapi - source: /reference/engine/classes/ScreenshotHud.yaml - ignoreTranslation: true - - title: ScriptBuilder - path: /reference/engine/classes/ScriptBuilder - type: engineapi - source: /reference/engine/classes/ScriptBuilder.yaml - ignoreTranslation: true - section: - - title: SyncScriptBuilder - path: /reference/engine/classes/SyncScriptBuilder - type: engineapi - source: /reference/engine/classes/SyncScriptBuilder.yaml - ignoreTranslation: true - - title: ScriptContext - path: /reference/engine/classes/ScriptContext - type: engineapi - source: /reference/engine/classes/ScriptContext.yaml - ignoreTranslation: true - - title: ScriptDocument - path: /reference/engine/classes/ScriptDocument - type: engineapi - source: /reference/engine/classes/ScriptDocument.yaml - ignoreTranslation: true - - title: ScriptEditorService - path: /reference/engine/classes/ScriptEditorService - type: engineapi - source: /reference/engine/classes/ScriptEditorService.yaml - ignoreTranslation: true - - title: ScriptProfilerService - path: /reference/engine/classes/ScriptProfilerService - type: engineapi - source: /reference/engine/classes/ScriptProfilerService.yaml - ignoreTranslation: true - - title: ScriptService - path: /reference/engine/classes/ScriptService - type: engineapi - source: /reference/engine/classes/ScriptService.yaml - ignoreTranslation: true - - title: Selection - path: /reference/engine/classes/Selection - type: engineapi - source: /reference/engine/classes/Selection.yaml - ignoreTranslation: true - - title: SelectionHighlightManager - path: /reference/engine/classes/SelectionHighlightManager - type: engineapi - source: /reference/engine/classes/SelectionHighlightManager.yaml - ignoreTranslation: true - - title: SensorBase - path: /reference/engine/classes/SensorBase - type: engineapi - source: /reference/engine/classes/SensorBase.yaml - ignoreTranslation: true - section: - - title: AtmosphereSensor - path: /reference/engine/classes/AtmosphereSensor - type: engineapi - source: /reference/engine/classes/AtmosphereSensor.yaml - ignoreTranslation: true - - title: BuoyancySensor - path: /reference/engine/classes/BuoyancySensor - type: engineapi - source: /reference/engine/classes/BuoyancySensor.yaml - ignoreTranslation: true - - title: ControllerSensor - path: /reference/engine/classes/ControllerSensor - type: engineapi - source: /reference/engine/classes/ControllerSensor.yaml - ignoreTranslation: true - section: - - title: ControllerPartSensor - path: /reference/engine/classes/ControllerPartSensor - type: engineapi - source: /reference/engine/classes/ControllerPartSensor.yaml - ignoreTranslation: true - - title: FluidForceSensor - path: /reference/engine/classes/FluidForceSensor - type: engineapi - source: /reference/engine/classes/FluidForceSensor.yaml - ignoreTranslation: true - - title: SerializationService - path: /reference/engine/classes/SerializationService - type: engineapi - source: /reference/engine/classes/SerializationService.yaml - ignoreTranslation: true - - title: ServerScriptService - path: /reference/engine/classes/ServerScriptService - type: engineapi - source: /reference/engine/classes/ServerScriptService.yaml - ignoreTranslation: true - - title: ServerStorage - path: /reference/engine/classes/ServerStorage - type: engineapi - source: /reference/engine/classes/ServerStorage.yaml - ignoreTranslation: true - - title: ServiceProvider - path: /reference/engine/classes/ServiceProvider - type: engineapi - source: /reference/engine/classes/ServiceProvider.yaml - ignoreTranslation: true - section: - - title: DataModel - path: /reference/engine/classes/DataModel - type: engineapi - source: /reference/engine/classes/DataModel.yaml - ignoreTranslation: true - - title: GenericSettings - path: /reference/engine/classes/GenericSettings - type: engineapi - source: /reference/engine/classes/GenericSettings.yaml - ignoreTranslation: true - section: - - title: GlobalSettings - path: /reference/engine/classes/GlobalSettings - type: engineapi - source: /reference/engine/classes/GlobalSettings.yaml - ignoreTranslation: true - - title: UserSettings - path: /reference/engine/classes/UserSettings - type: engineapi - source: /reference/engine/classes/UserSettings.yaml - ignoreTranslation: true - - title: ServiceVisibilityService - path: /reference/engine/classes/ServiceVisibilityService - type: engineapi - source: /reference/engine/classes/ServiceVisibilityService.yaml - ignoreTranslation: true - - title: SessionCheckService - path: /reference/engine/classes/SessionCheckService - type: engineapi - source: /reference/engine/classes/SessionCheckService.yaml - ignoreTranslation: true - - title: SharedTableRegistry - path: /reference/engine/classes/SharedTableRegistry - type: engineapi - source: /reference/engine/classes/SharedTableRegistry.yaml - ignoreTranslation: true - - title: Sky - path: /reference/engine/classes/Sky - type: engineapi - source: /reference/engine/classes/Sky.yaml - ignoreTranslation: true - - title: Smoke - path: /reference/engine/classes/Smoke - type: engineapi - source: /reference/engine/classes/Smoke.yaml - ignoreTranslation: true - - title: SmoothVoxelsUpgraderService - path: /reference/engine/classes/SmoothVoxelsUpgraderService - type: engineapi - source: /reference/engine/classes/SmoothVoxelsUpgraderService.yaml - ignoreTranslation: true - - title: SocialService - path: /reference/engine/classes/SocialService - type: engineapi - source: /reference/engine/classes/SocialService.yaml - ignoreTranslation: true - - title: Sound - path: /reference/engine/classes/Sound - type: engineapi - source: /reference/engine/classes/Sound.yaml - ignoreTranslation: true - - title: SoundEffect - path: /reference/engine/classes/SoundEffect - type: engineapi - source: /reference/engine/classes/SoundEffect.yaml - ignoreTranslation: true - section: - - title: ChorusSoundEffect - path: /reference/engine/classes/ChorusSoundEffect - type: engineapi - source: /reference/engine/classes/ChorusSoundEffect.yaml - ignoreTranslation: true - - title: CompressorSoundEffect - path: /reference/engine/classes/CompressorSoundEffect - type: engineapi - source: /reference/engine/classes/CompressorSoundEffect.yaml - ignoreTranslation: true - - title: DistortionSoundEffect - path: /reference/engine/classes/DistortionSoundEffect - type: engineapi - source: /reference/engine/classes/DistortionSoundEffect.yaml - ignoreTranslation: true - - title: EchoSoundEffect - path: /reference/engine/classes/EchoSoundEffect - type: engineapi - source: /reference/engine/classes/EchoSoundEffect.yaml - ignoreTranslation: true - - title: EqualizerSoundEffect - path: /reference/engine/classes/EqualizerSoundEffect - type: engineapi - source: /reference/engine/classes/EqualizerSoundEffect.yaml - ignoreTranslation: true - - title: FlangeSoundEffect - path: /reference/engine/classes/FlangeSoundEffect - type: engineapi - source: /reference/engine/classes/FlangeSoundEffect.yaml - ignoreTranslation: true - - title: PitchShiftSoundEffect - path: /reference/engine/classes/PitchShiftSoundEffect - type: engineapi - source: /reference/engine/classes/PitchShiftSoundEffect.yaml - ignoreTranslation: true - - title: ReverbSoundEffect - path: /reference/engine/classes/ReverbSoundEffect - type: engineapi - source: /reference/engine/classes/ReverbSoundEffect.yaml - ignoreTranslation: true - - title: TremoloSoundEffect - path: /reference/engine/classes/TremoloSoundEffect - type: engineapi - source: /reference/engine/classes/TremoloSoundEffect.yaml - ignoreTranslation: true - - title: SoundGroup - path: /reference/engine/classes/SoundGroup - type: engineapi - source: /reference/engine/classes/SoundGroup.yaml - ignoreTranslation: true - - title: SoundService - path: /reference/engine/classes/SoundService - type: engineapi - source: /reference/engine/classes/SoundService.yaml - ignoreTranslation: true - - title: Sparkles - path: /reference/engine/classes/Sparkles - type: engineapi - source: /reference/engine/classes/Sparkles.yaml - ignoreTranslation: true - - title: SpawnerService - path: /reference/engine/classes/SpawnerService - type: engineapi - source: /reference/engine/classes/SpawnerService.yaml - ignoreTranslation: true - - title: StandalonePluginScripts - path: /reference/engine/classes/StandalonePluginScripts - type: engineapi - source: /reference/engine/classes/StandalonePluginScripts.yaml - ignoreTranslation: true - - title: StarterGear - path: /reference/engine/classes/StarterGear - type: engineapi - source: /reference/engine/classes/StarterGear.yaml - ignoreTranslation: true - - title: StarterPack - path: /reference/engine/classes/StarterPack - type: engineapi - source: /reference/engine/classes/StarterPack.yaml - ignoreTranslation: true - - title: StarterPlayer - path: /reference/engine/classes/StarterPlayer - type: engineapi - source: /reference/engine/classes/StarterPlayer.yaml - ignoreTranslation: true - - title: StarterPlayerScripts - path: /reference/engine/classes/StarterPlayerScripts - type: engineapi - source: /reference/engine/classes/StarterPlayerScripts.yaml - ignoreTranslation: true - section: - - title: StarterCharacterScripts - path: /reference/engine/classes/StarterCharacterScripts - type: engineapi - source: /reference/engine/classes/StarterCharacterScripts.yaml - ignoreTranslation: true - - title: StartupMessageService - path: /reference/engine/classes/StartupMessageService - type: engineapi - source: /reference/engine/classes/StartupMessageService.yaml - ignoreTranslation: true - - title: Stats - path: /reference/engine/classes/Stats - type: engineapi - source: /reference/engine/classes/Stats.yaml - ignoreTranslation: true - - title: StatsItem - path: /reference/engine/classes/StatsItem - type: engineapi - source: /reference/engine/classes/StatsItem.yaml - ignoreTranslation: true - section: - - title: RunningAverageItemDouble - path: /reference/engine/classes/RunningAverageItemDouble - type: engineapi - source: /reference/engine/classes/RunningAverageItemDouble.yaml - ignoreTranslation: true - - title: RunningAverageItemInt - path: /reference/engine/classes/RunningAverageItemInt - type: engineapi - source: /reference/engine/classes/RunningAverageItemInt.yaml - ignoreTranslation: true - - title: RunningAverageTimeIntervalItem - path: /reference/engine/classes/RunningAverageTimeIntervalItem - type: engineapi - source: /reference/engine/classes/RunningAverageTimeIntervalItem.yaml - ignoreTranslation: true - - title: TotalCountTimeIntervalItem - path: /reference/engine/classes/TotalCountTimeIntervalItem - type: engineapi - source: /reference/engine/classes/TotalCountTimeIntervalItem.yaml - ignoreTranslation: true - - title: StopWatchReporter - path: /reference/engine/classes/StopWatchReporter - type: engineapi - source: /reference/engine/classes/StopWatchReporter.yaml - ignoreTranslation: true - - title: Studio - path: /reference/engine/classes/Studio - type: engineapi - source: /reference/engine/classes/Studio.yaml - ignoreTranslation: true - - title: StudioService - path: /reference/engine/classes/StudioService - type: engineapi - source: /reference/engine/classes/StudioService.yaml - ignoreTranslation: true - - title: StudioTestService - path: /reference/engine/classes/StudioTestService - type: engineapi - source: /reference/engine/classes/StudioTestService.yaml - ignoreTranslation: true - - title: StudioTheme - path: /reference/engine/classes/StudioTheme - type: engineapi - source: /reference/engine/classes/StudioTheme.yaml - ignoreTranslation: true - - title: StyleBase - path: /reference/engine/classes/StyleBase - type: engineapi - source: /reference/engine/classes/StyleBase.yaml - ignoreTranslation: true - section: - - title: StyleRule - path: /reference/engine/classes/StyleRule - type: engineapi - source: /reference/engine/classes/StyleRule.yaml - ignoreTranslation: true - - title: StyleSheet - path: /reference/engine/classes/StyleSheet - type: engineapi - source: /reference/engine/classes/StyleSheet.yaml - ignoreTranslation: true - - title: StyleDerive - path: /reference/engine/classes/StyleDerive - type: engineapi - source: /reference/engine/classes/StyleDerive.yaml - ignoreTranslation: true - - title: StyleLink - path: /reference/engine/classes/StyleLink - type: engineapi - source: /reference/engine/classes/StyleLink.yaml - ignoreTranslation: true - - title: SurfaceAppearance - path: /reference/engine/classes/SurfaceAppearance - type: engineapi - source: /reference/engine/classes/SurfaceAppearance.yaml - ignoreTranslation: true - - title: TaskScheduler - path: /reference/engine/classes/TaskScheduler - type: engineapi - source: /reference/engine/classes/TaskScheduler.yaml - ignoreTranslation: true - - title: Team - path: /reference/engine/classes/Team - type: engineapi - source: /reference/engine/classes/Team.yaml - ignoreTranslation: true - - title: TeamCreateData - path: /reference/engine/classes/TeamCreateData - type: engineapi - source: /reference/engine/classes/TeamCreateData.yaml - ignoreTranslation: true - - title: TeamCreateService - path: /reference/engine/classes/TeamCreateService - type: engineapi - source: /reference/engine/classes/TeamCreateService.yaml - ignoreTranslation: true - - title: Teams - path: /reference/engine/classes/Teams - type: engineapi - source: /reference/engine/classes/Teams.yaml - ignoreTranslation: true - - title: TeleportAsyncResult - path: /reference/engine/classes/TeleportAsyncResult - type: engineapi - source: /reference/engine/classes/TeleportAsyncResult.yaml - ignoreTranslation: true - - title: TeleportOptions - path: /reference/engine/classes/TeleportOptions - type: engineapi - source: /reference/engine/classes/TeleportOptions.yaml - ignoreTranslation: true - - title: TeleportService - path: /reference/engine/classes/TeleportService - type: engineapi - source: /reference/engine/classes/TeleportService.yaml - ignoreTranslation: true - - title: TerrainDetail - path: /reference/engine/classes/TerrainDetail - type: engineapi - source: /reference/engine/classes/TerrainDetail.yaml - ignoreTranslation: true - - title: TerrainRegion - path: /reference/engine/classes/TerrainRegion - type: engineapi - source: /reference/engine/classes/TerrainRegion.yaml - ignoreTranslation: true - - title: TestService - path: /reference/engine/classes/TestService - type: engineapi - source: /reference/engine/classes/TestService.yaml - ignoreTranslation: true - - title: TextBoxService - path: /reference/engine/classes/TextBoxService - type: engineapi - source: /reference/engine/classes/TextBoxService.yaml - ignoreTranslation: true - - title: TextChannel - path: /reference/engine/classes/TextChannel - type: engineapi - source: /reference/engine/classes/TextChannel.yaml - ignoreTranslation: true - - title: TextChatCommand - path: /reference/engine/classes/TextChatCommand - type: engineapi - source: /reference/engine/classes/TextChatCommand.yaml - ignoreTranslation: true - - title: TextChatConfigurations - path: /reference/engine/classes/TextChatConfigurations - type: engineapi - source: /reference/engine/classes/TextChatConfigurations.yaml - ignoreTranslation: true - section: - - title: BubbleChatConfiguration - path: /reference/engine/classes/BubbleChatConfiguration - type: engineapi - source: /reference/engine/classes/BubbleChatConfiguration.yaml - ignoreTranslation: true - - title: ChannelTabsConfiguration - path: /reference/engine/classes/ChannelTabsConfiguration - type: engineapi - source: /reference/engine/classes/ChannelTabsConfiguration.yaml - ignoreTranslation: true - - title: ChatInputBarConfiguration - path: /reference/engine/classes/ChatInputBarConfiguration - type: engineapi - source: /reference/engine/classes/ChatInputBarConfiguration.yaml - ignoreTranslation: true - - title: ChatWindowConfiguration - path: /reference/engine/classes/ChatWindowConfiguration - type: engineapi - source: /reference/engine/classes/ChatWindowConfiguration.yaml - ignoreTranslation: true - - title: TextChatMessage - path: /reference/engine/classes/TextChatMessage - type: engineapi - source: /reference/engine/classes/TextChatMessage.yaml - ignoreTranslation: true - - title: TextChatMessageProperties - path: /reference/engine/classes/TextChatMessageProperties - type: engineapi - source: /reference/engine/classes/TextChatMessageProperties.yaml - ignoreTranslation: true - section: - - title: BubbleChatMessageProperties - path: /reference/engine/classes/BubbleChatMessageProperties - type: engineapi - source: /reference/engine/classes/BubbleChatMessageProperties.yaml - ignoreTranslation: true - - title: ChatWindowMessageProperties - path: /reference/engine/classes/ChatWindowMessageProperties - type: engineapi - source: /reference/engine/classes/ChatWindowMessageProperties.yaml - ignoreTranslation: true - - title: TextChatService - path: /reference/engine/classes/TextChatService - type: engineapi - source: /reference/engine/classes/TextChatService.yaml - ignoreTranslation: true - - title: TextFilterResult - path: /reference/engine/classes/TextFilterResult - type: engineapi - source: /reference/engine/classes/TextFilterResult.yaml - ignoreTranslation: true - - title: TextFilterTranslatedResult - path: /reference/engine/classes/TextFilterTranslatedResult - type: engineapi - source: /reference/engine/classes/TextFilterTranslatedResult.yaml - ignoreTranslation: true - - title: TextGenerator - path: /reference/engine/classes/TextGenerator - type: engineapi - source: /reference/engine/classes/TextGenerator.yaml - ignoreTranslation: true - - title: TextService - path: /reference/engine/classes/TextService - type: engineapi - source: /reference/engine/classes/TextService.yaml - ignoreTranslation: true - - title: TextSource - path: /reference/engine/classes/TextSource - type: engineapi - source: /reference/engine/classes/TextSource.yaml - ignoreTranslation: true - - title: TimerService - path: /reference/engine/classes/TimerService - type: engineapi - source: /reference/engine/classes/TimerService.yaml - ignoreTranslation: true - - title: TouchInputService - path: /reference/engine/classes/TouchInputService - type: engineapi - source: /reference/engine/classes/TouchInputService.yaml - ignoreTranslation: true - - title: TouchTransmitter - path: /reference/engine/classes/TouchTransmitter - type: engineapi - source: /reference/engine/classes/TouchTransmitter.yaml - ignoreTranslation: true - - title: Trail - path: /reference/engine/classes/Trail - type: engineapi - source: /reference/engine/classes/Trail.yaml - ignoreTranslation: true - - title: Translator - path: /reference/engine/classes/Translator - type: engineapi - source: /reference/engine/classes/Translator.yaml - ignoreTranslation: true - - title: TweenBase - path: /reference/engine/classes/TweenBase - type: engineapi - source: /reference/engine/classes/TweenBase.yaml - ignoreTranslation: true - section: - - title: Tween - path: /reference/engine/classes/Tween - type: engineapi - source: /reference/engine/classes/Tween.yaml - ignoreTranslation: true - - title: TweenService - path: /reference/engine/classes/TweenService - type: engineapi - source: /reference/engine/classes/TweenService.yaml - ignoreTranslation: true - - title: UGCValidationService - path: /reference/engine/classes/UGCValidationService - type: engineapi - source: /reference/engine/classes/UGCValidationService.yaml - ignoreTranslation: true - - title: UIBase - path: /reference/engine/classes/UIBase - type: engineapi - source: /reference/engine/classes/UIBase.yaml - ignoreTranslation: true - section: - - title: UIComponent - path: /reference/engine/classes/UIComponent - type: engineapi - source: /reference/engine/classes/UIComponent.yaml - ignoreTranslation: true - section: - - title: UIConstraint - path: /reference/engine/classes/UIConstraint - type: engineapi - source: /reference/engine/classes/UIConstraint.yaml - ignoreTranslation: true - section: - - title: UIAspectRatioConstraint - path: /reference/engine/classes/UIAspectRatioConstraint - type: engineapi - source: /reference/engine/classes/UIAspectRatioConstraint.yaml - ignoreTranslation: true - - title: UISizeConstraint - path: /reference/engine/classes/UISizeConstraint - type: engineapi - source: /reference/engine/classes/UISizeConstraint.yaml - ignoreTranslation: true - - title: UITextSizeConstraint - path: /reference/engine/classes/UITextSizeConstraint - type: engineapi - source: /reference/engine/classes/UITextSizeConstraint.yaml - ignoreTranslation: true - - title: UICorner - path: /reference/engine/classes/UICorner - type: engineapi - source: /reference/engine/classes/UICorner.yaml - ignoreTranslation: true - - title: UIDragDetector - path: /reference/engine/classes/UIDragDetector - type: engineapi - source: /reference/engine/classes/UIDragDetector.yaml - ignoreTranslation: true - - title: UIFlexItem - path: /reference/engine/classes/UIFlexItem - type: engineapi - source: /reference/engine/classes/UIFlexItem.yaml - ignoreTranslation: true - - title: UIGradient - path: /reference/engine/classes/UIGradient - type: engineapi - source: /reference/engine/classes/UIGradient.yaml - ignoreTranslation: true - - title: UILayout - path: /reference/engine/classes/UILayout - type: engineapi - source: /reference/engine/classes/UILayout.yaml - ignoreTranslation: true - section: - - title: UIGridStyleLayout - path: /reference/engine/classes/UIGridStyleLayout - type: engineapi - source: /reference/engine/classes/UIGridStyleLayout.yaml - ignoreTranslation: true - section: - - title: UIGridLayout - path: /reference/engine/classes/UIGridLayout - type: engineapi - source: /reference/engine/classes/UIGridLayout.yaml - ignoreTranslation: true - - title: UIListLayout - path: /reference/engine/classes/UIListLayout - type: engineapi - source: /reference/engine/classes/UIListLayout.yaml - ignoreTranslation: true - - title: UIPageLayout - path: /reference/engine/classes/UIPageLayout - type: engineapi - source: /reference/engine/classes/UIPageLayout.yaml - ignoreTranslation: true - - title: UITableLayout - path: /reference/engine/classes/UITableLayout - type: engineapi - source: /reference/engine/classes/UITableLayout.yaml - ignoreTranslation: true - - title: UIPadding - path: /reference/engine/classes/UIPadding - type: engineapi - source: /reference/engine/classes/UIPadding.yaml - ignoreTranslation: true - - title: UIScale - path: /reference/engine/classes/UIScale - type: engineapi - source: /reference/engine/classes/UIScale.yaml - ignoreTranslation: true - - title: UIStroke - path: /reference/engine/classes/UIStroke - type: engineapi - source: /reference/engine/classes/UIStroke.yaml - ignoreTranslation: true - - title: UniqueIdLookupService - path: /reference/engine/classes/UniqueIdLookupService - type: engineapi - source: /reference/engine/classes/UniqueIdLookupService.yaml - ignoreTranslation: true - - title: UserGameSettings - path: /reference/engine/classes/UserGameSettings - type: engineapi - source: /reference/engine/classes/UserGameSettings.yaml - ignoreTranslation: true - - title: UserInputService - path: /reference/engine/classes/UserInputService - type: engineapi - source: /reference/engine/classes/UserInputService.yaml - ignoreTranslation: true - - title: UserService - path: /reference/engine/classes/UserService - type: engineapi - source: /reference/engine/classes/UserService.yaml - ignoreTranslation: true - - title: VRService - path: /reference/engine/classes/VRService - type: engineapi - source: /reference/engine/classes/VRService.yaml - ignoreTranslation: true - - title: VRStatusService - path: /reference/engine/classes/VRStatusService - type: engineapi - source: /reference/engine/classes/VRStatusService.yaml - ignoreTranslation: true - - title: ValueBase - path: /reference/engine/classes/ValueBase - type: engineapi - source: /reference/engine/classes/ValueBase.yaml - ignoreTranslation: true - section: - - title: BinaryStringValue - path: /reference/engine/classes/BinaryStringValue - type: engineapi - source: /reference/engine/classes/BinaryStringValue.yaml - ignoreTranslation: true - - title: BoolValue - path: /reference/engine/classes/BoolValue - type: engineapi - source: /reference/engine/classes/BoolValue.yaml - ignoreTranslation: true - - title: BrickColorValue - path: /reference/engine/classes/BrickColorValue - type: engineapi - source: /reference/engine/classes/BrickColorValue.yaml - ignoreTranslation: true - - title: CFrameValue - path: /reference/engine/classes/CFrameValue - type: engineapi - source: /reference/engine/classes/CFrameValue.yaml - ignoreTranslation: true - - title: Color3Value - path: /reference/engine/classes/Color3Value - type: engineapi - source: /reference/engine/classes/Color3Value.yaml - ignoreTranslation: true - - title: DoubleConstrainedValue - path: /reference/engine/classes/DoubleConstrainedValue - type: engineapi - source: /reference/engine/classes/DoubleConstrainedValue.yaml - ignoreTranslation: true - - title: IntConstrainedValue - path: /reference/engine/classes/IntConstrainedValue - type: engineapi - source: /reference/engine/classes/IntConstrainedValue.yaml - ignoreTranslation: true - - title: IntValue - path: /reference/engine/classes/IntValue - type: engineapi - source: /reference/engine/classes/IntValue.yaml - ignoreTranslation: true - - title: NumberValue - path: /reference/engine/classes/NumberValue - type: engineapi - source: /reference/engine/classes/NumberValue.yaml - ignoreTranslation: true - - title: ObjectValue - path: /reference/engine/classes/ObjectValue - type: engineapi - source: /reference/engine/classes/ObjectValue.yaml - ignoreTranslation: true - - title: RayValue - path: /reference/engine/classes/RayValue - type: engineapi - source: /reference/engine/classes/RayValue.yaml - ignoreTranslation: true - - title: StringValue - path: /reference/engine/classes/StringValue - type: engineapi - source: /reference/engine/classes/StringValue.yaml - ignoreTranslation: true - - title: Vector3Value - path: /reference/engine/classes/Vector3Value - type: engineapi - source: /reference/engine/classes/Vector3Value.yaml - ignoreTranslation: true - - title: ValueCurve - path: /reference/engine/classes/ValueCurve - type: engineapi - source: /reference/engine/classes/ValueCurve.yaml - ignoreTranslation: true - - title: Vector3Curve - path: /reference/engine/classes/Vector3Curve - type: engineapi - source: /reference/engine/classes/Vector3Curve.yaml - ignoreTranslation: true - - title: VideoCaptureService - path: /reference/engine/classes/VideoCaptureService - type: engineapi - source: /reference/engine/classes/VideoCaptureService.yaml - ignoreTranslation: true - - title: VideoPlayer - path: /reference/engine/classes/VideoPlayer - type: engineapi - source: /reference/engine/classes/VideoPlayer.yaml - ignoreTranslation: true - - title: VideoService - path: /reference/engine/classes/VideoService - type: engineapi - source: /reference/engine/classes/VideoService.yaml - ignoreTranslation: true - - title: VirtualInputManager - path: /reference/engine/classes/VirtualInputManager - type: engineapi - source: /reference/engine/classes/VirtualInputManager.yaml - ignoreTranslation: true - - title: VirtualUser - path: /reference/engine/classes/VirtualUser - type: engineapi - source: /reference/engine/classes/VirtualUser.yaml - ignoreTranslation: true - - title: VisibilityCheckDispatcher - path: /reference/engine/classes/VisibilityCheckDispatcher - type: engineapi - source: /reference/engine/classes/VisibilityCheckDispatcher.yaml - ignoreTranslation: true - - title: Visit - path: /reference/engine/classes/Visit - type: engineapi - source: /reference/engine/classes/Visit.yaml - ignoreTranslation: true - - title: VisualizationMode - path: /reference/engine/classes/VisualizationMode - type: engineapi - source: /reference/engine/classes/VisualizationMode.yaml - ignoreTranslation: true - - title: VisualizationModeCategory - path: /reference/engine/classes/VisualizationModeCategory - type: engineapi - source: /reference/engine/classes/VisualizationModeCategory.yaml - ignoreTranslation: true - - title: VisualizationModeService - path: /reference/engine/classes/VisualizationModeService - type: engineapi - source: /reference/engine/classes/VisualizationModeService.yaml - ignoreTranslation: true - - title: VoiceChatService - path: /reference/engine/classes/VoiceChatService - type: engineapi - source: /reference/engine/classes/VoiceChatService.yaml - ignoreTranslation: true - - title: WeldConstraint - path: /reference/engine/classes/WeldConstraint - type: engineapi - source: /reference/engine/classes/WeldConstraint.yaml - ignoreTranslation: true - - title: Wire - path: /reference/engine/classes/Wire - type: engineapi - source: /reference/engine/classes/Wire.yaml - ignoreTranslation: true - - title: WrapTextureTransfer - path: /reference/engine/classes/WrapTextureTransfer - type: engineapi - source: /reference/engine/classes/WrapTextureTransfer.yaml - ignoreTranslation: true - - title: MLSession - path: /reference/engine/classes/MLSession - type: engineapi - source: /reference/engine/classes/MLSession.yaml - ignoreTranslation: true - - title: TerrainIterateOperation - path: /reference/engine/classes/TerrainIterateOperation - type: engineapi - source: /reference/engine/classes/TerrainIterateOperation.yaml - ignoreTranslation: true - - title: TerrainModifyOperation - path: /reference/engine/classes/TerrainModifyOperation - type: engineapi - source: /reference/engine/classes/TerrainModifyOperation.yaml - ignoreTranslation: true - - title: TerrainReadOperation - path: /reference/engine/classes/TerrainReadOperation - type: engineapi - source: /reference/engine/classes/TerrainReadOperation.yaml - ignoreTranslation: true - - title: TerrainWriteOperation - path: /reference/engine/classes/TerrainWriteOperation - type: engineapi - source: /reference/engine/classes/TerrainWriteOperation.yaml - ignoreTranslation: true - - title: VideoSampler - path: /reference/engine/classes/VideoSampler - type: engineapi - source: /reference/engine/classes/VideoSampler.yaml - ignoreTranslation: true - - title: WebStreamClient - path: /reference/engine/classes/WebStreamClient - type: engineapi - source: /reference/engine/classes/WebStreamClient.yaml - ignoreTranslation: true - - title: Data types - path: /reference/engine/datatypes - source: /reference/engine/datatypes.md - section: - - title: Axes - path: /reference/engine/datatypes/Axes - type: engineapi - source: /reference/engine/datatypes/Axes.yaml - ignoreTranslation: true - - title: BrickColor - path: /reference/engine/datatypes/BrickColor - type: engineapi - source: /reference/engine/datatypes/BrickColor.yaml - ignoreTranslation: true - - title: CatalogSearchParams - path: /reference/engine/datatypes/CatalogSearchParams - type: engineapi - source: /reference/engine/datatypes/CatalogSearchParams.yaml - ignoreTranslation: true - - title: CFrame - path: /reference/engine/datatypes/CFrame - type: engineapi - source: /reference/engine/datatypes/CFrame.yaml - ignoreTranslation: true - - title: Color3 - path: /reference/engine/datatypes/Color3 - type: engineapi - source: /reference/engine/datatypes/Color3.yaml - ignoreTranslation: true - - title: ColorSequence - path: /reference/engine/datatypes/ColorSequence - type: engineapi - source: /reference/engine/datatypes/ColorSequence.yaml - ignoreTranslation: true - - title: ColorSequenceKeypoint - path: /reference/engine/datatypes/ColorSequenceKeypoint - type: engineapi - source: /reference/engine/datatypes/ColorSequenceKeypoint.yaml - ignoreTranslation: true - - title: Content - path: /reference/engine/datatypes/Content - type: engineapi - source: /reference/engine/datatypes/Content.yaml - ignoreTranslation: true - - title: DateTime - path: /reference/engine/datatypes/DateTime - type: engineapi - source: /reference/engine/datatypes/DateTime.yaml - ignoreTranslation: true - - title: DockWidgetPluginGuiInfo - path: /reference/engine/datatypes/DockWidgetPluginGuiInfo - type: engineapi - source: /reference/engine/datatypes/DockWidgetPluginGuiInfo.yaml - ignoreTranslation: true - - title: Enum - path: /reference/engine/datatypes/Enum - type: engineapi - source: /reference/engine/datatypes/Enum.yaml - ignoreTranslation: true - - title: EnumItem - path: /reference/engine/datatypes/EnumItem - type: engineapi - source: /reference/engine/datatypes/EnumItem.yaml - ignoreTranslation: true - - title: Enums - path: /reference/engine/datatypes/Enums - type: engineapi - source: /reference/engine/datatypes/Enums.yaml - ignoreTranslation: true - - title: Faces - path: /reference/engine/datatypes/Faces - type: engineapi - source: /reference/engine/datatypes/Faces.yaml - ignoreTranslation: true - - title: FloatCurveKey - path: /reference/engine/datatypes/FloatCurveKey - type: engineapi - source: /reference/engine/datatypes/FloatCurveKey.yaml - ignoreTranslation: true - - title: Font - path: /reference/engine/datatypes/Font - type: engineapi - source: /reference/engine/datatypes/Font.yaml - ignoreTranslation: true - - title: Instance - path: /reference/engine/datatypes/Instance - type: engineapi - source: /reference/engine/datatypes/Instance.yaml - ignoreTranslation: true - - title: NumberRange - path: /reference/engine/datatypes/NumberRange - type: engineapi - source: /reference/engine/datatypes/NumberRange.yaml - ignoreTranslation: true - - title: NumberSequence - path: /reference/engine/datatypes/NumberSequence - type: engineapi - source: /reference/engine/datatypes/NumberSequence.yaml - ignoreTranslation: true - - title: NumberSequenceKeypoint - path: /reference/engine/datatypes/NumberSequenceKeypoint - type: engineapi - source: /reference/engine/datatypes/NumberSequenceKeypoint.yaml - ignoreTranslation: true - - title: OverlapParams - path: /reference/engine/datatypes/OverlapParams - type: engineapi - source: /reference/engine/datatypes/OverlapParams.yaml - ignoreTranslation: true - - title: Path2DControlPoint - path: /reference/engine/datatypes/Path2DControlPoint - type: engineapi - source: /reference/engine/datatypes/Path2DControlPoint.yaml - ignoreTranslation: true - - title: PathWaypoint - path: /reference/engine/datatypes/PathWaypoint - type: engineapi - source: /reference/engine/datatypes/PathWaypoint.yaml - ignoreTranslation: true - - title: PhysicalProperties - path: /reference/engine/datatypes/PhysicalProperties - type: engineapi - source: /reference/engine/datatypes/PhysicalProperties.yaml - ignoreTranslation: true - - title: Random - path: /reference/engine/datatypes/Random - type: engineapi - source: /reference/engine/datatypes/Random.yaml - ignoreTranslation: true - - title: Ray - path: /reference/engine/datatypes/Ray - type: engineapi - source: /reference/engine/datatypes/Ray.yaml - ignoreTranslation: true - - title: RaycastParams - path: /reference/engine/datatypes/RaycastParams - type: engineapi - source: /reference/engine/datatypes/RaycastParams.yaml - ignoreTranslation: true - - title: RaycastResult - path: /reference/engine/datatypes/RaycastResult - type: engineapi - source: /reference/engine/datatypes/RaycastResult.yaml - ignoreTranslation: true - - title: RBXScriptConnection - path: /reference/engine/datatypes/RBXScriptConnection - type: engineapi - source: /reference/engine/datatypes/RBXScriptConnection.yaml - ignoreTranslation: true - - title: RBXScriptSignal - path: /reference/engine/datatypes/RBXScriptSignal - type: engineapi - source: /reference/engine/datatypes/RBXScriptSignal.yaml - ignoreTranslation: true - - title: Rect - path: /reference/engine/datatypes/Rect - type: engineapi - source: /reference/engine/datatypes/Rect.yaml - ignoreTranslation: true - - title: Region3 - path: /reference/engine/datatypes/Region3 - type: engineapi - source: /reference/engine/datatypes/Region3.yaml - ignoreTranslation: true - - title: Region3int16 - path: /reference/engine/datatypes/Region3int16 - type: engineapi - source: /reference/engine/datatypes/Region3int16.yaml - ignoreTranslation: true - - title: RotationCurveKey - path: /reference/engine/datatypes/RotationCurveKey - type: engineapi - source: /reference/engine/datatypes/RotationCurveKey.yaml - ignoreTranslation: true - - title: Secret - path: /reference/engine/datatypes/Secret - type: engineapi - source: /reference/engine/datatypes/Secret.yaml - ignoreTranslation: true - - title: SecurityCapabilities - path: /reference/engine/datatypes/SecurityCapabilities - type: engineapi - source: /reference/engine/datatypes/SecurityCapabilities.yaml - ignoreTranslation: true - - title: SharedTable - path: /reference/engine/datatypes/SharedTable - type: engineapi - source: /reference/engine/datatypes/SharedTable.yaml - ignoreTranslation: true - - title: TweenInfo - path: /reference/engine/datatypes/TweenInfo - type: engineapi - source: /reference/engine/datatypes/TweenInfo.yaml - ignoreTranslation: true - - title: UDim - path: /reference/engine/datatypes/UDim - type: engineapi - source: /reference/engine/datatypes/UDim.yaml - ignoreTranslation: true - - title: UDim2 - path: /reference/engine/datatypes/UDim2 - type: engineapi - source: /reference/engine/datatypes/UDim2.yaml - ignoreTranslation: true - - title: ValueCurveKey - path: /reference/engine/datatypes/ValueCurveKey - type: engineapi - source: /reference/engine/datatypes/ValueCurveKey.yaml - ignoreTranslation: true - - title: Vector2 - path: /reference/engine/datatypes/Vector2 - type: engineapi - source: /reference/engine/datatypes/Vector2.yaml - ignoreTranslation: true - - title: Vector2int16 - path: /reference/engine/datatypes/Vector2int16 - type: engineapi - source: /reference/engine/datatypes/Vector2int16.yaml - ignoreTranslation: true - - title: Vector3 - path: /reference/engine/datatypes/Vector3 - type: engineapi - source: /reference/engine/datatypes/Vector3.yaml - ignoreTranslation: true - - title: Vector3int16 - path: /reference/engine/datatypes/Vector3int16 - type: engineapi - source: /reference/engine/datatypes/Vector3int16.yaml - ignoreTranslation: true - - title: Enums - path: /reference/engine/enums - source: /reference/engine/enums.md - section: - - title: AccessModifierType - path: /reference/engine/enums/AccessModifierType - type: engineapi - source: /reference/engine/enums/AccessModifierType.yaml - ignoreTranslation: true - - title: AccessoryType - path: /reference/engine/enums/AccessoryType - type: engineapi - source: /reference/engine/enums/AccessoryType.yaml - ignoreTranslation: true - - title: ActionOnAutoResumeSync - path: /reference/engine/enums/ActionOnAutoResumeSync - type: engineapi - source: /reference/engine/enums/ActionOnAutoResumeSync.yaml - ignoreTranslation: true - - title: ActionOnStopSync - path: /reference/engine/enums/ActionOnStopSync - type: engineapi - source: /reference/engine/enums/ActionOnStopSync.yaml - ignoreTranslation: true - - title: ActionType - path: /reference/engine/enums/ActionType - type: engineapi - source: /reference/engine/enums/ActionType.yaml - ignoreTranslation: true - - title: ActuatorRelativeTo - path: /reference/engine/enums/ActuatorRelativeTo - type: engineapi - source: /reference/engine/enums/ActuatorRelativeTo.yaml - ignoreTranslation: true - - title: ActuatorType - path: /reference/engine/enums/ActuatorType - type: engineapi - source: /reference/engine/enums/ActuatorType.yaml - ignoreTranslation: true - - title: AdAvailabilityResult - path: /reference/engine/enums/AdAvailabilityResult - type: engineapi - source: /reference/engine/enums/AdAvailabilityResult.yaml - ignoreTranslation: true - - title: AdEventType - path: /reference/engine/enums/AdEventType - type: engineapi - source: /reference/engine/enums/AdEventType.yaml - ignoreTranslation: true - - title: AdFormat - path: /reference/engine/enums/AdFormat - type: engineapi - source: /reference/engine/enums/AdFormat.yaml - ignoreTranslation: true - - title: AdornCullingMode - path: /reference/engine/enums/AdornCullingMode - type: engineapi - source: /reference/engine/enums/AdornCullingMode.yaml - ignoreTranslation: true - - title: AdornShading - path: /reference/engine/enums/AdornShading - type: engineapi - source: /reference/engine/enums/AdornShading.yaml - ignoreTranslation: true - - title: AdShape - path: /reference/engine/enums/AdShape - type: engineapi - source: /reference/engine/enums/AdShape.yaml - ignoreTranslation: true - - title: AdTeleportMethod - path: /reference/engine/enums/AdTeleportMethod - type: engineapi - source: /reference/engine/enums/AdTeleportMethod.yaml - ignoreTranslation: true - - title: AdUIEventType - path: /reference/engine/enums/AdUIEventType - type: engineapi - source: /reference/engine/enums/AdUIEventType.yaml - ignoreTranslation: true - - title: AdUIType - path: /reference/engine/enums/AdUIType - type: engineapi - source: /reference/engine/enums/AdUIType.yaml - ignoreTranslation: true - - title: AdUnitStatus - path: /reference/engine/enums/AdUnitStatus - type: engineapi - source: /reference/engine/enums/AdUnitStatus.yaml - ignoreTranslation: true - - title: AlignType - path: /reference/engine/enums/AlignType - type: engineapi - source: /reference/engine/enums/AlignType.yaml - ignoreTranslation: true - - title: AlphaMode - path: /reference/engine/enums/AlphaMode - type: engineapi - source: /reference/engine/enums/AlphaMode.yaml - ignoreTranslation: true - - title: AnalyticsCustomFieldKeys - path: /reference/engine/enums/AnalyticsCustomFieldKeys - type: engineapi - source: /reference/engine/enums/AnalyticsCustomFieldKeys.yaml - ignoreTranslation: true - - title: AnalyticsEconomyAction - path: /reference/engine/enums/AnalyticsEconomyAction - type: engineapi - source: /reference/engine/enums/AnalyticsEconomyAction.yaml - ignoreTranslation: true - - title: AnalyticsEconomyFlowType - path: /reference/engine/enums/AnalyticsEconomyFlowType - type: engineapi - source: /reference/engine/enums/AnalyticsEconomyFlowType.yaml - ignoreTranslation: true - - title: AnalyticsEconomyTransactionType - path: /reference/engine/enums/AnalyticsEconomyTransactionType - type: engineapi - source: /reference/engine/enums/AnalyticsEconomyTransactionType.yaml - ignoreTranslation: true - - title: AnalyticsLogLevel - path: /reference/engine/enums/AnalyticsLogLevel - type: engineapi - source: /reference/engine/enums/AnalyticsLogLevel.yaml - ignoreTranslation: true - - title: AnalyticsProgressionStatus - path: /reference/engine/enums/AnalyticsProgressionStatus - type: engineapi - source: /reference/engine/enums/AnalyticsProgressionStatus.yaml - ignoreTranslation: true - - title: AnalyticsProgressionType - path: /reference/engine/enums/AnalyticsProgressionType - type: engineapi - source: /reference/engine/enums/AnalyticsProgressionType.yaml - ignoreTranslation: true - - title: AnimationClipFromVideoStatus - path: /reference/engine/enums/AnimationClipFromVideoStatus - type: engineapi - source: /reference/engine/enums/AnimationClipFromVideoStatus.yaml - ignoreTranslation: true - - title: AnimationNodeType - path: /reference/engine/enums/AnimationNodeType - type: engineapi - source: /reference/engine/enums/AnimationNodeType.yaml - ignoreTranslation: true - - title: AnimationPriority - path: /reference/engine/enums/AnimationPriority - type: engineapi - source: /reference/engine/enums/AnimationPriority.yaml - ignoreTranslation: true - - title: AnimatorRetargetingMode - path: /reference/engine/enums/AnimatorRetargetingMode - type: engineapi - source: /reference/engine/enums/AnimatorRetargetingMode.yaml - ignoreTranslation: true - - title: AnnotationEditingMode - path: /reference/engine/enums/AnnotationEditingMode - type: engineapi - source: /reference/engine/enums/AnnotationEditingMode.yaml - ignoreTranslation: true - - title: AnnotationRequestStatus - path: /reference/engine/enums/AnnotationRequestStatus - type: engineapi - source: /reference/engine/enums/AnnotationRequestStatus.yaml - ignoreTranslation: true - - title: AnnotationRequestType - path: /reference/engine/enums/AnnotationRequestType - type: engineapi - source: /reference/engine/enums/AnnotationRequestType.yaml - ignoreTranslation: true - - title: AppLifecycleManagerState - path: /reference/engine/enums/AppLifecycleManagerState - type: engineapi - source: /reference/engine/enums/AppLifecycleManagerState.yaml - ignoreTranslation: true - - title: ApplyStrokeMode - path: /reference/engine/enums/ApplyStrokeMode - type: engineapi - source: /reference/engine/enums/ApplyStrokeMode.yaml - ignoreTranslation: true - - title: AppShellActionType - path: /reference/engine/enums/AppShellActionType - type: engineapi - source: /reference/engine/enums/AppShellActionType.yaml - ignoreTranslation: true - - title: AppShellFeature - path: /reference/engine/enums/AppShellFeature - type: engineapi - source: /reference/engine/enums/AppShellFeature.yaml - ignoreTranslation: true - - title: AppUpdateStatus - path: /reference/engine/enums/AppUpdateStatus - type: engineapi - source: /reference/engine/enums/AppUpdateStatus.yaml - ignoreTranslation: true - - title: AspectType - path: /reference/engine/enums/AspectType - type: engineapi - source: /reference/engine/enums/AspectType.yaml - ignoreTranslation: true - - title: AssetCreatorType - path: /reference/engine/enums/AssetCreatorType - type: engineapi - source: /reference/engine/enums/AssetCreatorType.yaml - ignoreTranslation: true - - title: AssetFetchStatus - path: /reference/engine/enums/AssetFetchStatus - type: engineapi - source: /reference/engine/enums/AssetFetchStatus.yaml - ignoreTranslation: true - - title: AssetType - path: /reference/engine/enums/AssetType - type: engineapi - source: /reference/engine/enums/AssetType.yaml - ignoreTranslation: true - - title: AssetTypeVerification - path: /reference/engine/enums/AssetTypeVerification - type: engineapi - source: /reference/engine/enums/AssetTypeVerification.yaml - ignoreTranslation: true - - title: AudioApiRollout - path: /reference/engine/enums/AudioApiRollout - type: engineapi - source: /reference/engine/enums/AudioApiRollout.yaml - ignoreTranslation: true - - title: AudioCaptureMode - path: /reference/engine/enums/AudioCaptureMode - type: engineapi - source: /reference/engine/enums/AudioCaptureMode.yaml - ignoreTranslation: true - - title: AudioChannelLayout - path: /reference/engine/enums/AudioChannelLayout - type: engineapi - source: /reference/engine/enums/AudioChannelLayout.yaml - ignoreTranslation: true - - title: AudioFilterType - path: /reference/engine/enums/AudioFilterType - type: engineapi - source: /reference/engine/enums/AudioFilterType.yaml - ignoreTranslation: true - - title: AudioSimulationFidelity - path: /reference/engine/enums/AudioSimulationFidelity - type: engineapi - source: /reference/engine/enums/AudioSimulationFidelity.yaml - ignoreTranslation: true - - title: AudioSubType - path: /reference/engine/enums/AudioSubType - type: engineapi - source: /reference/engine/enums/AudioSubType.yaml - ignoreTranslation: true - - title: AudioWindowSize - path: /reference/engine/enums/AudioWindowSize - type: engineapi - source: /reference/engine/enums/AudioWindowSize.yaml - ignoreTranslation: true - - title: AuthorityMode - path: /reference/engine/enums/AuthorityMode - type: engineapi - source: /reference/engine/enums/AuthorityMode.yaml - ignoreTranslation: true - - title: AutoIndentRule - path: /reference/engine/enums/AutoIndentRule - type: engineapi - source: /reference/engine/enums/AutoIndentRule.yaml - ignoreTranslation: true - - title: AutomaticSize - path: /reference/engine/enums/AutomaticSize - type: engineapi - source: /reference/engine/enums/AutomaticSize.yaml - ignoreTranslation: true - - title: AvatarAssetType - path: /reference/engine/enums/AvatarAssetType - type: engineapi - source: /reference/engine/enums/AvatarAssetType.yaml - ignoreTranslation: true - - title: AvatarChatServiceFeature - path: /reference/engine/enums/AvatarChatServiceFeature - type: engineapi - source: /reference/engine/enums/AvatarChatServiceFeature.yaml - ignoreTranslation: true - - title: AvatarContextMenuOption - path: /reference/engine/enums/AvatarContextMenuOption - type: engineapi - source: /reference/engine/enums/AvatarContextMenuOption.yaml - ignoreTranslation: true - - title: AvatarItemType - path: /reference/engine/enums/AvatarItemType - type: engineapi - source: /reference/engine/enums/AvatarItemType.yaml - ignoreTranslation: true - - title: AvatarPromptResult - path: /reference/engine/enums/AvatarPromptResult - type: engineapi - source: /reference/engine/enums/AvatarPromptResult.yaml - ignoreTranslation: true - - title: AvatarSettingsAccessoryLimitMethod - path: /reference/engine/enums/AvatarSettingsAccessoryLimitMethod - type: engineapi - source: /reference/engine/enums/AvatarSettingsAccessoryLimitMethod.yaml - ignoreTranslation: true - - title: AvatarSettingsAccessoryMode - path: /reference/engine/enums/AvatarSettingsAccessoryMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsAccessoryMode.yaml - ignoreTranslation: true - - title: AvatarSettingsAnimationClipsMode - path: /reference/engine/enums/AvatarSettingsAnimationClipsMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsAnimationClipsMode.yaml - ignoreTranslation: true - - title: AvatarSettingsAnimationPacksMode - path: /reference/engine/enums/AvatarSettingsAnimationPacksMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsAnimationPacksMode.yaml - ignoreTranslation: true - - title: AvatarSettingsAppearanceMode - path: /reference/engine/enums/AvatarSettingsAppearanceMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsAppearanceMode.yaml - ignoreTranslation: true - - title: AvatarSettingsBuildMode - path: /reference/engine/enums/AvatarSettingsBuildMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsBuildMode.yaml - ignoreTranslation: true - - title: AvatarSettingsClothingMode - path: /reference/engine/enums/AvatarSettingsClothingMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsClothingMode.yaml - ignoreTranslation: true - - title: AvatarSettingsCollisionMode - path: /reference/engine/enums/AvatarSettingsCollisionMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsCollisionMode.yaml - ignoreTranslation: true - - title: AvatarSettingsCustomAccessoryMode - path: /reference/engine/enums/AvatarSettingsCustomAccessoryMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsCustomAccessoryMode.yaml - ignoreTranslation: true - - title: AvatarSettingsCustomBodyType - path: /reference/engine/enums/AvatarSettingsCustomBodyType - type: engineapi - source: /reference/engine/enums/AvatarSettingsCustomBodyType.yaml - ignoreTranslation: true - - title: AvatarSettingsCustomClothingMode - path: /reference/engine/enums/AvatarSettingsCustomClothingMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsCustomClothingMode.yaml - ignoreTranslation: true - - title: AvatarSettingsHitAndTouchDetectionMode - path: /reference/engine/enums/AvatarSettingsHitAndTouchDetectionMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsHitAndTouchDetectionMode.yaml - ignoreTranslation: true - - title: AvatarSettingsJumpMode - path: /reference/engine/enums/AvatarSettingsJumpMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsJumpMode.yaml - ignoreTranslation: true - - title: AvatarSettingsLegacyCollisionMode - path: /reference/engine/enums/AvatarSettingsLegacyCollisionMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsLegacyCollisionMode.yaml - ignoreTranslation: true - - title: AvatarSettingsScaleMode - path: /reference/engine/enums/AvatarSettingsScaleMode - type: engineapi - source: /reference/engine/enums/AvatarSettingsScaleMode.yaml - ignoreTranslation: true - - title: AvatarThumbnailCustomizationType - path: /reference/engine/enums/AvatarThumbnailCustomizationType - type: engineapi - source: /reference/engine/enums/AvatarThumbnailCustomizationType.yaml - ignoreTranslation: true - - title: AvatarUnificationMode - path: /reference/engine/enums/AvatarUnificationMode - type: engineapi - source: /reference/engine/enums/AvatarUnificationMode.yaml - ignoreTranslation: true - - title: Axis - path: /reference/engine/enums/Axis - type: engineapi - source: /reference/engine/enums/Axis.yaml - ignoreTranslation: true - - title: BenefitType - path: /reference/engine/enums/BenefitType - type: engineapi - source: /reference/engine/enums/BenefitType.yaml - ignoreTranslation: true - - title: BinType - path: /reference/engine/enums/BinType - type: engineapi - source: /reference/engine/enums/BinType.yaml - ignoreTranslation: true - - title: BodyPart - path: /reference/engine/enums/BodyPart - type: engineapi - source: /reference/engine/enums/BodyPart.yaml - ignoreTranslation: true - - title: BodyPartR15 - path: /reference/engine/enums/BodyPartR15 - type: engineapi - source: /reference/engine/enums/BodyPartR15.yaml - ignoreTranslation: true - - title: BorderMode - path: /reference/engine/enums/BorderMode - type: engineapi - source: /reference/engine/enums/BorderMode.yaml - ignoreTranslation: true - - title: BorderStrokePosition - path: /reference/engine/enums/BorderStrokePosition - type: engineapi - source: /reference/engine/enums/BorderStrokePosition.yaml - ignoreTranslation: true - - title: BreakpointRemoveReason - path: /reference/engine/enums/BreakpointRemoveReason - type: engineapi - source: /reference/engine/enums/BreakpointRemoveReason.yaml - ignoreTranslation: true - - title: BreakReason - path: /reference/engine/enums/BreakReason - type: engineapi - source: /reference/engine/enums/BreakReason.yaml - ignoreTranslation: true - - title: BulkMoveMode - path: /reference/engine/enums/BulkMoveMode - type: engineapi - source: /reference/engine/enums/BulkMoveMode.yaml - ignoreTranslation: true - - title: BundleType - path: /reference/engine/enums/BundleType - type: engineapi - source: /reference/engine/enums/BundleType.yaml - ignoreTranslation: true - - title: Button - path: /reference/engine/enums/Button - type: engineapi - source: /reference/engine/enums/Button.yaml - ignoreTranslation: true - - title: ButtonStyle - path: /reference/engine/enums/ButtonStyle - type: engineapi - source: /reference/engine/enums/ButtonStyle.yaml - ignoreTranslation: true - - title: CageType - path: /reference/engine/enums/CageType - type: engineapi - source: /reference/engine/enums/CageType.yaml - ignoreTranslation: true - - title: CameraMode - path: /reference/engine/enums/CameraMode - type: engineapi - source: /reference/engine/enums/CameraMode.yaml - ignoreTranslation: true - - title: CameraNavigationModel - path: /reference/engine/enums/CameraNavigationModel - type: engineapi - source: /reference/engine/enums/CameraNavigationModel.yaml - ignoreTranslation: true - - title: CameraPanMode - path: /reference/engine/enums/CameraPanMode - type: engineapi - source: /reference/engine/enums/CameraPanMode.yaml - ignoreTranslation: true - - title: CameraSpeedAdjustBinding - path: /reference/engine/enums/CameraSpeedAdjustBinding - type: engineapi - source: /reference/engine/enums/CameraSpeedAdjustBinding.yaml - ignoreTranslation: true - - title: CameraType - path: /reference/engine/enums/CameraType - type: engineapi - source: /reference/engine/enums/CameraType.yaml - ignoreTranslation: true - - title: CaptureGalleryPermission - path: /reference/engine/enums/CaptureGalleryPermission - type: engineapi - source: /reference/engine/enums/CaptureGalleryPermission.yaml - ignoreTranslation: true - - title: CaptureType - path: /reference/engine/enums/CaptureType - type: engineapi - source: /reference/engine/enums/CaptureType.yaml - ignoreTranslation: true - - title: CatalogCategoryFilter - path: /reference/engine/enums/CatalogCategoryFilter - type: engineapi - source: /reference/engine/enums/CatalogCategoryFilter.yaml - ignoreTranslation: true - - title: CatalogSortAggregation - path: /reference/engine/enums/CatalogSortAggregation - type: engineapi - source: /reference/engine/enums/CatalogSortAggregation.yaml - ignoreTranslation: true - - title: CatalogSortType - path: /reference/engine/enums/CatalogSortType - type: engineapi - source: /reference/engine/enums/CatalogSortType.yaml - ignoreTranslation: true - - title: CellBlock - path: /reference/engine/enums/CellBlock - type: engineapi - source: /reference/engine/enums/CellBlock.yaml - ignoreTranslation: true - - title: CellMaterial - path: /reference/engine/enums/CellMaterial - type: engineapi - source: /reference/engine/enums/CellMaterial.yaml - ignoreTranslation: true - - title: CellOrientation - path: /reference/engine/enums/CellOrientation - type: engineapi - source: /reference/engine/enums/CellOrientation.yaml - ignoreTranslation: true - - title: CenterDialogType - path: /reference/engine/enums/CenterDialogType - type: engineapi - source: /reference/engine/enums/CenterDialogType.yaml - ignoreTranslation: true - - title: CharacterControlMode - path: /reference/engine/enums/CharacterControlMode - type: engineapi - source: /reference/engine/enums/CharacterControlMode.yaml - ignoreTranslation: true - - title: ChatCallbackType - path: /reference/engine/enums/ChatCallbackType - type: engineapi - source: /reference/engine/enums/ChatCallbackType.yaml - ignoreTranslation: true - - title: ChatColor - path: /reference/engine/enums/ChatColor - type: engineapi - source: /reference/engine/enums/ChatColor.yaml - ignoreTranslation: true - - title: ChatMode - path: /reference/engine/enums/ChatMode - type: engineapi - source: /reference/engine/enums/ChatMode.yaml - ignoreTranslation: true - - title: ChatPrivacyMode - path: /reference/engine/enums/ChatPrivacyMode - type: engineapi - source: /reference/engine/enums/ChatPrivacyMode.yaml - ignoreTranslation: true - - title: ChatRestrictionStatus - path: /reference/engine/enums/ChatRestrictionStatus - type: engineapi - source: /reference/engine/enums/ChatRestrictionStatus.yaml - ignoreTranslation: true - - title: ChatStyle - path: /reference/engine/enums/ChatStyle - type: engineapi - source: /reference/engine/enums/ChatStyle.yaml - ignoreTranslation: true - - title: ChatVersion - path: /reference/engine/enums/ChatVersion - type: engineapi - source: /reference/engine/enums/ChatVersion.yaml - ignoreTranslation: true - - title: ClientAnimatorThrottlingMode - path: /reference/engine/enums/ClientAnimatorThrottlingMode - type: engineapi - source: /reference/engine/enums/ClientAnimatorThrottlingMode.yaml - ignoreTranslation: true - - title: CloseReason - path: /reference/engine/enums/CloseReason - type: engineapi - source: /reference/engine/enums/CloseReason.yaml - ignoreTranslation: true - - title: CollaboratorStatus - path: /reference/engine/enums/CollaboratorStatus - type: engineapi - source: /reference/engine/enums/CollaboratorStatus.yaml - ignoreTranslation: true - - title: CollisionFidelity - path: /reference/engine/enums/CollisionFidelity - type: engineapi - source: /reference/engine/enums/CollisionFidelity.yaml - ignoreTranslation: true - - title: CommandPermission - path: /reference/engine/enums/CommandPermission - type: engineapi - source: /reference/engine/enums/CommandPermission.yaml - ignoreTranslation: true - - title: CompileTarget - path: /reference/engine/enums/CompileTarget - type: engineapi - source: /reference/engine/enums/CompileTarget.yaml - ignoreTranslation: true - - title: CompletionAcceptanceBehavior - path: /reference/engine/enums/CompletionAcceptanceBehavior - type: engineapi - source: /reference/engine/enums/CompletionAcceptanceBehavior.yaml - ignoreTranslation: true - - title: CompletionItemKind - path: /reference/engine/enums/CompletionItemKind - type: engineapi - source: /reference/engine/enums/CompletionItemKind.yaml - ignoreTranslation: true - - title: CompletionItemTag - path: /reference/engine/enums/CompletionItemTag - type: engineapi - source: /reference/engine/enums/CompletionItemTag.yaml - ignoreTranslation: true - - title: CompletionTriggerKind - path: /reference/engine/enums/CompletionTriggerKind - type: engineapi - source: /reference/engine/enums/CompletionTriggerKind.yaml - ignoreTranslation: true - - title: CompositeValueCurveType - path: /reference/engine/enums/CompositeValueCurveType - type: engineapi - source: /reference/engine/enums/CompositeValueCurveType.yaml - ignoreTranslation: true - - title: CompressionAlgorithm - path: /reference/engine/enums/CompressionAlgorithm - type: engineapi - source: /reference/engine/enums/CompressionAlgorithm.yaml - ignoreTranslation: true - - title: ComputerCameraMovementMode - path: /reference/engine/enums/ComputerCameraMovementMode - type: engineapi - source: /reference/engine/enums/ComputerCameraMovementMode.yaml - ignoreTranslation: true - - title: ComputerMovementMode - path: /reference/engine/enums/ComputerMovementMode - type: engineapi - source: /reference/engine/enums/ComputerMovementMode.yaml - ignoreTranslation: true - - title: ConfigSnapshotErrorState - path: /reference/engine/enums/ConfigSnapshotErrorState - type: engineapi - source: /reference/engine/enums/ConfigSnapshotErrorState.yaml - ignoreTranslation: true - - title: ConnectionError - path: /reference/engine/enums/ConnectionError - type: engineapi - source: /reference/engine/enums/ConnectionError.yaml - ignoreTranslation: true - - title: ConnectionState - path: /reference/engine/enums/ConnectionState - type: engineapi - source: /reference/engine/enums/ConnectionState.yaml - ignoreTranslation: true - - title: ContentSourceType - path: /reference/engine/enums/ContentSourceType - type: engineapi - source: /reference/engine/enums/ContentSourceType.yaml - ignoreTranslation: true - - title: ContextActionPriority - path: /reference/engine/enums/ContextActionPriority - type: engineapi - source: /reference/engine/enums/ContextActionPriority.yaml - ignoreTranslation: true - - title: ContextActionResult - path: /reference/engine/enums/ContextActionResult - type: engineapi - source: /reference/engine/enums/ContextActionResult.yaml - ignoreTranslation: true - - title: ControlMode - path: /reference/engine/enums/ControlMode - type: engineapi - source: /reference/engine/enums/ControlMode.yaml - ignoreTranslation: true - - title: CoreGuiType - path: /reference/engine/enums/CoreGuiType - type: engineapi - source: /reference/engine/enums/CoreGuiType.yaml - ignoreTranslation: true - - title: CreateAssetResult - path: /reference/engine/enums/CreateAssetResult - type: engineapi - source: /reference/engine/enums/CreateAssetResult.yaml - ignoreTranslation: true - - title: CreateOutfitFailure - path: /reference/engine/enums/CreateOutfitFailure - type: engineapi - source: /reference/engine/enums/CreateOutfitFailure.yaml - ignoreTranslation: true - - title: CreatorType - path: /reference/engine/enums/CreatorType - type: engineapi - source: /reference/engine/enums/CreatorType.yaml - ignoreTranslation: true - - title: CreatorTypeFilter - path: /reference/engine/enums/CreatorTypeFilter - type: engineapi - source: /reference/engine/enums/CreatorTypeFilter.yaml - ignoreTranslation: true - - title: CurrencyType - path: /reference/engine/enums/CurrencyType - type: engineapi - source: /reference/engine/enums/CurrencyType.yaml - ignoreTranslation: true - - title: CustomCameraMode - path: /reference/engine/enums/CustomCameraMode - type: engineapi - source: /reference/engine/enums/CustomCameraMode.yaml - ignoreTranslation: true - - title: DataStoreRequestType - path: /reference/engine/enums/DataStoreRequestType - type: engineapi - source: /reference/engine/enums/DataStoreRequestType.yaml - ignoreTranslation: true - - title: DebuggerEndReason - path: /reference/engine/enums/DebuggerEndReason - type: engineapi - source: /reference/engine/enums/DebuggerEndReason.yaml - ignoreTranslation: true - - title: DebuggerExceptionBreakMode - path: /reference/engine/enums/DebuggerExceptionBreakMode - type: engineapi - source: /reference/engine/enums/DebuggerExceptionBreakMode.yaml - ignoreTranslation: true - - title: DebuggerFrameType - path: /reference/engine/enums/DebuggerFrameType - type: engineapi - source: /reference/engine/enums/DebuggerFrameType.yaml - ignoreTranslation: true - - title: DebuggerPauseReason - path: /reference/engine/enums/DebuggerPauseReason - type: engineapi - source: /reference/engine/enums/DebuggerPauseReason.yaml - ignoreTranslation: true - - title: DebuggerStatus - path: /reference/engine/enums/DebuggerStatus - type: engineapi - source: /reference/engine/enums/DebuggerStatus.yaml - ignoreTranslation: true - - title: DefaultScriptSyncFileType - path: /reference/engine/enums/DefaultScriptSyncFileType - type: engineapi - source: /reference/engine/enums/DefaultScriptSyncFileType.yaml - ignoreTranslation: true - - title: DevCameraOcclusionMode - path: /reference/engine/enums/DevCameraOcclusionMode - type: engineapi - source: /reference/engine/enums/DevCameraOcclusionMode.yaml - ignoreTranslation: true - - title: DevComputerCameraMovementMode - path: /reference/engine/enums/DevComputerCameraMovementMode - type: engineapi - source: /reference/engine/enums/DevComputerCameraMovementMode.yaml - ignoreTranslation: true - - title: DevComputerMovementMode - path: /reference/engine/enums/DevComputerMovementMode - type: engineapi - source: /reference/engine/enums/DevComputerMovementMode.yaml - ignoreTranslation: true - - title: DeveloperMemoryTag - path: /reference/engine/enums/DeveloperMemoryTag - type: engineapi - source: /reference/engine/enums/DeveloperMemoryTag.yaml - ignoreTranslation: true - - title: DeviceFeatureType - path: /reference/engine/enums/DeviceFeatureType - type: engineapi - source: /reference/engine/enums/DeviceFeatureType.yaml - ignoreTranslation: true - - title: DeviceForm - path: /reference/engine/enums/DeviceForm - type: engineapi - source: /reference/engine/enums/DeviceForm.yaml - ignoreTranslation: true - - title: DeviceLevel - path: /reference/engine/enums/DeviceLevel - type: engineapi - source: /reference/engine/enums/DeviceLevel.yaml - ignoreTranslation: true - - title: DeviceType - path: /reference/engine/enums/DeviceType - type: engineapi - source: /reference/engine/enums/DeviceType.yaml - ignoreTranslation: true - - title: DevTouchCameraMovementMode - path: /reference/engine/enums/DevTouchCameraMovementMode - type: engineapi - source: /reference/engine/enums/DevTouchCameraMovementMode.yaml - ignoreTranslation: true - - title: DevTouchMovementMode - path: /reference/engine/enums/DevTouchMovementMode - type: engineapi - source: /reference/engine/enums/DevTouchMovementMode.yaml - ignoreTranslation: true - - title: DialogBehaviorType - path: /reference/engine/enums/DialogBehaviorType - type: engineapi - source: /reference/engine/enums/DialogBehaviorType.yaml - ignoreTranslation: true - - title: DialogPurpose - path: /reference/engine/enums/DialogPurpose - type: engineapi - source: /reference/engine/enums/DialogPurpose.yaml - ignoreTranslation: true - - title: DialogTone - path: /reference/engine/enums/DialogTone - type: engineapi - source: /reference/engine/enums/DialogTone.yaml - ignoreTranslation: true - - title: DigitsRigDescriptionSide - path: /reference/engine/enums/DigitsRigDescriptionSide - type: engineapi - source: /reference/engine/enums/DigitsRigDescriptionSide.yaml - ignoreTranslation: true - - title: DisplaySize - path: /reference/engine/enums/DisplaySize - type: engineapi - source: /reference/engine/enums/DisplaySize.yaml - ignoreTranslation: true - - title: DominantAxis - path: /reference/engine/enums/DominantAxis - type: engineapi - source: /reference/engine/enums/DominantAxis.yaml - ignoreTranslation: true - - title: DraftStatusCode - path: /reference/engine/enums/DraftStatusCode - type: engineapi - source: /reference/engine/enums/DraftStatusCode.yaml - ignoreTranslation: true - - title: DragDetectorDragStyle - path: /reference/engine/enums/DragDetectorDragStyle - type: engineapi - source: /reference/engine/enums/DragDetectorDragStyle.yaml - ignoreTranslation: true - - title: DragDetectorPermissionPolicy - path: /reference/engine/enums/DragDetectorPermissionPolicy - type: engineapi - source: /reference/engine/enums/DragDetectorPermissionPolicy.yaml - ignoreTranslation: true - - title: DragDetectorResponseStyle - path: /reference/engine/enums/DragDetectorResponseStyle - type: engineapi - source: /reference/engine/enums/DragDetectorResponseStyle.yaml - ignoreTranslation: true - - title: DraggerCoordinateSpace - path: /reference/engine/enums/DraggerCoordinateSpace - type: engineapi - source: /reference/engine/enums/DraggerCoordinateSpace.yaml - ignoreTranslation: true - - title: DraggerMovementMode - path: /reference/engine/enums/DraggerMovementMode - type: engineapi - source: /reference/engine/enums/DraggerMovementMode.yaml - ignoreTranslation: true - - title: DraggingScrollBar - path: /reference/engine/enums/DraggingScrollBar - type: engineapi - source: /reference/engine/enums/DraggingScrollBar.yaml - ignoreTranslation: true - - title: EasingDirection - path: /reference/engine/enums/EasingDirection - type: engineapi - source: /reference/engine/enums/EasingDirection.yaml - ignoreTranslation: true - - title: EasingStyle - path: /reference/engine/enums/EasingStyle - type: engineapi - source: /reference/engine/enums/EasingStyle.yaml - ignoreTranslation: true - - title: ElasticBehavior - path: /reference/engine/enums/ElasticBehavior - type: engineapi - source: /reference/engine/enums/ElasticBehavior.yaml - ignoreTranslation: true - - title: EnviromentalPhysicsThrottle - path: /reference/engine/enums/EnviromentalPhysicsThrottle - type: engineapi - source: /reference/engine/enums/EnviromentalPhysicsThrottle.yaml - ignoreTranslation: true - - title: ExperienceAuthScope - path: /reference/engine/enums/ExperienceAuthScope - type: engineapi - source: /reference/engine/enums/ExperienceAuthScope.yaml - ignoreTranslation: true - - title: ExperienceEventStatus - path: /reference/engine/enums/ExperienceEventStatus - type: engineapi - source: /reference/engine/enums/ExperienceEventStatus.yaml - ignoreTranslation: true - - title: ExplosionType - path: /reference/engine/enums/ExplosionType - type: engineapi - source: /reference/engine/enums/ExplosionType.yaml - ignoreTranslation: true - - title: FacialAgeEstimationResultType - path: /reference/engine/enums/FacialAgeEstimationResultType - type: engineapi - source: /reference/engine/enums/FacialAgeEstimationResultType.yaml - ignoreTranslation: true - - title: FacialAnimationStreamingState - path: /reference/engine/enums/FacialAnimationStreamingState - type: engineapi - source: /reference/engine/enums/FacialAnimationStreamingState.yaml - ignoreTranslation: true - - title: FacsActionUnit - path: /reference/engine/enums/FacsActionUnit - type: engineapi - source: /reference/engine/enums/FacsActionUnit.yaml - ignoreTranslation: true - - title: FACSDataLod - path: /reference/engine/enums/FACSDataLod - type: engineapi - source: /reference/engine/enums/FACSDataLod.yaml - ignoreTranslation: true - - title: FieldOfViewMode - path: /reference/engine/enums/FieldOfViewMode - type: engineapi - source: /reference/engine/enums/FieldOfViewMode.yaml - ignoreTranslation: true - - title: FileMode - path: /reference/engine/enums/FileMode - type: engineapi - source: /reference/engine/enums/FileMode.yaml - ignoreTranslation: true - - title: FileSystemWalkMode - path: /reference/engine/enums/FileSystemWalkMode - type: engineapi - source: /reference/engine/enums/FileSystemWalkMode.yaml - ignoreTranslation: true - - title: FillDirection - path: /reference/engine/enums/FillDirection - type: engineapi - source: /reference/engine/enums/FillDirection.yaml - ignoreTranslation: true - - title: FilterErrorType - path: /reference/engine/enums/FilterErrorType - type: engineapi - source: /reference/engine/enums/FilterErrorType.yaml - ignoreTranslation: true - - title: FilterResult - path: /reference/engine/enums/FilterResult - type: engineapi - source: /reference/engine/enums/FilterResult.yaml - ignoreTranslation: true - - title: FinishRecordingOperation - path: /reference/engine/enums/FinishRecordingOperation - type: engineapi - source: /reference/engine/enums/FinishRecordingOperation.yaml - ignoreTranslation: true - - title: FluidFidelity - path: /reference/engine/enums/FluidFidelity - type: engineapi - source: /reference/engine/enums/FluidFidelity.yaml - ignoreTranslation: true - - title: FluidForces - path: /reference/engine/enums/FluidForces - type: engineapi - source: /reference/engine/enums/FluidForces.yaml - ignoreTranslation: true - - title: Font - path: /reference/engine/enums/Font - type: engineapi - source: /reference/engine/enums/Font.yaml - ignoreTranslation: true - - title: FontSize - path: /reference/engine/enums/FontSize - type: engineapi - source: /reference/engine/enums/FontSize.yaml - ignoreTranslation: true - - title: FontStyle - path: /reference/engine/enums/FontStyle - type: engineapi - source: /reference/engine/enums/FontStyle.yaml - ignoreTranslation: true - - title: FontWeight - path: /reference/engine/enums/FontWeight - type: engineapi - source: /reference/engine/enums/FontWeight.yaml - ignoreTranslation: true - - title: ForceLimitMode - path: /reference/engine/enums/ForceLimitMode - type: engineapi - source: /reference/engine/enums/ForceLimitMode.yaml - ignoreTranslation: true - - title: FormFactor - path: /reference/engine/enums/FormFactor - type: engineapi - source: /reference/engine/enums/FormFactor.yaml - ignoreTranslation: true - - title: FramerateManagerMode - path: /reference/engine/enums/FramerateManagerMode - type: engineapi - source: /reference/engine/enums/FramerateManagerMode.yaml - ignoreTranslation: true - - title: FrameStyle - path: /reference/engine/enums/FrameStyle - type: engineapi - source: /reference/engine/enums/FrameStyle.yaml - ignoreTranslation: true - - title: FriendRequestEvent - path: /reference/engine/enums/FriendRequestEvent - type: engineapi - source: /reference/engine/enums/FriendRequestEvent.yaml - ignoreTranslation: true - - title: FriendStatus - path: /reference/engine/enums/FriendStatus - type: engineapi - source: /reference/engine/enums/FriendStatus.yaml - ignoreTranslation: true - - title: FunctionalTestResult - path: /reference/engine/enums/FunctionalTestResult - type: engineapi - source: /reference/engine/enums/FunctionalTestResult.yaml - ignoreTranslation: true - - title: GameAvatarType - path: /reference/engine/enums/GameAvatarType - type: engineapi - source: /reference/engine/enums/GameAvatarType.yaml - ignoreTranslation: true - - title: GamepadType - path: /reference/engine/enums/GamepadType - type: engineapi - source: /reference/engine/enums/GamepadType.yaml - ignoreTranslation: true - - title: GearGenreSetting - path: /reference/engine/enums/GearGenreSetting - type: engineapi - source: /reference/engine/enums/GearGenreSetting.yaml - ignoreTranslation: true - - title: GearType - path: /reference/engine/enums/GearType - type: engineapi - source: /reference/engine/enums/GearType.yaml - ignoreTranslation: true - - title: Genre - path: /reference/engine/enums/Genre - type: engineapi - source: /reference/engine/enums/Genre.yaml - ignoreTranslation: true - - title: GraphicsMode - path: /reference/engine/enums/GraphicsMode - type: engineapi - source: /reference/engine/enums/GraphicsMode.yaml - ignoreTranslation: true - - title: GraphicsOptimizationMode - path: /reference/engine/enums/GraphicsOptimizationMode - type: engineapi - source: /reference/engine/enums/GraphicsOptimizationMode.yaml - ignoreTranslation: true - - title: GroupMembershipStatus - path: /reference/engine/enums/GroupMembershipStatus - type: engineapi - source: /reference/engine/enums/GroupMembershipStatus.yaml - ignoreTranslation: true - - title: GuiState - path: /reference/engine/enums/GuiState - type: engineapi - source: /reference/engine/enums/GuiState.yaml - ignoreTranslation: true - - title: GuiType - path: /reference/engine/enums/GuiType - type: engineapi - source: /reference/engine/enums/GuiType.yaml - ignoreTranslation: true - - title: HandlesStyle - path: /reference/engine/enums/HandlesStyle - type: engineapi - source: /reference/engine/enums/HandlesStyle.yaml - ignoreTranslation: true - - title: HapticEffectType - path: /reference/engine/enums/HapticEffectType - type: engineapi - source: /reference/engine/enums/HapticEffectType.yaml - ignoreTranslation: true - - title: HashAlgorithm - path: /reference/engine/enums/HashAlgorithm - type: engineapi - source: /reference/engine/enums/HashAlgorithm.yaml - ignoreTranslation: true - - title: HighlightDepthMode - path: /reference/engine/enums/HighlightDepthMode - type: engineapi - source: /reference/engine/enums/HighlightDepthMode.yaml - ignoreTranslation: true - - title: HorizontalAlignment - path: /reference/engine/enums/HorizontalAlignment - type: engineapi - source: /reference/engine/enums/HorizontalAlignment.yaml - ignoreTranslation: true - - title: HoverAnimateSpeed - path: /reference/engine/enums/HoverAnimateSpeed - type: engineapi - source: /reference/engine/enums/HoverAnimateSpeed.yaml - ignoreTranslation: true - - title: HttpCachePolicy - path: /reference/engine/enums/HttpCachePolicy - type: engineapi - source: /reference/engine/enums/HttpCachePolicy.yaml - ignoreTranslation: true - - title: HttpCompression - path: /reference/engine/enums/HttpCompression - type: engineapi - source: /reference/engine/enums/HttpCompression.yaml - ignoreTranslation: true - - title: HttpContentType - path: /reference/engine/enums/HttpContentType - type: engineapi - source: /reference/engine/enums/HttpContentType.yaml - ignoreTranslation: true - - title: HttpError - path: /reference/engine/enums/HttpError - type: engineapi - source: /reference/engine/enums/HttpError.yaml - ignoreTranslation: true - - title: HttpRequestType - path: /reference/engine/enums/HttpRequestType - type: engineapi - source: /reference/engine/enums/HttpRequestType.yaml - ignoreTranslation: true - - title: HumanoidCollisionType - path: /reference/engine/enums/HumanoidCollisionType - type: engineapi - source: /reference/engine/enums/HumanoidCollisionType.yaml - ignoreTranslation: true - - title: HumanoidDisplayDistanceType - path: /reference/engine/enums/HumanoidDisplayDistanceType - type: engineapi - source: /reference/engine/enums/HumanoidDisplayDistanceType.yaml - ignoreTranslation: true - - title: HumanoidHealthDisplayType - path: /reference/engine/enums/HumanoidHealthDisplayType - type: engineapi - source: /reference/engine/enums/HumanoidHealthDisplayType.yaml - ignoreTranslation: true - - title: HumanoidRigType - path: /reference/engine/enums/HumanoidRigType - type: engineapi - source: /reference/engine/enums/HumanoidRigType.yaml - ignoreTranslation: true - - title: HumanoidStateType - path: /reference/engine/enums/HumanoidStateType - type: engineapi - source: /reference/engine/enums/HumanoidStateType.yaml - ignoreTranslation: true - - title: IKCollisionsMode - path: /reference/engine/enums/IKCollisionsMode - type: engineapi - source: /reference/engine/enums/IKCollisionsMode.yaml - ignoreTranslation: true - - title: IKControlConstraintSupport - path: /reference/engine/enums/IKControlConstraintSupport - type: engineapi - source: /reference/engine/enums/IKControlConstraintSupport.yaml - ignoreTranslation: true - - title: IKControlType - path: /reference/engine/enums/IKControlType - type: engineapi - source: /reference/engine/enums/IKControlType.yaml - ignoreTranslation: true - - title: ImageAlphaType - path: /reference/engine/enums/ImageAlphaType - type: engineapi - source: /reference/engine/enums/ImageAlphaType.yaml - ignoreTranslation: true - - title: ImageCombineType - path: /reference/engine/enums/ImageCombineType - type: engineapi - source: /reference/engine/enums/ImageCombineType.yaml - ignoreTranslation: true - - title: InfoType - path: /reference/engine/enums/InfoType - type: engineapi - source: /reference/engine/enums/InfoType.yaml - ignoreTranslation: true - - title: InitialDockState - path: /reference/engine/enums/InitialDockState - type: engineapi - source: /reference/engine/enums/InitialDockState.yaml - ignoreTranslation: true - - title: InOut - path: /reference/engine/enums/InOut - type: engineapi - source: /reference/engine/enums/InOut.yaml - ignoreTranslation: true - - title: InputActionType - path: /reference/engine/enums/InputActionType - type: engineapi - source: /reference/engine/enums/InputActionType.yaml - ignoreTranslation: true - - title: InputType - path: /reference/engine/enums/InputType - type: engineapi - source: /reference/engine/enums/InputType.yaml - ignoreTranslation: true - - title: InstanceFileSyncStatus - path: /reference/engine/enums/InstanceFileSyncStatus - type: engineapi - source: /reference/engine/enums/InstanceFileSyncStatus.yaml - ignoreTranslation: true - - title: IntermediateMeshGenerationResult - path: /reference/engine/enums/IntermediateMeshGenerationResult - type: engineapi - source: /reference/engine/enums/IntermediateMeshGenerationResult.yaml - ignoreTranslation: true - - title: InterpolationThrottlingMode - path: /reference/engine/enums/InterpolationThrottlingMode - type: engineapi - source: /reference/engine/enums/InterpolationThrottlingMode.yaml - ignoreTranslation: true - - title: InviteState - path: /reference/engine/enums/InviteState - type: engineapi - source: /reference/engine/enums/InviteState.yaml - ignoreTranslation: true - - title: ItemLineAlignment - path: /reference/engine/enums/ItemLineAlignment - type: engineapi - source: /reference/engine/enums/ItemLineAlignment.yaml - ignoreTranslation: true - - title: IXPLoadingStatus - path: /reference/engine/enums/IXPLoadingStatus - type: engineapi - source: /reference/engine/enums/IXPLoadingStatus.yaml - ignoreTranslation: true - - title: JoinSource - path: /reference/engine/enums/JoinSource - type: engineapi - source: /reference/engine/enums/JoinSource.yaml - ignoreTranslation: true - - title: JointCreationMode - path: /reference/engine/enums/JointCreationMode - type: engineapi - source: /reference/engine/enums/JointCreationMode.yaml - ignoreTranslation: true - - title: KeyCode - path: /reference/engine/enums/KeyCode - type: engineapi - source: /reference/engine/enums/KeyCode.yaml - ignoreTranslation: true - - title: KeyInterpolationMode - path: /reference/engine/enums/KeyInterpolationMode - type: engineapi - source: /reference/engine/enums/KeyInterpolationMode.yaml - ignoreTranslation: true - - title: KeywordFilterType - path: /reference/engine/enums/KeywordFilterType - type: engineapi - source: /reference/engine/enums/KeywordFilterType.yaml - ignoreTranslation: true - - title: Language - path: /reference/engine/enums/Language - type: engineapi - source: /reference/engine/enums/Language.yaml - ignoreTranslation: true - - title: LeftRight - path: /reference/engine/enums/LeftRight - type: engineapi - source: /reference/engine/enums/LeftRight.yaml - ignoreTranslation: true - - title: LexemeType - path: /reference/engine/enums/LexemeType - type: engineapi - source: /reference/engine/enums/LexemeType.yaml - ignoreTranslation: true - - title: LightingStyle - path: /reference/engine/enums/LightingStyle - type: engineapi - source: /reference/engine/enums/LightingStyle.yaml - ignoreTranslation: true - - title: Limb - path: /reference/engine/enums/Limb - type: engineapi - source: /reference/engine/enums/Limb.yaml - ignoreTranslation: true - - title: LineJoinMode - path: /reference/engine/enums/LineJoinMode - type: engineapi - source: /reference/engine/enums/LineJoinMode.yaml - ignoreTranslation: true - - title: ListDisplayMode - path: /reference/engine/enums/ListDisplayMode - type: engineapi - source: /reference/engine/enums/ListDisplayMode.yaml - ignoreTranslation: true - - title: ListenerLocation - path: /reference/engine/enums/ListenerLocation - type: engineapi - source: /reference/engine/enums/ListenerLocation.yaml - ignoreTranslation: true - - title: ListenerType - path: /reference/engine/enums/ListenerType - type: engineapi - source: /reference/engine/enums/ListenerType.yaml - ignoreTranslation: true - - title: LiveEditingAtomicUpdateResponse - path: /reference/engine/enums/LiveEditingAtomicUpdateResponse - type: engineapi - source: /reference/engine/enums/LiveEditingAtomicUpdateResponse.yaml - ignoreTranslation: true - - title: LiveEditingBroadcastMessageType - path: /reference/engine/enums/LiveEditingBroadcastMessageType - type: engineapi - source: /reference/engine/enums/LiveEditingBroadcastMessageType.yaml - ignoreTranslation: true - - title: LoadCharacterLayeredClothing - path: /reference/engine/enums/LoadCharacterLayeredClothing - type: engineapi - source: /reference/engine/enums/LoadCharacterLayeredClothing.yaml - ignoreTranslation: true - - title: LoadDynamicHeads - path: /reference/engine/enums/LoadDynamicHeads - type: engineapi - source: /reference/engine/enums/LoadDynamicHeads.yaml - ignoreTranslation: true - - title: LocationType - path: /reference/engine/enums/LocationType - type: engineapi - source: /reference/engine/enums/LocationType.yaml - ignoreTranslation: true - - title: LuauTypeCheckMode - path: /reference/engine/enums/LuauTypeCheckMode - type: engineapi - source: /reference/engine/enums/LuauTypeCheckMode.yaml - ignoreTranslation: true - - title: MakeupType - path: /reference/engine/enums/MakeupType - type: engineapi - source: /reference/engine/enums/MakeupType.yaml - ignoreTranslation: true - - title: MarketplaceBulkPurchasePromptStatus - path: /reference/engine/enums/MarketplaceBulkPurchasePromptStatus - type: engineapi - source: /reference/engine/enums/MarketplaceBulkPurchasePromptStatus.yaml - ignoreTranslation: true - - title: MarketplaceItemPurchaseStatus - path: /reference/engine/enums/MarketplaceItemPurchaseStatus - type: engineapi - source: /reference/engine/enums/MarketplaceItemPurchaseStatus.yaml - ignoreTranslation: true - - title: MarketplaceProductType - path: /reference/engine/enums/MarketplaceProductType - type: engineapi - source: /reference/engine/enums/MarketplaceProductType.yaml - ignoreTranslation: true - - title: MarkupKind - path: /reference/engine/enums/MarkupKind - type: engineapi - source: /reference/engine/enums/MarkupKind.yaml - ignoreTranslation: true - - title: MatchmakingType - path: /reference/engine/enums/MatchmakingType - type: engineapi - source: /reference/engine/enums/MatchmakingType.yaml - ignoreTranslation: true - - title: Material - path: /reference/engine/enums/Material - type: engineapi - source: /reference/engine/enums/Material.yaml - ignoreTranslation: true - - title: MaterialPattern - path: /reference/engine/enums/MaterialPattern - type: engineapi - source: /reference/engine/enums/MaterialPattern.yaml - ignoreTranslation: true - - title: MembershipType - path: /reference/engine/enums/MembershipType - type: engineapi - source: /reference/engine/enums/MembershipType.yaml - ignoreTranslation: true - - title: MeshPartDetailLevel - path: /reference/engine/enums/MeshPartDetailLevel - type: engineapi - source: /reference/engine/enums/MeshPartDetailLevel.yaml - ignoreTranslation: true - - title: MeshPartHeadsAndAccessories - path: /reference/engine/enums/MeshPartHeadsAndAccessories - type: engineapi - source: /reference/engine/enums/MeshPartHeadsAndAccessories.yaml - ignoreTranslation: true - - title: MeshScaleUnit - path: /reference/engine/enums/MeshScaleUnit - type: engineapi - source: /reference/engine/enums/MeshScaleUnit.yaml - ignoreTranslation: true - - title: MeshType - path: /reference/engine/enums/MeshType - type: engineapi - source: /reference/engine/enums/MeshType.yaml - ignoreTranslation: true - - title: MessageType - path: /reference/engine/enums/MessageType - type: engineapi - source: /reference/engine/enums/MessageType.yaml - ignoreTranslation: true - - title: ModelLevelOfDetail - path: /reference/engine/enums/ModelLevelOfDetail - type: engineapi - source: /reference/engine/enums/ModelLevelOfDetail.yaml - ignoreTranslation: true - - title: ModelStreamingBehavior - path: /reference/engine/enums/ModelStreamingBehavior - type: engineapi - source: /reference/engine/enums/ModelStreamingBehavior.yaml - ignoreTranslation: true - - title: ModelStreamingMode - path: /reference/engine/enums/ModelStreamingMode - type: engineapi - source: /reference/engine/enums/ModelStreamingMode.yaml - ignoreTranslation: true - - title: ModerationStatus - path: /reference/engine/enums/ModerationStatus - type: engineapi - source: /reference/engine/enums/ModerationStatus.yaml - ignoreTranslation: true - - title: ModifierKey - path: /reference/engine/enums/ModifierKey - type: engineapi - source: /reference/engine/enums/ModifierKey.yaml - ignoreTranslation: true - - title: MouseBehavior - path: /reference/engine/enums/MouseBehavior - type: engineapi - source: /reference/engine/enums/MouseBehavior.yaml - ignoreTranslation: true - - title: MoverConstraintRootBehaviorMode - path: /reference/engine/enums/MoverConstraintRootBehaviorMode - type: engineapi - source: /reference/engine/enums/MoverConstraintRootBehaviorMode.yaml - ignoreTranslation: true - - title: MoveState - path: /reference/engine/enums/MoveState - type: engineapi - source: /reference/engine/enums/MoveState.yaml - ignoreTranslation: true - - title: MuteState - path: /reference/engine/enums/MuteState - type: engineapi - source: /reference/engine/enums/MuteState.yaml - ignoreTranslation: true - - title: NameOcclusion - path: /reference/engine/enums/NameOcclusion - type: engineapi - source: /reference/engine/enums/NameOcclusion.yaml - ignoreTranslation: true - - title: NegateOperationHiddenHistory - path: /reference/engine/enums/NegateOperationHiddenHistory - type: engineapi - source: /reference/engine/enums/NegateOperationHiddenHistory.yaml - ignoreTranslation: true - - title: NetworkOwnership - path: /reference/engine/enums/NetworkOwnership - type: engineapi - source: /reference/engine/enums/NetworkOwnership.yaml - ignoreTranslation: true - - title: NetworkStatus - path: /reference/engine/enums/NetworkStatus - type: engineapi - source: /reference/engine/enums/NetworkStatus.yaml - ignoreTranslation: true - - title: NoiseType - path: /reference/engine/enums/NoiseType - type: engineapi - source: /reference/engine/enums/NoiseType.yaml - ignoreTranslation: true - - title: NormalId - path: /reference/engine/enums/NormalId - type: engineapi - source: /reference/engine/enums/NormalId.yaml - ignoreTranslation: true - - title: NotificationButtonType - path: /reference/engine/enums/NotificationButtonType - type: engineapi - source: /reference/engine/enums/NotificationButtonType.yaml - ignoreTranslation: true - - title: OperationType - path: /reference/engine/enums/OperationType - type: engineapi - source: /reference/engine/enums/OperationType.yaml - ignoreTranslation: true - - title: OrientationAlignmentMode - path: /reference/engine/enums/OrientationAlignmentMode - type: engineapi - source: /reference/engine/enums/OrientationAlignmentMode.yaml - ignoreTranslation: true - - title: OutfitSource - path: /reference/engine/enums/OutfitSource - type: engineapi - source: /reference/engine/enums/OutfitSource.yaml - ignoreTranslation: true - - title: OutfitType - path: /reference/engine/enums/OutfitType - type: engineapi - source: /reference/engine/enums/OutfitType.yaml - ignoreTranslation: true - - title: OutputLayoutMode - path: /reference/engine/enums/OutputLayoutMode - type: engineapi - source: /reference/engine/enums/OutputLayoutMode.yaml - ignoreTranslation: true - - title: OverrideMouseIconBehavior - path: /reference/engine/enums/OverrideMouseIconBehavior - type: engineapi - source: /reference/engine/enums/OverrideMouseIconBehavior.yaml - ignoreTranslation: true - - title: PackagePermission - path: /reference/engine/enums/PackagePermission - type: engineapi - source: /reference/engine/enums/PackagePermission.yaml - ignoreTranslation: true - - title: ParticleEmitterShape - path: /reference/engine/enums/ParticleEmitterShape - type: engineapi - source: /reference/engine/enums/ParticleEmitterShape.yaml - ignoreTranslation: true - - title: ParticleEmitterShapeInOut - path: /reference/engine/enums/ParticleEmitterShapeInOut - type: engineapi - source: /reference/engine/enums/ParticleEmitterShapeInOut.yaml - ignoreTranslation: true - - title: ParticleEmitterShapeStyle - path: /reference/engine/enums/ParticleEmitterShapeStyle - type: engineapi - source: /reference/engine/enums/ParticleEmitterShapeStyle.yaml - ignoreTranslation: true - - title: ParticleFlipbookLayout - path: /reference/engine/enums/ParticleFlipbookLayout - type: engineapi - source: /reference/engine/enums/ParticleFlipbookLayout.yaml - ignoreTranslation: true - - title: ParticleFlipbookMode - path: /reference/engine/enums/ParticleFlipbookMode - type: engineapi - source: /reference/engine/enums/ParticleFlipbookMode.yaml - ignoreTranslation: true - - title: ParticleFlipbookTextureCompatible - path: /reference/engine/enums/ParticleFlipbookTextureCompatible - type: engineapi - source: /reference/engine/enums/ParticleFlipbookTextureCompatible.yaml - ignoreTranslation: true - - title: ParticleOrientation - path: /reference/engine/enums/ParticleOrientation - type: engineapi - source: /reference/engine/enums/ParticleOrientation.yaml - ignoreTranslation: true - - title: PartType - path: /reference/engine/enums/PartType - type: engineapi - source: /reference/engine/enums/PartType.yaml - ignoreTranslation: true - - title: PathfindingUseImprovedSearch - path: /reference/engine/enums/PathfindingUseImprovedSearch - type: engineapi - source: /reference/engine/enums/PathfindingUseImprovedSearch.yaml - ignoreTranslation: true - - title: PathStatus - path: /reference/engine/enums/PathStatus - type: engineapi - source: /reference/engine/enums/PathStatus.yaml - ignoreTranslation: true - - title: PathWaypointAction - path: /reference/engine/enums/PathWaypointAction - type: engineapi - source: /reference/engine/enums/PathWaypointAction.yaml - ignoreTranslation: true - - title: PeoplePageLayout - path: /reference/engine/enums/PeoplePageLayout - type: engineapi - source: /reference/engine/enums/PeoplePageLayout.yaml - ignoreTranslation: true - - title: PermissionLevelShown - path: /reference/engine/enums/PermissionLevelShown - type: engineapi - source: /reference/engine/enums/PermissionLevelShown.yaml - ignoreTranslation: true - - title: PhysicsSimulationRate - path: /reference/engine/enums/PhysicsSimulationRate - type: engineapi - source: /reference/engine/enums/PhysicsSimulationRate.yaml - ignoreTranslation: true - - title: PhysicsSteppingMethod - path: /reference/engine/enums/PhysicsSteppingMethod - type: engineapi - source: /reference/engine/enums/PhysicsSteppingMethod.yaml - ignoreTranslation: true - - title: Platform - path: /reference/engine/enums/Platform - type: engineapi - source: /reference/engine/enums/Platform.yaml - ignoreTranslation: true - - title: PlaybackState - path: /reference/engine/enums/PlaybackState - type: engineapi - source: /reference/engine/enums/PlaybackState.yaml - ignoreTranslation: true - - title: PlayerActions - path: /reference/engine/enums/PlayerActions - type: engineapi - source: /reference/engine/enums/PlayerActions.yaml - ignoreTranslation: true - - title: PlayerCharacterDestroyBehavior - path: /reference/engine/enums/PlayerCharacterDestroyBehavior - type: engineapi - source: /reference/engine/enums/PlayerCharacterDestroyBehavior.yaml - ignoreTranslation: true - - title: PlayerChatType - path: /reference/engine/enums/PlayerChatType - type: engineapi - source: /reference/engine/enums/PlayerChatType.yaml - ignoreTranslation: true - - title: PlayerDataErrorState - path: /reference/engine/enums/PlayerDataErrorState - type: engineapi - source: /reference/engine/enums/PlayerDataErrorState.yaml - ignoreTranslation: true - - title: PlayerDataLoadFailureBehavior - path: /reference/engine/enums/PlayerDataLoadFailureBehavior - type: engineapi - source: /reference/engine/enums/PlayerDataLoadFailureBehavior.yaml - ignoreTranslation: true - - title: PlayerExitReason - path: /reference/engine/enums/PlayerExitReason - type: engineapi - source: /reference/engine/enums/PlayerExitReason.yaml - ignoreTranslation: true - - title: PoseEasingDirection - path: /reference/engine/enums/PoseEasingDirection - type: engineapi - source: /reference/engine/enums/PoseEasingDirection.yaml - ignoreTranslation: true - - title: PoseEasingStyle - path: /reference/engine/enums/PoseEasingStyle - type: engineapi - source: /reference/engine/enums/PoseEasingStyle.yaml - ignoreTranslation: true - - title: PositionAlignmentMode - path: /reference/engine/enums/PositionAlignmentMode - type: engineapi - source: /reference/engine/enums/PositionAlignmentMode.yaml - ignoreTranslation: true - - title: PredictionMode - path: /reference/engine/enums/PredictionMode - type: engineapi - source: /reference/engine/enums/PredictionMode.yaml - ignoreTranslation: true - - title: PredictionStatus - path: /reference/engine/enums/PredictionStatus - type: engineapi - source: /reference/engine/enums/PredictionStatus.yaml - ignoreTranslation: true - - title: PreferredInput - path: /reference/engine/enums/PreferredInput - type: engineapi - source: /reference/engine/enums/PreferredInput.yaml - ignoreTranslation: true - - title: PreferredTextSize - path: /reference/engine/enums/PreferredTextSize - type: engineapi - source: /reference/engine/enums/PreferredTextSize.yaml - ignoreTranslation: true - - title: PrimalPhysicsSolver - path: /reference/engine/enums/PrimalPhysicsSolver - type: engineapi - source: /reference/engine/enums/PrimalPhysicsSolver.yaml - ignoreTranslation: true - - title: PrimitiveType - path: /reference/engine/enums/PrimitiveType - type: engineapi - source: /reference/engine/enums/PrimitiveType.yaml - ignoreTranslation: true - - title: PrivilegeType - path: /reference/engine/enums/PrivilegeType - type: engineapi - source: /reference/engine/enums/PrivilegeType.yaml - ignoreTranslation: true - - title: ProductLocationRestriction - path: /reference/engine/enums/ProductLocationRestriction - type: engineapi - source: /reference/engine/enums/ProductLocationRestriction.yaml - ignoreTranslation: true - - title: ProductPurchaseChannel - path: /reference/engine/enums/ProductPurchaseChannel - type: engineapi - source: /reference/engine/enums/ProductPurchaseChannel.yaml - ignoreTranslation: true - - title: ProductPurchaseDecision - path: /reference/engine/enums/ProductPurchaseDecision - type: engineapi - source: /reference/engine/enums/ProductPurchaseDecision.yaml - ignoreTranslation: true - - title: PromptCreateAssetResult - path: /reference/engine/enums/PromptCreateAssetResult - type: engineapi - source: /reference/engine/enums/PromptCreateAssetResult.yaml - ignoreTranslation: true - - title: PromptCreateAvatarResult - path: /reference/engine/enums/PromptCreateAvatarResult - type: engineapi - source: /reference/engine/enums/PromptCreateAvatarResult.yaml - ignoreTranslation: true - - title: PromptExperienceDetailsResult - path: /reference/engine/enums/PromptExperienceDetailsResult - type: engineapi - source: /reference/engine/enums/PromptExperienceDetailsResult.yaml - ignoreTranslation: true - - title: PromptPublishAssetResult - path: /reference/engine/enums/PromptPublishAssetResult - type: engineapi - source: /reference/engine/enums/PromptPublishAssetResult.yaml - ignoreTranslation: true - - title: PropertyStatus - path: /reference/engine/enums/PropertyStatus - type: engineapi - source: /reference/engine/enums/PropertyStatus.yaml - ignoreTranslation: true - - title: ProximityPromptExclusivity - path: /reference/engine/enums/ProximityPromptExclusivity - type: engineapi - source: /reference/engine/enums/ProximityPromptExclusivity.yaml - ignoreTranslation: true - - title: ProximityPromptInputType - path: /reference/engine/enums/ProximityPromptInputType - type: engineapi - source: /reference/engine/enums/ProximityPromptInputType.yaml - ignoreTranslation: true - - title: ProximityPromptStyle - path: /reference/engine/enums/ProximityPromptStyle - type: engineapi - source: /reference/engine/enums/ProximityPromptStyle.yaml - ignoreTranslation: true - - title: QualityLevel - path: /reference/engine/enums/QualityLevel - type: engineapi - source: /reference/engine/enums/QualityLevel.yaml - ignoreTranslation: true - - title: R15CollisionType - path: /reference/engine/enums/R15CollisionType - type: engineapi - source: /reference/engine/enums/R15CollisionType.yaml - ignoreTranslation: true - - title: RaycastFilterType - path: /reference/engine/enums/RaycastFilterType - type: engineapi - source: /reference/engine/enums/RaycastFilterType.yaml - ignoreTranslation: true - - title: ReadCapturesFromGalleryResult - path: /reference/engine/enums/ReadCapturesFromGalleryResult - type: engineapi - source: /reference/engine/enums/ReadCapturesFromGalleryResult.yaml - ignoreTranslation: true - - title: RecommendationActionType - path: /reference/engine/enums/RecommendationActionType - type: engineapi - source: /reference/engine/enums/RecommendationActionType.yaml - ignoreTranslation: true - - title: RecommendationDepartureIntent - path: /reference/engine/enums/RecommendationDepartureIntent - type: engineapi - source: /reference/engine/enums/RecommendationDepartureIntent.yaml - ignoreTranslation: true - - title: RecommendationImpressionType - path: /reference/engine/enums/RecommendationImpressionType - type: engineapi - source: /reference/engine/enums/RecommendationImpressionType.yaml - ignoreTranslation: true - - title: RecommendationItemContentType - path: /reference/engine/enums/RecommendationItemContentType - type: engineapi - source: /reference/engine/enums/RecommendationItemContentType.yaml - ignoreTranslation: true - - title: RecommendationItemVisibility - path: /reference/engine/enums/RecommendationItemVisibility - type: engineapi - source: /reference/engine/enums/RecommendationItemVisibility.yaml - ignoreTranslation: true - - title: RejectCharacterDeletions - path: /reference/engine/enums/RejectCharacterDeletions - type: engineapi - source: /reference/engine/enums/RejectCharacterDeletions.yaml - ignoreTranslation: true - - title: RenderFidelity - path: /reference/engine/enums/RenderFidelity - type: engineapi - source: /reference/engine/enums/RenderFidelity.yaml - ignoreTranslation: true - - title: RenderingCacheOptimizationMode - path: /reference/engine/enums/RenderingCacheOptimizationMode - type: engineapi - source: /reference/engine/enums/RenderingCacheOptimizationMode.yaml - ignoreTranslation: true - - title: RenderingTestComparisonMethod - path: /reference/engine/enums/RenderingTestComparisonMethod - type: engineapi - source: /reference/engine/enums/RenderingTestComparisonMethod.yaml - ignoreTranslation: true - - title: RenderPriority - path: /reference/engine/enums/RenderPriority - type: engineapi - source: /reference/engine/enums/RenderPriority.yaml - ignoreTranslation: true - - title: ReplicateInstanceDestroySetting - path: /reference/engine/enums/ReplicateInstanceDestroySetting - type: engineapi - source: /reference/engine/enums/ReplicateInstanceDestroySetting.yaml - ignoreTranslation: true - - title: ResamplerMode - path: /reference/engine/enums/ResamplerMode - type: engineapi - source: /reference/engine/enums/ResamplerMode.yaml - ignoreTranslation: true - - title: ReservedHighlightId - path: /reference/engine/enums/ReservedHighlightId - type: engineapi - source: /reference/engine/enums/ReservedHighlightId.yaml - ignoreTranslation: true - - title: RestPose - path: /reference/engine/enums/RestPose - type: engineapi - source: /reference/engine/enums/RestPose.yaml - ignoreTranslation: true - - title: ReturnKeyType - path: /reference/engine/enums/ReturnKeyType - type: engineapi - source: /reference/engine/enums/ReturnKeyType.yaml - ignoreTranslation: true - - title: ReverbType - path: /reference/engine/enums/ReverbType - type: engineapi - source: /reference/engine/enums/ReverbType.yaml - ignoreTranslation: true - - title: RibbonTool - path: /reference/engine/enums/RibbonTool - type: engineapi - source: /reference/engine/enums/RibbonTool.yaml - ignoreTranslation: true - - title: RigScale - path: /reference/engine/enums/RigScale - type: engineapi - source: /reference/engine/enums/RigScale.yaml - ignoreTranslation: true - - title: RigType - path: /reference/engine/enums/RigType - type: engineapi - source: /reference/engine/enums/RigType.yaml - ignoreTranslation: true - - title: RollOffMode - path: /reference/engine/enums/RollOffMode - type: engineapi - source: /reference/engine/enums/RollOffMode.yaml - ignoreTranslation: true - - title: RolloutState - path: /reference/engine/enums/RolloutState - type: engineapi - source: /reference/engine/enums/RolloutState.yaml - ignoreTranslation: true - - title: RotationOrder - path: /reference/engine/enums/RotationOrder - type: engineapi - source: /reference/engine/enums/RotationOrder.yaml - ignoreTranslation: true - - title: RotationType - path: /reference/engine/enums/RotationType - type: engineapi - source: /reference/engine/enums/RotationType.yaml - ignoreTranslation: true - - title: RsvpStatus - path: /reference/engine/enums/RsvpStatus - type: engineapi - source: /reference/engine/enums/RsvpStatus.yaml - ignoreTranslation: true - - title: RtlTextSupport - path: /reference/engine/enums/RtlTextSupport - type: engineapi - source: /reference/engine/enums/RtlTextSupport.yaml - ignoreTranslation: true - - title: RunContext - path: /reference/engine/enums/RunContext - type: engineapi - source: /reference/engine/enums/RunContext.yaml - ignoreTranslation: true - - title: RunState - path: /reference/engine/enums/RunState - type: engineapi - source: /reference/engine/enums/RunState.yaml - ignoreTranslation: true - - title: RuntimeUndoBehavior - path: /reference/engine/enums/RuntimeUndoBehavior - type: engineapi - source: /reference/engine/enums/RuntimeUndoBehavior.yaml - ignoreTranslation: true - - title: SafeAreaCompatibility - path: /reference/engine/enums/SafeAreaCompatibility - type: engineapi - source: /reference/engine/enums/SafeAreaCompatibility.yaml - ignoreTranslation: true - - title: SalesTypeFilter - path: /reference/engine/enums/SalesTypeFilter - type: engineapi - source: /reference/engine/enums/SalesTypeFilter.yaml - ignoreTranslation: true - - title: SandboxedInstanceMode - path: /reference/engine/enums/SandboxedInstanceMode - type: engineapi - source: /reference/engine/enums/SandboxedInstanceMode.yaml - ignoreTranslation: true - - title: SaveAvatarThumbnailCustomizationFailure - path: /reference/engine/enums/SaveAvatarThumbnailCustomizationFailure - type: engineapi - source: /reference/engine/enums/SaveAvatarThumbnailCustomizationFailure.yaml - ignoreTranslation: true - - title: SavedQualitySetting - path: /reference/engine/enums/SavedQualitySetting - type: engineapi - source: /reference/engine/enums/SavedQualitySetting.yaml - ignoreTranslation: true - - title: SaveFilter - path: /reference/engine/enums/SaveFilter - type: engineapi - source: /reference/engine/enums/SaveFilter.yaml - ignoreTranslation: true - - title: ScaleType - path: /reference/engine/enums/ScaleType - type: engineapi - source: /reference/engine/enums/ScaleType.yaml - ignoreTranslation: true - - title: ScopeCheckResult - path: /reference/engine/enums/ScopeCheckResult - type: engineapi - source: /reference/engine/enums/ScopeCheckResult.yaml - ignoreTranslation: true - - title: ScreenInsets - path: /reference/engine/enums/ScreenInsets - type: engineapi - source: /reference/engine/enums/ScreenInsets.yaml - ignoreTranslation: true - - title: ScreenOrientation - path: /reference/engine/enums/ScreenOrientation - type: engineapi - source: /reference/engine/enums/ScreenOrientation.yaml - ignoreTranslation: true - - title: ScrollBarInset - path: /reference/engine/enums/ScrollBarInset - type: engineapi - source: /reference/engine/enums/ScrollBarInset.yaml - ignoreTranslation: true - - title: ScrollingDirection - path: /reference/engine/enums/ScrollingDirection - type: engineapi - source: /reference/engine/enums/ScrollingDirection.yaml - ignoreTranslation: true - - title: SecurityCapability - path: /reference/engine/enums/SecurityCapability - type: engineapi - source: /reference/engine/enums/SecurityCapability.yaml - ignoreTranslation: true - - title: SelectionBehavior - path: /reference/engine/enums/SelectionBehavior - type: engineapi - source: /reference/engine/enums/SelectionBehavior.yaml - ignoreTranslation: true - - title: SelectionRenderMode - path: /reference/engine/enums/SelectionRenderMode - type: engineapi - source: /reference/engine/enums/SelectionRenderMode.yaml - ignoreTranslation: true - - title: SelfViewPosition - path: /reference/engine/enums/SelfViewPosition - type: engineapi - source: /reference/engine/enums/SelfViewPosition.yaml - ignoreTranslation: true - - title: SensorMode - path: /reference/engine/enums/SensorMode - type: engineapi - source: /reference/engine/enums/SensorMode.yaml - ignoreTranslation: true - - title: SensorUpdateType - path: /reference/engine/enums/SensorUpdateType - type: engineapi - source: /reference/engine/enums/SensorUpdateType.yaml - ignoreTranslation: true - - title: ServerLiveEditingMode - path: /reference/engine/enums/ServerLiveEditingMode - type: engineapi - source: /reference/engine/enums/ServerLiveEditingMode.yaml - ignoreTranslation: true - - title: ServiceVisibility - path: /reference/engine/enums/ServiceVisibility - type: engineapi - source: /reference/engine/enums/ServiceVisibility.yaml - ignoreTranslation: true - - title: Severity - path: /reference/engine/enums/Severity - type: engineapi - source: /reference/engine/enums/Severity.yaml - ignoreTranslation: true - - title: ShowAdResult - path: /reference/engine/enums/ShowAdResult - type: engineapi - source: /reference/engine/enums/ShowAdResult.yaml - ignoreTranslation: true - - title: SignalBehavior - path: /reference/engine/enums/SignalBehavior - type: engineapi - source: /reference/engine/enums/SignalBehavior.yaml - ignoreTranslation: true - - title: SizeConstraint - path: /reference/engine/enums/SizeConstraint - type: engineapi - source: /reference/engine/enums/SizeConstraint.yaml - ignoreTranslation: true - - title: SolverConvergenceMetricType - path: /reference/engine/enums/SolverConvergenceMetricType - type: engineapi - source: /reference/engine/enums/SolverConvergenceMetricType.yaml - ignoreTranslation: true - - title: SolverConvergenceVisualizationMode - path: /reference/engine/enums/SolverConvergenceVisualizationMode - type: engineapi - source: /reference/engine/enums/SolverConvergenceVisualizationMode.yaml - ignoreTranslation: true - - title: SortDirection - path: /reference/engine/enums/SortDirection - type: engineapi - source: /reference/engine/enums/SortDirection.yaml - ignoreTranslation: true - - title: SortOrder - path: /reference/engine/enums/SortOrder - type: engineapi - source: /reference/engine/enums/SortOrder.yaml - ignoreTranslation: true - - title: SpecialKey - path: /reference/engine/enums/SpecialKey - type: engineapi - source: /reference/engine/enums/SpecialKey.yaml - ignoreTranslation: true - - title: StartCorner - path: /reference/engine/enums/StartCorner - type: engineapi - source: /reference/engine/enums/StartCorner.yaml - ignoreTranslation: true - - title: StateObjectFieldType - path: /reference/engine/enums/StateObjectFieldType - type: engineapi - source: /reference/engine/enums/StateObjectFieldType.yaml - ignoreTranslation: true - - title: Status - path: /reference/engine/enums/Status - type: engineapi - source: /reference/engine/enums/Status.yaml - ignoreTranslation: true - - title: StepFrequency - path: /reference/engine/enums/StepFrequency - type: engineapi - source: /reference/engine/enums/StepFrequency.yaml - ignoreTranslation: true - - title: StreamingIntegrityMode - path: /reference/engine/enums/StreamingIntegrityMode - type: engineapi - source: /reference/engine/enums/StreamingIntegrityMode.yaml - ignoreTranslation: true - - title: StreamingPauseMode - path: /reference/engine/enums/StreamingPauseMode - type: engineapi - source: /reference/engine/enums/StreamingPauseMode.yaml - ignoreTranslation: true - - title: StreamOutBehavior - path: /reference/engine/enums/StreamOutBehavior - type: engineapi - source: /reference/engine/enums/StreamOutBehavior.yaml - ignoreTranslation: true - - title: StrokeSizingMode - path: /reference/engine/enums/StrokeSizingMode - type: engineapi - source: /reference/engine/enums/StrokeSizingMode.yaml - ignoreTranslation: true - - title: StudioCloseMode - path: /reference/engine/enums/StudioCloseMode - type: engineapi - source: /reference/engine/enums/StudioCloseMode.yaml - ignoreTranslation: true - - title: StudioDataModelType - path: /reference/engine/enums/StudioDataModelType - type: engineapi - source: /reference/engine/enums/StudioDataModelType.yaml - ignoreTranslation: true - - title: StudioPlaceUpdateFailureReason - path: /reference/engine/enums/StudioPlaceUpdateFailureReason - type: engineapi - source: /reference/engine/enums/StudioPlaceUpdateFailureReason.yaml - ignoreTranslation: true - - title: StudioScriptEditorColorCategories - path: /reference/engine/enums/StudioScriptEditorColorCategories - type: engineapi - source: /reference/engine/enums/StudioScriptEditorColorCategories.yaml - ignoreTranslation: true - - title: StudioScriptEditorColorPresets - path: /reference/engine/enums/StudioScriptEditorColorPresets - type: engineapi - source: /reference/engine/enums/StudioScriptEditorColorPresets.yaml - ignoreTranslation: true - - title: StudioStyleGuideColor - path: /reference/engine/enums/StudioStyleGuideColor - type: engineapi - source: /reference/engine/enums/StudioStyleGuideColor.yaml - ignoreTranslation: true - - title: StudioStyleGuideModifier - path: /reference/engine/enums/StudioStyleGuideModifier - type: engineapi - source: /reference/engine/enums/StudioStyleGuideModifier.yaml - ignoreTranslation: true - - title: Style - path: /reference/engine/enums/Style - type: engineapi - source: /reference/engine/enums/Style.yaml - ignoreTranslation: true - - title: SubscriptionExpirationReason - path: /reference/engine/enums/SubscriptionExpirationReason - type: engineapi - source: /reference/engine/enums/SubscriptionExpirationReason.yaml - ignoreTranslation: true - - title: SubscriptionPaymentStatus - path: /reference/engine/enums/SubscriptionPaymentStatus - type: engineapi - source: /reference/engine/enums/SubscriptionPaymentStatus.yaml - ignoreTranslation: true - - title: SubscriptionPeriod - path: /reference/engine/enums/SubscriptionPeriod - type: engineapi - source: /reference/engine/enums/SubscriptionPeriod.yaml - ignoreTranslation: true - - title: SubscriptionState - path: /reference/engine/enums/SubscriptionState - type: engineapi - source: /reference/engine/enums/SubscriptionState.yaml - ignoreTranslation: true - - title: SurfaceConstraint - path: /reference/engine/enums/SurfaceConstraint - type: engineapi - source: /reference/engine/enums/SurfaceConstraint.yaml - ignoreTranslation: true - - title: SurfaceGuiShape - path: /reference/engine/enums/SurfaceGuiShape - type: engineapi - source: /reference/engine/enums/SurfaceGuiShape.yaml - ignoreTranslation: true - - title: SurfaceGuiSizingMode - path: /reference/engine/enums/SurfaceGuiSizingMode - type: engineapi - source: /reference/engine/enums/SurfaceGuiSizingMode.yaml - ignoreTranslation: true - - title: SurfaceType - path: /reference/engine/enums/SurfaceType - type: engineapi - source: /reference/engine/enums/SurfaceType.yaml - ignoreTranslation: true - - title: SwipeDirection - path: /reference/engine/enums/SwipeDirection - type: engineapi - source: /reference/engine/enums/SwipeDirection.yaml - ignoreTranslation: true - - title: SystemThemeValue - path: /reference/engine/enums/SystemThemeValue - type: engineapi - source: /reference/engine/enums/SystemThemeValue.yaml - ignoreTranslation: true - - title: TableMajorAxis - path: /reference/engine/enums/TableMajorAxis - type: engineapi - source: /reference/engine/enums/TableMajorAxis.yaml - ignoreTranslation: true - - title: TeamCreateErrorState - path: /reference/engine/enums/TeamCreateErrorState - type: engineapi - source: /reference/engine/enums/TeamCreateErrorState.yaml - ignoreTranslation: true - - title: Technology - path: /reference/engine/enums/Technology - type: engineapi - source: /reference/engine/enums/Technology.yaml - ignoreTranslation: true - - title: TeleportMethod - path: /reference/engine/enums/TeleportMethod - type: engineapi - source: /reference/engine/enums/TeleportMethod.yaml - ignoreTranslation: true - - title: TeleportResult - path: /reference/engine/enums/TeleportResult - type: engineapi - source: /reference/engine/enums/TeleportResult.yaml - ignoreTranslation: true - - title: TeleportState - path: /reference/engine/enums/TeleportState - type: engineapi - source: /reference/engine/enums/TeleportState.yaml - ignoreTranslation: true - - title: TeleportType - path: /reference/engine/enums/TeleportType - type: engineapi - source: /reference/engine/enums/TeleportType.yaml - ignoreTranslation: true - - title: TerrainAcquisitionMethod - path: /reference/engine/enums/TerrainAcquisitionMethod - type: engineapi - source: /reference/engine/enums/TerrainAcquisitionMethod.yaml - ignoreTranslation: true - - title: TerrainFace - path: /reference/engine/enums/TerrainFace - type: engineapi - source: /reference/engine/enums/TerrainFace.yaml - ignoreTranslation: true - - title: TextChatMessageStatus - path: /reference/engine/enums/TextChatMessageStatus - type: engineapi - source: /reference/engine/enums/TextChatMessageStatus.yaml - ignoreTranslation: true - - title: TextDirection - path: /reference/engine/enums/TextDirection - type: engineapi - source: /reference/engine/enums/TextDirection.yaml - ignoreTranslation: true - - title: TextFilterContext - path: /reference/engine/enums/TextFilterContext - type: engineapi - source: /reference/engine/enums/TextFilterContext.yaml - ignoreTranslation: true - - title: TextInputType - path: /reference/engine/enums/TextInputType - type: engineapi - source: /reference/engine/enums/TextInputType.yaml - ignoreTranslation: true - - title: TextTruncate - path: /reference/engine/enums/TextTruncate - type: engineapi - source: /reference/engine/enums/TextTruncate.yaml - ignoreTranslation: true - - title: TextureMode - path: /reference/engine/enums/TextureMode - type: engineapi - source: /reference/engine/enums/TextureMode.yaml - ignoreTranslation: true - - title: TextureQueryType - path: /reference/engine/enums/TextureQueryType - type: engineapi - source: /reference/engine/enums/TextureQueryType.yaml - ignoreTranslation: true - - title: TextXAlignment - path: /reference/engine/enums/TextXAlignment - type: engineapi - source: /reference/engine/enums/TextXAlignment.yaml - ignoreTranslation: true - - title: TextYAlignment - path: /reference/engine/enums/TextYAlignment - type: engineapi - source: /reference/engine/enums/TextYAlignment.yaml - ignoreTranslation: true - - title: ThreadPoolConfig - path: /reference/engine/enums/ThreadPoolConfig - type: engineapi - source: /reference/engine/enums/ThreadPoolConfig.yaml - ignoreTranslation: true - - title: ThrottlingPriority - path: /reference/engine/enums/ThrottlingPriority - type: engineapi - source: /reference/engine/enums/ThrottlingPriority.yaml - ignoreTranslation: true - - title: ThumbnailSize - path: /reference/engine/enums/ThumbnailSize - type: engineapi - source: /reference/engine/enums/ThumbnailSize.yaml - ignoreTranslation: true - - title: ThumbnailType - path: /reference/engine/enums/ThumbnailType - type: engineapi - source: /reference/engine/enums/ThumbnailType.yaml - ignoreTranslation: true - - title: TickCountSampleMethod - path: /reference/engine/enums/TickCountSampleMethod - type: engineapi - source: /reference/engine/enums/TickCountSampleMethod.yaml - ignoreTranslation: true - - title: TonemapperPreset - path: /reference/engine/enums/TonemapperPreset - type: engineapi - source: /reference/engine/enums/TonemapperPreset.yaml - ignoreTranslation: true - - title: TopBottom - path: /reference/engine/enums/TopBottom - type: engineapi - source: /reference/engine/enums/TopBottom.yaml - ignoreTranslation: true - - title: TouchCameraMovementMode - path: /reference/engine/enums/TouchCameraMovementMode - type: engineapi - source: /reference/engine/enums/TouchCameraMovementMode.yaml - ignoreTranslation: true - - title: TouchMovementMode - path: /reference/engine/enums/TouchMovementMode - type: engineapi - source: /reference/engine/enums/TouchMovementMode.yaml - ignoreTranslation: true - - title: TrackerError - path: /reference/engine/enums/TrackerError - type: engineapi - source: /reference/engine/enums/TrackerError.yaml - ignoreTranslation: true - - title: TrackerExtrapolationFlagMode - path: /reference/engine/enums/TrackerExtrapolationFlagMode - type: engineapi - source: /reference/engine/enums/TrackerExtrapolationFlagMode.yaml - ignoreTranslation: true - - title: TrackerFaceTrackingStatus - path: /reference/engine/enums/TrackerFaceTrackingStatus - type: engineapi - source: /reference/engine/enums/TrackerFaceTrackingStatus.yaml - ignoreTranslation: true - - title: TrackerLodFlagMode - path: /reference/engine/enums/TrackerLodFlagMode - type: engineapi - source: /reference/engine/enums/TrackerLodFlagMode.yaml - ignoreTranslation: true - - title: TrackerLodValueMode - path: /reference/engine/enums/TrackerLodValueMode - type: engineapi - source: /reference/engine/enums/TrackerLodValueMode.yaml - ignoreTranslation: true - - title: TrackerMode - path: /reference/engine/enums/TrackerMode - type: engineapi - source: /reference/engine/enums/TrackerMode.yaml - ignoreTranslation: true - - title: TrackerPromptEvent - path: /reference/engine/enums/TrackerPromptEvent - type: engineapi - source: /reference/engine/enums/TrackerPromptEvent.yaml - ignoreTranslation: true - - title: TrackerType - path: /reference/engine/enums/TrackerType - type: engineapi - source: /reference/engine/enums/TrackerType.yaml - ignoreTranslation: true - - title: TriStateBoolean - path: /reference/engine/enums/TriStateBoolean - type: engineapi - source: /reference/engine/enums/TriStateBoolean.yaml - ignoreTranslation: true - - title: TweenStatus - path: /reference/engine/enums/TweenStatus - type: engineapi - source: /reference/engine/enums/TweenStatus.yaml - ignoreTranslation: true - - title: UICaptureMode - path: /reference/engine/enums/UICaptureMode - type: engineapi - source: /reference/engine/enums/UICaptureMode.yaml - ignoreTranslation: true - - title: UIDragDetectorBoundingBehavior - path: /reference/engine/enums/UIDragDetectorBoundingBehavior - type: engineapi - source: /reference/engine/enums/UIDragDetectorBoundingBehavior.yaml - ignoreTranslation: true - - title: UIDragDetectorDragRelativity - path: /reference/engine/enums/UIDragDetectorDragRelativity - type: engineapi - source: /reference/engine/enums/UIDragDetectorDragRelativity.yaml - ignoreTranslation: true - - title: UIDragDetectorDragSpace - path: /reference/engine/enums/UIDragDetectorDragSpace - type: engineapi - source: /reference/engine/enums/UIDragDetectorDragSpace.yaml - ignoreTranslation: true - - title: UIDragDetectorDragStyle - path: /reference/engine/enums/UIDragDetectorDragStyle - type: engineapi - source: /reference/engine/enums/UIDragDetectorDragStyle.yaml - ignoreTranslation: true - - title: UIDragDetectorResponseStyle - path: /reference/engine/enums/UIDragDetectorResponseStyle - type: engineapi - source: /reference/engine/enums/UIDragDetectorResponseStyle.yaml - ignoreTranslation: true - - title: UIDragSpeedAxisMapping - path: /reference/engine/enums/UIDragSpeedAxisMapping - type: engineapi - source: /reference/engine/enums/UIDragSpeedAxisMapping.yaml - ignoreTranslation: true - - title: UIFlexAlignment - path: /reference/engine/enums/UIFlexAlignment - type: engineapi - source: /reference/engine/enums/UIFlexAlignment.yaml - ignoreTranslation: true - - title: UIFlexMode - path: /reference/engine/enums/UIFlexMode - type: engineapi - source: /reference/engine/enums/UIFlexMode.yaml - ignoreTranslation: true - - title: UiMessageType - path: /reference/engine/enums/UiMessageType - type: engineapi - source: /reference/engine/enums/UiMessageType.yaml - ignoreTranslation: true - - title: UITheme - path: /reference/engine/enums/UITheme - type: engineapi - source: /reference/engine/enums/UITheme.yaml - ignoreTranslation: true - - title: UploadCaptureResult - path: /reference/engine/enums/UploadCaptureResult - type: engineapi - source: /reference/engine/enums/UploadCaptureResult.yaml - ignoreTranslation: true - - title: UsageContext - path: /reference/engine/enums/UsageContext - type: engineapi - source: /reference/engine/enums/UsageContext.yaml - ignoreTranslation: true - - title: UserCFrame - path: /reference/engine/enums/UserCFrame - type: engineapi - source: /reference/engine/enums/UserCFrame.yaml - ignoreTranslation: true - - title: UserInputState - path: /reference/engine/enums/UserInputState - type: engineapi - source: /reference/engine/enums/UserInputState.yaml - ignoreTranslation: true - - title: UserInputType - path: /reference/engine/enums/UserInputType - type: engineapi - source: /reference/engine/enums/UserInputType.yaml - ignoreTranslation: true - - title: VelocityConstraintMode - path: /reference/engine/enums/VelocityConstraintMode - type: engineapi - source: /reference/engine/enums/VelocityConstraintMode.yaml - ignoreTranslation: true - - title: VerticalAlignment - path: /reference/engine/enums/VerticalAlignment - type: engineapi - source: /reference/engine/enums/VerticalAlignment.yaml - ignoreTranslation: true - - title: VerticalScrollBarPosition - path: /reference/engine/enums/VerticalScrollBarPosition - type: engineapi - source: /reference/engine/enums/VerticalScrollBarPosition.yaml - ignoreTranslation: true - - title: VibrationMotor - path: /reference/engine/enums/VibrationMotor - type: engineapi - source: /reference/engine/enums/VibrationMotor.yaml - ignoreTranslation: true - - title: VideoCaptureResult - path: /reference/engine/enums/VideoCaptureResult - type: engineapi - source: /reference/engine/enums/VideoCaptureResult.yaml - ignoreTranslation: true - - title: VideoCaptureStartedResult - path: /reference/engine/enums/VideoCaptureStartedResult - type: engineapi - source: /reference/engine/enums/VideoCaptureStartedResult.yaml - ignoreTranslation: true - - title: VideoDeviceCaptureQuality - path: /reference/engine/enums/VideoDeviceCaptureQuality - type: engineapi - source: /reference/engine/enums/VideoDeviceCaptureQuality.yaml - ignoreTranslation: true - - title: VideoError - path: /reference/engine/enums/VideoError - type: engineapi - source: /reference/engine/enums/VideoError.yaml - ignoreTranslation: true - - title: VideoSampleSize - path: /reference/engine/enums/VideoSampleSize - type: engineapi - source: /reference/engine/enums/VideoSampleSize.yaml - ignoreTranslation: true - - title: ViewMode - path: /reference/engine/enums/ViewMode - type: engineapi - source: /reference/engine/enums/ViewMode.yaml - ignoreTranslation: true - - title: VirtualCursorMode - path: /reference/engine/enums/VirtualCursorMode - type: engineapi - source: /reference/engine/enums/VirtualCursorMode.yaml - ignoreTranslation: true - - title: VirtualInputMode - path: /reference/engine/enums/VirtualInputMode - type: engineapi - source: /reference/engine/enums/VirtualInputMode.yaml - ignoreTranslation: true - - title: VoiceChatDistanceAttenuationType - path: /reference/engine/enums/VoiceChatDistanceAttenuationType - type: engineapi - source: /reference/engine/enums/VoiceChatDistanceAttenuationType.yaml - ignoreTranslation: true - - title: VoiceChatState - path: /reference/engine/enums/VoiceChatState - type: engineapi - source: /reference/engine/enums/VoiceChatState.yaml - ignoreTranslation: true - - title: VoiceControlPath - path: /reference/engine/enums/VoiceControlPath - type: engineapi - source: /reference/engine/enums/VoiceControlPath.yaml - ignoreTranslation: true - - title: VolumetricAudio - path: /reference/engine/enums/VolumetricAudio - type: engineapi - source: /reference/engine/enums/VolumetricAudio.yaml - ignoreTranslation: true - - title: VRComfortSetting - path: /reference/engine/enums/VRComfortSetting - type: engineapi - source: /reference/engine/enums/VRComfortSetting.yaml - ignoreTranslation: true - - title: VRControllerModelMode - path: /reference/engine/enums/VRControllerModelMode - type: engineapi - source: /reference/engine/enums/VRControllerModelMode.yaml - ignoreTranslation: true - - title: VRDeviceType - path: /reference/engine/enums/VRDeviceType - type: engineapi - source: /reference/engine/enums/VRDeviceType.yaml - ignoreTranslation: true - - title: VRLaserPointerMode - path: /reference/engine/enums/VRLaserPointerMode - type: engineapi - source: /reference/engine/enums/VRLaserPointerMode.yaml - ignoreTranslation: true - - title: VRSafetyBubbleMode - path: /reference/engine/enums/VRSafetyBubbleMode - type: engineapi - source: /reference/engine/enums/VRSafetyBubbleMode.yaml - ignoreTranslation: true - - title: VRScaling - path: /reference/engine/enums/VRScaling - type: engineapi - source: /reference/engine/enums/VRScaling.yaml - ignoreTranslation: true - - title: VRSessionState - path: /reference/engine/enums/VRSessionState - type: engineapi - source: /reference/engine/enums/VRSessionState.yaml - ignoreTranslation: true - - title: VRTouchpad - path: /reference/engine/enums/VRTouchpad - type: engineapi - source: /reference/engine/enums/VRTouchpad.yaml - ignoreTranslation: true - - title: VRTouchpadMode - path: /reference/engine/enums/VRTouchpadMode - type: engineapi - source: /reference/engine/enums/VRTouchpadMode.yaml - ignoreTranslation: true - - title: WaterDirection - path: /reference/engine/enums/WaterDirection - type: engineapi - source: /reference/engine/enums/WaterDirection.yaml - ignoreTranslation: true - - title: WaterForce - path: /reference/engine/enums/WaterForce - type: engineapi - source: /reference/engine/enums/WaterForce.yaml - ignoreTranslation: true - - title: WebSocketState - path: /reference/engine/enums/WebSocketState - type: engineapi - source: /reference/engine/enums/WebSocketState.yaml - ignoreTranslation: true - - title: WebStreamClientState - path: /reference/engine/enums/WebStreamClientState - type: engineapi - source: /reference/engine/enums/WebStreamClientState.yaml - ignoreTranslation: true - - title: WebStreamClientType - path: /reference/engine/enums/WebStreamClientType - type: engineapi - source: /reference/engine/enums/WebStreamClientType.yaml - ignoreTranslation: true - - title: WeldConstraintPreserve - path: /reference/engine/enums/WeldConstraintPreserve - type: engineapi - source: /reference/engine/enums/WeldConstraintPreserve.yaml - ignoreTranslation: true - - title: WhisperChatPrivacyMode - path: /reference/engine/enums/WhisperChatPrivacyMode - type: engineapi - source: /reference/engine/enums/WhisperChatPrivacyMode.yaml - ignoreTranslation: true - - title: WrapLayerAutoSkin - path: /reference/engine/enums/WrapLayerAutoSkin - type: engineapi - source: /reference/engine/enums/WrapLayerAutoSkin.yaml - ignoreTranslation: true - - title: WrapLayerDebugMode - path: /reference/engine/enums/WrapLayerDebugMode - type: engineapi - source: /reference/engine/enums/WrapLayerDebugMode.yaml - ignoreTranslation: true - - title: WrapTargetDebugMode - path: /reference/engine/enums/WrapTargetDebugMode - type: engineapi - source: /reference/engine/enums/WrapTargetDebugMode.yaml - ignoreTranslation: true - - title: ZIndexBehavior - path: /reference/engine/enums/ZIndexBehavior - type: engineapi - source: /reference/engine/enums/ZIndexBehavior.yaml - ignoreTranslation: true - - title: Globals - path: /reference/engine/globals - source: /reference/engine/globals.md - section: - - title: Lua Globals - path: /reference/engine/globals/LuaGlobals - type: engineapi - source: /reference/engine/globals/LuaGlobals.yaml - ignoreTranslation: true - - title: Roblox Globals - path: /reference/engine/globals/RobloxGlobals - type: engineapi - source: /reference/engine/globals/RobloxGlobals.yaml - ignoreTranslation: true - - title: Libraries - path: /reference/engine/libraries - source: /reference/engine/libraries.md - section: - - title: bit32 - path: /reference/engine/libraries/bit32 - type: engineapi - source: /reference/engine/libraries/bit32.yaml - ignoreTranslation: true - - title: buffer - path: /reference/engine/libraries/buffer - type: engineapi - source: /reference/engine/libraries/buffer.yaml - ignoreTranslation: true - - title: coroutine - path: /reference/engine/libraries/coroutine - type: engineapi - source: /reference/engine/libraries/coroutine.yaml - ignoreTranslation: true - - title: debug - path: /reference/engine/libraries/debug - type: engineapi - source: /reference/engine/libraries/debug.yaml - ignoreTranslation: true - - title: math - path: /reference/engine/libraries/math - type: engineapi - source: /reference/engine/libraries/math.yaml - ignoreTranslation: true - - title: os - path: /reference/engine/libraries/os - type: engineapi - source: /reference/engine/libraries/os.yaml - ignoreTranslation: true - - title: string - path: /reference/engine/libraries/string - type: engineapi - source: /reference/engine/libraries/string.yaml - ignoreTranslation: true - - title: table - path: /reference/engine/libraries/table - type: engineapi - source: /reference/engine/libraries/table.yaml - ignoreTranslation: true - - title: task - path: /reference/engine/libraries/task - type: engineapi - source: /reference/engine/libraries/task.yaml - ignoreTranslation: true - - title: utf8 - path: /reference/engine/libraries/utf8 - type: engineapi - source: /reference/engine/libraries/utf8.yaml - ignoreTranslation: true - - title: vector - path: /reference/engine/libraries/vector - type: engineapi - source: /reference/engine/libraries/vector.yaml - ignoreTranslation: true - - include: /engine/releaseNotes.yaml diff --git a/.cursor/rules/roblox/common/navigation/engine/resources.yaml b/.cursor/rules/roblox/common/navigation/engine/resources.yaml deleted file mode 100644 index 3db0501d..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/resources.yaml +++ /dev/null @@ -1,121 +0,0 @@ -navigation: - - heading: Code samples - - title: Overview - path: /samples/ - - heading: Feature packages - - title: Overview - path: /resources/feature-packages/ - - title: Bundles - path: /resources/feature-packages/bundles - - title: Missions - path: /resources/feature-packages/missions - - title: Season passes - path: /resources/feature-packages/season-passes - - title: Engagement rewards - path: /resources/feature-packages/engagement-rewards - - title: Changelog - path: /resources/feature-packages/changelog - - heading: Developer modules - - title: Overview - path: /resources/modules/ - - title: Selfie Mode - path: /resources/modules/selfie-mode - - title: Merch Booth - path: /resources/modules/merch-booth - - title: Friends Locator - path: /resources/modules/friends-locator - - title: Profile Card - path: /resources/modules/profile-card - - title: Emote Bar - path: /resources/modules/emote-bar - - title: Spawn With Friends - path: /resources/modules/spawn-with-friends - - title: Photo Booth - path: /resources/modules/photo-booth - - title: Surface Art - path: /resources/modules/surface-art - - title: Scavenger Hunt - path: /resources/modules/scavenger-hunt - - title: Social Interactions - path: /resources/modules/social-interactions - - title: Event Sequencer - path: /resources/modules/event-sequencer - - heading: Scripting libraries - - title: Overview - path: /resources/scripting-libraries - - heading: Projects and kits - - title: Templates - path: /resources/templates - - title: Roblox Connect project - path: /resources/roblox-connect - - title: Plant reference project - path: /resources/plant-reference-project - - - heading: Resources - - title: The Mystery of Duvall Drive - path: /resources/the-mystery-of-duvall-drive/ - section: - - title: Overview - path: /resources/the-mystery-of-duvall-drive/ - - title: Construct the house - path: /resources/the-mystery-of-duvall-drive/construct-the-house - - title: Materialize the world - path: /resources/the-mystery-of-duvall-drive/materialize-the-world - - title: Immersive narrative - path: /resources/the-mystery-of-duvall-drive/immersive-narrative - - title: Stream in immersion - path: /resources/the-mystery-of-duvall-drive/stream-in-immersion - - title: Develop a moving world - path: /resources/the-mystery-of-duvall-drive/develop-a-moving-world - - title: Design dark soundscapes - path: /resources/the-mystery-of-duvall-drive/design-dark-soundscapes - - title: Technical overview - path: /resources/the-mystery-of-duvall-drive/technical-overview - section: - - title: Overview - path: /resources/the-mystery-of-duvall-drive/technical-overview - - title: Main design requirements - path: /resources/the-mystery-of-duvall-drive/main-design-requirements - - title: Foundational gameplay systems - path: /resources/the-mystery-of-duvall-drive/foundational-gameplay-systems - - title: Supporting systems - path: /resources/the-mystery-of-duvall-drive/supporting-systems - - title: Beyond the Dark - path: /resources/beyond-the-dark/ - section: - - title: Overview - path: /resources/beyond-the-dark/ - - title: Architecture - path: /resources/beyond-the-dark/building-architecture - - title: Characters - path: /resources/beyond-the-dark/custom-characters - - title: Layered clothing - path: /resources/beyond-the-dark/layered-clothing - - title: Sound design - path: /resources/beyond-the-dark/sound-design - - title: User interface - path: /resources/beyond-the-dark/user-interface - - - title: Battle Royale - path: /resources/battle-royale/ - section: - - title: Overview - path: /resources/battle-royale/ - - title: Installation and setup - path: /resources/battle-royale/installation-and-setup - - title: Run the game - path: /resources/battle-royale/run-the-game - - title: Core scripts - path: /resources/battle-royale/core-scripts - - title: Pickup system - path: /resources/battle-royale/pickup-system - - title: Building system - path: /resources/battle-royale/building-system - - title: Minimap system - path: /resources/battle-royale/minimap-system - - title: The storm - path: /resources/battle-royale/the-storm - - title: Weapons kit - path: /resources/weapons-kit - - title: NPC kit - path: /resources/npc-kit diff --git a/.cursor/rules/roblox/common/navigation/engine/studio.yaml b/.cursor/rules/roblox/common/navigation/engine/studio.yaml deleted file mode 100644 index a4c08437..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/studio.yaml +++ /dev/null @@ -1,62 +0,0 @@ -defaultType: markdown -navigation: - - heading: Roblox Studio - - title: Overview - path: /studio/ - - title: Setup - path: /studio/setup - - title: Interface - path: /studio/ui-overview - - title: Assistant - path: /assistant/guide - section: - - title: Overview - path: /assistant/guide - - title: Prompt guide and examples - path: /assistant/prompt-engineering - - heading: Building tools - - title: Align - path: /studio/align-tool - - title: Pivot - path: /studio/pivot-tools - - title: Terrain Editor - path: /studio/terrain-editor - - title: Material Generator - path: /studio/material-generator - - title: Texture Generator - path: /studio/texture-generator - - title: Rig Generator - path: /studio/rig-builder - - heading: Scripting tools - - title: Script Editor - path: /studio/script-editor - - title: Debugging - path: /studio/debugging - - heading: Testing tools - - title: Testing modes - path: /studio/testing-modes - - title: Output - path: /studio/output - - title: Developer Console - path: /studio/developer-console - section: - - title: Overview - path: /studio/developer-console - - title: Script Profiler - path: /studio/optimization/scriptprofiler - - title: Memory usage - path: /studio/optimization/memory-usage - - heading: UI reference - - title: Explorer - path: /studio/explorer - - title: Properties - path: /studio/properties - - title: Experience Settings - path: /studio/experience-settings - - title: Avatar Settings - path: /studio/avatar-settings - - heading: Plugins - - title: Overview - path: /studio/plugins - - title: Studio widgets - path: /studio/build-studio-widgets diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-animator.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-animator.yaml deleted file mode 100644 index e6b69c2d..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-animator.yaml +++ /dev/null @@ -1,17 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Learn to animate - - title: Overview - path: /tutorials/curriculums/animator/ - - title: Get started - path: /tutorials/curriculums/animator/get-started - - title: Work with the Animation Editor - path: /tutorials/curriculums/animator/work-with-the-animation-editor - - title: Play your animation - path: /tutorials/curriculums/animator/play-your-animation - - title: Test and save - path: /tutorials/curriculums/animator/test-and-save - - title: Next steps - path: /tutorials/curriculums/animator/next-steps diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-artist.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-artist.yaml deleted file mode 100644 index 8b984a0d..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-artist.yaml +++ /dev/null @@ -1,15 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Learn to create VFX art - - title: Overview - path: /tutorials/curriculums/artist/ - - title: Get started - path: /tutorials/curriculums/artist/get-started - - title: Work with particle emitters - path: /tutorials/curriculums/artist/work-with-particle-emitters - - title: Test and save - path: /tutorials/curriculums/artist/test-and-save - - title: Next steps - path: /tutorials/curriculums/artist/next-steps diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-building.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-building.yaml deleted file mode 100644 index 58470c0d..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-building.yaml +++ /dev/null @@ -1,17 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Learn to build an obby - - title: Overview - path: /tutorials/curriculums/building/ - - title: Get started - path: /tutorials/curriculums/building/get-started - - title: Work with parts - path: /tutorials/curriculums/building/work-with-parts - - title: AI Assistant - path: /tutorials/curriculums/building/code-with-assistant - - title: Test and save - path: /tutorials/curriculums/building/test-and-save - - title: Next steps - path: /tutorials/curriculums/building/next-steps \ No newline at end of file diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-coding.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-coding.yaml deleted file mode 100644 index c738ffc2..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-coding.yaml +++ /dev/null @@ -1,17 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Learn to code - - title: Overview - path: /tutorials/curriculums/coding/ - - title: Get started - path: /tutorials/curriculums/coding/get-started - - title: Work with variables - path: /tutorials/curriculums/coding/work-with-variables - - title: Test and save - path: /tutorials/curriculums/coding/test-and-save - - title: Customize strings - path: /tutorials/curriculums/coding/customize-strings - - title: Next steps - path: /tutorials/curriculums/coding/next-steps diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-core.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-core.yaml deleted file mode 100644 index eee93c0a..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-core.yaml +++ /dev/null @@ -1,30 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Overview - - title: Core curriculum - path: /tutorials/curriculums/core/ - - heading: Build - - title: Create a project - path: /tutorials/curriculums/core/building/create-a-project - - title: Create an environment with terrain - path: /tutorials/curriculums/core/building/create-an-environment-with-terrain - - title: Greybox a playable area - path: /tutorials/curriculums/core/building/greybox-a-playable-area - - heading: Script - - title: Create a coin collection mechanic - path: /tutorials/curriculums/core/scripting/script-game-behavior - - title: Record and display player data - path: /tutorials/curriculums/core/scripting/record-and-display-player-data - - title: Create player hazards - path: /tutorials/curriculums/core/scripting/create-player-hazards - - title: Script an upgrade button - path: /tutorials/curriculums/core/scripting/script-an-upgrade-button - - heading: Polish - - title: Create basic visual effects - path: /tutorials/curriculums/core/building/create-basic-visual-effects - - title: Customize global lighting - path: /tutorials/curriculums/core/building/customize-global-lighting - - title: Apply polished assets - path: /tutorials/curriculums/core/building/apply-polished-assets diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-ea.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-ea.yaml deleted file mode 100644 index 57ee5a3a..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-ea.yaml +++ /dev/null @@ -1,17 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Environmental art curriculum - - title: Overview - path: /tutorials/curriculums/environmental-art/ - - title: Greybox your environment - path: /tutorials/curriculums/environmental-art/greybox-your-environment - - title: Develop polished assets - path: /tutorials/curriculums/environmental-art/develop-polished-assets - - title: Assemble an asset library - path: /tutorials/curriculums/environmental-art/assemble-an-asset-library - - title: Construct your world - path: /tutorials/curriculums/environmental-art/construct-your-world - - title: Optimize your experience - path: /tutorials/curriculums/environmental-art/optimize-your-experience diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-fundamentals.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-fundamentals.yaml deleted file mode 100644 index e7e9e8c5..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-fundamentals.yaml +++ /dev/null @@ -1,79 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Coding fundamentals - - title: Overview - path: /tutorials/fundamentals/coding-1/coding-fundamentals - - title: Variables & objects - path: /tutorials/fundamentals/coding-1/landing - section: - - title: Create a script - path: /tutorials/fundamentals/coding-1/create-a-script - - title: Object properties - path: /tutorials/fundamentals/coding-1/object-properties - - title: Parents and children - path: /tutorials/fundamentals/coding-1/parents-and-children - - title: Functions and events - path: /tutorials/fundamentals/coding-2/functions-and-events - section: - - title: Code a function - path: /tutorials/fundamentals/coding-2/code-a-function - - title: Use information with parameters - path: /tutorials/fundamentals/coding-2/use-parameters-and-events - - title: Parameters practice - buttons - path: /tutorials/fundamentals/coding-2/parameters-practice-buttons - - title: Multiple parameters and arguments - path: /tutorials/fundamentals/coding-2/multiple-parameters-and-arguments - - title: Conditionals - path: /tutorials/fundamentals/coding-3/landing - section: - - title: Intro to if statements - path: /tutorials/fundamentals/coding-3/intro-to-if-statements - - title: If/then practice - traps - path: /tutorials/fundamentals/coding-3/traps-with-if-statements - - title: If/then practice - power ups - path: /tutorials/fundamentals/coding-3/powerups-with-if-statements - - title: Multiple conditions with else/if - path: /tutorials/fundamentals/coding-3/multiple-conditions - - title: Else/if practice - giving points - path: /tutorials/fundamentals/coding-3/give-points - - title: Loops - path: /tutorials/fundamentals/coding-4/landing - section: - - title: Repeat code with while loops - path: /tutorials/fundamentals/coding-4/repeat-code-with-while-loops - - title: Intro to for loops - path: /tutorials/fundamentals/coding-4/intro-to-for-loops - - title: Glow lights with for loops - path: /tutorials/fundamentals/coding-4/glow-lights-with-for-loops - - title: Timed bridge for loops - path: /tutorials/fundamentals/coding-4/create-a-timed-bridge - - title: Nest loops - path: /tutorials/fundamentals/coding-4/nested-loops - - title: Dictionaries and arrays - path: /tutorials/fundamentals/coding-5/landing - section: - - title: Intro to arrays - path: /tutorials/fundamentals/coding-5/intro-to-arrays - - title: Loop through arrays - path: /tutorials/fundamentals/coding-5/loops-and-arrays - - title: Make changes to arrays - path: /tutorials/fundamentals/coding-5/make-changes-to-arrays - - title: Intro to dictionaries - path: /tutorials/fundamentals/coding-5/intro-to-dictionaries - - title: Pairs and iPairs - path: /tutorials/fundamentals/coding-5/pairs-and-ipairs - - title: Return values from tables - path: /tutorials/fundamentals/coding-5/return-values-from-tables - - title: Organize code - path: /tutorials/fundamentals/coding-6/landing - section: - - title: Intro to module scripts - path: /tutorials/fundamentals/coding-6/intro-to-module-scripts - - title: Create with module scripts - path: /tutorials/fundamentals/coding-6/create-with-module-scripts - - title: Code abstraction - path: /tutorials/fundamentals/coding-6/coding-concept-abstraction - - title: Code algorithms - path: /tutorials/fundamentals/coding-6/coding-concept-algorithms diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-gs.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-gs.yaml deleted file mode 100644 index 6d581599..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-gs.yaml +++ /dev/null @@ -1,17 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Gameplay scripting curriculum - - title: Overview - path: /tutorials/curriculums/gameplay-scripting/ - - title: Create teams - path: /tutorials/curriculums/gameplay-scripting/create-teams - - title: Spawn and respawn - path: /tutorials/curriculums/gameplay-scripting/spawn-respawn - - title: Add rounds - path: /tutorials/curriculums/gameplay-scripting/add-rounds - - title: Implement blaster behavior - path: /tutorials/curriculums/gameplay-scripting/implement-blasters - - title: Detect hits - path: /tutorials/curriculums/gameplay-scripting/detect-hits diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-studio.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-studio.yaml deleted file mode 100644 index 160f2fbe..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-studio.yaml +++ /dev/null @@ -1,15 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: Learn about Studio - - title: Overview - path: /tutorials/curriculums/studio/ - - title: Create Roblox account - path: /tutorials/curriculums/studio/create-account - - title: Install Roblox Studio - path: /tutorials/curriculums/studio/install-studio - - title: Explore UI - path: /tutorials/curriculums/studio/explore-ui - - title: Next steps - path: /tutorials/curriculums/studio/next-steps diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials-ui.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials-ui.yaml deleted file mode 100644 index 6097af86..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials-ui.yaml +++ /dev/null @@ -1,13 +0,0 @@ -backTo: - title: Back to tutorials - path: /tutorials/ -navigation: - - heading: UI design curriculum - - title: Overview - path: /tutorials/curriculums/user-interface-design/ - - title: Choose an art style - path: /tutorials/curriculums/user-interface-design/choose-an-art-style - - title: Wireframe your layouts - path: /tutorials/curriculums/user-interface-design/wireframe-your-layouts - - title: Implement designs in Studio - path: /tutorials/curriculums/user-interface-design/implement-designs-in-studio diff --git a/.cursor/rules/roblox/common/navigation/engine/tutorials.yaml b/.cursor/rules/roblox/common/navigation/engine/tutorials.yaml deleted file mode 100644 index 5befa612..00000000 --- a/.cursor/rules/roblox/common/navigation/engine/tutorials.yaml +++ /dev/null @@ -1,173 +0,0 @@ -navigation: - - heading: Get started - - title: Overview - path: /tutorials/ - - title: Brand new to Studio? - section: - - title: Studio lesson - path: /tutorials/curriculums/studio - navigation: /engine/tutorials-studio.yaml - - title: Building lesson - path: /tutorials/curriculums/building - navigation: /engine/tutorials-building.yaml - - title: Coding lesson - path: /tutorials/curriculums/coding - navigation: /engine/tutorials-coding.yaml - - title: VFX lesson - path: /tutorials/curriculums/artist - navigation: /engine/tutorials-artist.yaml - - title: Animation lesson - path: /tutorials/curriculums/animator - navigation: /engine/tutorials-animator.yaml - - title: Create your first experience - path: /tutorials/curriculums/core/ - navigation: /engine/tutorials-core.yaml - - title: Luau basics - path: /tutorials/fundamentals/coding-1/coding-fundamentals - navigation: /engine/tutorials-fundamentals.yaml - - heading: Intermediate tutorials - - title: Overview - path: /tutorials/use-case-tutorials/use-case-tutorial-overview - - title: Modeling - section: - - title: Neon signs - path: /tutorials/use-case-tutorials/modeling/create-neon-signs - - title: Modular environments - path: /tutorials/use-case-tutorials/modeling/assemble-modular-environments - - title: User interfaces - section: - - title: HUD meters - path: /tutorials/use-case-tutorials/ui/create-hud-meters - - title: Interactive UI - path: /tutorials/use-case-tutorials/ui/interactive-ui - - title: Proximity prompts - path: /tutorials/use-case-tutorials/ui/proximity-prompts - - title: Score bars - path: /tutorials/use-case-tutorials/ui/create-a-score-bar - - title: Audio - section: - - title: 2D audio - path: /tutorials/use-case-tutorials/audio/add-2D-audio - - title: 3D audio - path: /tutorials/use-case-tutorials/audio/add-3D-audio - - title: Voice chat - path: /tutorials/use-case-tutorials/audio/add-voice-chat - - title: Text-to-speech - path: /tutorials/use-case-tutorials/audio/add-text-to-speech - - title: Speech-to-text - path: /tutorials/use-case-tutorials/audio/speech-to-text - - title: Lighting - section: - - title: Indoor environments - path: /tutorials/use-case-tutorials/lighting/enhance-indoor-environments - - title: Outdoor environments - path: /tutorials/use-case-tutorials/lighting/enhance-outdoor-environments - - title: VFX - section: - - title: Laser beams - path: /tutorials/use-case-tutorials/vfx/laser-traps-with-beams - - title: Waterfalls - path: /tutorials/use-case-tutorials/vfx/create-waterfalls - - title: Volcanoes - path: /tutorials/use-case-tutorials/vfx/create-volcanoes - - title: Explosions - path: /tutorials/use-case-tutorials/vfx/use-particles-for-explosions - - title: Physics - section: - - title: Moving objects - path: /tutorials/use-case-tutorials/physics/create-moving-objects - - title: Spinning objects - path: /tutorials/use-case-tutorials/physics/create-spinning-objects - - title: Animation - section: - - title: In Studio - section: - - title: Create character animations - path: /tutorials/use-case-tutorials/animation/create-an-animation - - title: Play character animations - path: /tutorials/use-case-tutorials/animation/play-character-animations - - title: In Blender - section: - - title: Rig simple meshes - path: /art/modeling/rig-a-simple-mesh - - title: Skin simple meshes - path: /art/modeling/skin-a-simple-mesh - - title: Rig humanoid models - path: /art/modeling/rig-a-humanoid-model - - title: Skin humanoid models - path: /art/modeling/skin-a-humanoid-model - - title: Scripting - section: - - title: Basic gameplay - section: - - title: Introduction to scripting - path: /tutorials/use-case-tutorials/scripting/basic-scripting/intro-to-scripting - - title: Deadly lava - path: /tutorials/use-case-tutorials/scripting/basic-scripting/deadly-lava - - title: Fading trap - path: /tutorials/use-case-tutorials/scripting/basic-scripting/fading-trap - - title: Score points - path: /tutorials/use-case-tutorials/scripting/basic-scripting/score-points - - title: Intermediate gameplay - section: - - title: Health pickups - path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/create-a-health-pickup - - title: Player tools - path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/create-player-tools - - title: Hit detection with lasers - path: /tutorials/use-case-tutorials/scripting/intermediate-scripting/hit-detection-with-lasers - - title: Input and camera - section: - - title: Control the user's camera - path: /tutorials/use-case-tutorials/input-and-camera/control-the-users-camera - - title: Detect user input - path: /tutorials/use-case-tutorials/input-and-camera/detect-user-input - - title: Data storage - section: - - title: Save player data - path: /tutorials/use-case-tutorials/data-storage/save-player-data - - title: Create a custom leaderboard - path: /tutorials/use-case-tutorials/data-storage/create-leaderboard - - title: Avatar items - section: - - title: Create accessories from an existing model - path: /art/accessories/from-existing - - title: Rig and cage an existing model - path: /art/accessories/rig-and-cage-existing-models - - title: Create basic heads - path: /art/characters/facial-animation/create-basic-heads - - title: Create face accessories - path: /art/characters/facial-animation/create-face-accessories - - title: Publish eyebrows and eyelashes - path: /art/accessories/publish-eyebrows-eyelashes - - title: Test characters - path: /art/characters/testing/ - section: - - title: Overview - path: /art/characters/testing/ - - title: In Blender - path: /art/characters/testing/blender - - title: In Studio - path: /art/characters/testing/studio - - heading: Advanced paths - - title: Overview - path: /tutorials/curriculums/curriculum-overview - - title: Environmental art - path: /tutorials/curriculums/environmental-art/ - navigation: /engine/tutorials-ea.yaml - - title: Gameplay scripting - path: /tutorials/curriculums/gameplay-scripting/ - navigation: /engine/tutorials-gs.yaml - - title: User interface design - path: /tutorials/curriculums/user-interface-design/ - navigation: /engine/tutorials-ui.yaml - # avatar/tutorials content needs to move somewhere - - title: Rigid accessories - path: /art/accessories/creating-rigid/ - navigation: /avatar/tutorials-accessories.yaml - - title: Clothing - path: /art/accessories/creating - navigation: /avatar/tutorials-clothing.yaml - - title: Bodies - path: /art/characters/creating - navigation: /avatar/tutorials-bodies.yaml diff --git a/.cursor/rules/roblox/common/navigation/monetize.yaml b/.cursor/rules/roblox/common/navigation/monetize.yaml deleted file mode 100644 index 402dee17..00000000 --- a/.cursor/rules/roblox/common/navigation/monetize.yaml +++ /dev/null @@ -1,60 +0,0 @@ -navigation: - - heading: Monetize - - title: Overview - path: /monetize-experiences - - title: Earn - path: /production/monetization/ - section: - - title: Creator Rewards - path: /creator-rewards - - title: Private servers - path: /production/monetization/private-servers - - title: Subscriptions - path: /production/monetization/subscriptions - - title: Passes - path: /production/monetization/passes - - title: Developer products - path: /production/monetization/developer-products - - title: Commerce products - path: /production/monetization/commerce-products - - title: Paid access in Robux - path: /production/monetization/paid-access-robux - - title: Paid access in local currency - path: /production/monetization/paid-access-local-currency - - title: Price optimization - path: /production/monetization/price-optimization - - title: Regional Pricing - path: /production/monetization/regional-pricing - - - title: License - path: /ip-licensing/ - section: - - title: Tools for IP holders - path: /ip-licensing/get-started - section: - - title: Get started - path: /ip-licensing/get-started - - title: License Manager - path: /ip-licensing/license-manager - - title: Rights Manager - path: /production/publishing/rights-manager - - title: IP licensing for creators - path: /ip-licensing/creators - - title: FAQ and guidelines - path: /ip-licensing/faq - - title: Glossary - path: /ip-licensing/glossary - - - title: Advertise - path: /production/promotion/advertise - section: - - title: Ads Manager - path: /production/promotion/ads-manager - - title: Roblox-served ads vs. independent ads - path: /production/promotion/advertise-on-roblox - - title: Immersive ads - path: /production/monetization/immersive-ads - - title: Rewarded video ads - path: /production/promotion/rewarded-video-ads - - title: Advertising standards - path: /production/promotion/comply-with-advertising-standards diff --git a/.cursor/rules/roblox/common/navigation/platform.yaml b/.cursor/rules/roblox/common/navigation/platform.yaml deleted file mode 100644 index faaa7de4..00000000 --- a/.cursor/rules/roblox/common/navigation/platform.yaml +++ /dev/null @@ -1,43 +0,0 @@ -navigation: - - heading: Platform - - title: Get Started - path: /get-started/ - section: - - title: Why should I develop on Roblox? - path: /get-started/why-build-on-roblox - - title: How is Roblox different from other platforms? - path: /get-started/how-is-roblox-different - - title: What tools does Roblox provide? - path: /get-started/tools - - title: How do I make money? - path: /get-started/monetization - - title: Recommended strategies - path: /get-started/strategies - - title: Start creating - path: /get-started/creating - - title: Resources - path: /get-started/resources - - title: Create - path: /platform - - title: Scale - path: /scale - - title: Monetize - path: /monetize - - title: Guidelines and policies - section: - - title: Safety on Roblox - path: /safety - - title: Content maturity - path: /production/promotion/content-maturity - - title: Regional content availability - path: /production/promotion/regional-content-availability - - title: GDPR and CCPA - path: /production/publishing/about-GDPR-and-CCPA - - title: DMCA - path: /production/publishing/dmca-guidelines - - title: AI data sharing - path: /ai-data-sharing - - title: Account verification - path: /production/publishing/account-verification - - title: Group guidelines - path: /projects/group-guidelines diff --git a/.cursor/rules/roblox/common/navigation/programs.yaml b/.cursor/rules/roblox/common/navigation/programs.yaml deleted file mode 100644 index b80ea182..00000000 --- a/.cursor/rules/roblox/common/navigation/programs.yaml +++ /dev/null @@ -1,34 +0,0 @@ -navigation: - - heading: Creator Programs - - title: Overview - path: /creator-programs/ - - title: Brand Developer Directory - path: /creator-programs/brand-developer-directory - - title: Community Feedback - path: /creator-programs/feedback - - title: Community Safety Council - path: /creator-programs/safety-council - - title: Creator Events - path: /creator-programs/creator-events - - title: Creator Fund - path: /creator-fund - - title: Creator Spotlights - path: /creator-programs/spotlights - - title: Developer Awards - path: /creator-programs/developer-awards - - title: Inspire - path: /creator-programs/inspire - - title: Learn & Explore Sort - path: /creator-programs/learn-explore-sort - - title: Managed Brand Integrations - path: /creator-programs/managed-brand-integrations - - title: Roblox Developers Conference (RDC) - path: /creator-programs/rdc - - title: Roblox Innovation Awards - path: /creator-programs/innovation-awards - - title: Roblox Research Panel - path: /creator-programs/research-panel - - title: Today's Picks on Home - path: /creator-programs/todays-picks-home - - title: Today's Picks on Marketplace - path: /creator-programs/todays-picks-marketplace diff --git a/.cursor/rules/roblox/common/navigation/scale.yaml b/.cursor/rules/roblox/common/navigation/scale.yaml deleted file mode 100644 index 9629f86a..00000000 --- a/.cursor/rules/roblox/common/navigation/scale.yaml +++ /dev/null @@ -1,119 +0,0 @@ -navigation: - - heading: Scale - # - title: Overview - # path: /scale-experiences - - title: Discovery - path: /discovery - section: - - title: Charts page - section: - - title: Genres - path: /production/publishing/experience-genres - - title: Icons - path: /production/publishing/experience-icons - - title: Thumbnails - path: /production/publishing/thumbnails - - title: Badges - path: /production/publishing/badges - - title: Events - path: /production/promotion/experience-events - - title: Player invite prompts - path: /production/promotion/invite-prompts - - title: Connection referral system - path: /production/promotion/referral-system - - title: Notifications - path: /production/promotion/experience-notifications - - title: Social media links - path: /production/promotion/social-media-links - - title: Share links - path: /production/promotion/share-links - - - title: Localization - section: - - title: Overview - path: /production/localization/ - - title: Automatic translation - section: - - title: Enable automatic translations - path: /production/localization/automatic-translations - - title: Translate dynamic content - path: /production/localization/auto-translate-dynamic-content - - title: Manual translations - section: - - title: Overview - path: /production/localization/manual-translations - - title: Add source content - path: /production/localization/add-source-content - - title: Remove content - path: /production/localization/remove-content - - title: Add translations - path: /production/localization/add-translations - - title: Dynamic content - path: /production/localization/translate-dynamic-content - - title: Scripting - path: /production/localization/localize-with-scripting - - title: Work with translators - path: /production/localization/work-with-translators - - title: Language codes - path: /production/localization/language-codes - - - title: Game design - path: /production/game-design/ - section: - - title: Design your experience - section: - - title: Design for Roblox - path: /production/game-design/design-for-roblox - - title: Roblox user base - path: /production/roblox-user-base - - title: Core loops - path: /production/game-design/core-loops - - title: Prototyping - path: /production/game-design/prototyping - - - title: Build your experience - section: - - title: Onboarding - path: /production/game-design/onboarding - - title: Onboarding techniques - path: /production/game-design/onboarding-techniques - - title: Quest design - path: /production/game-design/introduction-to-quest-design - - title: UI and UX - path: /production/game-design/ui-ux-design - - title: Accessibility guidelines - path: /production/publishing/accessibility - - title: Adaptive design guidelines - path: /production/publishing/adaptive-design - section: - - title: Overview - path: /production/publishing/adaptive-design - - title: Console - path: /production/publishing/console-guidelines - - title: VR - path: /production/publishing/vr-guidelines - - title: Monetize your experience - section: - - title: Monetization - path: /production/game-design/monetization-foundations - - title: Season passes - path: /production/game-design/season-pass-design - - title: Starter packs - path: /production/game-design/starter-pack-design - - title: Subscriptions - path: /production/game-design/subscription-design - - title: Contextual purchases - path: /production/game-design/contextual-purchases - - title: Virtual economies - path: /production/game-design/balance-virtual-economies - - - title: Support your experience - section: - - title: LiveOps essentials - path: /production/game-design/liveops-essentials - - title: LiveOps planning - path: /production/game-design/liveops-planning - - title: Analytics essentials - path: /production/game-design/analytics-essentials - - title: Content updates - path: /production/game-design/content-updates diff --git a/.cursor/rules/roblox/en-us/affiliates.md b/.cursor/rules/roblox/en-us/affiliates.md deleted file mode 100644 index dcfe935f..00000000 --- a/.cursor/rules/roblox/en-us/affiliates.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Creator Affiliate Program -description: Learn how to earn Robux by driving users to experiences. ---- - - -Effective July 24, 2025, the Creator Affiliate program is deprecated and has been replaced by the [Creator Rewards](./creator-rewards.md) program. - - -The [Creator Affiliate Program](https://create.roblox.com/affiliate) is a pilot program that lets you earn Robux using affiliate links. With it, you can: - -- Generate affiliate share links for any Roblox experience, including other developers' experiences, through the Creator Hub. -- Promote your affiliate links off-platform on social media channels. -- Earn revenue in Robux whenever new users create a Roblox account and purchase Robux using your affiliate link. A new user is someone who doesn't already have an alternative Roblox account. -- Exchange your Robux earnings for real-world money using the Developer Exchange program. - -When a user creates a Roblox account using your affiliate link and then buys Robux, you can receive up to 50% of the value of their Robux purchases during their first six months on the platform, for a maximum revenue of \$100 USD per new user. For example, if a new user joins Roblox and purchases \$100 USD of Robux, you can earn up to \$50 USD, minus certain fees like taxes and VAT. - -You receive your revenue in Robux, which you can exchange for real-world money through Developer Exchange. diff --git a/.cursor/rules/roblox/en-us/ai-data-sharing.md b/.cursor/rules/roblox/en-us/ai-data-sharing.md deleted file mode 100644 index a605c09e..00000000 --- a/.cursor/rules/roblox/en-us/ai-data-sharing.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: AI data sharing -description: Understand AI data sharing policies and how to update your preferences. ---- - -Roblox has a suite of AI-powered solutions, including [Code Assist](studio/script-editor.md#code-assist), [Material Generator](studio/material-generator.md), [Assistant](assistant/guide.md), in-experience chat translation, [Texture Generator](studio/texture-generator.md), and [Avatar Setup](/avatar-setup/index.md). These tools help you quickly find information, accelerate the creation process, and complement your existing skillset. - -To improve these tools and build new ones, Roblox uses data to train its generative AI models. - -When you publish an experience in Studio, upload an avatar item, or upload a **paid** asset to the [Creator Store](production/creator-store.md), you have the option to share your data. The default choice in the user interface is based on a setting in the [Creator Hub](https://create.roblox.com/). - -An image of the publish experience dialog showing the data sharing toggle. - -- The data sharing setting is **off by default** for experiences, avatar items, and paid assets published prior to July 10, 2024. -- The data sharing setting is **on by default** for experiences, avatar items, and paid assets published on or after July 10, 2024. - -You can change your default choice at any time and override it as desired whenever you publish. - - -Because they're distributed with the intent of others using them, **free** [Creator Store](production/creator-store.md) assets are shared by default, with no ability to disable sharing. - - -## Manage data sharing preferences - -To set your global data sharing preferences: - -1. On the [Creator Hub](https://create.roblox.com/), click your user name and **Settings**. -1. Select **Data Sharing**. -1. Enable or disable **Make sharing data the default option when publishing experiences**. -1. (Optional) Choose individual experiences, avatar items, and paid Creator Store assets to share or not share. - -## How Roblox uses data - -All data shared with Roblox is for AI-enhancement purposes only and is not shared with third parties. Data is processed and stored in accordance with strict security protocols, contains no personal information, is split into tokens (small snippets) for further anonymization, and is retained for only as long as it is beneficial for model improvement. Roblox regularly reviews and purges shared data. - -If you share something and then later stop sharing it, Roblox will remove it from the training dataset within 30 days. Any AI models that were trained using your data will be updated within 365 days. - -
    Sources and ownership of the datasets
    - -Roblox's generative AI systems made available to the public are trained on the following, with particular data sources varying for each system: - -- Data from publicly accessible repositories under permissive licenses or released in the public domain -- Non-public data obtained from third-party providers via commercial arrangements -- Data from user activity on our platform and from our creators who have not opted-out from model training -- Data generated internally, including synthetic data -- Data provided by annotation services and other contractors - -
    Purpose and methodology of data collection, cleaning, processing, or modification
    - -Roblox uses training data to develop or enhance its AI offerings to its creators. Data enables contextual understanding and generation with respect to language capabilities, as well as within virtual, 3D environments, including with respect to materials, textures, geometry, and structures, to enhance details, interactions, and relevance among objects. - -Data is retained for only as long as it is beneficial for model improvement. Roblox regularly reviews and purges data. - -
    Data points included in the datasets, such as types, labels, and counters
    - -Training data incorporates various types of (a) written and audio text including in a variety of languages; (b) visual content; and (c) annotations, rating, and preference data. The size of datasets varies by system type and version, but the amount of training can range up to over 3 million distinct assets. - -
    Licensing status, indicating whether datasets are copyright-protected, purchased, licensed, or in the public domain
    - -Training data may include data subject to third party intellectual property rights. Third party data is derived from data repositories under (a) permissive licenses or released in the public domain; (b) third-party providers via commercial arrangements; and (c) our creators on our platform who have not opted-out from model training. Roblox conducts diligence on training data, including from third-party sources. - -
    Inclusion of personal or aggregate consumer information, as defined by the California Consumer Privacy Act
    - -Roblox implements processes including filtering to exclude personal information from training generative AI systems available for public use. Creator data is also tokenized to ensure it is not associated with an individual. To the extent data may contain aggregate consumer information, Roblox does not use it to identify or target individuals. Creators on our platform can control their data sharing preferences, including opting-out of their content being used for training, and all users may request deletion of personal information generally. - -
    Cleaning, processing, or other modification of datasets by the developer and the respective purpose for each modification
    - -Roblox employs various data processing techniques to enhance efficiency, quality, and safety, and to protect sensitive information, including deduplication, classification, and safety and privacy filtering. - -
    Use of synthetic data in development and/or training of the system
    - -Generated synthetic data is included in datasets used in development and training. - -
    Dates when datasets were first used and the time frame during which the data was collected
    - -Roblox started compiling and using datasets for generative AI systems in 2023. Such use is ongoing. - -
    Additional information
    - -For additional information, refer to our model cards and research papers related to our published models. - -This information is provided pursuant to California Civil Code Section 3111 (AB 2013) and is subject to update. - -## Public Luau - -Previously, Roblox launched a program that allowed you to share your scripts with Roblox, a public Luau dataset, or both. Roblox no longer uses the script data that was shared only with Roblox. Instead, you now decide if you want to share entire experiences, including their scripts. - -The Luau public dataset is not affected by this change. You can set your sharing preferences on the Creator Hub in the **Public Luau** tab. For more details on the public dataset, see [Empower Luau creation](https://create.roblox.com/data-collection). diff --git a/.cursor/rules/roblox/en-us/animation/capture.md b/.cursor/rules/roblox/en-us/animation/capture.md deleted file mode 100644 index 0a1b4731..00000000 --- a/.cursor/rules/roblox/en-us/animation/capture.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Animation capture -description: Animation Capture in the Animation Editor allows you to generate high-quality, realistic animations for faces and bodies. ---- - -import BetaAlert from '../includes/beta-features/beta-alert.md' - -You can record or upload video content to the [Animation Editor](../animation/editor.md) to quickly capture movement and expressions as animation keyframes. These tools can create unique and realistic animations within minutes while providing access to the animation keyframes for additional adjustments. - -The animation capture tools allow you to: - -- [Record your face](#face) with a webcam to puppeteer characters with [animation compatible heads](../art/characters/facial-animation/index.md). -- [Upload full-body video content](#body) to generate high quality realistic animations for an entire character. - -## Face - -**Animation Capture - Face** allows you to use your webcam to puppeteer rigs with [animation compatible heads](../art/characters/facial-animation/index.md) and generate corresponding keyframes to your movement. With the ability to record up to 60‑second animations, you can quickly provide both your playable and nonplayable characters the means to realistically grin, raise their eyebrows, drop their jaw, or any other expression necessary for your experience. - - - -Before you begin to record your face, ensure that you're in a well lit room close enough to your camera so that your face is in the center of your camera's recording frame. This increases your camera's ability to distinguish you from your surroundings so that you can accurately puppeteer your avatar and create high-quality animations. - -1. From the toolbar's **Avatar** tab, click **Animation**. The [Animation Editor](../animation/editor.md) window displays. -2. In the 3D viewport or the [Explorer](../studio/explorer.md) hierarchy, select the rig you want your video to animate. Enter a new animation name in the dialog window and click the **Create** button. -3. Navigate to the **track list** and click the **Face Capture** button. A popup displays asking you to acknowledge that you consent to the collection of your facial movements to enable the feature and camera access. - - - -4. If you have multiple cameras, choose which camera you want to use to record. - -5. In the controls widget in the 3D viewport, click the red circle. Your camera begins recording your facial movements. - - - -6. When you finish your recording, click either the red square or countdown timer. Keyframes that correspond to your facial movement display within the timeline. - - - -7. If you'd like to delete the recording and try again, click **Re‑Record**. - -After you finish your recording, you can [fine-tune](../animation/editor.md#keyframes) the keyframes, [save](../animation/editor.md#save-an-animation) your animation, then [export](../animation/editor.md#export-an-animation) it to use across all of your experiences. - -## Body - -The **Animation Capture - Body** allows you to quickly generate high-quality, realistic full-body animations for your R15 rigs by uploading videos to use to track the body's movement and generate corresponding keyframes. This significantly speeds up the manual process of creating animations, and allows you to personalize your avatars and NPCs with life-like mannerisms in a few minutes. - - - -Before you import a video to the **Animation Editor**, ensure the `.mp4` or `.mov` file meets the following requirements: - -- It includes just one person who is well-lit and visible throughout the video. -- It only contains a continuous single shot that's less than 15 seconds from a stable camera. -- It adheres to Roblox's [Community Rules](https://en.help.roblox.com/hc/articles/203313410) and [Terms of Use](https://en.help.roblox.com/hc/articles/115004647846). - -To import a video to create an animation: - -1. From the toolbar's **Avatar** tab, click **Animation**. The [Animation Editor](../animation/editor.md) window displays. -2. In the 3D viewport or the [Explorer](../studio/explorer.md) hierarchy, select the R15 rig you want your video to animate. Enter a new animation name in the dialog window and click the **Create** button. -3. Navigate to the **media and playback controls** and click the **⋯** button, then navigate to **Import** ⟩ **Live Animation Creator**. - - - -4. In the popup dialog, click the **Choose Video** button. -5. Select the video you want to import from your local machine, then click the **Open** button. After about a minute, keyframes that correspond to movement in your video display within the timeline. - -After your import is successful, you can [save](../animation/editor.md#save-an-animation) and [export](../animation/editor.md#export-an-animation) your animation to use across all of your experiences. diff --git a/.cursor/rules/roblox/en-us/animation/curve-editor.md b/.cursor/rules/roblox/en-us/animation/curve-editor.md deleted file mode 100644 index cd07292d..00000000 --- a/.cursor/rules/roblox/en-us/animation/curve-editor.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: Curve Editor -description: Curve Editor is a curve-based animation editing interface that lets you see and modify a rig's position and orientation. -comments: There are some opportunities to improve or add images/videos in this doc. Also some opportunity to create a "Using Curve Editor" use-case based article that'll quickly get an animator up to speed on the curve editor UI without the math. ---- - -The **Curve Editor** is a curve-based animation editing interface within the [Animation Editor](../animation/editor.md) that allows you to see and modify how a rig's position and orientation changes between keyframes through color‑coded curve graphs. It allows you to define independent tracks for the **X**, **Y** and **Z** angles, providing additional levels of control to make your animations more fluid and realistic. - - -
    - -
    Dope Sheet Editor
    -
    -
    - -
    Curve Editor
    -
    -
    - -Instead of using the default dope sheet editor's method of manually moving the scrubber from one frame to another to see how a rig's position and orientation change over time, the Curve Editor lets you quickly reference position and orientation values of your selected tracks through the **position ruler** on the left side of the timeline and the **rotation ruler** on the right side of the timeline. - -Curve Editor Overview - -## Open the Curve Editor - -You can switch the editor's timeline between the dope sheet editor and the Curve Editor at any time. - -1. Open the [Animation Editor](./editor.md) from Studio's **Avatar** tab or the **Window** ⟩ **Avatar** menu. - - Animation Editor indicated in Studio's toolbar - -2. Studio automatically converts [quaternions](https://en.wikipedia.org/wiki/Quaternion) to [Euler angles](https://en.wikipedia.org/wiki/Euler_angles) when you open the Curve Editor, so it's important that you verify your rotation type **before** you switch to the Curve Editor. Once you convert quaternions to Euler angle tracks, it's impossible to convert them back into quaternions. - - 1. In the top-right corner of the editor window, click the gear icon. A contextual menu displays. - - Gear Icon - - 2. Hover over **Default Rotation Type**, then select either **Euler Angles** or **Quaternions**. Your rotation type sets to your choice and becomes the default rotation type for future projects. - -3. In the top-left corner of the **timeline**, click the **Curve Animation** icon. A popup window displays to confirm that your `Class.KeyframeSequence` clip will convert to a `Class.CurveAnimation` clip. - - Opening Curve Editor - - If you kept the default rotation type of Euler angles, Studio automatically converts any pre-existing quaternions to Euler angles following the [Euler angles order](#euler-angles-order) setting. Because `Class.KeyframeSequence|KeyframeSequences` work with quaternions and curve animations work with Euler angles by default, your animation might appear slightly different between keyframes, especially if any of your Euler angles approach [Gimbal lock](https://en.wikipedia.org/wiki/Gimbal_lock). - - Convert Euler Angles - - If you set the rotation type to quaternions, the conversion to curves preserves the quaternions and the animation remains the same. - - Curve Editor Overview - -## Interpolation - -Interpolation is Studio's process of "filling in" position and orientation values between your keyframes. This allows the rig to seamlessly animate from one orientation or position to another instead of disjointedly jumping between keyframes. While Euler angle curves interpolate between the values of each keyframe, quaternion curves interpolate from `0` to `1` over a set time. To illustrate this, the following images display the same `Class.KeyframeSequence` after you open the Curve Editor with either a Euler angle or a quaternion rotation type: - - -
    - -
    Euler Angle Curve
    -
    -
    - -
    Quaternion Curve
    -
    -
    - -For **Euler angle curves**, the height of each keyframe represents its orientation value over time. For example, the highest keyframe represents a rotation of about 120 degrees around the **X** axis, and the lowest keyframe represents a rotation of about -10 degrees. For **quaternion curves**, each segment represents orientation changing between keyframes, and the line displays the interpolation between them. In the previous example, the animation starts from orientation A, then interpolates linearly to orientation B. Once it is at B, the interpolation starts again from orientation B to orientation C, then continues with this pattern until the rig reaches its final orientation. - -You can modify how the Curve Editor handles interpolation for both Euler angle curves and quaternion curves by [setting tangents](#set), [changing the interpolation mode](#interpolation-mode), or by [generating interpolation curves](#generate-interpolation-curves) between two or more keyframes. - -### Tangents - -The Curve Editor provides **tangents**, or handles, that let you quickly adjust the interpolation either before or after a keyframe. Euler angle curves have a tangent both before and after the keyframe while quaternion curves have one tangent at the beginning and another at the end of a segment. The initial tangent controls the interpolation after the keyframe and the secondary tangent controls the interpolation before the keyframe. For example: - - -
    - -
    Euler Angle Curve Tangents
    -
    -
    - -
    Quaternion Curve Tangents
    -
    -
    - - -For quaternion curve tangents, no matter how much you adjust each tangent, each segment always begins at `0` and ends at `1`. Although each segment of a quaternion curve graph is disconnected from subsequent segments, the two keyframes within the same frame always represent the same orientation. - - -Tangents change appearance when you set them to a new position. For example, when you manually set a tangent, the handle displays as a white circle, otherwise an unset tangent displays as a clear circle. For keyframes with two tangents, you can manually set either one or both tangents, and their appearance changes accordingly. - -Tangents change appearance when you set them to a new position; an unset tangent displays as a clear circle, and a set tangent displays as a white circle. Studio automatically calculates the position for unset tangents based on the position of any set tangents. For instance, if you only set one tangent and leave the other unset, the unset tangent aligns with its opposite tangent: - -Tangent Image - -#### Set - -To set a tangent: - -1. Click and drag the tangent in the direction you want to pull the curve. The curve adjusts based on the location of your cursor. -2. Release the tangent. The interpolation between keyframes adjusts accordingly. -3. If you set one tangent and want to align the unset tangent horizontally, right-click the unset tangent and select **Set Tangent to Zero** from the contextual menu. - -#### Reset - -If you ever set a tangent to a new position and the resulting interpolation is undesirable, you can always use "auto‑tangent mode" to clear a tangent's value and reset it back to its default interpolation behavior. - -1. Right-click on a tangent. A contextual menu displays. -2. Select **Set Tangent To Zero**. The tangent resets to its default interpolation behavior. - -### Interpolation mode - -Interpolation mode is the rate at which an animation moves between different keyframe positions within the animation. There are three interpolation modes available for curve animations: - -- **Linear** (default) — Moves at a constant speed from one keyframe to another. -- **Constant** — Removes interpolation between the selected keyframe and next keyframe, causing the animation to "snap" from keyframe to keyframe. -- **Cubic** — Eases in and/or out of the animation. Cubic is the only mode that allows you to define tangents. - -To change interpolation mode: - -1. Right-click a keyframe. A contextual menu displays. -2. Hover over **Interpolation Mode**, then select either **Linear**, **Constant**, or **Cubic**. The interpolation mode changes the curve following the keyframe. - - Interpolation Mode - -### Generate interpolation curves - -For curve animations, bounce and elastic easing styles are not available as standard interpolations like they are for `Class.KeyframeSequence|KeyframeSequences`. However, when you convert a `Class.KeyframeSequence` to a curve animation, Studio automatically adds additional keyframes to your animation to keep the animation intact, and you can select two or more keyframes and generate an **interpolation curve** that removes and replaces any of their intermediate keyframes to mimic bounce and elastic easing behavior. - -To generate interpolation curves: - -1. Select two or more keyframes. Each keyframe you select highlights. -2. Right-click one of these keyframes. A contextual menu displays. -3. Hover over **Generate Curve**, then over **Bounce** or **Elastic**, and then select either **Out**, **In**, or **InOut**. An interpolation curve between your selected keyframes generates according to your settings. - - - **Out** — The motion is faster at the beginning and slower toward the end of the keyframe range. - - **In** — The motion is slower at the beginning and faster toward the end of the keyframe range. - - **InOut** — **In** and **Out** on the same tween, with **In** at the beginning and **Out** taking effect halfway through the keyframe range. - -## Euler angles order - -When you're working with Euler angles, Studio represents the **X**, **Y**, and **Z** axes through three channel values that follow a specific order to move your rig from its starting orientation to its next orientation. Each order is named after the [matrix multiplications](https://en.wikipedia.org/wiki/Matrix_multiplication) to get to the final orientation. For example, an **XYZ** order (**X**×**Y**×**Z**) means that the rig moves starting on the **Z** axis, then the **Y** axis, then the **X** axis. - -How an animation changes when you set Euler angles order is dependent on **when** you change the order: - -- If you load a `Class.KeyframeSequence` or a `Class.CurveAnimation` with a set quaternion rotation type then change the order, the new order doesn't affect the animation. This is because Studio uses quaternions to configure changes in your rig's orientation using the shortest path possible between its starting orientation to its next orientation. However, this method does affect how the quaternions of each keyframe transform into **X**, **Y**, and **Z** angles in the track list, which might visually affect the values within the timeline without affecting the animation itself. -- If you change the order of an existing Euler angle track, the animation might change since Studio preserves the values of each keyframe. This means that the ordered path Studio takes to change your rig's orientation from its starting orientation to its next orientation changes with the Euler angles order. - -To set the Euler angles order: - -1. In the top-right corner of the editor window, click the gear icon. A contextual menu displays. - - Gear Icon - -2. Hover over **Default Euler's Angles Order**, then select either **XYZ**, **XZY**, **YXZ**, **YZX**, **ZXY**, or **ZYX**. Your Euler angles order changes accordingly. diff --git a/.cursor/rules/roblox/en-us/animation/editor.md b/.cursor/rules/roblox/en-us/animation/editor.md deleted file mode 100644 index 7758cc77..00000000 --- a/.cursor/rules/roblox/en-us/animation/editor.md +++ /dev/null @@ -1,597 +0,0 @@ ---- -title: Animation Editor -description: Animation Editor allows you to design and publish custom animations on rigs. ---- - -The **Animation Editor**, accessible from Studio's **Avatar** tab or **Window** ⟩ **Avatar** menu, allows you to design and publish custom animations on rigs. A rig is an object with individual sections connected by joints. You can move these joints to [create poses](#create-poses) and then smoothly animate the rig from pose to pose. - -Animation Editor indicated in Studio's toolbar - -## Interface - - - -### Media and playback controls - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    The name of the animation.
    - Opens a contextual menu with the following menu items: -
      -
    • **Load**
    • -
    • **Save**
    • -
    • **Save As**
    • -
    • **Import**
    • -
    • **Export**
    • -
    • **Create New**
    • -
    • **Set Animation Priority**
    • -
    -
    Moves the scrubber to the first key.
    Moves the scrubber to the previous key.
    Previews the animation in reverse.
    Pauses the animation.
    Previews the animation.
    Moves the scrubber to the next key.
    Moves the scrubber to the last key.
    Toggles looping for the animation.
    The **position indicator** that displays the timeline unit for the position of the scrubber in **seconds:frames**.
    - -### Timeline - - - - - - - - - - - - - - - - - - - - - - -
    A scrubber that marks the current frame position.
    Time units that allow you to move the scrubber to a precise time unit.
    A keyframe that marks the change in position or orientation of a part.
    Either expands or contracts the time unit marks.
    - Opens a contextual menu with the following menu items: -
      -
    • **Timeline Unit**
    • -
    • **Frame Rate: 30fps**
    • -
    • **Show Animation Events**
    • -
    • **Snap To Keys**
    • -
    -
    - -### Track list - - - - - - - - - - - - - - - - - - - - - - -
    The name of the rig.
    Opens the **Manage IK** window.
    Opens a contextual menu of additional tracks you can add to the track list.
    The track displaying the name, position, and rotation of the part that - has been moved or rotated to a new position or orientation.
    - Opens a contextual menu with the following menu items: -
      -
    • **Add Keyframe**
    • -
    • **Delete Track**
    • -
    -
    - -## Create an animation - -You can only create animations using rigs. If you don't have a rig available, insert a pre-built rig using the [Rig Generator](../studio/rig-builder.md) tool. The pre-built rigs have all of the basic parts and mechanisms to -build a character animation. - -If you have a rig, you can create a new animation for it using the following steps: - -1. From the toolbar's **Avatar** tab, click **Animation**. -2. Select the rig you want to create an animation for to display the creation dialog. - - - -3. In the **Animation Name** field, enter a new animation name, then - click the **Create** button. The **Animation Editor** window displays - the [media and playback controls](#media-and-playback-controls), [timeline](#timeline), and [track list](#track-list). - -From here, you can begin [creating poses](#create-poses) -for your rig and modifying the animation settings, such as [looping -the animation](#loop-an-animation) or [setting its -priority](#set-a-priority). - -### Create poses - -An animation consists of different **poses**, or specific positions and orientations of `Class.Bone` or `Class.MeshPart` objects within a rig. You can create poses by moving or rotating bones or meshes, such as the rig's hands, feet, or torso. After you create multiple poses on different positions of the timeline, the **Animation Editor** runs between them with your [easing settings](#easing) to smoothly animate the rig from pose-to-pose. - -For example, a simple animation where a humanoid character turns -to look 45° to the left has two poses: - -- The initial position looking forward. -- The turned position looking left. - - - -To create a pose: - -1. In the **Explorer** window, select the rig and expand its child instances to access the bones or meshes. - -2. In the **Animation Editor** window, navigate to the timeline, then - click-and-move the **scrubber** to the frame position where you - want to set the pose. By default, Roblox represents timeline units as - **seconds:frames** and animations run at 30 frames per second. For example, 0:15 indicates ½ second. - - - -3. In the **viewport**, hover your mouse over **rig** and select a bone or mesh. You can also select the ⊕ icon on the timeline and click **Add All** to add all bones or meshes to the animation. - - -4. Move or rotate the bone or mesh to a new orientation. For bones, you can rotate them to pose the rig along the created bone joints. - - - - - When creating poses, you can toggle between **Move** and **Rotate** - modes by pressing R. These modes work exactly like moving and rotating base objects, including the snap settings and incremental values located in Studio's toolbar. - - -5. Continue moving or rotating bones or meshes until you get the desired pose. - Whenever you adjust a specific bone or mesh, a **new track** displays in the track list, and a **new keyframe** displays on the **timeline** for that bone more mesh at that specific frame position. - - - -6. When you're ready to preview the animation, you can either: - - - Navigate to the **Media and Playback Controls**, then click the - **Play** button. - - - - - Or press the **Spacebar**. - - - By default, the timeline displays a duration of 1 second (30 frames), but the final keyframe determines the animation's actual duration. To - add more time to the timeline, enter a new value in the right-side box of - the position indicator. - - -## Keyframes - -Once you [create basic poses](#create-poses) for a rig, -fine-tuning individual keyframes can significantly improve the final -animation. - -### Add keyframes - -Whenever you change a part's position or orientation, a new keyframe -displays on the timeline. You can also add keyframes to a timeline -through the following methods. - -To add a keyframe for a single part of the rig: - -1. Navigate to the **timeline**, then move the **scrubber** to a new - position. -2. In the **track list**, navigate to the part's **track** and click - the **⋯** button. A contextual menu displays. - - - -3. Select **Add Keyframe**. - -To add a keyframe for multiple parts of the rig: - -1. Navigate to the **timeline**, then right-click in the dark region - above the tracks. A pop-up menu displays. - - - -2. Select **Add Keyframe Here**. - -Note that the keyframes insert at the frame position closest to where you click, -not at the position of the scrubber. - -### Move keyframes - -You can increase or decrease the amount of time between keyframes by moving -either individual keyframes or every keyframe in a frame position. - -To move a single keyframe: - -1. Navigate to the **timeline** and click on any **gray keyframe**. - Both the **gray keyframe** and the **white keyframe** are now - surrounded with a blue border. - - - -2. Click-and-drag it to a new frame position. - -To move every keyframe in a frame position: - -1. Navigate to the **timeline** and click on the **white keyframe** in - the dark region above the tracks. Every keyframe in the frame - position is now surrounded with a blue border. - - - -2. Click-and-drag it to a new frame position. - -### Duplicate keyframes - -You can duplicate either a specific keyframe or multiple keyframes for -multiple parts into a new position in the timeline. This is particularly -useful for when you want to - -To duplicate one or more keyframes: - -1. Navigate to the **timeline** and select one or more keyframes. Every selected keyframe is now surrounded by a blue border. -1. Press CtrlC (⌘C). Every selected keyframe copies to your clipboard. -1. Move the **scrubber** to a new frame position. -1. Press CtrlV (⌘V). The keyframe(s) paste into the new frame position. - -### Delete keyframes - -To delete one or more keyframes, select the keyframe(s), then press -**Delete** or **Backspace**. - -### Optimize keyframes - -Animators can often generate many keyframes during the course of animation, especially when using various animation tools and features. To help reduce the number of unnecessary keyframes and make it easier to animate on the timeline, the **Animation Editor** provides tools for [automatic](#automatic-optimization) and [on-demand](#on-demand-optimization) keyframe optimization. - -#### Automatic optimization - -The **Animation Editor** automatically detects and removes unnecessary keyframes when creating [facial animations](../art/characters/facial-animation/animate-heads.md) and when [promoting a keyframe animation to a curve animation](../animation/curve-editor.md#open-the-curve-editor). - -If 3 or more consecutive keyframes have the same value in a track, the **Animation Editor** removes the intermediary keyframes and keeps only the first and last keyframes. - -If the track only contains keyframes with default values, such as an `Datatype.CFrame.identity|Identity Cframe`, or a `0` value for a curve animation, the entire track is removed from the animation. - -#### On-demand optimization - -Optimize Keyframes - -During animating, you can use the editor's **Keyframe Optimization** tool to quickly reduce the number of unnecessary keyframes. Keyframe Optimization prioritizes the least impactful keyframes first. You can adjust the number of keyframes using the slider. - -While using the slider, you can preview the animation and scrub through the timeline to check your animation but you can not perform editing operations, such as changing keyframe values or adding tracks. - -To access the **Optimize Keyframes** tool: - -1. In the **Animation Editor**, click \***\*⋯\*\*** button and select **Optimize Keyframes**. A dialog box with a slider displays. - - Optimize Keyframes - -2. Move the slider to the desired number of keyframes. You can preview and playback the animation to verify the optimization. - - Optimize Keyframes - -3. Click **OK** when complete. - -### Easing - -For each keyframe in the [Animation Editor](../animation/editor.md), you can choose both an -[easing style](#easing-style) and an [easing direction](#easing-direction). - -#### Easing style - -**Easing style** is the rate at which an animation moves between different frame -positions within the animation. By default, a part will move and/or rotate from -one keyframe to the next in an even, steady motion known as **linear easing**. -In the following video, linear easing makes the character's turning animation -appear stiff and robotic. - -
    - -
    Linear easing
    -
    - -While that may look appropriate for some motions, compare the following video -where **cubic easing** makes the animation of the character's motion appear more -natural. - -
    - -
    Cubic easing
    -
    - -To change the easing style for one or more keyframes: - -1. Navigate to the **timeline** and select one or more keyframes. Every selected - keyframe is now surrounded by a blue border. -2. Right-click on a **keyframe with a border**. A pop-up menu displays. -3. Hover over **Easing Style**, then choose from the following options: - - - **Linear** - Moves at a constant speed. - - **Constant** - Removes interpolation between the selected keyframe and - next keyframe. The animation will "snap" from keyframe to keyframe. - - **Cubic** - Eases in or out with cubic interpolation. - - **Elastic** - Moves as if the object is attached to a rubber band. - - **Bounce** - Moves as if the start or end position of the tween is bouncy. - -#### Easing direction - -**Easing direction** defines which end of the animation movement is affected by -the [easing style](#easing-style). By default, the motion is slower at the -beginning and faster toward the end of the animation. - -To change the easing direction for one or more keyframes: - -1. Navigate to the **timeline** and select one or more keyframes. Every selected - keyframe is now surrounded by a blue border. -1. Right-click on a **keyframe with a border**. A pop-up menu displays. -1. Hover over **Easing Direction**, then choose from the following options: - - - **Out** - The motion will be faster at the beginning and slower toward the - end. - - **InOut** - **In** and **Out** on the same tween, with **In** at the - beginning and **Out** taking effect halfway through. - - **In** - The motion will be slower at the beginning and faster toward the - end. - -## Loop an animation - -To make an animation automatically loop, navigate to the [Media and -Playback Controls](#media-and-playback-controls) and click -the **Looping** button. - - - - - A looping animation doesn't interpolate between the final - keyframes and first keyframes. To make the animation loop smoothly, -
    duplicate the first - keyframes and use them as the final keyframes. - - -## Set a priority - -An animation's **priority** (`Enum.AnimationPriority`) dictates when it will play in an -experience. For example, if you play an animation with a higher priority -than another animation that's already playing, the new animation will -override the old. For example, a "jump" animation should take priority over an "idle" animation so that a character doesn't perform both at the same time. - -Roblox uses seven levels of priority, ordered here from highest to lowest: - - - - - **Action4** - - - - - - **Action3** - - - - - - **Action2** - - - - - - **Action** - - - - - - **Movement** - - - - - - **Idle** - - - - - - **Core** - - -
    - -To set an animation to a different priority: - -1. Navigate to the [Media and Playback Controls](#media-and-playback-controls) - and click the **⋯** button. A - contextual menu displays. -1. Hover over **Set Animation Priority**, then choose your desired - priority setting. - -## Save an animation - -When you save an animation, Studio saves it as a -`Class.KeyframeSequence` object in `Class.ServerStorage` and adds a reference to your rig object. Saving your animation is meant to preserve your animation progress and work. If you intend to use an animation, [export it](#export-an-animation) before referencing the published animation in your experience. - -To save an animation: - -1. Navigate to the [Media and Playback Controls](#media-and-playback-controls) - and click the **⋯** button. A - contextual menu displays. - - - -2. Select **Save** or **Save As** to save the animation with a reference added to the **AnimSaves** object. - - - -### Access local data - -Roblox saves animation data locally to `Class.ServerStorage` to preserve your animation work. In most cases, your experience shouldn't directly access this local data and instead should reference a published animation. - -In the rare cases that your experience requires accessing local data, reference the value of the `Class.ObjectValue` in your rig's AnimSaves folder rather than directly accessing the `Class.ServerStorage`. See the following examples: - -```lua title="Access local animation data" -local myAnim = myRig.AnimSaves.Value.myAnimation --- Accesses your local animation data with the value reference in your rig -``` - -```lua title="Incorrectly access local data" -local myAnim = ServerStorage.RBX_ANIMSAVES.myRig.myAnimation --- Can conflict with other rigs sharing the same name -``` - - -Since local data is stored in `Class.ServerStorage`, it doesn't replicate and isn't available from clients. If your clients need access to that data, you must move the `Class.KeyframeSequence` or `Class.CurveAnimation` objects and their descendants to `Class.ReplicatedStorage`. - - -### Migrate legacy data - -The **Animation Editor** previously stored animation objects directly within a rig, not within `Class.ServerStorage`. If your experience references legacy animation objects in a rig, you can migrate this data to `Class.ServerStorage` using the animation migration tool, allowing you to [access local animation data](#access-local-data) in the same way. - -To migrate your legacy animation data: - -1. With the **Animation Editor**, select a rig with older animations that aren't saved in `Class.ServerStorage`. A migration window displays. - - - -2. Select **Delete**, **Migrate**, or **Ignore** for each detected animation. - - - **Delete**: Delete animations that are already published or no longer being used. - - **Migrate**: Migrate animations that are still in progress or that haven't yet been published. - - **Ignore**: Ignore animations if you have yet to update your experience's code to [access local data](#access-local-data) from `Class.ServerStorage`. Once updated, migrate these animations. - -3. Press **OK** when complete. - -## Export an animation - -When you export an animation to Studio, it becomes available for use in -all experiences. This means that you only need to create an animation -once, then you can reuse it as many times as you want. - - - If your animation will be used for a **default** Roblox character animation like jumping or running, ensure that you rename the final keyframe as outlined in the first step below. - - -To export an animation: - -1. **(Important)** If the animation will be used to [replace a default character animation](../animation/using.md#replace-default-animations) like running or jumping, rename the final keyframe **End** as follows: - - 1. Right-click the final white keyframe symbol in the upper bar region and choose **Rename Key Keyframe** from the - contextual menu. - - - - 2. Type **End** (case-sensitive) into the input field. - 3. Click the **Save** button. - -2. Navigate to the [Media and Playback Controls](#media-and-playback-controls) - and click the **⋯** button. - - - -3. Select **Publish to Roblox** from the contextual menu. -4. In the **Asset Configuration** window, enter an animation title and optional description. -5. **(Important)** If the animation will be used in any [group-owned](../projects/groups.md) experience, select the group from the **Creator** field. -6. Click the **Submit** button. - -Once the upload is complete, you can copy the animation's asset ID -from the [Toolbox](../projects/assets/toolbox.md) for scripting custom animations or to replace default character animations, as outlined in [Use animations](../animation/using.md). - -1. Click the **Creations** tab and select **Animations** from the dropdown menu. -2. Right-click the desired animation and select **Copy Asset ID** from the contextual menu. -3. See [Use animations](../animation/using.md) for instructions on how to play the animation from a script or use the animation as a default character animation. diff --git a/.cursor/rules/roblox/en-us/animation/events.md b/.cursor/rules/roblox/en-us/animation/events.md deleted file mode 100644 index fd8aa957..00000000 --- a/.cursor/rules/roblox/en-us/animation/events.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -title: Animation events -description: Animation Events are markers across the timeline span in the Animation Editor. ---- - -You can define animation **event markers** across the timeline span and use -`Class.AnimationTrack:GetMarkerReachedSignal()|GetMarkerReachedSignal()` -to detect those markers as the animation runs. - -## Show events - -By default, the event track isn't visible. To show the event track: - -1. Navigate to the right of the **timeline**, then click the **Gear** icon. - A pop-up menu displays. - - - -2. Select **Show Animation Events**. This opens the **Animation Events** bar directly below the media and - playback controls. - - - -You can now [create](#create-events), [detect](#detect-events), and -[duplicate](#duplicate-events) events. - -## Create events - -Event markers are visual indicators of where an animation event begins. After you create an event -marker, you can move it to any frame position on the timeline. - -To create a new event marker: - -1. Navigate to the **timeline**, then click-and-drag the **scrubber** to the - frame position where the event should occur. -2. Navigate to the **event track**, then click the **Edit Animation Events** - button. The **Edit Animation Events** dialog displays. - - - -3. In the **Edit Animation Events** dialog, click **+ Add Event**, then enter an - event name. - - - -4. **(Optional)** In the **Parameter** field, enter a parameter string for the event. -5. Click the **Save** button. In the events bar within the timeline, a new - marker symbol displays at the frame position. - - - -## Detect events - -To detect animation events in a `Class.LocalScript`, -connect a function to the `Class.AnimationTrack:GetMarkerReachedSignal()|GetMarkerReachedSignal()` function of `Class.AnimationTrack`. For example: - -```lua -local Players = game:GetService("Players") - -local player = Players.LocalPlayer -local character = player.Character or player.CharacterAdded:Wait() -local humanoid = character:WaitForChild("Humanoid") -local animator = humanoid:WaitForChild("Animator") - --- Create new "Animation" instance -local walkAnim = Instance.new("Animation") --- Set its "AnimationId" to the corresponding animation asset ID -walkAnim.AnimationId = "rbxassetid://5432167890" - --- Load animation onto the animator -local walkAnimTrack = animator:LoadAnimation(walkAnim) - --- Connect "GetMarkerReachedSignal" event to a specific named keyframe -walkAnimTrack:GetMarkerReachedSignal("FootStep"):Connect(function(paramString) - print(paramString) -end) -``` - - -You can specify a Parameter value for any event -marker within the **Animation Editor**. This lets you pass a custom string -(single value, comma-separated string, etc.) to the `Class.AnimationTrack:GetMarkerReachedSignal()|GetMarkerReachedSignal()` function, as illustrated by the paramString argument in the code example above. This string can then be parsed or converted, if necessary, and used for whatever action you wish to perform in the event. - - -## Duplicate events - -As you create events, they become available for usage throughout the whole -animation, not only at the frame position where you originally created them. For -instance, you can create a "FootStep" event marker at the point where a -character's **left** foot touches down, then use the same event when the -character's **right** foot touches down. - -To duplicate an event: - -1. Navigate to the **timeline**, then click an **event marker** in the **event bar**. - - - -2. Press CtrlC (⌘C on Mac). -3. Click-and-drag the **scrubber** to the frame position where you want to - duplicate the event. -4. Press CtrlV (⌘V on Mac). - - - -If the original event uses a parameter -but the duplicated event should use a modified parameter, perform the following -steps: - -1. Right-click the duplicated event marker. A pop-up menu displays. -2. Select **Edit Animation** Event. The **Edit Animation Events** dialog - displays. -3. Make your changes, then click the **Save** button. - - -You can also duplicate events by clicking the Edit Animation Events button (just as if you were creating a new event), clicking Add Event in the pop-up menu, selecting the desired event from the dropdown, and clicking Save. - diff --git a/.cursor/rules/roblox/en-us/animation/index.md b/.cursor/rules/roblox/en-us/animation/index.md deleted file mode 100644 index b42c01e2..00000000 --- a/.cursor/rules/roblox/en-us/animation/index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Animation in Roblox -description: An overview of all animation tools in Roblox Studio. ---- - -**Animation** is the process of applying motion to your characters, objects, and environments to create an engaging and dynamic experience. While there are many ways to make objects move and interact, animation in Roblox typically refers to customizing an expressive movement of a specific character, or group of parts, using the **Animation Editor** or **animation-related APIs**. - -Animation can apply to any Roblox part or group of parts. Different types of objects can utilize various animation features. The following are the general categories of animatable objects: - -- **Simple objects**, such as a basic part, can only animate changes across the part's single position or rotation property. -- **Rigs**, or parts connected by joints like `Class.Bone` or `Class.Motor6D`, can articulate positional and rotational movement between their joints, like elbows and wrists. Rigged models can take advantage of animation features like [inverse kinematics](#inverse-kinematics) to quickly and programmatically apply movement in response to environments and events. -- **R15 rigs**, rigs that incorporate the standardized [avatar character model](../characters/index.md#avatar-character-components), can use animations from Roblox's character animation library and other movement features, even if it's a player or non-player character model. - -## Animation Editor - -The [Animation Editor](../animation/editor.md) allows you to design and publish custom animations on rigs. You can move the joints that connect individual sections of a rig to create poses, and the **Animation Editor** smoothly animates the rig from pose-to-pose. As long as all moving parts are connected with `Class.Motor6D` objects, you can use the editor for both human and non-human rigs. - - - -When creating animations, Studio provides the following features to animate effectively: - -- Instantly create face and body animations through the [Animation Capture](../animation/capture.md) tool. - -- Switch to the [Curve Editor](../animation/curve-editor.md) to access the curve-based animation UI and more control over your animation tracks. - -- Make realistic animations by posing and animating `Class.Bone|Bones` of a [rigged mesh](../art/modeling/rigging.md). - -## Inverse kinematics - -You can use [inverse kinematics](../animation/inverse-kinematics.md) APIs to automatically create animations and poses based on environmental and external events. With inverse kinematics, you can procedurally generate various animation events, such as having a character's head track a bird flying in the sky, or making a character's arm automatically reach for a door knob when nearby. - -## Animation events - -An [animation event](../animation/events.md) is a specific point in an animation that triggers an action. You can define animation event markers across the **Animation Editor** timeline span, then use `Class.AnimationTrack:GetMarkerReachedSignal()` to detect those markers as the animation runs to perform specific actions, such as playing a sound effect whenever the user's foot touches the ground. diff --git a/.cursor/rules/roblox/en-us/animation/inverse-kinematics.md b/.cursor/rules/roblox/en-us/animation/inverse-kinematics.md deleted file mode 100644 index ab688ba9..00000000 --- a/.cursor/rules/roblox/en-us/animation/inverse-kinematics.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: Inverse Kinematics -description: Inverse Kinematics is a technique in computer animation to make characters move and interact with their environment. ---- - -[Inverse Kinematics](https://en.wikipedia.org/wiki/Inverse_kinematics) (IK) is a common technique in computer animation to efficiently make characters move and interact realistically with their environment. The process of creating a realistic movement for a character often requires many iterations and minor adjustments of the various joints. With IK, you can pose and animate multiple character parts by posing or adjusting a single object. - -This animation technique can provide solutions to the following examples: - - -
    - -
    Grab and pose a character's hand while automatically adjusting the related limbs, such as the wrist, elbow, and shoulder.
    -
    -
    - -
    Make a character's feet interact realistically on different surfaces and slopes.
    -
    -
    - -
    Grab and move a single target object to quickly create realistic interactions with your character and props.
    -
    -
    - -## IKControl - -You can use an `Class.IKControl` to procedurally add IK to your character rigs outside of the **Animation Editor**. Studio allows you to programmatically apply IK to all characters, such as R15, Rthro, and custom imported skinned characters, to create realistic movement and interactions in your experience. - -When adding an `Class.IKControl`, set the [required properties](#required-properties) correctly to avoid unexpected and unnatural animation results. As with all animation, [test your IKControls](#test-ikcontrols) to ensure that you achieve the desired behavior. - -### Required properties - -When adding a `Class.IKControl` to your character's `Class.Humanoid` or `Class.AnimationController`, you must set the following required properties to enable IK: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PropertyDescription
    `Class.IKControl.Type|Type`Specifies the behavior type of the IK control. See `Enum.IKControlType` for the list of behavior options. Common behavior types are `Position` or `Transform`.
    `Class.IKControl.EndEffector|EndEffector`A `Class.BasePart` or `Class.Bone` in your character rig that tracks toward the `Class.IKControl.Target|Target`. For example, you can set a **LeftHand** bone as a `Class.IKControl.EndEffector|EndEffector` to reach a doorknob object set as the `Class.IKControl.Target|Target`.
    `Class.IKControl.Target|Target`The object the `Class.IKControl.EndEffector|EndEffector` reaches or points toward. A `Class.IKControl.Target|Target` can be any object with a world position.
    `Class.IKControl.ChainRoot|ChainRoot`Defines the chain of `Class.BasePart|BaseParts` or `Class.Bone|Bones` that the `Class.IKControl` affects. All connected parts between the `Class.IKControl.ChainRoot|ChainRoot` and the `Class.IKControl.EndEffector|EndEffector` are affected by the `Class.IKControl` using the behavior type defined.

    For example, if your character's **LeftHand** is set as the `Class.IKControl.Target|Target`, you can apply IK to the entire left arm by setting `Class.IKControl.ChainRoot|ChainRoot` to the **LeftUpperArm**. To apply IK just to the parts below the elbow, set `Class.IKControl.ChainRoot|ChainRoot` to the **LeftLowerArm**.
    - -### Test IKControls - -You can add and edit `Class.IKControl` programmatically or directly through the **Explorer**. You can even add and make changes to `Class.IKControl` during a Play test to quickly check how various properties affect a character's movements. - -To quickly test your `Class.IKControl` using an `Class.Attachment` as a target: - -1. From Studio's mezzanine, [initiate a playtest](../studio/testing-modes.md#playtesting). -2. In the **Explorer**, navigate to **Workspace** → your user's `Class.Model`. This `Class.Model` instance is named as your current Roblox account. -3. Click the **⊕** icon next to your character model's `HumanoidRootPart` and add an **Attachment**. - - - -4. Select the **Attachment** and use the **Move** tool to position the object in front of your character in the viewport. - - - -5. In the **Explorer** window, select the **⊕** icon next to your character's `Class.Humanoid` and add an **IKControl**. - - - -6. Select the `Class.IKControl` and set the following property values in the **Properties** window: - - 1. **Type**: Select `Transform` from the dropdown. - 2. **EndEffector**: Select your model's **LeftHand** `Class.MeshPart` in the **Explorer**. - 3. **Target**: Select the newly created **Attachment** object in the **Explorer**. - 4. **ChainRoot**: Select your model's **LeftUpperArm** `Class.MeshPart` in the **Explorer**. - - -
    - -
    IKControl Properties
    -
    -
    - -
    Explorer - Character Model
    -
    -
    - - Your character's left arm should now reach for the target `Class.Attachment`. You can experiment with moving the `Class.Attachment` or editing the `Class.IKControl` properties to achieve different results. - - - -### Add constraints - -You can use `Class.Constraint|Constraints` to restrict how joints can move when reaching its target. Constraints can ensure joints like the elbows and knees bend naturally, or to make the mechanical joints rotate in a specific orientation. - - -
    - -
    Elbow bending unnaturally
    -
    - -
    - -
    Elbow bending correctly
    -
    -
    - -To add constraints to your character using `Class.IKControl`, your `Class.IKControl` and constraint must meet the following conditions: - -- The attachments referenced in the constraint's `Class.Constraint.Attachment0|Attachment0`/`Class.Constraint.Attachment1|Attachment1` properties attaches to the same parts as the `Class.Motor6D` `Class.Motor6D.Part0|Part0`/`Class.Motor6D.Part1|Part1`. -- The relative positions of `Class.Constraint.Attachment0|Attachment0`/`Class.Constraint.Attachment1|Attachment1` must equal the corresponding positions of the `Class.Motor6D` `Class.Motor6D.C0|C0`/`Class.Motor6D.C1|C1` CFrames. -- The constraint and the IKControl share the same parent `Class.Model`. - -The following instructions describe the process of adding a `Class.HingeConstraint` to restrict the rotation of a character's elbow and adding a `Class.BallSocketConstraint` to the wrist to limit the rotation angle. - -#### Elbow - -Roblox R15 characters already include attachments in their joints that you can use to apply the elbow constraint. For the elbow, both the LeftUpperArm and the LeftLowerArm include a `LeftElbowRigAttachment`. Along with adding a constraint, you also need to add additional child attachments to each part's `LeftElbowRigAttachment` to specify which axis the elbow can rotate about. - -To add the `Class.HingeConstraint` and child attachments: - -1. In the **Explorer**, locate your model's **LeftLowerArm** and click the **⊕ button**. -2. Add a **HingeConstraint** with the name `LeftElbowConstraint`. -3. In the **Explorer**, navigate to the **LeftUpperArm.LeftElbowRigAttachment** and add an attachment: - - 1. Click the **⊕ button** to add an **Attachment** with the name `LeftElbowConstraintAttachment0`. - 2. In the viewport, select the attachment and use the **Rotate tool** to rotate the attachment so the yellow **PrimaryAxis** is the axis of your elbow's expected rotation. - - - - 3. Set the **LeftElbowConstraint.Attachment0** property to this new attachment. - -4. In the **Explorer**, navigate to your model's **LeftLowerArm.LeftElbowRigAttachment** add an attachment: - - 1. Click the **⊕ button** and add an **Attachment** with the name `LeftElbowConstraintAttachment1`. - 2. Set the **LeftUpperArm.LeftElbowConstraint.Attachment1** property to this new attachment. - 3. Copy the **LeftElbowConstraintAttachment0.CFrameOrientation** property and paste it as the **LeftElbowConstraint.Attachment1.CFrameOrientation** value. - - - - -If you see a red arrow on the constraint's visualization, that means your attachment orientations are violating the hinge constraint. Go back and make sure the **LeftElbowConstraintAttachment1** has the same orientation as the **LeftElbowConstraintAttachment0**. - - -Test your IKControl to verify the elbow only rotates about its hinge axis: - - -#### Wrists - -Even with the elbow constraint, the IKControl can still produce unrealistic poses with the wrists. - -
    - -
    The wrist bends unnaturally at certain orientations
    -
    - -You can improve this by adding a `Class.BallSocketConstraint` to limit the rotation of the wrist. While this is similar to the process for adding a `Class.HingeConstraint` to the elbow, you can use the `Class.BallSocketConstraint.LimitsEnabled|LimitsEnabled` property on this constraint to further control the range of motion of the wrist. - -To add a `Class.BallSocketConstraint` for the wrist: - -1. In the **Explorer**, locate your model's **LeftHand** and click the **⊕ button**. - 1. Add a **BallSocketConstraint** with the name `LeftWristConstraint`. -2. Locate your model's **LeftLowerArm.LeftWristRigAttachment** and add an attachment: - 1. Click the **⊕ button** and add an **Attachment** with the name `LeftWristConstraintAttachment0`. - 2. In the viewport, select the attachment and use the **Rotate tool** to rotate the attachment so the yellow PrimaryAxis points toward the model's fingertips. - - 3. Set the **LeftWristConstraint.Attachment0** property to the new `LeftWristConstraintAttachment0`. -3. Locate your model's **LeftHand.LeftWristRigAttachment** and add an attachment: - 1. Click the **⊕ button** and add an **Attachment** with the name `LeftWristConstraintAttachment1`. - 2. Copy the **LeftWristConstraintAttachment0.CFrameOrientation** property and paste it as the **LeftWristConstraintAttachment1.CFrameOrientation** property. - 3. Set the **LeftWristConstraint.Attachment1** property to this new **LeftWristConstraintAttachment1**. -4. In the **Explorer**, select the **LeftWristConstraint**. -5. In the **Properties** window, set the following: - 1. Enable **LimitsEnabled**. - 2. Set **UpperAngle** to `80`. This controls how much the constraint's axis can rotate, and 80 degrees is approximately how much the wrist should be able to bend. -6. Depending on your character you may want to tweak the direction the cone is pointing in. You can do this by using the **Rotate tool** to rotate the constraint's **Attachment0**. - -When selecting the **LeftWristConstraint**, a green cone appears visualizing the wrist's range of motion. - - - -With the constraint set up, test the IKControl with the hand pointing down in front of the character and the wrist should rotate and bend more realistically. - - diff --git a/.cursor/rules/roblox/en-us/animation/using.md b/.cursor/rules/roblox/en-us/animation/using.md deleted file mode 100644 index a07e9f6f..00000000 --- a/.cursor/rules/roblox/en-us/animation/using.md +++ /dev/null @@ -1,538 +0,0 @@ ---- -title: Use animations -description: Explains the process of playing animations through scripts, and replacing default animations. ---- - -Once you have [created an animation](../animation/editor.md), you need to use scripts to include them in your experience. You can either [play animations manually](#play-animations-from-scripts) from scripts or [replace default animations](#replace-default-animations) for player characters. - -## Play animations from scripts - -In some cases, you'll need to play an animation directly from inside a script, such as when a user presses a certain key or picks up a special item. - -### Humanoids - -To play an animation on a rig containing a `Class.Humanoid` -object, such as typical playable characters, follow this basic pattern: - -1. Ensure that the local player's `Class.Humanoid` contains an `Class.Animator` object. -2. Create a new `Class.Animation` instance with the proper `Class.Animation.AnimationId|AnimationId`. -3. Load the animation via `Class.Animator:LoadAnimation()` to create an `Class.AnimationTrack`. -4. Play the track with `Class.AnimationTrack:Play()`. - -For example, the following `Class.LocalScript`, when placed in -`Class.StarterPlayerScripts`, loads a "kick" animation onto the player's character and plays it. The script also utilizes the `Class.AnimationTrack:GetMarkerReachedSignal()|GetMarkerReachedSignal()` method to detect when a specific [animation event](../animation/events.md) occurs. - -```lua title="LocalScript - Play Custom Animation on Player Character" -local Players = game:GetService("Players") - -local player = Players.LocalPlayer -local character = player.Character or player.CharacterAdded:Wait() - --- Ensure that the character's humanoid contains an "Animator" object -local humanoid = character:WaitForChild("Humanoid") -local animator = humanoid:WaitForChild("Animator") - --- Create a new "Animation" instance and assign an animation asset ID -local kickAnimation = Instance.new("Animation") -kickAnimation.AnimationId = "rbxassetid://2515090838" - --- Load the animation onto the animator -local kickAnimationTrack = animator:LoadAnimation(kickAnimation) - --- If a named event was defined for the animation, connect it to "GetMarkerReachedSignal()" -kickAnimationTrack:GetMarkerReachedSignal("KickEnd"):Connect(function(paramString) - print(paramString) -end) - -task.wait(4) - --- Play the animation track -kickAnimationTrack:Play() -``` - -### Non-humanoids - -To play animations on rigs that do **not** contain a `Class.Humanoid`, you must create an `Class.AnimationController` with a child `Class.Animator`. For example, the following `Class.Script` (assumed to be a direct child of the rig) loads a "kick" animation and plays it. - -```lua title="Script - Play Custom Animation on Character Rig" -local rig = script.Parent - --- Create a new "Animation" instance and assign an animation asset ID -local kickAnimation = Instance.new("Animation") -kickAnimation.AnimationId = "rbxassetid://2515090838" - --- Create a new "AnimationController" and "Animator" -local animationController = Instance.new("AnimationController") -animationController.Parent = rig - -local animator = Instance.new("Animator") -animator.Parent = animationController - --- Load the animation onto the animator -local kickAnimationTrack = animator:LoadAnimation(kickAnimation) - --- If a named event was defined for the animation, connect it to "GetMarkerReachedSignal()" -kickAnimationTrack:GetMarkerReachedSignal("KickEnd"):Connect(function(paramString) - print(paramString) -end) - -task.wait(4) - --- Play the animation track -kickAnimationTrack:Play() -``` - -## Replace default animations - -By default, Roblox player characters include common animations like running, -climbing, swimming, and jumping. You can replace these [default animations](#default-character-animations) with animations from the [catalog](#catalog-animations) or with your own [custom](../animation/editor.md) animations. - -1. Obtain the **asset ID** of the new animation as follows: - - - For a custom animation built with the [Animation Editor](../animation/editor.md), follow the [export](../animation/editor.md#exporting-an-animation) instructions. - - Copy an appropriate ID from the [catalog animation reference](#catalog-animations) below. For example, to replace the default run animation with the Ninja Run variant, use `656118852`. - -2. In the [Explorer](../studio/explorer.md) window, add a new `Class.Script` to **ServerScriptService**. - - 1. Hover over **ServerScriptService** and click the ⊕ button. - 2. From the contextual menu, insert a **Script**. - -3. In the new script, paste the following code: - - ```lua title="Script - Replace Default Character Animations" - local Players = game:GetService("Players") - - local function onCharacterAdded(character) - -- Get animator on humanoid - local humanoid = character:WaitForChild("Humanoid") - local animator = humanoid:WaitForChild("Animator") - - -- Stop all animation tracks - for _, playingTrack in animator:GetPlayingAnimationTracks() do - playingTrack:Stop(0) - end - - local animateScript = character:WaitForChild("Animate") - --animateScript.run.RunAnim.AnimationId = "rbxassetid://" - --animateScript.walk.WalkAnim.AnimationId = "rbxassetid://" - --animateScript.jump.JumpAnim.AnimationId = "rbxassetid://" - --animateScript.idle.Animation1.AnimationId = "rbxassetid://" - --animateScript.idle.Animation2.AnimationId = "rbxassetid://" - --animateScript.fall.FallAnim.AnimationId = "rbxassetid://" - --animateScript.swim.Swim.AnimationId = "rbxassetid://" - --animateScript.swimidle.SwimIdle.AnimationId = "rbxassetid://" - --animateScript.climb.ClimbAnim.AnimationId = "rbxassetid://" - end - - local function onPlayerAdded(player) - player.CharacterAppearanceLoaded:Connect(onCharacterAdded) - end - - Players.PlayerAdded:Connect(onPlayerAdded) - ``` - -4. For each line that references a [default character animation](#default-character-animations), uncomment it and paste the replacement ID after `rbxassetid://`. For example, to change the default run animation to the Ninja Run variant: - - ```lua title="Script - Replace Default Character Animations" highlight="14" - local Players = game:GetService("Players") - - local function onCharacterAdded(character) - -- Get animator on humanoid - local humanoid = character:WaitForChild("Humanoid") - local animator = humanoid:WaitForChild("Animator") - - -- Stop all animation tracks - for _, playingTrack in animator:GetPlayingAnimationTracks() do - playingTrack:Stop(0) - end - - local animateScript = character:WaitForChild("Animate") - animateScript.run.RunAnim.AnimationId = "rbxassetid://656118852" - --animateScript.walk.WalkAnim.AnimationId = "rbxassetid://" - --animateScript.jump.JumpAnim.AnimationId = "rbxassetid://" - --animateScript.idle.Animation1.AnimationId = "rbxassetid://" - --animateScript.idle.Animation2.AnimationId = "rbxassetid://" - --animateScript.fall.FallAnim.AnimationId = "rbxassetid://" - --animateScript.swim.Swim.AnimationId = "rbxassetid://" - --animateScript.swimidle.SwimIdle.AnimationId = "rbxassetid://" - --animateScript.climb.ClimbAnim.AnimationId = "rbxassetid://" - end - - local function onPlayerAdded(player) - player.CharacterAppearanceLoaded:Connect(onCharacterAdded) - end - - Players.PlayerAdded:Connect(onPlayerAdded) - ``` - -## Set animation weights - -You can use multiple animations for the same action. For example, there -are two `idle` variations in the code sample for [replacing default animations](#replace-default-animations). - -When multiple animations exist for a character state, the **Animate** script -randomly chooses which one to play, but you can influence the outcome by -setting the animation's `Weight` value under the following formula: - -- **animation weight / total weight of all state animations** - -In the following example, `idle.Animation1` will play ⅓ of the time the character is idle, while `idle.Animation2` will play ⅔ of the time. - -```lua title="Script - Replace Default Character Animations" highlight="3,4" - animateScript.idle.Animation1.AnimationId = "rbxassetid://656117400" - animateScript.idle.Animation2.AnimationId = "rbxassetid://656118341" - animateScript.idle.Animation1.Weight.Value = 5 - animateScript.idle.Animation2.Weight.Value = 10 -``` - -## Animation references - -### Default character animations - -The following table contains all of the default character animations that you can [replace](#replace-default-animations) with [catalog](#catalog-animations) animations or your own [custom](../animation/editor.md) animations. Note that **Idle** has two variations which you can [weight](#set-animation-weights) to play more or less frequently. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Character actionAnimate script reference
    **Run**`animateScript.run.RunAnim.AnimationId`
    **Walk**`animateScript.walk.WalkAnim.AnimationId`
    **Jump**`animateScript.jump.JumpAnim.AnimationId`
    **Idle** - `animateScript.idle.Animation1.AnimationId`
    - `animateScript.idle.Animation2.AnimationId` -
    **Fall**`animateScript.fall.FallAnim.AnimationId`
    **Swim** - `animateScript.swim.Swim.AnimationId` -
    **Swim (Idle)** - `animateScript.swimidle.SwimIdle.AnimationId` -
    **Climb**`animateScript.climb.ClimbAnim.AnimationId`
    - -### Catalog animations - -When using avatar animation bundles to [replace default animations](#replace-default-animations), use the following references for the respective asset IDs. For example, if you want to apply the Ninja Jump animation, use `656117878`. Note that **Idle** has multiple variations. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - **Astronaut** - - - **Run**
    891636393
    - **Walk**
    891636393
    - **Jump**
    891627522
    - **Idle**
    891621366, 891633237, 1047759695
    - **Fall**
    891617961
    - **Swim**
    891639666
    - **Swim (Idle)**
    891663592
    - **Climb**
    891609353
    -
    -
    - **Bubbly** - - - **Run**
    910025107
    - **Walk**
    910034870
    - **Jump**
    910016857
    - **Idle**
    910004836, 910009958, 1018536639
    - **Fall**
    910001910
    - **Swim**
    910028158
    - **Swim (Idle)**
    910030921
    - **Climb**
    909997997
    -
    -
    - **Cartoony** - - - **Run**
    742638842
    - **Walk**
    742640026
    - **Jump**
    742637942
    - **Idle**
    742637544, 742638445, 885477856
    - **Fall**
    742637151
    - **Swim**
    742639220
    - **Swim (Idle)**
    742639812
    - **Climb**
    742636889
    -
    -
    - **Elder** - - - **Run**
    845386501
    - **Walk**
    845403856
    - **Jump**
    845398858
    - **Idle**
    845397899, 845400520, 901160519
    - **Fall**
    845396048
    - **Swim**
    845401742
    - **Swim (Idle)**
    845403127
    - **Climb**
    845392038
    -
    -
    - **Knight** - - - **Run**
    657564596
    - **Walk**
    657552124
    - **Jump**
    658409194
    - **Idle**
    657595757, 657568135, 885499184
    - **Fall**
    657600338
    - **Swim**
    657560551
    - **Swim (Idle)**
    657557095
    - **Climb**
    658360781
    -
    -
    - **Levitation** - - - **Run**
    616010382
    - **Walk**
    616013216
    - **Jump**
    616008936
    - **Idle**
    616006778, 616008087, 886862142
    - **Fall**
    616005863
    - **Swim**
    616011509
    - **Swim (Idle)**
    616012453
    - **Climb**
    616003713
    -
    -
    - **Mage** - - - **Run**
    707861613
    - **Walk**
    707897309
    - **Jump**
    707853694
    - **Idle**
    707742142, 707855907, 885508740
    - **Fall**
    707829716
    - **Swim**
    707876443
    - **Swim (Idle)**
    707894699
    - **Climb**
    707826056
    -
    -
    - **Ninja** - - - **Run**
    656118852
    - **Walk**
    656121766
    - **Jump**
    656117878
    - **Idle**
    656117400, 656118341, 886742569
    - **Fall**
    656115606
    - **Swim**
    656119721
    - **Swim (Idle)**
    656121397
    - **Climb**
    656114359
    -
    -
    - **Pirate** - - - **Run**
    750783738
    - **Walk**
    750785693
    - **Jump**
    750782230
    - **Idle**
    750781874, 750782770, 885515365
    - **Fall**
    750780242
    - **Swim**
    750784579
    - **Swim (Idle)**
    750785176
    - **Climb**
    750779899
    -
    -
    - **Robot** - - - **Run**
    616091570
    - **Walk**
    616095330
    - **Jump**
    616090535
    - **Idle**
    616088211, 616089559, 885531463
    - **Fall**
    616087089
    - **Swim**
    616092998
    - **Swim (Idle)**
    616094091
    - **Climb**
    616086039
    -
    -
    - **Rthro** - - - **Run**
    2510198475
    - **Walk**
    2510202577
    - **Jump**
    2510197830
    - **Idle**
    2510197257, 2510196951, 3711062489
    - **Fall**
    2510195892
    - **Swim**
    2510199791
    - **Swim (Idle)**
    2510201162
    - **Climb**
    2510192778
    -
    -
    - **Stylish** - - - **Run**
    616140816
    - **Walk**
    616146177
    - **Jump**
    616139451
    - **Idle**
    616136790, 616138447, 886888594
    - **Fall**
    616134815
    - **Swim**
    616143378
    - **Swim (Idle)**
    616144772
    - **Climb**
    616133594
    -
    -
    - **Superhero** - - - **Run**
    616117076
    - **Walk**
    616122287
    - **Jump**
    616115533
    - **Idle**
    616111295, 616113536, 885535855
    - **Fall**
    616108001
    - **Swim**
    616119360
    - **Swim (Idle)**
    616120861
    - **Climb**
    616104706
    -
    -
    - **Toy** - - - **Run**
    782842708
    - **Walk**
    782843345
    - **Jump**
    782847020
    - **Idle**
    782841498, 782845736, 980952228
    - **Fall**
    782846423
    - **Swim**
    782844582
    - **Swim (Idle)**
    782845186
    - **Climb**
    782843869
    -
    -
    - **Vampire** - - - **Run**
    1083462077
    - **Walk**
    1083473930
    - **Jump**
    1083455352
    - **Idle**
    1083445855, 1083450166, 1088037547
    - **Fall**
    1083443587
    - **Swim**
    1083464683
    - **Swim (Idle)**
    1083467779
    - **Climb**
    1083439238
    -
    -
    - **Werewolf** - - - **Run**
    1083216690
    - **Walk**
    1083178339
    - **Jump**
    1083218792
    - **Idle**
    1083195517, 1083214717, 1099492820
    - **Fall**
    1083189019
    - **Swim**
    1083222527
    - **Swim (Idle)**
    1083225406
    - **Climb**
    1083182000
    -
    -
    - **Zombie** - - - **Run**
    616163682
    - **Walk**
    616168032
    - **Jump**
    616161997
    - **Idle**
    616158929, 616160636, 885545458
    - **Fall**
    616157476
    - **Swim**
    616165109
    - **Swim (Idle)**
    616166655
    - **Climb**
    616156119
    -
    -
    diff --git a/.cursor/rules/roblox/en-us/art/accessories/accessory-fitting-tool.md b/.cursor/rules/roblox/en-us/art/accessories/accessory-fitting-tool.md deleted file mode 100644 index ac158189..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/accessory-fitting-tool.md +++ /dev/null @@ -1,277 +0,0 @@ ---- -title: Accessory Fitting Tool -description: The Accessory Fitting Tool lets you adjust and test custom accessory models on different body types, animations, or custom assets. -labels: Article,Engine,Cloud API ---- - -The **Accessory Fitting Tool** (AFT) is a built-in Studio tool that allows you to test your custom models on multiple combinations of character bodies, animations, and accessories before generating the final `Class.Accessory` object. When testing your accessories, you can make minor fit and positional changes to ensure that you get the best result possible. - -The AFT automatically handles the conversion of the custom `Class.Model` or `Class.MeshPart` based on the user menu selections, allowing you to create **layerable clothing accessories** or **rigid accessories**. After generating your accessory, the AFT creates the correct `Class.Accessory` object hierarchy with any updated fit edits, sets the appropriate `AccessoryType` property, and generates any required body attachment points. - - -
    - -
    Test and edit the cages of your layered clothing assets.
    -
    -
    - -
    Test and edit the orientation and placement of your rigid assets.
    -
    -
    - - -If you are intending to sell your accessory on the Marketplace, make sure your accessory model design adheres to the [Marketplace Requirements](../../marketplace/marketplace-policy.md). - - -## Set up accessories - -The first stage of the fitting workflow allows you to configure the type of accessory to correctly populate the correct fitting tools and generate the appropriate accessory object. When selecting the type of accessory, the following options are available: - -- **Clothing**: Layerable accessories that use an inner and outer cage to stretch and wrap around a body and other clothing items. -- **Accessory**: Rigid accessories that attach to a specific attachment point of a character and remain static in that position and orientation. - -Before using the tool, ensure that you have the `Class.MeshPart` or `Class.Model` you intend to create into an accessory selectable in your project. As a reference, you can test the AFT using a reference [clothing](../../assets/accessories/reference-files/Additional-FBX-assets.zip) or [rigid accessory](../../assets/accessories/reference-files/Bow-rigid.rbxm) custom model. - -To setup your accessories: - -1. Ensure that your custom asset is selectable in your project. See [3D Importer](../../art/modeling/3d-importer.md) for instructions on importing a custom model into your experience. -2. In the toolbar's **Avatar** tab, click **Accessory** to open the AFT. -3. Select the **Part** field and click on the `Class.MeshPart` or `Class.Model` in the viewport that you intend to preview. The text field populates with the name of the object selected. - - - -4. Click **Next**. The Asset Type menu screen displays. -5. Select the correct Asset Type for your accessory. An additional dropdown displays for a specific `AssetType` selection. - - - -6. Use the dropdown to select the specific type of accessory to preview. This sets the correct `AssetType` and attachment points when creating the accessory. - - - -7. Select the expected scaling of an accessory. This only affects rigid accessories if the specific body part has a different `AvatarPartScaleType` `Class.StringValue` object. This does not affect clothing accessories. - - 1. **Classic**: Sets the scaling of the accessory to classic R15 proportions. - 2. **Proportions Slender**: Sets the `AvatarPartScaleType` value to `ProportionsSlender`. - 3. **Proportions Normal**: Sets the `AvatarPartScaleType` value to `ProportionsNormal`. - -8. Click **Next** to continue. A preview panel and workspace tools display. - - - -## Test accessories - -After you provide the initial accessory details, the tool displays a preview panel. With the preview panel, you can test how your accessory looks on different combinations of character bodies, clothing items, animations, or even custom assets in your experience. - - -At any point of the testing process, you can [initiate a playtest](../../studio/testing-modes.md#playtesting) to launch an instance of your experience where your avatar is replaced with the currently selected character body and accessories from the AFT. - - -If you notice any fitting issues with your accessory, you can use the [edit](#edit-accessory-fit) tools to make minor adjustments to your accessory. - -### With different bodies - -You can select different bodies to test the fit and wear of your accessories. The AFT supplies several default character models you can use to ensure your accessories fit as expected. - - -
    - -
    Bazooka Bones character preview
    -
    -
    - -
    Goblin character preview
    -
    -
    - -To test your accessory with a different body: - -1. In the tool's catalog, navigate to **Avatars** > **Default**. -2. Click one of the character model tiles. The preview loads with the selected character model. - 1. If two character tiles are selected, click a selected tile to deselect it. - 2. In the character preview, **click** and **drag** to rotate and **right-click** to pan to inspect your character. - -### With different clothing - -You can select different clothing accessories to test the fit and layering of your caged accessories. The AFT supplies several default character models you can use to ensure your accessories fit as expected. - - -
    - -
    Goblin character preview with reference clothing
    -
    -
    - -
    Magma Fiend character preview with reference clothing
    -
    -
    - -To test your accessory with a different accessory: - -1. In the tool's catalog, navigate to **Clothing** > **Default**. -2. Click one or more of the available catalog items. The character preview loads with the selected clothing accessory. - 1. In the catalog, click an active tile to deselect the asset. - 2. In the character preview, **drag** and **drop** the accessory boxes to change the layer order. - 3. In the character preview, **click** and **drag** to rotate and **right-click** to pan to inspect your character. - -### With animations - -You can select different animations to test the movement of your accessory asset. The AFT supplies several default animation assets you can use to ensure your accessories fit as expected when a model is performing various movements. - - -
    - -
    Walking animation reference
    -
    -
    - -
    Shy emote reference
    -
    -
    - -To test your accessory with different animations: - -1. In the tool's catalog, navigate to **Animations** > **Default**. -2. Click one of the animation asset tiles. - 1. In the catalog, press the play and pause icon to control the playback. - 2. In the character preview, **click** and **drag** to rotate and **right-click** to pan to inspect your character. - -### With custom assets - -You can add custom character models, clothing accessories, and animations that are part of your workspace to the AFT preview catalog. Use this functionality to verify that your accessory works with any other custom models or accessories they may interact with in your experience. - -To add custom assets: - -1. Click the ⊕ icon next to the catalog search. A prompt appears, allowing you to choose a supported object. - - - -2. Select any `Class.Accessory`, `Class.Model`, `Class.MeshPart`, `Class.Animation` or `Class.Folder` within the 3D viewport or **Explorer**. The asset displays in the corresponding **Custom** category. - - 1. If no selection is made, click the tool panel again to exit the prompt. - - - -## Edit accessory fit - -The AFT populates different fitting tools depending on the type of accessory being created. - -### Layered clothing - -When editing clothing items, the following tools populate in the viewport: - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    IconDescription
    Toggles the [Cage Editing](#cage-editing) interface in the viewport for making minor inner or outer cage changes to your clothing.
    Toggles [auto-skinning](../../art/accessories/automatic-skinning-transfer.md#enabling-automatic-skinning-transfer) between `EnabledPreserved` and `EnabledOverride`. Depending on the asset and skinning quality, auto-skinning may provide better results.

    EnabledPreserved uses the asset's original skinning data applied in a modeling software.
    `EnabledOverride` transfers skinning data from the avatar character instead of using the asset's original skinning data.
    Displays a button to **Bring Mannequin in View** which centers mannequin in front of the camera.
    Centers the camera on the mannequin.
    - -#### Cage editing - -When the Cage Editing interface is enabled, additional tools display in the viewport. The viewport also displays the vertices of the selected cage over the mannequin, allowing you to make positional edits to the cage and change how a clothing item can fit on a body. - - - - -You can use these Cage Editing tools for minor to moderate cage edits. If your asset requires major fit or sculpting changes, edit the cage meshes directly in a third-party modeling software, such as Blender or Maya, and import the updated model into Studio. - - -Use the following cage editing tools to help visualize and edit any cage vertices: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    IconDescription
    Toggles the selection for the inner and outer cage vertices. When selected, the vertices of that specific cage are available to edit.
    **Falloff Distance** sets the radius of influence when editing vertices of the cage mesh. When editing a cage vertex, nearby vertices follow the changes for efficient cage editing.

    A higher Falloff Distance applies influence to vertices further away from the origin.
    Displays additional buttons:
    • Bring Mannequin in View - centers camera on the mannequin.
    • Reset Inner/Outer Cage - resets any changes made to the selected cage.
    Use the slider to set the opacity of the mesh or the cage vertices. Setting the opacity allows you to better see and access certain vertices and angles of your clothing item.
    - -To make changes to the vertices of the currently selected cage: - -1. In the Studio toolbar, disable **Move** snapping. This enables you to make detailed changes to a vertex's position. -2. Select a vertex and use the **Move** tool to reposition. Changes to the cage apply immediately and display in the preview panel. - 1. Use the opacity sliders to better visualize the changes to your cage. - 2. Set the **Falloff Distance** depending on the number of vertices being adjusted at once. - - -### Rigid accessories - -When fitting rigid accessories, a bounding box appears around the mannequin indicating the possible placement of that specific type of accessory. You can **position**, **rotate**, and **scale** objects within this bounding box to ensure your accessory fits on different character models. - - -
    - -
    Adjust your rigid accessory fit within the bounding box.
    -
    -
    - -
    If the accessory is outside the appropriate space, the bounding box turns red.
    -
    -
    - -### Create accessory - -You can create the accessory at any time. The tool applies any fit changes and generates the appropriate Accessory instance in the workspace depending on the type of accessory selected and any configurations applied. - -When you are ready to generate your accessory, select **Generate MeshPart Accessory**. - - -
    - -
    Hierarchy generated for layered clothing.
    -
    -
    - -
    Hierarchy generated for rigid accessories.
    -
    -
    - -With an accessory successfully created, you can now try the following: - -- Equip the accessory on an avatar-ready character by drag and dropping the accessory on an existing model, or using [HumanoidDescription](../../characters/appearance.md#manually-modify-appearance). -- Save the accessory as an [avatar asset](../../projects/assets/index.md#for-avatars) for use in an experience later. -- If you meet certain account requirements, you can [upload your asset](../../marketplace/publish-to-marketplace.md) for moderation and start selling it on the Marketplace. diff --git a/.cursor/rules/roblox/en-us/art/accessories/automatic-skinning-transfer.md b/.cursor/rules/roblox/en-us/art/accessories/automatic-skinning-transfer.md deleted file mode 100644 index 972d165b..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/automatic-skinning-transfer.md +++ /dev/null @@ -1,184 +0,0 @@ ---- -title: Automatic Skinning Transfer -description: Automatic Skinning Transfer can create deformation data for character accessories without manual skinning. ---- - -**Automatic Skinning Transfer** allows layered clothing and facial accessories to deform accurately along with the character model it's attached to without having to skin the accessory itself. Instead of the complex task of manually [rigging and skinning](../../art/modeling/rigging.md) models in 3D modeling software, you can use this feature to transfer or generate skinning data to the accessory. When using Automatic Skinning Transfer, the Roblox Engine creates and applies skinning at runtime. - -**No skinning of accessory geometry is required to use Automatic Skinning Transfer**. In fact, auto-skinned accessories work well with most characters they're attached to, even if those characters have a different number of joints, bones, or use a different kind of skinning, and the accessories move accurately with characters as they animate. - - - -Skinning is still an important concept for character creation, and if you're creating custom characters, you may want to apply skinning data to the model to create a character with more natural looking poses and animations. For information on how to skin a mesh, see [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md). - - -Because the skinning transfer process uses a character's outer cage to help calculate skinning data to apply onto the accessory, it's important that all [layered clothing requirements](../../art/accessories/project-files.md) are still met when creating accessories. - - -## Enable Automatic Skinning Transfer - -To enable the Automatic skinning transfer process, you must enable the `Class.WrapLayer.AutoSkin|AutoSkin` property within the `Class.WrapLayer` instance of the layered `Class.Accessory` you want to automatically skin, then set it to one of the following values: - -- `Disabled`: Disables the Automatic Skinning Transfer process. This is the default value. -- `EnabledOverride`: Enables the Automatic Skinning Transfer process, and allows it to override any existing skinning information found on the accessory at runtime. -- `EnabledPreserve`: Enables the Automatic Skinning Transfer process, but doesn't allow it to override any existing skinning information found on the accessory at runtime. If there isn't any skinning to maintain, the Automatic Skinning Transfer process automatically creates new skinning data. - -When there isn't any skinning data on the accessory, or if you choose to override any existing skinning data associated with the accessory, the Roblox Engine calculates skinning data from the character's geometry and cages, then the new skinning data and rig associated with the accessory drives the accessory's deformations and motions in sync with the source geometry itself. - -## Best practices - -While Automatic Skinning Transfer often works better than manual skinning, there are some best practices to reduce unexpected behavior with the accessory skinning. Like all modeling processes, constantly test your layered clothing and facial accessories on different avatar types to achieve the results you want. - -### Special skinning transfer joints - -Automatic skinning transfer may not work well for certain detailed accessory types, like eyelashes or eyebrows. To get a more controlled skinning transfer result, you have the option to skin accessory geometry to one of two specially named joints: `RBX_Leader` and `RBX_Follower`. - - -It's best to create these joints/bones directly beneath the Root joint in your hierarchy for simplicity and clarity. These joints/bones won't be detected as a part of your character model's R15 rig on import. - - -Any vertices skinned to `RBX_Leader` will undergo the same transfer process that exists today. However, any vertices skinned to `RBX_Follower` will actually transfer based on their nearest leader vertex. This allows for better results in situations like an eyelash where the tip of an eyelash strand would normally transfer to somewhere on the brow area, rather than follow the base of the eyelash strand when moving. - -For eyelashes, good candidates for RBX_Leader are the ones that are intended to sit right on the eyelid of the character. The remaining vertices can be skinned to RBX_Follower. - - -
    - Screenshot of vertices assigned as leader. -
    Vertices of an eyelash assigned to a RBX_Leader bone vertex group.
    -
    -
    - Screenshot of vertices assigned as follower. -
    Vertices of an eyelash assigned to a RBX_Follower bone vertex group.
    -
    -
    - -For eyebrows, good candidates for RBX_Leader are vertices along the edges that span the browline. - - -
    - Screenshot of vertices assigned as leader. -
    Vertices of an eyebrow assigned to a RBX_Leader bone vertex group.
    -
    -
    - Screenshot of vertices assigned as follower. -
    Vertices of an eyebrow assigned to a RBX_Follower bone vertex group.
    -
    -
    - -In Blender, user the **Object Data Properties** > **Vertex Groups** to manage and view your vertex group assignments. - - Screenshot of properties panel with vertex group assignments - - -In Blender, vertex groups automatically created after you make a bone object. This allows you to quickly set vertices to a specific bone vertex group. - - - -
    - -
    Eyelashes without transfer joints. Notice how the upper eyelashes near the bridge of the nose doesn't follow the eyelids as expected.
    -
    -
    - -
    Eyelashes with transfer joints. All eyelashes follow the leading vertices closest to the eyes.
    -
    -
    - -No additional work is needed in Studio to support this method. If your accessory is set to `Class.WrapLayer.AutoSkin.EnabledOverride` and these joints exist with vertices assigned to them, then this skinning transfer variation will be in effect. - -If you wish to upload an accessory using these joints as a UGC item, there are a few rules to be aware of: - -- Vertices cannot be partially weighted to these joints. If you want to use them you must skin the vertex to the joint with a weight of `1.0`. -- If these joints are present in the mesh, then the accessory must be set to `WrapLayerAutoSkin.EnabledOverride`. -- Body part meshes containing these joints will be rejected by validation. -- Eyebrow and Eyelash accessory types are required to have the special skinning joints and be set to `WrapLayerAutoSkin.EnabledOverride`. - -### Modify character cages - - -You can't upload assets with a partial cage to the Marketplace. You may use partial cages for assets intended for in-experience use, but the Marketplace validation process will reject assets with partial cages. - - -You can modify character cages for the accessories to deform accurately to the expected character surfaces using the Automatic Skinning Transfer. For example, auto-skinning may cause layered clothing to deform based on an incorrect body part because the transfer process is based on the closest distance between the accessory and its inner cage. In the following instance, a beard accessory was modeled using a blocky-type full-body cage. This causes the beard to deform incorrectly because parts of the beard are closer to the character cage's upper chest instead of the chin: - - - - - -To prevent a layered accessory from using skinning data from an undesired area of the character's geometry, you can model your asset on a different character mannequin cage. For example, a blocky-type character will struggle with a beard skinning to the torso, but a character with an actual neck, like a humanoid, won't have this problem. - -Alternatively, you can remove parts of the outer cage that the layered accessory shouldn't be skinned to. **This is not a valid workflow for assets intended for the Marketplace**, but you can use this for in-experience assets or assets for other use. For example, the following image shows how the outer cage was modified so that it only includes the head geometry. With this improvement to the outer cage, when you automatically transfer skinning data, the beard and partial cage now correctly transfer skinning only from the head geometry. - - - - - -It's important to note that you could also solve the previous example's deformation issue by using a different cage altogether. For example, if you use a more humanoid cage with more space between the chest and the chin, the beard is closest to the head instead of being near the chest or neck area, so the Automatic Skinning Transfer wouldn't transfer skinning data from those regions. - - - -By modifying different regions of the character's cage, you can ensure that your layered clothing and facial accessories deform in relation to the correct region of the body or head, such as modifying the character model's arms so dresses don't incorrectly attach to them while a character is running, or modifying pants that incorrectly map to feet. The following video demonstrates how a jacket's collar incorrectly moves with the head, as the layered clothing is deforming in the collar region, which is closest to the head portion of the cage. To resolve this, you can remove the head portion of the cage so that the jacket won't incorrectly deform in relation to the head at all. Instead, it will deform in relation to the shoulder region, which is much more appropriate for this article of clothing. - - - - - - -During the asset creation process, it's important to verify what skinning solution works best for your design by testing your individual assets on multiple models and animations. You can always skin your assets manually and choose to use the Automatic Skinning Transfer later. - - -### Different accessory categories - -Automatic skinning transfer may not work well for certain accessory categories, such as hat, and glasses-type accessories. For example, hat or glasses accessories might introduce deformation in areas that should typically be rigid. In general, those accessories should remain rigid, and you shouldn't associate any skinning data with them. - -For a summary of suggested `Class.WrapLayer.AutoSkin` parameters for different accessory categories, see the following table: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Accessory CategorySuggested Parameter
    Beard`EnabledOverride`
    Eyebrow`EnabledOverride`
    Eyelash`EnabledOverride`
    Hair`Disabled`
    Hat`Disabled`
    Glasses`Disabled`
    Shirt`EnabledOverride` or `EnabledPreserve`
    Pants`EnabledOverride` or `EnabledPreserve`
    Shoes`EnabledOverride` or `EnabledPreserve`
    diff --git a/.cursor/rules/roblox/en-us/art/accessories/body-scale.md b/.cursor/rules/roblox/en-us/art/accessories/body-scale.md deleted file mode 100644 index e749b708..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/body-scale.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Body scale and proportions -description: Avatars come in 3 different standard sizes, Classic, Rthro, Rthro Slender. ---- - -Roblox supports three common avatar sizes, known as **Classic**, **Rthro**, and **Rthro Slender**. This standard sizing helps keep avatar characters consistent, allowing developers to create experiences and environments that can fit commonly sized character models. - -When modeling rigid accessories, like a helmet that contours around a character's head, it's important to use a mannequin to help ensure your proportions fit. The asset provided in this tutorial example was originally modeled using **Rthro** proportions. Layered clothing, such as clothing, don't require body scale specification, since layered assets automatically stretch and deform over any body scale. - -If you are modeling your asset, visit the [references resources](../../avatar/resources.md#references) to download any of the following mesh mannequin: - - -
    - -
    -Classic blocky body scale.

    Roughly 4.75 studs tall. -
    -
    -
    - -
    -Normal body scale.

    Roughly 5.75-6.5 studs tall, with wider shoulders and narrower hips. -
    -
    -
    - -
    -Slender body scale.

    Roughly 5.25-6.25 studs tall, with narrower shoulders and wider hips. -
    -
    -
    - -See the [accessory apecifications](../../art/accessories/specifications.md#body-scale) and the [body specifications](../../art/characters/specifications.md#body-scale) for specific range values and other geometry requirements. - -## AvatarPartScaleType - -Roblox represents body scale in the engine by an `AvatarPartScaleType` `Class.StringValue` object within each avatar character part and associated accessory. In most cases, asset creators do not need to directly access or modify this value object since tools, such as the [Accessory Fitting Tool](../accessories/accessory-fitting-tool.md), automatically generate the appropriate value object on accessory creation. - -In cases where you may need to identify the current body scale of a body part or accessory, the following table defines the `AvatarPartScaleType` value for each type of body size. When importing your model, use the 3D Importer's [Rig Scale](../modeling/3d-importer.md#rig-general) to automatically apply a scale to your icustom asset. - - - - - - - - - - - - - - - - - - - - - - -
    Body ScaleAvatarPartScaleType value
    Classic`Classic`
    Normal`ProportionsNormal`
    Slender`ProportionsSlender`
    diff --git a/.cursor/rules/roblox/en-us/art/accessories/caging-best-practices.md b/.cursor/rules/roblox/en-us/art/accessories/caging-best-practices.md deleted file mode 100644 index 8e34e161..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/caging-best-practices.md +++ /dev/null @@ -1,276 +0,0 @@ ---- -title: Caging best practices -description: In-depth description and images of various caging best practices for layered clothing. ---- - - -

    - -Caging is a complex process required to define the inner and outer surface of a layered clothing item. Properly caged assets allow your clothing items to stretch and layer in combination with each other. Cages that are improperly configured can lead to cosmetic issues with the look and feel of your clothing item. - - -
    - -
    A properly configured cage typically includes a tight layering of the inner cage, clothing mesh, and the outer cage.
    -
    - -
    - -
    The t-shirt stretches and fits naturally over a base body.
    -
    - -
    - -
    Other layered objects, such as a jacket, should stretch and fit naturally over a target body and any other caged assets.
    -
    - -
    - -In extreme cases, improper cages may interfere with gameplay or social elements on Roblox. If your asset includes improper cages, Roblox may prevent you from uploading them to the Marketplace and may remove existing assets with improper cages from the catalog. - - -Roblox is enforcing a stricter set of validation rules to improve the overall quality of layered clothing accessories in the Marketplace. - - -The following [best practices](#best-practices) and [common issues](#common-issues) is useful for 3D clothing creators of all levels and can elevate the quality of your clothing creations and save time with troubleshooting. - -## Best practices - -Always start any caging work with one of Roblox's [provided caging templates](../../assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip). These templates include an inner cage and outer cage with properly set UVs. - - -You should not edit the cage UVs since this will introduce visual artifacts. - - -When caging your clothing items, use these important universal guidelines: - -- Any clothing mesh positioned between the inner cage and outer cage will be deformed by the layering system. This is the typical configuration for nearly all layered clothing assets. - -
    - -
    The t-shirt mesh fits snugly between the inner and outer cage.
    -
    - -
    - -
    The correctly configured t-shirt naturally stretches over a target body.
    -
    - -
    - -
    Other layered assets should stretch and fit naturally over a target body and any equipped caged assets.
    -
    -
    - -- You must follow the [naming conventions](../../art/accessories/clothing-specifications.md#cage-meshes) for the clothing geometry and the cage. -- Many caging issues start from incorrect outer cage setup. See [working with outer cages](#working-with-outer-cages) for specific details. -- Do not modify areas of your cage that are unrelated to the clothing item you are caging. For example, do not modify the inner or outer cages of the lower leg areas when caging a t-shirt. -- Review any specific best practices for [form-fitting clothes](#caging-form-fitting-clothing), [bulky clothes](#caging-bulky-clothing-items), and [clothing with protrusions](#caging-protrusions). -- If troubleshooting any issues, review [common issues](#common-issues) to help identify problematic clothing items or specific validation errors. - -### Working with outer cages - -As long as the clothing mesh properly fits **over the inner cage** and **under the outer cage**, you can edit the outer cage in various ways depending on the final visual effect you intend to achieve. - -When working with the outer cage, use the following guidelines when possible: - -- Move vertices outwards in the normal's direction. - -- Keep the outer cage as close to the clothing as possible. -- Work symmetrically as much as possible to save time. -- Do not alter the UVs in any way. -- Do not stack your vertices. -
    - -
    Two vertices stacked directly over each other. This will introduce visual artifacts when layering other layered accessories on top.
    -
    - -- Keep the vertex, edge, and face count exactly the same as when you started. -- Keep your cage's edge spacing as evenly as possible. - -
    - -
    Outer cage with even spacing whenever possible on the faces.
    -
    -
    - -
    Outer cage with uneven spacing throughout the torso area. Uneven cages can create visual artifacts and uneven deformations.
    -
    -
    - -- Keep your cage's break lines between body parts lined up to the joint's position as possible. For example, try to align the elbow to where the LowerArm joint is located. - -
    - -
    Proportional changes can help improve animation and posing quality.
    -
    - -### Caging form-fitting clothing - -Form-fitting clothing, like t-shirts, yoga pants, shorts, sweaters and slim jackets, are the most common type of layered clothing. - -In this case, the outer cage needs to completely envelop the clothing accessory with minimal gaps between inner cage, clothing, and outer cage. - -- Move outer cage vertices outwards to completely cover the clothing item, while maintaining the silhouette of the clothing as much as possible. -- Do not move outer cage vertices that don't contribute to covering the clothing item. For example, don't move outer cage vertices in the lower leg when the clothing item is a t-shirt. -- The entire clothing item should be located in-between the outer and inner cages. - -### Caging bulky clothing items - -Bulky clothing items, like puffy jackets, sweat pants, and hoodies, require additional displacement of the outer cage vertices will be much larger to envelop the bulky asset. The outer cage should still completely wrap the external surface of a bulky item. - -- Pay special attention to the direction neighboring outer cage vertices are moved. -- Move along vertex normal directions as much as possible. -- Move vertices nearby each other more or less along the same directions (smooth relative displacements). -- Avoid moving vertices that are not covered by the clothing item, such as moving vertices in the arm region if you are making pants. - -### Caging protrusions - -Some clothing items may have assets that may protrude or extend past the rest of the clothing. Examples include clothing with puffy hoods, shoulder pads, and spikes. - - -
    - -
    Like all clothing, clothing with protrusions should fit over inner cages.
    -
    - -
    - -
    Setting the outer cage below the puffy hood allows the hood to be visible even when equipping other layered assets.
    -
    - -
    - -
    Setting the outer cage above the puffy hood causes additional layered assets to stretch and cover the protrusion which is often undesired.
    -
    -
    - -To ensure that the protruded region stays visible independent of the number of layers: - -- Leave the protruded region outside the outer cage. Alternatively, edit the outer cage to pass under the regions that are meant to be visible and undeformed. -- Avoid moving vertices that are not covered by the clothing item - -## Common issues - -Improper caging can cause various rendering and deformation issues. The following common examples can help diagnose and troubleshoot any caging issues you may encounter. - -### Uneven caging - -Unexpected outer cage shapes causes issues when other layered assets are equipped. While the clothing may fit correctly on a target body, any additional layers will fail to stretch and deform appropriately. - - - -
    - -
    The outer cage of the black shirt is set up with uneven vertices producing an undulated caging surface.
    -
    -
    - -
    Any layered clothing accessory fit on top will have visual artifacts even if the clothing asset itself looks fine.
    -
    -
    - -### Identical inner and outer cage - -If the inner cage and outer cage are exactly the same, the layered clothing system cannot properly determine the accessory and may not deform or deform unexpectedly. - - -
    - -
    An example of an identical inner and outer cages.
    -
    -
    - -
    The tshirt deforms in an unexpected manner and fails to render in its original shape or placement.
    -
    -
    - -### Clothing inside inner cage - -Any part of the clothing mesh positioned **inside** the **inner cage** will introduce visual artifacts when the clothing is layered on top of other clothing. You should always avoid this type of configuration. - - - -
    - -
    The clothing mesh intersects and is positioned within the inner cage at the shoulders and abdomen areas.
    -
    -
    - -
    When equipped, the t-shirt does not fit properly, exposing the problematic areas in the shoulders and abdomen.
    -
    -
    - -### Clothing partially outside outer cage - -Any part of the clothing mesh positioned **outside** the **outer cage** will not be deformed by the layered system. This configuration can sometimes be intentional for effect, such as when [caging clothing assets that include protrusions](#caging-protrusions). - - -
    - -
    The outer cage of the tshirt is positioned within the clothing mesh near the abdomen.
    -
    -
    - -
    When equipped, layered assets fail to fit properly at the affected areas.
    -
    -
    - -### Oversized outer cage - -Ensure that the gap between the layered accessory and the outer cage is not too large. This can cause severe deformation issues when combined with other layered assets. - - - -### Collapsed cage vertices - -When cage vertices are collapsed into one vertex or a small region, any additional layer placed on top of your clothing item will have weird artifacts near the collapsed region. - -
    - -
    Most 3D applications can indicate if vertices are directly overlapping
    -
    - - -This setup will be rejected during validation. - - -### Cages with missing limbs - - - -The cage is meant to match the shape of the template body used to model your clothing item. Cages without heads or missing limbs won't work properly with the layered clothing system. - - -This setup will be rejected during validation. - - -### Outer cage inside the inner cage - -Setting the outer cage inside the inner cage creates a clothing item that can't properly layer with other assets. - - - - -This setup will be rejected during validation. - - -### Mesh outside of outer cage - -Layered assets placed outside their outer cages do not deform. If the item is completely outside then it will behave similar to a rigid accessory. - - -
    - -
    Assets outside of the cage meshes are not supported.
    -
    -
    - -
    Even with a correct hierarchy, assets outside the cages will not deform.
    -
    - -
    - - -This setup will be rejected during validation. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/clothing-export-settings.md b/.cursor/rules/roblox/en-us/art/accessories/clothing-export-settings.md deleted file mode 100644 index 3cc65f65..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/clothing-export-settings.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -title: Layered clothing export settings -description: Use the appropriate export settings in Maya and Blender to generate Studio-ready .fbx files. ---- - -Export your mesh or model as a `.fbx` or `.gltf` to take advantage of all of Studio's 3D import features. When rigging or skinning a layerable model, these file types contains all the mesh and texture data, including the rig and influence data, you need to later [import](../../art/modeling/3d-importer.md) into Studio. - - -If creating other types of 3D models: -
      -
    • For generic meshes, see [general mesh specifications](../modeling/specifications.md) and [general export settings](../modeling/export-requirements.md).

    • -
    • For rigid accessories, see [accessory specifications](../accessories/specifications.md) and [accessory export settings](../accessories/export-settings.md).

    • -
    • For avatar characters, see [avatar specifications](../characters/specifications.md) and [avatar export settings](../characters/export-settings.md).
    • -
    -
    - -## Before exporting - -Before exporting, ensure that you are only exporting the Roblox supported objects related to your model. If you have any modifiers to your mesh or project objects, make sure to apply or delete them before export. - -You can export layered clothing models with the following object structure: - -Blender clothing data model example - -- Armature parent - - Bones / joints - - Primary mesh object -- Cage parent object - - - Inner cage mesh object - - Outer cage mesh object - -You can also export shoes together. Even though left and right shoes are separate accessories, you can either export the left and right shoe individually, or export both shoes at the same time using the following structure: - -Shoe clothing data model example - -- Armature parent - - Bones / joints - - Left shoe mesh object - - Right shoe mesh object -- Cage parent object - - Left shoe inner cage - - Left shoe outer cage - - Right shoe inner cage - - Right shoe outer cage - - -Each shoe must include their own inner and outer cage. - - -## Blender - -Blender allows you to export in `.fbx` or `.gltf` as well as other formats. If you are using `.fbx` export, familiarize yourself with [Blender's FBX scaling](../blender.md#adjust-scale-fbx) to ensure that you successfully import the model into Studio at the correct scale. - -### Export settings - -To export the `.fbx` file in Blender: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export**, then **FBX (.fbx)**. The **Blender File View** window displays. -3. On the right-hand side, change the **Path Mode** property to **Copy**, then toggle the **Embed Textures** button. - - - -4. If your project doesn't already have `.01` scene unit scaling, set the **Transform** > **Apply Scalings** to `FBX Unit Scale`. For more details, see [Blender FBX scaling](../blender.md#adjust-scale-fbx). - - - -5. Under the **Armature** section, disable **Add Leaf Bones**. - - - -6. Click the **Export FBX** button. -7. After exporting, use Studio's [3D Importer](../../art/modeling/3d-importer.md) to import your model and the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) to convert the model into an accessory. - -## Maya export settings - -To export a mesh in Maya as a `.fbx` file: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export All**. The **Export All** window displays. -3. Near the bottom of the window, click the **Files of type** dropdown, then select **FBX export**. -4. On the right-hand side of the window, navigate to the **Options...** section. -5. In the **Geometry** section, enable **Smooth Mesh** and **Referenced Asset Content**. -6. If you need to import textures as a `.png`, in the **Embed Media** section, enable **Embed Media**. -7. In the **Advanced Options** section, - - Navigate to **Units**, then enable **Automatic**. - - Navigate to **Axis Conversion**, then set the **Up Axis** property to **Y**. -8. Click the **Export All** button. - -9. After exporting, use Studio's [3D Importer](../../art/modeling/3d-importer.md) to import your model and the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) to convert the model into an accessory. diff --git a/.cursor/rules/roblox/en-us/art/accessories/clothing-specifications.md b/.cursor/rules/roblox/en-us/art/accessories/clothing-specifications.md deleted file mode 100644 index 5f9abc09..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/clothing-specifications.md +++ /dev/null @@ -1,215 +0,0 @@ ---- -title: Clothing specifications -description: Layered clothing specifications lists the specific technical requirements for the visible mesh, cages, and proper rigging and skinning data. ---- - -When creating clothing for Roblox, it's important to meet specific technical requirements to ensure compatibility and optimize for performance and quality. Many of these requirements must be applied when designing and modeling your asset in a third-party modeling application. - -Although [rigid accessories](../../art/accessories/specifications.md) and layerable accessories share many technical requirements, layerable clothing accessories must include additional components to ensure the accessories deform and stretch appropriately on different body scales. - -If you are intending to publish and sell these assets on the Marketplace, there are additional [Marketplace policy](../../marketplace/marketplace-policy.md) standards that you must follow for any accessory or clothing item. - -When ready to export, see [export requirements](../../art/accessories/clothing-export-settings.md) for mesh export settings for Blender and Maya. - - -If creating other types of 3D models: -
      -
    • For generic meshes, see [general mesh specifications](../modeling/specifications.md) and [general export settings](../modeling/export-requirements.md).

    • -
    • For rigid accessories, see [accessory specifications](../accessories/specifications.md) and [accessory export settings](../accessories/export-settings.md).

    • -
    • For avatar characters, see [avatar specifications](../characters/specifications.md) and [avatar export settings](../characters/export-settings.md).
    • -
    -
    - -## Geometry and Budgets - -- **Single Mesh** - Accessories must be a single mesh. -- **Budgets** - Accessories can't exceed **4k** triangles. -- **Watertight** - All geometry must be watertight without exposed holes or backfaces. -- Use **quads** whenever possible. Avoid faces with 5 or more sides. -- **Mesh Size** - Depending on the type of accessory asset, meshes must follow a standard size (in studs, centered on attachment point) depending on the [body scale](#size-requirements) it is designed for. - -### Size Requirements - -Depending on the type of layerable asset, the size requirements can't exceed the following maximum width, height, and depth (in studs). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Asset TypeWidth (X)Height (Y)Depth (Z)
    T-Shirt, Shirt, Sweater, Jacket, Pants, Shorts, Dress & Skirt888
    Hair35*
    (Not centered: 2 up, 3 down)
    3.5*
    (Not centered: 1.5 front, 2 behind)
    Eyebrow and Eyelashes1.50.50.5
    - -### Attachment Points - -`Class.Attachment` objects indicate where an accessory model attaches to a point on a character body. Whether you are creating rigid or [layered](./layered-clothing.md) accessories, Studio's [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) (AFT) automatically adds and configures the appropriate `Class.Attachment` with the following specifications: - -- **One attachment** - Each accessory, including layered clothing, require at least one attachment point to its associated body part. -- **Naming Convention** - The `Class.Attachment` name must follow a specific naming convention depending on the `Class.Accessory.AccessoryType`. The AFT generates an appropriate `Class.Attachment` name automatically. - -If setting attachment names manually in Studio, use the following `Class.Attachment` name for each accessory type: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Accessory TypeAttachment Name
    Hat`HatAttachment`
    Hair`HairAttachment`
    Back`BodyBackAttachment`
    Waist`WaistFrontAttachment`, `WaistCenterAttachment`, `WaistBackAttachment`
    Shoulder`RightShoulderAttachment`, `RightCollarAttachment`, `NeckAttachment`, `LeftCollarAttachment`, `LeftShoulderAttachment`
    Face, Eyelash, Eyebrow`FaceFrontAttachment`, `FaceCenterAttachment`
    Neck`NeckAttachment`
    Front`BodyFrontAttachment`
    Layered tops (Shirt, TShirt, Sweater, Jacket)`BodyFrontAttachment`
    Layered bottoms (Pants, Shorts, DressSkirt)`WaistCenterAttachment`
    - - - The 3D Importer automatically recognizes mesh objects as attachment points if the objects include the affix `\_Att`. This only applies when importing meshes with caging data, such as clothing or bodies. - - -- **Shoulders and Collars** - Even though they are in similar locations, Shoulder and Collar attachment points interact with character rigs differently for rigid accessories. - - Items using `RightShoulderAttachment` or `LeftShoulderAttachment` move with the character's arm. - - Items using `RightCollarAttachment` or `LeftCollarAttachment` do not move with the character's arm. - -### Face Accessories - -Face accessories, such as hair, eyebrows, and eyelashes are unique accessories that you can bundle with an avatar body upload. At this time, eyebrows and eyelashes can not be uploaded as standalone accessories and must be bundled with avatar bodies. For more information on bundling your face accessories with avatar models, see [Publishing bodies with eyelashes and eyebrows](../accessories/publish-eyebrows-eyelashes.md). - -- **Naming Convention when bundled** - When including these assets with an avatar body upload, the accessory objects must use the following name conventions: - - `EyebrowAccessory` - - `EyelashAccessory` - - `HairAccessory` - -## Textures - -- Textures for Marketplace assets can't exceed 2048x2048 resolution. -- Textures created for accessories must meet Roblox's [texture specifications](../../art/modeling/texture-specifications.md). High resolution textures are automatically converted to lower-resolution textures to optimize performance. - -## Layerable Properties - -Clothing and accessories that deform and fit around any characters and existing clothing items require additional configuration in a 3D modeling software such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). - -To achieve the layering effect, your clothing must meet the following requirements: - -- Asset must be [weighted and bound](#rigging-and-skinning) to an R15 skeleton (Maya) or armature (Blender). -- Asset must contain an [inner mesh cage](#inner-cage) and an [outer mesh cage](#outer-cage). -- Asset must continue to follow any applicable [custom mesh requirements](../../art/characters/specifications.md), such as best practices on watertightness, textures, and polycount budgets. - -See [Creating Layered Models](../../art/accessories/creating/index.md) for a basic guide on applying these requirements on a reference asset in Blender. Once the `.fbx` file is [exported](../../art/accessories/export-settings.md), see [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) for instructions on creating an accessory from your model. - -### Rigging and Skinning - -Rigging and skinning a layered accessory allows the accessory to move naturally with a character body. You can perform this manually through a modeling tool, or [use automatic skinning transfer](../../art/accessories/automatic-skinning-transfer.md) to generate an accessory's skinning data at run time. - -If using modeling software to skin your accessories, keep in mind that **Joint Influences** (Maya) or **Bone Assignments** (Blender) per vertex should be limited to **4**. - -For more information on basic skinning in third-party modeling software, such as Blender's [Automatic Weights](https://docs.blender.org/manual/en/latest/animation/armatures/skinning/parenting.html#with-automatic-weights), see [Skinning a Simple Mesh](../../art/modeling/skin-a-simple-mesh.md) for instructions on rigging, applying weights, and skinning a basic mesh. - -### Cage Meshes - -**Cage meshes**, or **cages**, are invisible meshes that define the inner and outer surfaces of your asset and are fundamental to the layerable properties of clothing items. The inner cage determines the inside surface of a clothing item while the outer cage determines the outside surface of a clothing item. - - -Assets with invalid cage configurations may fail validation and are subject to moderation. See [Caging best practices](./caging-best-practices.md) for examples and instructions. - - -For a basic overview on caging, see the [Basic Clothing Tutorial](../accessories/creating/caging-setup.md) and the relevant section of the tutorial video at [8:32](https://www.youtube.com/watch?v=C-DwGRBHvmE&t=512s): - - - -#### Inner Cage - -The inner cage is the inner surface of your model and defines how the layered asset fits over another layered model. As a best practice, the shape of the inner and outer cage should match each other before editing the outer cage to completely cover your asset. - -The inner cage mesh object must have the same name as the accessory model appended with **\_InnerCage**. - - - - - -#### Outer Cage - -The outer cage defines the external surface that another item's inner cage would layer on top of. Avatar character models must have an outer cage included with its model in order to be compatible with layered clothing. All avatar models available on the [Marketplace](https://www.roblox.com/catalog) include a properly configured outer cage and are compatible with layered assets. - -The outer cage of a layered clothing asset is a mesh that precisely covers the clothing item. The outer cage included in the template files is identical to the inner cage by default and must be the only cage adjusted to fit over an accessory. - -The outer cage mesh object must have the same name as the accessory model appended with **\_OuterCage**. - - - - - - -The vertexes and UVs of the inner and outer cage meshes should not be deleted or removed, as they are used to match coordinates between other cages. - - -## Marketplace Requirements - -Your items must meet the following requirements before you upload them to the Marketplace to sell: - -- Ensure that your items adhere to the [Marketplace Program Guidelines](../../marketplace/marketplace-policy.md). -- Whenever applicable, ensure that your items adhere to Roblox's [custom mesh specifications](../../art/modeling/specifications.md) and [rigid accessory specifications](../../art/accessories/specifications.md). -- Object `Class.MeshPart.Material|Material` is set to `Plastic`. -- Object `Class.MeshPart.Transparency|Transparency` is set to 0. -- Object `Class.MeshPart.VertexColor|VertexColor` is the default `1, 1, 1`. -- Your `Class.Accessory` instance does not contain extraneous objects, like `Class.Script` or additional `Class.Part` instances. diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/converting.md b/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/converting.md deleted file mode 100644 index 4e06fffd..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/converting.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Use the Accessory Fitting Tool -description: Use the Accessory Fitting Tool to convert your model to an rigid accessory. -next: /art/accessories/creating-rigid/publishing -prev: /art/accessories/creating-rigid/importing ---- - -After importing your asset into Studio, you can begin **fitting** your imported object to a mannequin and **converting** the `Class.Model` object into a `Class.Accessory`. When fitting and converting your accessory it's important to use the [Accessory Fitting Tool](../../../art/accessories/accessory-fitting-tool.md) (AFT) to correctly preview the placement and apply the correct configurations to your accessory. - - - -To fit and generate your accessory: - -1. In the toolbar's **Avatar** tab, click **Accessory** to open the AFT. -2. In the new AFT panel, select the **Part** field and, in the workspace, select the accessory `Class.MeshPart` object in the workspace and press **Next**. - -3. Set **type** of asset to **Back**. Press **Next** when complete. - -4. Using both the AFT preview window and the workspace, adjust the position, scale, and rotation of the accessory. - - 1. Use the AFT preview window and your mannequin as an accurate preview of how your asset fits on the character. The clothing mannequin in the workspace does not accurately portray how rigid accessories attach. - 2. In the workspace, use the **Move**, **Scale**, and **Rotate** tools to adjust the positioning of your rigid accessory. - 3. If you accidentally select something else, click back into the AFT panel to reselect the accessory and resume your adjustments using the transformation tools. - -5. After previewing and fitting your asset, select the **dropdown** next to **Generate** button to select **Generate Legacy Accessory**. The accessory object populates in your viewport and in the **Explorer**. - - - For rigid accessories that you intend to sell on the Marketplace you must use the [generate legacy accessory](../accessory-fitting-tool.md#generate-legacy-accessory) option when creating your Marketplace accessories. - - A dropdown appears above the GenerateMeshPartAccessory when expanded, displaying a Generate Legacy Accessory option. - -6. Test your accessory by equipping it to a character and using the **Avatar Setup** tool. - - - - -After successful fitting and converting, your 3D model should populate in your project as a `Class.Accessory`. With this `Class.Accessory` you can perform any of the following: - -- [Upload the accessory](../../../art/accessories/creating-rigid/publishing.md) to the Marketplace. -- Use the accessory in your current experience by equipping it to character models with [HumanoidDescription](../../../characters/appearance.md#manually-modify-appearance), or by dragging and dropping the accessory under the appropriate character `Class.Model` object. -- Save the accessory to your [Toolbox](../../../projects/assets/toolbox.md) to share or use within any of your experiences. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/exporting.md b/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/exporting.md deleted file mode 100644 index 12812cf0..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/exporting.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -title: Export from Blender -description: Use Blender's .fbx exporter with the correct settings to create a Studio-ready asset. -prev: /art/accessories/creating-rigid/texturing -next: /art/accessories/creating-rigid/importing ---- - - - -After modeling and texturing your asset, you can begin the process of **exporting** your Blender project as a `.fbx` or `.gltf`. For up-to-date settings, see [Export settings](../../modeling/export-requirements.md). - - -If you are creating your own accessory object, it's important to clean up your project, which can involve deleting or removing any extra objects, such as lights, cameras, or mannequins, to ensure you only export the accessory mesh, and applying any modifiers to your mesh object. - - -To export your model as a `.fbx`: - -1. In the topbar, click **File**. -2. Select **Export**, then **FBX (.fbx)**. -3. On the right-hand side of the file view window, change the **Path Mode** property to **Copy**, then toggle the **Embed Textures** button. - - - -4. Set the **Transform** > **Scale** to `.01`. This is required to maintain scale size for `.fbx` exports. - - - -5. Click the **Export FBX** button. - - -You've completed the exporting section of this tutorial. If desired, download a [reference sample](../../../assets/art/accessories/creating-rigid/Rigid_Mask_Export.fbx) of this exported file for comparison. You can use this reference in the next importing step. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/importing.md b/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/importing.md deleted file mode 100644 index 9d006840..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/importing.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -title: Use Studio's 3D Importer -description: Use Studio's 3D importer to import a third-party 3D model into Studio. -next: /art/accessories/creating-rigid/converting -prev: /art/accessories/creating-rigid/exporting ---- - - - -Studio's 3D Importer provides a quick and easy way to import third-party 3D `.fbx` or `.gltf` assets into your projects. The importer provides object previews and error-checking to ensure that your asset meets Studio's general 3D requirements. - -
    - -To import your asset ([downloadable reference](../../../assets/art/accessories/creating-rigid/Chest-Texturing-Complete.fbx)): - -1. From Studio's **File** menu, select **3D Importer**. -2. In the file browser, select the `.fbx` file saved locally. The 3D Importer loads a preview of the object. - 1. If textures don't load for your asset, continue to the next step and add textures manually later. -3. Select **Import**. - 1. The asset populates in your workspace as a `Class.Model` that contains a `Class.MeshPart` with the appropriate textures applied as a `Class.MeshPart.TextureID`. - 2. If textures were not imported correctly, follow the instructions below to add the file manually. - - -Add textures manually - - -If textures didn't load correctly, add them manually. You may need to save and publish your experience in order to access the [Asset Manager](../../../projects/assets/manager.md). - -1. In the **Asset Manager**, click the **Import** button. -2. Upload your image file. -3. After moderation clears for your image, select the `Class.MeshPart` parented within your imported `Class.Model`. -4. In the **TextureID** property, select the value field and add the asset ID of the texture image. - - - - - -After successful import, your model object should populate in your project as a `Class.Model` with the appropriate textures applied. See [3D Importer](../../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/index.md b/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/index.md deleted file mode 100644 index 294b181f..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/index.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Rigid accessory creation -description: This tutorial covers the basic steps required to publish a custom asset on the Marketplace. -next: /art/accessories/creating-rigid/modeling-setup ---- - - -

    - -Rigid accessories are 3D objects that users can equip to their avatar characters in an experience or through Roblox's [Marketplace](https://www.roblox.com/catalog) and [Avatar Editor](https://www.roblox.com/my/avatar). - -Unlike clothing or bodies, rigid accessories do not require additional configuration in a third-party application beyond modeling and texturing, rigid accessories are typically the most basic type of 3D avatar item to create. - -This tutorial covers the basics of each step in the workflow to create your own simple 3D model in Blender and import it into Studio. From there, you can upload the accessory to the Marketplace to sell, save the asset to your toolbox, or use the asset in your experiences. - - -Creating, building, and sharing on Roblox is free. However, the last step of listing your item to sell requires a Premium Roblox account, an upload fee, and a publishing advance. For more information, see the [Marketplace policy](../../../marketplace/marketplace-policy.md#creator-requirements). - - - -
    - -
    - 3D mesh object created in Blender -
    -
    -
    - -
    - Mesh object equipped as an `Class.Accessory` in Studio -
    -
    -
    - - -While this content covers the Blender workflow with a provided reference example, you can apply the same concepts to other third-party modeling applications and custom assets. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/modeling-setup.md b/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/modeling-setup.md deleted file mode 100644 index 193d200b..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/modeling-setup.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -title: Box modeling -description: Create your basic rigid accessory model in Blender. -next: /art/accessories/creating-rigid/texturing -prev: /art/accessories/creating-rigid/ ---- - -A screenshot of blender showing the final 3d shape of a treasure chest in the viewport - -**Modeling** is the process of creating and shaping the 3D geometry of an object. **Box modeling** is a fundamental technique in 3D modeling combining basic shapes and steps to create a more complex object. - -The following instructions are based off of the [Box Modeling 101 staff article](https://devforum.roblox.com/t/modeling-101-in-blender-box-modeling/2963814). The original article includes additional information, as well as Blender setup instructions, best practices, and advanced modeling examples that are not included in this accessory tutorial. - - -Whether you are using an existing shape or creating your own 3D object, it's important to consider [technical requirements](../../../art/accessories/specifications.md), such as keeping your geometry within a polycount budget, and [policy requirements](../../../marketplace/marketplace-policy.md), such as ensuring your design does not infringe on other creator's IP both within and outside of the Roblox ecosystem. - - -## General shape - - - -In a new Blender file, delete everything except the starter cube, then create the basic shape of the treasure chest. - -1. In a new project, select the non-cube objects and press X to delete. -2. Select the cube and press S for scale. - 1. Press Y to lock scaling to the y-axis. - 2. Drag with the mouse to create a rectangle. -3. Switch to Edit mode (Tab). -4. Near the Edit mode dropdown, select the Face selection. -5. Select the top face of the box and press E to extrude. -6. Drag your mouse to extrude the lid. Extend the lid to about half the height of the main body. - -## Rounded lid - - -Create the rounded lid shape using segmentation: - -1. Near the Edit mode dropdown, select the Line selection. -2. Holding Shift, click the top front and back lines of your chest. -3. With both lines selected, press CtrlB/⌘B to bevel. -4. In the context menu at the bottom right, set the number of segments to `6` and enable **Clamp Overlap**. - -### Merge vertices - -Sometimes tools like the **Bevel** tool may move vertices very close to each other without merging them. Use the Merge Vertices function to ensure that your object shares vertices wherever possible. - -1. Near the Edit mode dropdown, select the Vertices selection. -2. Press A to select all vertices. -3. Right-click and select **Merge Vertices by Distance**. -4. In the pop-up modal, set the distance to `.01`. - -## Side insets - - - -Create the left and right insets of your chest: - -1. Near the Edit mode dropdown, select the Face selection. -2. Hold Shift and click both sides of your shape. This selects both the left and right faces. -3. Press I for inset. Drag the mouse to adjust the amount of inset for the new face. - 1. Set the inset about the size of your bevel segmentations. -4. With your new insets selected, right-click and select **Extrude Along Normals**. -5. Use the mouse to drag and adjust the distance of extrusion into the chest. - -## Front insets - -Create the front and back insets of your chest by creating new lines and then extruding your faces between those lines. - -### Vertical loop cuts - - - -To create your vertical loop cuts: - -1. Near the Edit mode dropdown, select the Line selection. -2. Press A to select the entire chest. -3. Use CtrlR/⌘R to create a loop cut. -4. Using your mouse, hover over the object until the highlighted cut is vertical. Click to confirm. -5. In the context menu, set the number of cuts to `2`. -6. With the new lines selected, press S to scale and Y to scale within the y-axis. -7. Use the mouse to drag the lines until they nearly reach the edges of your chest. Click to confirm. - -### Horizontal loop cuts - - - -To create your horizontal loop cuts: - -1. Select the chest, and press CtrlR/⌘R to loop cut. -2. Using the mouse, click to confirm a horizontal cut. -3. Using the context menu, set the number of cuts to `2`. -4. To straighten each line across your object, select the one of your new lines: - 1. Press S for scale. - 2. Press Z to scale within the z-axis. - 3. Press 0 to set the scale value to `0` across the z-axis. -5. Repeat step 4 with the other line. -6. Position the top line near the top below the segmentations. -7. Position the bottom line near the bottom. - 1. Enable **Magnet Snapping** so the bottom line merges with the existing vertices and lines from the side insets. - -### Extrusions - -Create the extrusions for the front, top, and back of the chest. - -1. Near the Edit mode dropdown, select the Face selection. -2. Hold Alt/⌥ and click on your front faces to select the front, top, and back faces. -3. With the faces selected, hold Shift and click on the metal borders to deselect them. The front and back faces, and the top segmentations, should remain selected. -4. Right click and select **Extrude Faces Along Normals**. Drag the mouse to extrude the faces about the same width as the metal borders. - -## Complete border - - - -The chest is almost ready, but is still missing the continuous metal border across the top edge. Remove the existing faces and add new geometry to the treasure chest. - -### Delete faces - -Delete the faces of the top side metal borders: - -1. Near the Edit mode dropdown, select the Face selection. -2. Starting on any side, shift click the three faces of the top metal border. -3. Press X to delete. -4. Repeat steps 2-3 on the other side. - -### Add faces - -Add new faces to the sides that complete the geometry of the treasure chest box. - -1. Near the Edit mode dropdown, select the Line selection. -2. Starting with any side, Hold Shift and click the two top corner edges of the missing face. -3. Right click and select **New Face from Edges** to create a top face. -4. Repeat steps 2-3 with the bottom corner edges to create a bottom face. -5. On the other side of the chest, repeat steps 2-4 to complete the metal border. - - -You've completed the modeling section of this tutorial. If desired, download a [reference version](../../../assets/art/accessories/creating-rigid/Chest-Modeling-Complete.blend) of this stage of the project for comparison. - -This tutorial represents an extremely basic overview of the 3D modeling process. Tools like Blender offer many features, workflows, and techniques to create unique and complex models. Check out Blender's official and community tutorials for additional instructional content. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/publishing.md b/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/publishing.md deleted file mode 100644 index 9dbe8abc..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/publishing.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Upload and publish -description: Before selling your accessory, upload the accessory for validation and moderation. -prev: /art/accessories/creating-rigid/converting ---- - -After generating your `Class.Accessory` item, you can now begin the process of **publishing** the asset to the Marketplace. This step is optional and only applicable for creators who intend to sell their asset. - - -Users must meet [creator requirements](../../../marketplace/marketplace-policy.md#creator-requirements) to be eligible to sell assets on the Marketplace. Creators must also provide an upload fee and a payment advance during the upload and publishing process. - - -Adding your asset to the Marketplace involves 2 steps: - -1. **Uploading** - Uploading the asset to Roblox servers for moderation. -2. **Publishing** - Listing the item on sale on the Marketplace. - - - -## Upload - -To upload your accessory: - -1. In the **Explorer**, right-click your accessory object and select **Save to Roblox…** from the contextual menu. -2. In the **Asset Configuration** window, set the **Content Type** to **Avatar Item**. -3. Complete the following fields (you can adjust these later): - - 1. **Title**: The name of your accessory. - 2. **Description**: A short description of your asset. - 3. **Asset Category**: The type of accessory. This should match the Accessory Type selected during the [fitting and conversion](../../../art/accessories/creating-rigid/converting.md) process. - 4. **Creator**: Use the dropdown to select if you'd like to publish this asset as an individual or as part of an associated group. - -4. After you select the **Asset Category**, Studio begins validating the asset to ensure that it matches Roblox's accessory technical requirements. -5. If the validation is successful, you can submit the asset to the upload and moderation queue for a fee. See [Fees and commissions](../../../marketplace/marketplace-fees-and-commissions.md) for current fee information. - -## Publish - -After uploading your accessory, the asset is added to the moderation queue and may take up to 24 hours to clear. - -You can check your accessory's moderation status in the [Creator Hub](https://create.roblox.com/dashboard/creations). - -After moderation completes, your item's publishing details become available to edit and enable for sale. See the following for an overview on the various sale options available: - - -
    -After listing an asset to the Marketplace, you can return to this page to edit your item's sale details, or take the item offsale. diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/texturing.md b/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/texturing.md deleted file mode 100644 index f2918a8d..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating-rigid/texturing.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Texture painting -description: Covers the process of associating PBR textures to rigid accessories in Blender. -prev: /art/accessories/creating-rigid/modeling-setup -next: /art/accessories/creating-rigid/exporting ---- - -A screenshot of blender showing the final 3d shape and color of a treasure chest in the viewport - -**Texturing** is the process of applying a surface appearance to a 3D object. **Texture painting** is a technique that allows you to digitally brush your surface colors onto your 3D object, or onto the 2D image that represents the surface of your object. - -This tutorial covers basic texture painting in Blender. Common workflows in the industry utilize additional third-party tools to create textures, especially high-definition PBR textures that mimic realistic lighting and texture properties. - - -While PBR textures are not required for accessories and is not covered in this tutorial, adding PBR textures can add extra visual flair and realism to elevate your creations. This typically requires additional software.

    For more information, see [PBR textures](../../modeling/surface-appearance.md). -
    - -## UV projecting - - - -Use Blender's automatic UV Project feature to "unwrap" your 3D object onto a 2D plane. This allows you to associate a 2D image to the 3D surface of your object. - -1. In Edit mode, press A to select your object. -2. In the top UV menu, select **Smart UV Project**. -3. Set Island Margin to `.02`. - -## Add new material - - - -Add a new material for Blender to associate this new texture, and assign it to a new blank 2D image. - -1. In the bottom right panel, select the red **Materials** tab. -2. Select the **+ New** button. Additional material options display below. -3. In **Base Color**, select the dot. A dropdown appears. - 1. Select **Image Texture**. -4. Under Base Color, select the **+ New** button. - 1. Name the texture image file. Using an affix like "\_TXT" can help organize your files later. - 2. Select the color and pick a color. This tutorial recommends using a metallic color for your metal borders to save time. - -## Texture painting - -Texture painting allows you to paint directly on the 3D object or the 2D mapping of the surface. - -Since Blender automatically mapped the 2D atlas of the texture, it's not easy to tell what parts of the 2D image maps to the 3D object. First mark the sections of the 3D object you want to paint solid before completing your texture by painting the 2D map. - - -There are many ways to texture within Blender. To keep this process simple, the tutorial used Blender's [Smart UV Project](https://docs.blender.org/manual/en/2.79/editors/uv_image/uv/editing/unwrapping/mapping_types.html), but there are many ways to manually create your 2D texture islands and organize your mesh and texture. - - -### Mark 3D object - - - -Switch to Texture Paint mode and use the paintbrush to track the "wood" parts of the treasure chest. - -1. In Edit mode, select your object. -2. Switch to **Texture Paint** mode. A side-by-side panel displays with your 2D atlas on the left and the 3D object on the right. -3. Expand the Tool submenu in the top-right of either window. -4. Select your brush settings and mark the wooden areas of your chest. - 1. Use CtrlZ/⌘Z to undo any accidental brushes on the metal border. - 2. Hold F and drag the mouse to adjust brush size. - -### Paint 2D map - - - -With all of the wooden areas of your chest marked, you can now quickly texture your 2D atlas. First adjust your brush settings to have a hard edge and then begin painting the 2D image. - -1. On the left window, access to **Tool** menu in the top right of the window. - 1. Set the **Falloff** shape to the flattest icon to ensure the edges are sharp. - 2. Set the color or any other brush settings here. -2. In the left window, begin coloring in each island of your texture. You can quickly preview the changes on your 3D object on the right side. - 1. Use CtrlZ/⌘Z to undo any accidental brushes on the metal border. - 2. Hold F and drag the mouse to adjust brush size. -3. After completion, navigate to **Image** > **Save** to save your image file. - - -You've completed the texturing section of this tutorial. If desired, download a [reference version](../../../assets/art/accessories/creating-rigid/Chest-Texturing-Complete.blend) of this stage of the project for comparison. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/armature-setup.md b/.cursor/rules/roblox/en-us/art/accessories/creating/armature-setup.md deleted file mode 100644 index 7ddd4cc3..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/armature-setup.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Armature setup -description: Transfer and parent an armature template to your custom clothing Blender project. -next: /art/accessories/creating/test-poses -prev: /art/accessories/creating/texture-painting ---- - -**Rigging** is the process that enables the clothing object to move and deform with a Roblox character's R15 rig. In this tutorial, you'll parent the clothing item to Roblox's provided R15 armature and verify the Automatic Skinning Transfer data. After rigging, be sure to test out some basic poses to ensure that your clothes move and stretch correctly with any character body. - - -
    - -
    Clothing mesh with no rigging data
    -
    -
    - -
    Clothing mesh with rigging data performing pose tests
    -
    -
    - -The rigging process requires the following: - -1. Download and append an R15 armature to your project. -2. Parent the rig with Blender's automatic weights. -3. Test poses. - -## Transfer armature - -Roblox provides an R15 base armature that you can import into your own project. While it is possible to create your own R15 armature rig, importing a premade rig saves you time and reduces the potential for error. - -To import the R15 character armature into your file: - -1. Download Roblox's [Rig_and_Attachments_Template.blend](../../../assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip). Do not open this project. -2. In your current clothing project, return to **Object Mode**. -3. Navigate to **File** > **Append**, and select the saved **Rig_And_Attachment.blend** file. An additional folder structure appears. - - - -4. Select **Armature** > **Armature** and press **Append**. An armature object is added to your workspace. - - - -5. The armature may need reorientation with the following steps: - - 1. With the armature selected, open the **Item tool** sidebar. - 2. Adjust the rotation so the armature is correctly aligned with your mesh. - 3. After alignment, navigate to **Object** > **Apply** > **All Transforms** to freeze your new rotation values. - - - - - -## Parent armature - -With the armature rig in place, you can use Blender's **Parent with Automatic Weights** functionality to quickly set your clothing mesh as a child of the armature. This feature also applies vertex weighting, or **skinning**, automatically to your mesh, which can save you significant time over skinning your clothing manually. - -To parent the clothing to the rig: - -1. Select the clothing mesh object. -2. Hold shift and click the **Armature** object. Ensure that the armature object is the last object selected. -3. Right-click and select **Parent** > **With Automatic Weights**. - - - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/caging-setup.md b/.cursor/rules/roblox/en-us/art/accessories/creating/caging-setup.md deleted file mode 100644 index cf72363b..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/caging-setup.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Caging setup -description: Isolate your outer cage meshes and hide extra objects before modifying your clothing cage. -next: /art/accessories/creating/modify-cage -prev: /art/accessories/creating/test-poses ---- - -**Caging** is the process of setting the clothing's interior and exterior surfaces, referred to as the inner and outer cages respectively. This enables your clothing to layer over existing clothing and bodies, and additional clothes to layer on top. - -Since the shirt in this tutorial was created using the cage templates as a mannequin, there is no need to adjust the inner cage where your clothing asset already fits over. **Only the outer cage needs to be adjusted** to fit over the new clothing item. - - -
    - -
    Clothing and cage meshes before caging
    -
    -
    - -
    Outer cage mesh after caging process
    -
    -
    - -The caging process uses the following steps: - -1. Set up your project by isolating the outer cage and the clothing mesh in your project. -2. Modify the outer cage to wrap over the clothing mesh using sculpting tools. - -To set up your project: - -1. Switch to **Object mode**. -2. In the Outliner: - 1. Hide the Armature. - 2. Unhide your LongSleeve_OuterCage object. -3. In the Outliner, navigate to **Armature** > **Long Sleeve** and toggle the **Disable Selection** icon. This prevents accidental edits to the clothing mesh. - - -4. Select the OuterCage object, and navigate to Object Properties and enable **Wireframe**. This helps easily visualize and access the mesh. - - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/converting.md b/.cursor/rules/roblox/en-us/art/accessories/creating/converting.md deleted file mode 100644 index 138087b7..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/converting.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: Convert -description: Use the Accessory Fitting Tool to convert a Model object to an Accessory. -prev: /art/accessories/creating/importing ---- - -With the `Class.Model` in your project, the last step in the process of clothing creation requires you to convert this object to a standard `Class.Accessory` that avatars can equip. Using the [Accessory Fitting Tool](../../../art/accessories/accessory-fitting-tool.md) (AFT), convert the model object to a `Class.Accessory` that you can then use in your experience or publish to the Marketplace. - -To generate the accessory object: - -1. In the toolbar's **Avatar** tab, click **Accessory** to open the AFT. -2. Select the `Class.Model` of the clothing item in the viewport. The tool's text field populates with the name of the object selected. Alternatively, you can select the object within the **Explorer** window. -3. Test out various sample characters, clothing, and animations. See [Test accessories](../../../art/accessories/accessory-fitting-tool.md#test-accessories) for additional information. - - If required, make minor cage adjustments using the editing features. Larger cage changes may require returning to your third-party modeling software and re-exporting the asset. -4. When ready to generate your accessory, click **Generate MeshPart Accessory**. The accessory object with your model populates in your workspace. - - -
    - -
    Clothing accessory in viewport
    -
    -
    - -
    Clothing accessory in Explorer
    -
    -
    - - -Congratulations, you've completed your clothing tutorial. With this accessory, you can: - -- Equip the accessory on an avatar-ready character by drag and dropping the accessory on an existing model, or using [HumanoidDescription](../../../characters/appearance.md#manually-modify-appearance). -- Save the accessory as an [avatar asset](../../../projects/assets/index.md#for-avatars) for use in an experience later. -- If you meet certain account requirements, you can [upload your asset](../../../marketplace/publish-to-marketplace.md) for moderation and start selling it on the Marketplace. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/exporting.md b/.cursor/rules/roblox/en-us/art/accessories/creating/exporting.md deleted file mode 100644 index e5a1a3be..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/exporting.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Export -description: Use Blender's FBX export with specific settings when exporting a clothing asset. -prev: /art/accessories/creating/modify-cage -next: /art/accessories/creating/importing ---- - -It's important to follow the Blender export settings to ensure a Studio-compatible `.fbx` file. Before exporting your file, ensure that you've removed extra objects, such as lights, cameras, or mannequins, and applied or removed any active modifiers. - -To export your file from Blender: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export**, then **FBX (.fbx)**. The **Blender File View** window displays. -3. On the right-hand side, change the **Path Mode** property to **Copy**, then toggle the **Embed Textures** button. - - - -4. If your project doesn't have .01 scene unit scaling, set the **Transform** > **Scale** to `.01`. - - - -5. Under the **Armature** section, disable **Add Leaf Bones**. - - - -6. Disable **Bake Animation**. - -
    - -7. Click the **Export FBX** button. - - -You've completed the exporting section of this tutorial. If desired, download a [reference sample](../../../assets/art/accessories/creating/Long_Sleeve_Export.fbx) of this exported file for comparison. You can use this reference in the next importing step. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/importing.md b/.cursor/rules/roblox/en-us/art/accessories/creating/importing.md deleted file mode 100644 index 9b091fb8..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/importing.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: Import -description: Use the 3D Importer to import your custom accessory into Studio. -prev: /art/accessories/creating/exporting -next: /art/accessories/creating/converting ---- - -After creating the clothing item in your third-party modeling tool, import the `.fbx` using Studio's 3D Importer tool to add the object to your project as a `Class.Model`. - -Use the 3D Importer to import your `.fbx` into Studio: - -1. From Studio's **File** menu, select **Import 3D**. -1. Select your exported `.fbx` and verify any possible warnings or errors. - 1. Warnings or errors related to the clothing mesh may require returning to Blender to resolve. -1. Select **Import** to add the model to your workspace. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/index.md b/.cursor/rules/roblox/en-us/art/accessories/creating/index.md deleted file mode 100644 index fb3a3ae1..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/index.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Basic clothing creation -description: This tutorial covers the basic steps required in Blender to Studio-ready clothing assets from scratch. -next: /art/accessories/creating/modeling-setup ---- - - -

    - -You can create your own custom avatar clothing using Blender and Roblox's downloadable project templates. These project templates include [components required for layered clothing](../../../art/accessories/layered-clothing.md#components-of-a-layered-clothing-accessory), and can double as a mannequin to quickly begin shaping and sculpting your clothing assets. By the end of this tutorial, you will have a clothing asset that contains all the required components for a layered clothing accessory on the Marketplace. - - -While this content and the provided examples cover the Blender workflow and tools, you can apply the same concepts to other third-party modeling applications. - - - -
    - -
    Provided Blender mannequin template
    -
    -
    - -
    Final Studio-ready clothing asset
    -
    -
    - -This tutorial is intended for creators with moderate Blender experience and uses the following processes to create a clothing item: - -1. Modeling basic clothing using an existing mannequin shape. -2. Texturing your mesh to change its surface appearance and color. -3. Caging your clothing mesh using Roblox's template cages. -4. Rigging your clothing mesh using Roblox's armature templates. -5. Exporting your asset from Blender. -6. Importing and converting the model to an accessory in Studio. - - -This tutorial covers a **basic workflow** for 3D clothing creation. There are many external resources for different techniques, processes, and refinements you can incorporate for creating clothing, such as using Blender's various sewing and cloth simulation tools and PBR textures. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/modeling-setup.md b/.cursor/rules/roblox/en-us/art/accessories/creating/modeling-setup.md deleted file mode 100644 index 190beb88..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/modeling-setup.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Modeling setup -description: Setup your Blender environment with the correct files and templates to model efficiently. -next: /art/accessories/creating/trimming -prev: /art/accessories/creating/ ---- - -Modeling, sometimes known as **sculpting**, is the process of shaping 3D geometry. In this tutorial, use one of Roblox's template files to create the initial shape of the clothing and add unique and clothing-specific modifications to its geometry. You can further apply the techniques and processes in this tutorial to create any other type of clothing, such as pants, skirts, shoes, and more. - - -
    - -
    Base Mannequin using Roblox provided cage meshes
    -
    -
    - -
    Sculpted clothing mesh for a long sleeve shirt
    -
    -
    - -This modeling tutorial covers the following processes: - -1. Setting up your project and creating your base mesh. -2. Clearing the duplicated mesh of extra attributes. -3. Trimming the shape to match the desired clothing type. -4. Adding and smoothing the vertices of your clothing shape. -5. Scaling and positioning the clothes onto the mannequin. -6. Sculpting fabric and other details onto the mesh object. -7. Closing the holes in your mesh, making it watertight. - -## Set up mesh - -To get your project started, download and open Roblox's [Clothing_Cage.blend](../../../assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip) project and begin setting up your basic project objects. - - -
    - -
    3D viewport - duplicated cage mesh object
    -
    -
    - -
    Outliner - duplicated object named "LongSleeve"
    -
    -
    - -To set up your project and your initial mesh object: - -1. Download the [Clothing_Cage.blend](../../../assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip) project. This project includes the inner and outer cage mesh that you will use as temporary mannequins. -2. Open this file, click **Save As**, and save the project with a new name. This will be your main Blender project for the clothing accessory. -3. In the Outliner, copy and paste **InnerCage** object to duplicate it. -4. With the duplicated object highlighted, right-click in the viewport and select **Parent** > **Parent and Keep Transformation**. -5. In the Outliner, right-click and delete the extra **Cage.001 data object**. -6. Rename the duplicated object as "LongSleeve". -7. Rename the original cages as "LongSleeve_OuterCage" and "LongSleeve_InnerCage", respectively. -8. **Hide** the original \_OuterCage and \_InnerCage objects. You use these later in the Caging step. - - - -## Clear extra attributes - -The cage mesh objects in the template include some helper vertex color properties that need to be removed from your clothing mesh. If left in, the vertex colors may clash with the texture of the object after importing in Studio. - -To remove extra attribute data: - -1. With the LongSleeve object selected, navigate to the **Properties** panel > **Object Data Properties** > **Color Attributes**. - - - -2. With **colorSet1** selected, remove it by pressing the **–** button. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/modify-cage.md b/.cursor/rules/roblox/en-us/art/accessories/creating/modify-cage.md deleted file mode 100644 index b7531515..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/modify-cage.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Modify outer cage -description: Modify the outer cage to fit tightly over your clothing item. -next: /art/accessories/creating/exporting -prev: /art/accessories/creating/caging-setup ---- - -With your project environment set, you can now adjust your outer cage using sculpting and editing tools. Set your outer cage as close as possible to your clothing mesh to ensure the best deformation and layering effects. - - -**Do not delete any vertices or faces of the provided cages.** Destructive modification of the cages can cause import issues and prevent the clothing from importing and displaying as expected. - - -To modify your outer cage: - -1. With the OuterCage mesh selected, switch to **Sculpt Mode**. -2. Enable **X Axis Symmetry**. -3. Switch to **Inflate tool**. -4. Press F to adjust the radius of the brush. -5. Starting with one side, expand the outer cage to fit precisely over the mesh -6. After expanding the cage mesh over a majority of the mesh, disable **X Axis Symmetry** and address individual spots. Keep the following in mind: - 1. Your outer cage should always cover your clothing mesh. - 2. Your outer cage should be as close to the clothing mesh as possible to ensure accurate layering. - 3. For small angular areas, like the armpit, you may need to switch back to **Edit Mode** and grab the individual vertices to avoid crowding your cage mesh vertices. - -7. Perform additional passes in **Edit Mode** with wireframe enabled to ensure your outer cage vertices fit as closely as possible. A tight fit ensures that your clothing item layers as accurately as possible. - - - -You've completed the caging section of this tutorial. - -If desired, download a [reference sample](../../../assets/art/reference-files/checkpoint/4_LongSleeve-Caging-Complete.blend) of this project for comparison before exporting your project and bringing it into Studio. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/sculpting.md b/.cursor/rules/roblox/en-us/art/accessories/creating/sculpting.md deleted file mode 100644 index 888d9c22..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/sculpting.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Sculpt detail -description: Use Blender's sculpting and simulation tools to add detail to your clothing shape. -next: /art/accessories/creating/watertight -prev: /art/accessories/creating/trimming ---- - -After scaling and positioning your clothing mesh, begin applying sculpting detail to add cloth and fabric detail to your mesh. While there are many ways to sculpt an object in Blender, this tutorial primarily uses the **Elastic Deform**, **Inflate**, and **Clothing** tools to make your mesh look more like realistic clothing. - -
    -
    - -
    Clothing mesh after sculpting details
    -
    -
    - -To add clothing details: - -1. With the shirt highlighted, switch to **Sculpt Mode**. -2. Disable **X-Ray mode**, if required. -3. Enable **X Mirror** to perform symmetrical edits. -4. Select the **Elastic Deform** tool at `.5` strength to stretch parts of vertices to completely cover the mannequin. - - 1. Use F to change the radius of the brush. - 2. You can hide the mannequin to access hard-to-reach areas. - - - -5. Select the **Cloth** tool. -6. Disable **X Mirror**. The cloth tool can produce unexpected results with symmetry enabled. -7. Using the Cloth tool, click and drag on your mesh to add a cloth-like surface to your mesh. Adjust the settings to change the strength of the deformations. - - - -8. Using the **Elastic Deform**, **Inflate**, and **Cloth** tools, make the final adjustments to your mesh so that it sits on top of the mannequin with the final desired shape. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/test-poses.md b/.cursor/rules/roblox/en-us/art/accessories/creating/test-poses.md deleted file mode 100644 index 2d6681c5..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/test-poses.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Test poses -description: Test your poses after rigging a clothing item to ensure the clothes bend and deform correctly. -next: /art/accessories/creating/caging-setup -prev: /art/accessories/creating/armature-setup ---- - -With the clothing mesh parented to an armature, you can now perform quick tests to verify that your clothing deforms correctly. - - -If you see issues with the deformation of your clothing, you may need to correct the issue with weight-painting, a technique for manually applying skinning data to your meshes. - -This tutorial doesn't cover the process of weight-painting. For additional resources on manually weight painting and instructions on updating skinning data on meshes, see the following resources: - -- [Skin a simple mesh](../../modeling/skin-a-simple-mesh.md) -- [Skin a humanoid mesh](../../modeling/skin-a-humanoid-model.md) - - - -To test your clothing's movement: - -1. With your armature selected, navigate to the **Properties** panel > **Armature properties**. -2. In **Viewport Display** > **Show**, enable **In Front**. The **In Front** property enables you to easily see and access the bones for posing. - - - -3. In the viewport, select your armature and navigate to **Pose** mode. -4. Click on various bones and press R to rotate and set a pose. After pressing R: - - 1. Click to save the rotation. - 2. Right-click to cancel an unsaved rotation. - 3. If you have saved a rotation, reset your pose in the viewport with right-click and select **Clear User Transforms**. - -5. Try various natural poses of your character to ensure that your clothing stretches and fits correctly. - - - - -You've completed the rigging section of this tutorial. If desired, download a [reference sample](../../../assets/art/reference-files/checkpoint/3_LongSleeve-Rigging-Complete.blend) of this project for comparison. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/texture-map.md b/.cursor/rules/roblox/en-us/art/accessories/creating/texture-map.md deleted file mode 100644 index 540850b3..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/texture-map.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: Create texture map -description: Generate a 2D texture map image that you can save your texture painting to. -prev: /art/accessories/creating/unwrapping -next: /art/accessories/creating/texture-painting ---- - -Creating seams and unwrapping tells Blender how to project the 3D surface of the clothing item in 2D. Before you can apply any texture appearance changes, you need to create a texture map, which is the specific 2D image you apply and save your textures to. - -To create a new texture map: - -1. With the clothing mesh selected, navigate to the **Properties** panel > **Material Preview** tab. - - -2. Select the **+ New** button. -3. Next to Base Color, select the **yellow dot** and click **Image Texture**. - -4. Click the **+ New** button. - - 1. Name the texture image the same as your clothing mesh with a `_TXT` affix. - 2. Set the color to black, or any base color of your preference. - 3. Keep the rest of the default settings. - 4. Press **OK** when completed. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/texture-painting.md b/.cursor/rules/roblox/en-us/art/accessories/creating/texture-painting.md deleted file mode 100644 index e035f7dc..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/texture-painting.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: Texture painting -description: Use Blender's Texture Painting tools to apply a surface appearance to your clothing item. -prev: /art/accessories/creating/texture-map -next: /art/accessories/creating/armature-setup ---- - -With a new image ready to apply textures to, use Blender's Texture Paint mode to quickly brush texture colors onto your mesh: - -1. Navigate to **Texture Paint mode**. -2. On the viewport, select the clothing object. -3. Open up the sidebar tools to access brush settings. -4. Select a color, brush size, and falloff to apply. You might need to adjust settings, depending on the modifications you intend to apply. -5. Draw on either the UV 2D map, or the 3D mesh. -6. Save the `.png` of your texture map by selecting **Image** > **Save**. - - - -You've completed the texturing section of this tutorial. If desired, download a [reference sample](../../../assets/art/reference-files/checkpoint/2_LongSleeve-Texturing-Complete.blend) of this project and texture image for comparison. - -There are a lot of ways to texture and apply a unique appearance to your meshes. For additional suggestions, try utilizing alpha transparencies, unique seams, [PBR textures](../../modeling/surface-appearance.md), or Blender's other texturing tools and techniques. - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/trimming.md b/.cursor/rules/roblox/en-us/art/accessories/creating/trimming.md deleted file mode 100644 index f305d77a..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/trimming.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Trim clothing shape -description: Create the general shape of your clothing item by removing unnecessary sections of your duplicated mesh. -next: /art/accessories/creating/sculpting -prev: /art/accessories/creating/modeling-setup ---- - -With a clean mesh object to work with, cut the basic shape of the type of clothing item you intend to create and prepare the mesh for additional sculpting detail. In this tutorial, you create a long-sleeve shirt shape by removing the leg, arm, and head sections, smoothing out the mesh to create a flat canvas, and repositioning the mesh onto your temporary mannequin. - -
    - -
    Long-sleeve trimming of the full-body mesh.
    -
    - -## Trim clothing shape - -Create the general shape of your clothing type by trimming sections of your duplicated mannequin mesh. - -To trim your clothing shape: - -1. Select the **LongSleeve** object. -2. Switch to **Edit Mode**. -3. Enable **X-Ray mode** in the top right corner of the viewport. -4. Click and drag over parts of the mesh that you do not want to include in your shirt. -5. Press X and select **Vertices** to delete these sections of your mesh. -6. **Repeat step 4** until you reach your desired clothing shape. - - - -## Add and smooth vertices - -With the basic shape created, subdivide the surface of your clothing mesh to add vertices and smooth out the mesh. This process removes the grid-like surface and allows you to apply more complex sculpting detail later. - - -
    - -
    Before applying Subdivision modifier and Shade Smooth
    -
    -
    - -
    After applying Subdivision modifier and Shade Smooth
    -
    -
    - -To add and smooth your vertices: - -1. Switch back to **Object Mode**. -2. With the clothing mesh selected, navigate to the **Modifier Properties** panel. -3. Select **Add Modifier** > **Subdivision Surface Modifier** and click **Apply** with the default settings. -4. In the viewport, right-click the object and select **Shade Smooth** to eliminate the creases on your clothing article. - - - -## Scale and position - -With your base clothing shape created, the next steps are to scale out the mesh and reposition it on top of the mannequin. - -
    - -
    Clothing mesh should fit over mannequin after applying a reposition and scale
    -
    - -To set up and scale your clothing to your mannequin: - -1. Return to **Object Mode**. -2. **Unhide** one of your original cage meshes. -3. In the filter dropdown, enable **Selectable** toggles, and set your body mesh to unselectable. Disabling the **Selectable** toggle prevents accidental edits to your mannequin. -4. Select your shirt mesh and lightly **scale** and **position** your asset to rest over the mannequin. -5. Press S and use your mouse to scale. In most cases, the scaling should be a small change. -6. Press G and click to grab your shirt, make sure the shirt rests loosely over the mannequin. The shirt does not need to fit perfectly at this point. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/unwrapping.md b/.cursor/rules/roblox/en-us/art/accessories/creating/unwrapping.md deleted file mode 100644 index 6681699a..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/unwrapping.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Create seams and unwrap -description: Use Blender's seams and unwrapping functionality to project your 3D surface on a 2D texture plane. -prev: /art/accessories/creating/watertight -next: /art/accessories/creating/texture-map ---- - -**Texturing** is the process of customizing the color, tone, and shading of your model's surface. Custom meshes and models use a 2D image, known as a texture map, to project various surface appearance elements onto your 3D object. In this tutorial, apply a complete color to your shirt and add a smaller design using Blender's Texture Paint mode. - - -This tutorial does not cover [PBR textures](../../modeling/surface-appearance.md), which are advanced textures that can replicate real-world texture properties, like reflectivity and surface roughness, and are recommended to give your clothing items an extra dimension of creativity and visual pop. PBR textures often require a third-party application such as Substance Painter. - - - -
    - -
    Clothing mesh after sculpting
    -
    -
    - -
    Clothing mesh after texturing
    -
    -
    - -The texturing process requires the following steps: - -1. Create seams in your mesh to define how Blender unwraps your 3D object. -2. Unwrap the UV of your model, creating a distinct front and back 2D surface to apply textures on based on your seams. -3. Create a new texture image to save as your 2D map. -4. Paint a custom texture using Blender's Texture Paint tools. - -## Create seams - -To begin texturing, you must first generate a **UV map**, or 2D projection, of the surface of your mesh. To set up this UV map, you tell Blender which edges of your mesh to use as seams when creating the projection. - -To create seams that naturally separate the front and back of the shirt: - -1. With your clothing object selected, switch to **Edit mode**. -2. In the top-left, navigate to the Select modes and select **Edge select**. -3. Hold Alt and click on the center vertical edges of your shirt. The detected edge highlights. -4. Whenever a complete edge is selected, **right-click** and select **Make Seam**. The edge highlights to indicate the seam in your model. -5. **Repeat steps 3-4** to create a continuous seam across your mesh. - - -## UV unwrap - -After applying the seams, Blender now knows how to "unwrap" the mesh surface onto a 2D plane as a front and back surface. - -
    - - -
    UV-mapping of your 3D clothing mesh.
    -
    - -To UV Unwrap your object by your selected seams: - -1. While in Edit mode, press A to highlight all vertices. -2. At the top of the viewport, select **UV** > **Unwrap**. -3. Switch to **Texture Paint** mode, your UVs display on the left window when your object is selected. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/creating/watertight.md b/.cursor/rules/roblox/en-us/art/accessories/creating/watertight.md deleted file mode 100644 index 2181b6dc..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/creating/watertight.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Make mesh watertight -description: Seal off your geometry to ensure that there are no angles where the interior backfaces of your object are exposed. -next: /art/accessories/creating/unwrapping -prev: /art/accessories/creating/sculpting ---- - -With the shirt shape finalized, make your mesh **watertight** by "sealing" the holes at the neck, waist, and wrist. A watertight shape ensures that only the top visible surface of the mesh is exposed at any angle. If an asset is not watertight, it may expose backfaces, or single sided faces, that could affect the rendering of your asset and performance when equipped. - - -
    - -
    Watertight top view
    -
    -
    - -
    Watertight bottom view
    -
    -
    - -To make your mesh watertight: - -1. Select your mesh and switch to **Edit Mode**. -2. Starting with any hole in the mesh, hold Alt and click the **last edge** on the mesh. The entire edge highlights. -3. Press E to extrude the mesh and click after a small length is added. -4. With the new edge still selected, right-click and select **Merge Vertices** > **At Center**. -5. Press G to grab the new vertex and reposition it within your clothing mesh. -6. **Repeat steps 2-5** until all the interior-exposing holes of your mesh are closed. - - - - -You've completed the modeling section of this tutorial. If desired, download a [reference project](../../../assets/art/reference-files/checkpoint/1_LongSleeve-Modeling-Complete.blend) of this stage and compare it against your work. - -There are a lot of techniques to create clothing. Try experimenting with the following techniques, tools, and processes to create additional unique assets: - -- Making asymmetrical clothing. -- Blender's [cloth simulation](https://docs.blender.org/manual/en/latest/physics/cloth/examples.html#using-simulation-to-shape-sculpt-a-mesh) and other sculpting tools. -- Various community sewing and fabric techniques for creating clothing on Blender. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/export-settings.md b/.cursor/rules/roblox/en-us/art/accessories/export-settings.md deleted file mode 100644 index e99ea657..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/export-settings.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Rigid accessory export settings -description: Use the appropriate export settings in Maya and Blender to generate Studio-ready .fbx files. ---- - -Export your rigid accessory model as a `.fbx` or `.gltf` file to take advantage of all of Studio's 3D import features. These file types contains mesh and texture data you need to later [import](../../art/modeling/3d-importer.md) into Studio. - - -If creating other types of 3D models: -
      -
    • For generic meshes, see [general mesh specifications](../modeling/specifications.md) and [general export settings](../modeling/export-requirements.md).

    • -
    • For layered accessories, see [layered accessory specifications](../accessories/clothing-specifications.md) and [layered export settings](../accessories/clothing-export-settings.md).

    • -
    • For avatar characters, see [avatar specifications](../../art/characters/specifications.md) and [avatar export settings](../characters/export-settings.md).
    • -
    -
    - - -If you have any modifiers to your mesh or project objects, make sure to apply -or delete them before export. - - -## Blender - -Blender allows you to export in `.fbx` or `.gltf` as well as other formats. If you are using `.fbx` export, familiarize yourself with [Blender's FBX scaling](../blender.md#adjust-scale-fbx) to ensure that you successfully import the model into Studio at the correct scale. - -### Export settings - -To export the `.fbx` file in Blender: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export**, then **FBX (.fbx)**. The **Blender File View** window displays. -3. On the right-hand side, change the **Path Mode** property to **Copy**, then toggle the **Embed Textures** button. - -4. Set **Transform** > **Apply Scalings** to **Unit Scale**. For more information, see [scaling and scene units](../blender.md#adjust-scale-fbx). - -5. Click the **Export FBX** button. -6. After exporting, use Studio's [3D Importer](../../art/modeling/3d-importer.md) to import your model and the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) to convert the model into an accessory. - -## Maya export settings - -To export a mesh in Maya as a `.fbx` file: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export All**. The **Export All** window displays. -3. Near the bottom of the window, click the **Files of type** dropdown, then select **FBX export**. -4. On the right-hand side of the window, navigate to the **Options...** section. -5. In the **Geometry** section, enable **Smooth Mesh** and **Referenced Asset Content**. -6. In the **Animation** section, disable **Animation**. -7. If you need to import textures as a `.png`, in the **Embed Media** section, enable **Embed Media**. -8. In the **Advanced Options** section, - - Navigate to **Units**, then enable **Automatic**. - - Navigate to **Axis Conversion**, then set the **Up Axis** property to **Y**. -9. Click the **Export All** button. - - - -10. After exporting, use Studio's [3D Importer](../../art/modeling/3d-importer.md) to import your model and the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) to convert the model into an accessory. diff --git a/.cursor/rules/roblox/en-us/art/accessories/from-existing.md b/.cursor/rules/roblox/en-us/art/accessories/from-existing.md deleted file mode 100644 index b48de931..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/from-existing.md +++ /dev/null @@ -1,205 +0,0 @@ ---- -title: Accessories from an existing model -description: This tutorial covers the basic steps required to publish a custom asset on the Marketplace. ---- - -In many cases, you may want to convert a premade model from your modeling -software into an accessory on Roblox. If you are looking to create your -accessory from scratch, see [Create accessories](./creating-rigid/index.md). - -Using a provided 3D reference file, this tutorial covers each step in the workflow to properly configure and export a 3D model with PBR textures from Blender and generate your own **rigid accessory** in Studio. After you create the accessory, you can upload it to the Marketplace, save it to your toolbox, and use it in your own experiences. - - -This tutorial only covers rigid accessories, and does not cover the process of converting more advanced clothing or character body models. - - - -
    - -
    - Mask asset as an untextured mesh object in Blender -
    -
    -
    - -
    - Mask asset equipped as an `Class.Accessory` in Studio -
    -
    -
    - -Using a provided reference 3D asset, this tutorial covers the following rigid accessory workflow: - -1. Modeling overview and requirements in Blender. -2. Texturing setup using PBR textures in Blender. -3. Exporting your asset as a `.fbx` from Blender. -4. Importing the asset into Studio. -5. Fitting and converting the imported model to an `Class.Accessory` object. -6. Publishing and validating the accessory for Marketplace upload. - - -While this content covers the Blender workflow with a provided reference example, you can apply the same concepts to other third-party modeling applications and custom assets. - - -## Setup model - -Whether you are using an existing shape or creating your own 3D object, it's important to consider [technical requirements](../../art/accessories/specifications.md), such as keeping your geometry within a polycount budget, and [policy requirements](../../marketplace/marketplace-policy.md), such as ensuring your design does not infringe on other creator's IP both within and outside of the Roblox ecosystem. - -Correctly setting up your asset in Blender helps reduce importing and rendering issues later in Studio. When importing Roblox-related `.fbx` files, such as the provided [mask asset](../../assets/art/accessories/creating-rigid/Rigid_Mask_Model-Only.fbx), you might discover that your asset imports at a 1/100 scale due to the `.fbx` conversion. In your Blender project, you can quickly reset the scale to make the asset easier to work with in the Blender environment. - - -If you are creating your own rigid accessory from scratch, it's important to understand Roblox's [standard avatar sizes](../../art/accessories/body-scale.md), especially for rigid accessories that contour around a body part, such as a hat or bangle. - - -Using the [Sci Fi Mask](../../assets/art/accessories/creating-rigid/Rigid_Mask_Model-Only.fbx) reference as an example, use the following instructions to import and set up your rigid accessory model in Blender: - -1. Open a new Blender project. -2. Press A to highlight all and X to delete the default starting cube and cameras. -3. Navigate to **File** > **Import** > **FBX** and select the downloaded reference model. -4. If the object imports at a small scale, **select** the object and navigate to the **Properties** panel > **Object Properties** > **Transform** and adjust the **X**, **Y**, **Z** to `1.000`. - - - - - -5. If you are sculpting your asset from scratch, orient the object in your workspace. If you are importing, you may not need to make any adjustment. - 1. Make sure your asset is facing **-Y forward**. - 2. Ideally your accessory should be moved to `0`,`0`,`0` in the world to ensure it imports at the center of the camera in Studio. - - -You've completed the modeling section of this tutorial. If desired, download a [reference version](../../assets/art/accessories/creating-rigid/Rigid_Mask_Texturing-Completed.blend) of this stage of the project for comparison. - -There are many tools and workflows to create your own unique asset. For additional suggestions, try creating different asset types, such as shoulder pads or belts, or importing a reference model into Blender as a mannequin to sculpt and shape your cosmetics from scratch. - - -## Apply texture - -**Texturing** is the process of applying a surface appearance to a 3D object. Blender provides various tools and features to create and connect your own texture maps to your asset, allowing you to preview your model's final appearance and link the texture images to your exported file. - -The mask example asset uses [physically-based rendering (PBR) textures](../../art/modeling/surface-appearance.md), which are advanced textures that create realistic surfaces under different lighting environments. PBR textures use multiple image files, or **maps**, to represent the various surface properties of your 3D object. - - -
    - -
    -Color (Albedo) Map -
    -
    -
    - -
    -Normal Map -
    -
    -
    - -
    -Roughness Map -
    -
    -
    - -
    -Metalness Map -
    -
    -
    - -This tutorial doesn't cover the PBR texture creation process, which typically involves using third-party software such as ZBrush or Substance 3D Painter. Instead, this section goes over the process of bringing premade PBR image files into Blender and properly associating them to your asset on export. - - -While PBR textures are not required for accessories, adding PBR textures can add extra visual flair and realism to elevate your creations. For an example on using Blender to create a basic, non-PBR texture, see [Texture basic clothing](../../art/accessories/creating/unwrapping.md). - - -To configure and link your PBR textures to your model: - -1. Download [Rigid_Mask_Textures.zip](../../assets/art/accessories/creating-rigid/Rigid_Mask_Textures.zip) and unzip the textures images locally in the same directory as your Blender project. -2. In Blender, navigate to the **Shading** tab. Ensure that your object is selected. - - 1. If you don't see the **PrincipledBSDF node**, select the **+New** button to create a new material. - - - - - -3. From your file browser, drag and drop your texture `.png` files into the node section. A new image node appears with each file. -4. In the newly created node, click and drag the following image nodes to their appropriate connection on the Principled BSDF main node: - - 1. **\_ALB texture**: Connect the **Color** node to **Principled BSDF** > **Base Color**. - - 2. **\_MTL texture**: Connect the **Color** node to **Principled BSDF** > **Metallic**. - - 3. **\_RGH texture**: Connect the **Color** node to **Principled BSDF** > **Roughness**. - - 4. **\_NOR texture**: - 1. Click **Add** > **Vector** > **Normal Map** to generate a NormalMap node. This node is required to convert Normal PBR image maps. - 2. Connect the \_NOR node's **Color** to the NormalMap node's **Color** connection. - 3. Connect the NormalMap's **Normal** to the **Principled BSDF** > **Normal**. - - -5. Test your textures by changing the viewport viewing mode to **Viewport Shading > Material Preview Mode**. - - - -You've completed the texturing section of this tutorial. If desired, download a [reference sample](../../assets/art/accessories/creating-rigid/Rigid_Mask_Texturing-Completed.blend) of this stage of the project for comparison. - -If you are creating your own PBR textures, check out [Material references](../../art/modeling/material-reference.md) for various PBR material examples you can apply to your next accessory. - - -## Clean up - -After modeling and texturing your asset, you can begin the process of **exporting** your Blender project as a `.fbx`. The start of this process includes cleaning up your project, which can involve deleting or removing any extra objects, such as lights, cameras, or mannequin meshes, to ensure you only export the accessory mesh, and applying any modifiers to your mesh object. - -An often forgotten cleanup step involves **applying your transformations**, also known as **freezing your transforms**, by setting your orientation, rotation, and scale deltas to zero. Failure to apply any transformations can result in unexpected behavior and orientation when importing the mesh in Studio. - -To freeze your transforms: - -1. In Object mode, select your mesh object. -2. Navigate to **Object** > **Apply** > **All Transforms**. - - - -## Export from modeling tool - -After modeling and texturing your asset, you can begin the process of **exporting** your Blender project as a `.fbx`. The start of this process includes cleaning up your project, which can involve deleting or removing any extra objects, such as lights, cameras, or mannequins, to ensure you only export the accessory mesh, and applying any modifiers to your mesh object. - -For the latest export settings for Blender, see [rigid accessory export settings](./export-settings.md). - - -You've completed the exporting section of this tutorial. If desired, download a [reference sample](../../assets/art/accessories/creating-rigid/Rigid_Mask_Export.fbx) of this exported file for comparison. You can use this reference in the next importing step. - - -## Import to Studio - -Studio's 3D Importer provides a quick and easy way to import third-party 3D assets into your projects. The importer provides object previews and error-checking to ensure that your asset meets Studio's general 3D requirements. - -To import your asset, check out the latest information on [importing rigid accessories](./importing.md). - -## Convert - -After importing your asset into Studio, you can begin **fitting** your imported object to a mannequin and **converting** the `Class.Model` object into a `Class.Accessory`. When fitting and converting your accessory it's important to use the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) (AFT) to correctly preview the placement and apply the correct configurations to your accessory. - -To convert your asset into a `Class.Accessory`, check out the latest information on [converting rigid accessories](./importing.md#convert-rigid-accessories). - -## Upload and publish - -After generating your `Class.Accessory` item, you can now begin the process of **publishing** the asset to the Marketplace. This step is optional and only applicable for creators who intend to sell their asset. - -For additional information and instructions on this process, see [uploading and publishing instructions](../../marketplace/publish-to-marketplace.md). - - -
    - -You now have your accessory added to the Marketplace catalog! Use the item's Marketplace link to view your listing at any time, or to send to your connections and followers for additional engagement. - - - - -See the following resources for additional Marketplace policy and related information: - -- [Marketplace policy](../../marketplace/marketplace-policy.md) -- [Fees and commissions](../../marketplace/marketplace-fees-and-commissions.md) -- [Intellectual property](../../marketplace/intellectual-property.md) -- [Moderation](../../marketplace/moderation.md) - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/import-clothing.md b/.cursor/rules/roblox/en-us/art/accessories/import-clothing.md deleted file mode 100644 index f3e3df92..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/import-clothing.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -title: Import clothing accessories -description: Use the 3D Importer to add third-party models to Studio before using the Accessory Fitting Tool to convert the model to an Accessory. ---- - -Use the following instructions to [import](#import-3d-assets) your `.fbx` or `.gltf` third-party model into Studio and [convert](#convert-layered-accessories) the asset to a clothing `Accessory` object that you can save to use in your experience, share with others, or upload to the Marketplace. - - -The following asset example and instructions are part of the [Clothing accessory tutorial](../accessories/creating/index.md) which covers the process of converting a model from Blender to publishing the asset to the Marketplace. - - -## Import 3D assets - -Studio's 3D Importer provides a quick and easy way to import third-party 3D assets into your projects. The importer provides object previews and error-checking to ensure that your asset meets Roblox's [general 3D requirements](../modeling/specifications.md). - -Keep in mind, your 3D layered accessory must also follow Roblox's [clothing specifications](../accessories/clothing-specifications.md) to eventually use this asset as a layered `Class.Accessory`, or you may experience errors later in the workflow. - -To import your asset: - -1. From Studio's **File** menu, select **3D Importer**. -2. In the file browser, select the `.fbx` or `.gltf` file saved locally. The 3D Importer loads a preview of the object. - - - If textures don't load for your asset, you can manually import your textures later. - - See [3D Importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting. - -3. Select **Import**. The asset populates in your workspace as a `Class.Model` with the appropriate textures applied as a `Class.SurfaceAppearance` or `Class.MeshPart.TextureID`. - - -Manually add textures - - If textures didn't load correctly, add them manually. You may need to save and publish your experience in order to access the [Asset Manager](../../projects/assets/manager.md). - -1. In the **Asset Manager**, click the **Import** button. -2. Upload your image files. -3. After moderation clears for your image, select the `Class.MeshPart` parented within your imported `Class.Model`. -4. If you are using a single basic texture, set the `Class.MeshPart.TextureID` property to your uploaded texture image. -5. If you are using PBR textures: - - 1. Add a `Class.SurfaceAppearance` child to your `Class.MeshPart`. - - - - 2. In the `Class.SurfaceAppearance` properties, click each property value and assign the appropriate texture image from the asset dropdown: - - 1. Set the **ColorMap** to the **\_ALB** texture image. - 2. Set the **MetalnessMap** to the **\_MTL** texture image. - 3. Set the **NormalMap** to the **\_NOR** texture image. - 4. Set the **RoughnessMap** to the **\_RGH** texture image. - - - - - - - -After successful import, your model object should populate in your project as a `Class.Model` with the appropriate textures applied. See [3D Importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting. - - -## Convert layered accessories - -With the `Class.Model` in your project, the last step in the process of clothing creation requires you to use the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) (AFT) to convert this object to a standard `Class.Accessory` that avatar characters can equip. - - -For shoes, you must convert the left shoe and the right shoe as separate accessories. Use the following instructions for each shoe before grouping both shoe accessories as a `Class.Model` when [saving to Roblox](../../marketplace/publish-to-marketplace.md#upload-an-asset). - - -To generate the accessory object: - -1. In the toolbar's **Avatar** tab, click **Accessory** to open the AFT. -2. Select the `Class.Model` of the clothing item in the viewport. The tool's text field populates with the name of the object selected. Alternatively, you can select the object within the **Explorer** window. -3. Test out various sample characters, clothing, and animations. See [Test accessories](../../art/accessories/accessory-fitting-tool.md#test-accessories) for additional information. - - If required, make minor cage adjustments using the editing features. Larger cage changes may require returning to your third-party modeling software and re-exporting the asset. -4. When ready to generate your accessory, click **Generate MeshPart Accessory**. The accessory object with your model populates in your workspace. - - -
    - -
    Clothing accessory in viewport
    -
    -
    - -
    Clothing accessory in Explorer
    -
    -
    - -After successful fitting and converting, your 3D model should populate in your project as an `Class.Accessory`. With this `Class.Accessory` you can perform any of the following: - -- Begin the process of [uploading and publishing](../../marketplace/publish-to-marketplace.md#upload-an-asset) the clothing accessory to the Marketplace. - -- Use the accessory in your current experience by equipping it to character models with [HumanoidDescription](../../characters/appearance.md#manually-modify-appearance), or by dragging and dropping the accessory under the appropriate character `Class.Model` object. - -- Save the accessory to your [Toolbox](../../projects/assets/toolbox.md) or make it public on the [Creator Store](../../production/creator-store.md) to share or use within any of your experiences. diff --git a/.cursor/rules/roblox/en-us/art/accessories/importing.md b/.cursor/rules/roblox/en-us/art/accessories/importing.md deleted file mode 100644 index 841a6679..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/importing.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Import rigid accessories -description: Use the 3D Importer to add third-party models to Studio before using the Accessory Fitting Tool to convert the model to an Accessory. ---- - -Use the following instructions to [import](#import-3d-assets) your `.fbx` or `.gltf` third-party model into Studio and [convert](#convert-rigid-accessories) the asset to an `Accessory` object that you can save to use in your experience, share with others, or upload to the Marketplace. - - -The following asset example and instructions are part of the [Rigid accessory tutorial](../accessories/creating-rigid/index.md) which covers the process of converting a model from Blender to publishing the asset to the Marketplace. - - -## Import 3D assets - -Studio's 3D Importer provides a quick and easy way to import third-party 3D assets into your projects. The importer provides object previews and error-checking to ensure that your asset meets Roblox's [general 3D requirements](../modeling/specifications.md). - -Keep in mind, the model that you intend to create as a rigid accessory must also follow Roblox's [accessory specifications](../accessories/specifications.md) to eventually use this asset as an `Class.Accessory`, or you may experience errors later in the workflow. - -To import your asset: - -1. From Studio's **File** menu, select **3D Importer**. -2. In the file browser, select the `.fbx` or `.gltf` file saved locally. The 3D Importer loads a preview of the object. - - - - - If textures don't load for your asset, you can manually import your textures later. - - See [3D Importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting. - -3. Select **Import**. The asset populates in your workspace as a `Class.Model` with the appropriate textures applied as a `Class.SurfaceAppearance` or `Class.MeshPart.TextureID`. - - -Manually add textures - - -If textures didn't load correctly, add them manually. You may need to save and publish your experience in order to access the [Asset Manager](../../projects/assets/manager.md). - -1. In the **Asset Manager**, click the **Import** button. -2. Upload your image files. -3. After moderation clears for your image, select the `Class.MeshPart` parented within your imported `Class.Model`. -4. Add a `Class.SurfaceAppearance` child to your `Class.MeshPart`. - - - -5. In the `Class.SurfaceAppearance` properties, click each property value and assign the appropriate texture image from the asset dropdown: - - 1. Set the **ColorMap** to the **\_ALB** texture image. - 2. Set the **MetalnessMap** to the **\_MTL** texture image. - 3. Set the **NormalMap** to the **\_NOR** texture image. - 4. Set the **RoughnessMap** to the **\_RGH** texture image. - - - - - - - -After successful import, your model object should populate in your project as a `Class.Model` with the appropriate textures applied. See [3D Importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting. - - -## Convert rigid accessories - -After importing your asset into Studio, you can begin **fitting** your imported object to a mannequin and **converting** the `Class.Model` object into a `Class.Accessory`. When fitting and converting your accessory it's important to use the [Accessory Fitting Tool](../accessories/accessory-fitting-tool.md) (AFT) to correctly preview the placement and apply the correct configurations to your accessory. - -To fit and generate your accessory: - -1. In the toolbar's **Avatar** tab, click **Accessory** to open the AFT. -2. In the tool's panel, select the **Part** field and, in the workspace, select the accessory `Class.MeshPart` object in the workspace and press **Next**. - - - -3. On the Asset Type page, select the **type** of asset and the expected **body scale**. Press **Next** when complete. - - 1. This example uses a **Hat** asset with an **Proportions Normal** scale. - 2. Body scale is typically set based on the original sculpting and sizing of the asset. See [Body Scale](../../art/accessories/body-scale.md) for additional information on rigid accessory scaling. - - - -4. On the preview screen, select one of the humanoid characters as a mannequin: - - 1. In the Avatars section, select a humanoid base body character. - 2. In the preview panel, deselect the previous selection. Only the humanoid body displays in the preview window. - - - -5. Using both the AFT preview window and the workspace, adjust the position, scale, and rotation of the accessory. - - 1. Use the AFT preview window and your mannequin as an accurate preview of how your asset fits on the character. The clothing mannequin in the workspace does not accurately portray how rigid accessories attach. - 2. In the workspace, use the **Move**, **Scale**, and **Rotate** tools to adjust the positioning of your rigid accessory. - 3. If you accidentally select something else, click back into the AFT panel to reselect the accessory and resume your adjustments using the transformation tools. - - - -6. After previewing and fitting your asset, select **Generate MeshPart Accessory** to create the Accessory and add it to your explorer. - -After successful fitting and converting, your 3D model should populate in your project as an `Class.Accessory`. With this `Class.Accessory` you can perform any of the following: - -- Begin the process of [uploading and publishing](../../marketplace/publish-to-marketplace.md#upload-an-asset) the accessory to the Marketplace. - -- Use the accessory in your current experience by equipping it to character models with [HumanoidDescription](../../characters/appearance.md#manually-modify-appearance), or by dragging and dropping the accessory under the appropriate character `Class.Model` object. - -- Save the accessory to your [Toolbox](../../projects/assets/toolbox.md) or make it public on the [Creator Store](../../production/creator-store.md) to share or use within any of your experiences. diff --git a/.cursor/rules/roblox/en-us/art/accessories/index.md b/.cursor/rules/roblox/en-us/art/accessories/index.md deleted file mode 100644 index 32d10b8d..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/index.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -title: Rigid accessories -description: Rigid accessories are basic 3D cosmetics users can equip and wear on their avatar character. ---- - - - - - -
    - -
    - -A high-level overview of accessories on Roblox. - - -
    -
    - - - - -
    - -
    - -Create and sell your first basic accessory. - -
    -
    -
    - -Rigid accessories are the most basic 3D cosmetic items that users can equip and wear on their avatar character, such props, weapons, hats, and more. Unlike [clothing accessories](../accessories/layered-clothing.md) that stretch and fit over a character body, rigid accessories attach to a specific point on an avatar character and don't deform or wrap over a target. - -To create a custom Roblox accessory for your own experience or to sell on the Marketplace, it's important to start with the following: - -- A basic background with 3D modeling tools such as [Blender](https://www.blender.org/) or [Maya](https://www.autodesk.com/products/maya/overview). -- An understanding of the [components that make up a rigid accessory](#components-of-a-rigid-accessory). -- An understanding of the general [accessory creation process](#creation-process). -- Review Roblox's official tutorials to create your own accessories: - - [Rigid accessory creation tutorial](../../art/accessories/creating-rigid/index.md) - covers each process required for converting a 3D model to a rigid accessory and publishing it to the Marketplace. - - [Clothing creation tutorial](../../art/accessories/creating/index.md) - a step-by-step process of creating your own avatar-ready clothing from scratch in Blender. -- [Additional tools, resources, and guides](#resources) provided by Roblox to standardize and expedite the creation process. - -## Components of a rigid accessory - -All accessory models are made up of the same base components of a [mesh object](#mesh-part), [textures](#textures), and [attachment](#attachments). - -When [creating accessories](#creation-process), most of these components are created first in your modeling software, then converted to their appropriate Roblox Studio instance on import. - -### Mesh part - - -
    Bow rigid accessory mesh object
    - -
    T-shirt layered clothing mesh object
    -
    - - -Clothing, such as the t-shirt, require [additional clothing components](../accessories/layered-clothing.md) to apply the layerable effect to the 3D object. - - -All accessories require a single mesh object that represents the geometry of the accessory object. In Studio, this mesh object is represented as a `Class.MeshPart` nested under a single `Class.Model`. - -### Textures - - -
    2D texture map for the t-shirt model
    - -
    T-shirt model with texture applied
    -
    - -Textures are 2D image files that define the surface appearance of your 3D object. You can create textures within a texture painting program or a 3D modeling software. - -In Studio, textures images are imported as image assets and are set to `Class.MeshPart` objects by a child `Class.SurfaceAppearance` object or a `Class.MeshPart.TextureID` property. - -### Attachments - - -
    Attachment geometry defines where the attachment connects with the character
    - -
    Geometry with the "_Att" suffix automatically convert to `Class.Attachment` objects in Studio
    -
    - -Attachment points define where accessories attach to a character's body. In Studio, attachments are represented by `Class.Attachment` objects. - -## Creation process - -Custom accessories are first created in 3D modeling programs, such as [Blender](https://www.blender.org/) or [Maya](https://www.autodesk.com/products/maya/overview), before importing the `.fbx` or `.gltf` model into Studio. -To get started creating your first avatar asset, see the [avatar tutorials](../../avatar/tutorials.md). - -Depending on the type of asset you are creating, the creation process follows these high-level workflows: - - - -
    Rigid Accessory Workflow
    - -
    Layered Accessory Workflow
    -
    - - -Since 3D creation isn't a linear process and always requires reiteration and testing, the process of creating an accessory can differ between individuals and various creation workflows. - - -## Resources - -There are a variety of resources available for creators of all backgrounds to get started with accessory creation. - -If you are interested in specific avatar creation topics, use the following table to find guides and resources that best match your needs: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TopicResources
    Tutorials[Rigid accessory creation](../../art/accessories/creating-rigid/index.md)

    [Basic clothing creation](../../art/accessories/creating/index.md)
    Reference files[Accessory and clothing reference files](../../art/modeling/project-files.md)
    Technical specs[.FBX export settings](../../art/modeling/export-requirements.md)

    [General mesh specifications](../../art/modeling/specifications.md)

    [Accessory specifications](../../art/accessories/specifications.md)

    [Marketplace policy](../../marketplace/marketplace-policy.md)
    Cosmetic creation[Accessories overview](../../art/accessories/specifications.md)

    [Layered clothing overview](../../art/accessories/layered-clothing.md)


    [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md)

    [Accessory specifications](../../art/accessories/specifications.md)

    [Marketplace requirements](../../marketplace/marketplace-policy.md)
    Texturing[Texturing requirements](../../art/modeling/texture-specifications.md)

    [PBR textures](../../art/modeling/surface-appearance.md)
    Rigging and skinning[Rigging and skinning overview](../../art/modeling/rigging.md)

    [Humanoid rig requirements](../../art/characters/specifications.md#rigging)

    [Rig facial bones](../../art/characters/facial-animation/create-basic-heads.md#rigging)

    [Automatic Skin Transfer](../../art/accessories/automatic-skinning-transfer.md)

    [Skin facial bones](../../art/characters/facial-animation/create-basic-heads.md#skin-face-bones)
    Publishing and Marketplace[Uploading to Marketplace](../../marketplace/publish-to-marketplace.md)

    [Marketplace Policy](../../marketplace/marketplace-policy.md)

    [Fees and commissions](../../marketplace/marketplace-fees-and-commissions.md)
    diff --git a/.cursor/rules/roblox/en-us/art/accessories/layered-clothing.md b/.cursor/rules/roblox/en-us/art/accessories/layered-clothing.md deleted file mode 100644 index 0e6b4e69..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/layered-clothing.md +++ /dev/null @@ -1,201 +0,0 @@ ---- -title: Layered clothing -description: Layered clothing are cosmetic accessories that stretch, fit, and layer over any body type simulating real-life clothing. ---- - - - - - -
    - -
    - -A high-level overview of 3D clothing on Roblox. - - -
    -
    - - - - -
    - -
    - -Create and sell your first basic layered clothing. - -
    -
    -
    - -Layered clothing accessories are 3D cosmetic items that users can equip and wear on their avatar body, such as pants, t-shirt, jackets, dresses, and more. Unlike [rigid accessories](../../art/accessories/index.md) that only attach to a specific point on a character, layered clothing stretches and fits over any body type and existing clothing. - -To create a custom Roblox accessory for your own experience or to sell on the Marketplace, it's important to start with the following: - -- A general background with 3D modeling tools such as [Blender](https://www.blender.org/) or [Maya](https://www.autodesk.com/products/maya/overview). -- An understanding of the [components that make up a layered accessory](#components-of-a-layered-clothing-accessory). -- An understanding of the general [clothing creation process](#creation-process). -- Review Roblox's official tutorials to create your own accessories: - - [Rigid accessory creation tutorial](../../art/accessories/creating-rigid/index.md) - covers each process required for converting a 3D model to a rigid accessory and publishing it to the Marketplace. - - [Clothing creation tutorial](../../art/accessories/creating/index.md) - a step-by-step process of creating your own avatar-ready clothing from scratch in Blender. -- [Additional tools, resources, and guides](#resources) provided by Roblox to standardize and expedite the creation process. - - -If you are a developer and are looking for information on manually equipping or configuring layered clothing accessories within an experience, including [implementing layered clothing on a non-standard character model](../../characters/appearance.md#layered-clothing-on-non-r15), see [Character appearance](../../characters/appearance.md). - - -Roblox also supports [classic clothing](#classic-clothing), 2D images that can be applied to your character's surface. - -## Components of a layered clothing accessory - -All accessory models are made up of the same base components of a [mesh object](#mesh-part), [textures](#textures), and [attachment](#attachments). Layered clothing requires additional components, such as a [poseable rig](#rigging-armature), and an [inner and outer cage](#inner-and-outer-cages), to allow the asset to stretch, fit, and layer over a target character and existing clothing items. - -When [creating accessories](#creation-process), all of the components are created first in your modeling software, then converted to their appropriate Roblox Studio instance on import. - -### Mesh part - - - -
    T-shirt clothing mesh object
    - -
    Bow accessory mesh object
    -
    - - -Simple accessories, such as the bow, are [rigid accessories](../../art/accessories/index.md) do not require the rigging and caging components that allow it to stretch and fit over a target. - - -All accessories require a single mesh object that represents the geometry of the accessory object. In Studio, this mesh object is represented as a `Class.MeshPart` nested under a single `Class.Model` - -### Textures - - -
    2D texture map for the t-shirt model
    - -
    T-shirt model with texture applied
    -
    - -Textures are image files that define the surface appearance of your accessory. You can create textures within a texture painting program or a 3D modeling software. In Studio, textures images are imported as image assets and are set to `Class.MeshPart` objects by a child `Class.SurfaceAppearance` object or a `Class.MeshPart.TextureID` property. - -### Attachments - - -
    Attachment geometry defines where the attachment connects with the character
    - -
    Geometry with the "_Att" suffix automatically convert to `Class.Attachment` objects in Studio
    -
    - -For layered clothing, the attachment point is used to associate with the correct body part when the body ragdolls or is dismembered. In Studio, attachments are represented by `Class.Attachment` objects. - -Attachments for clothing items are automatically generated in Studio using the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md). - -### Rigging armature - - -
    To ensure natural movement of the clothing item, it must be weighted to a character rig
    - -
    When the rig is properly set up, the layered model can move and bend with the character rig
    -
    - -A rigging armature defines how a layered asset can move with a character model. Using rigging and skinning techniques, you can set the areas of your clothes to move naturally with a character model's joints, such as ensuring a shirt sleeve correctly follows the movement of the elbow and shoulder. In Studio, this rigging and skinning data is saved to the mesh geometry. - -### Inner and outer cages - - -
    The inner cage defines the inner surface of the clothing item where the clothes wrap over
    - -
    The outer cage defines the outer surface of the clothing item where any additional clothes can wrap and layer over
    -
    - -Cage meshes indicate the inner and outer surfaces of a layered accessory. The inside cage of a t-shirt defines how the t-shirt stretches and fits over a character body. The outer cage of a t-shirt defines how additional layered clothing fit over the t-shirt. In Studio, these cages are represented by `Class.WrapLayer` objects. - -## Creation process - -Custom accessories are first created in 3D modeling programs, such as [Blender](https://www.blender.org/) or [Maya](https://www.autodesk.com/products/maya/overview), before importing the `.fbx` or `.gltf` model into Studio. -To get started creating your first avatar asset, see [Avatar Tutorials](../../avatar/tutorials.md). - -Depending on the type of asset you are creating, the creation process follows these high-level workflows: - - -
    Layered Accessory Workflow

    - -
    Rigid Accessory Workflow

    - -
    - - -Since 3D creation isn't a linear process and always requires reiteration and testing, the process of creating an accessory can differ between individuals and various creation workflows. - - -## Resources - -There are a variety of resources available for creators of all backgrounds to get started with accessory creation. - -If you are interested in specific avatar creation topics, use the following table to find guides and resources that best match your needs: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TopicResources
    Tutorials[Rigid accessory creation](../../art/accessories/creating-rigid/index.md)

    [Basic clothing creation](../../art/accessories/creating/index.md)
    Reference files[Accessory and clothing reference files](../../art/modeling/project-files.md)
    Technical specs[.FBX export settings](../../art/modeling/export-requirements.md)

    [General mesh specifications](../../art/modeling/specifications.md)

    [Accessory specifications](../../art/accessories/specifications.md)

    [Marketplace policy](../../marketplace/marketplace-policy.md)
    Cosmetic creation[Accessories overview](../../art/accessories/specifications.md)

    [Layered clothing overview](../../art/accessories/index.md)

    [Create face accessories](../../art/characters/facial-animation/create-face-accessories.md)

    [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md)

    [Accessory specifications](../../art/accessories/specifications.md)

    [Marketplace requirements](../../marketplace/marketplace-policy.md)
    Texturing[Texturing requirements](../../art/modeling/texture-specifications.md)

    [PBR textures](../../art/modeling/surface-appearance.md)
    Rigging and skinning[Rigging and skinning overview](../../art/modeling/rigging.md)

    [Humanoid rigging requirements](../../art/characters/specifications.md#rigging)

    [Rigging facial bones](../../art/characters/facial-animation/create-basic-heads.md#rigging)

    [Auto skin transfer](../../art/accessories/automatic-skinning-transfer.md)

    [Skin facial bones](../../art/characters/facial-animation/create-basic-heads.md#skin-face-bones)
    Testing and validation[Calisthenics tool](../../art/modeling/calisthenics-tool.md)

    [Clothing validation tool](../../art/accessories/validation-tool.md)
    Publishing and Marketplace[Upload to Marketplace](../../marketplace/publish-to-marketplace.md)

    [Marketplace policy](../../marketplace/marketplace-policy.md)

    [Fees and commissions](../../marketplace/marketplace-fees-and-commissions.md)
    - -## Classic clothing - -Classic clothing assets are 2D images that you can apply to the surface of an avatar body as t-shirts, shirts, or pants. You can design these assets in any image processing software, test the textures in Studio, and then upload the designs to the Marketplace to sell. See [Classic clothing](../../art/classic-clothing.md) for more information on creating, uploading, and selling these assets. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/project-files.md b/.cursor/rules/roblox/en-us/art/accessories/project-files.md deleted file mode 100644 index a81f455b..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/project-files.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: Accessory project files and references -description: Download various accessory-related project files and reference files. ---- - - -See [Resources](../../avatar/resources.md) for a complete list of avatar-related downloadable content. - - -The following `.fbx`, `.blend`, and `.ma` project files are available to use as templates or as reference: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FileDescription
    Tshirt-model.fbxUncaged example clothing ready for caging in a 3D modeling software.
    Additional-FBX-assets.zipCaged 3D accessory models ready for import into Studio or in a modeling tool.
    Additional-FBX-assets.zipAdditional caged clothing items from How to cage Roblox's [3D clothing video guide](https://www.youtube.com/watch?v=QwZaA9Gc-WQ).
    ClassicMannequin.fbxA [Classic body](../../art/characters/specifications.md#classic) type blank mannequin to use in Studio or your modeling application.
    ClassicMannequin_With-CagesA [Classic](../../art/characters/specifications.md#classic) body type blank mannequin with **body cages** to use in Studio or your modeling application for clothing design. Due to unconfigured cage objects, this file may not import correctly into Studio until modified.
    RthroMannequin.fbxAn [Rthro Normal](../../art/characters/specifications.md#normal) body type blank mannequin to use in Studio or your modeling application.
    RthroMannequin_With-Cages.fbxAn [Rthro Normal](../../art/characters/specifications.md#normal) body type blank mannequin with **body cages** to use in Studio or your modeling application to use in Studio or your modeling application for clothing design. Due to unconfigured cage objects, this file may not import correctly into Studio until modified.
    RthroSlenderMannequin.fbxAn [Rthro Slender](../../art/characters/specifications.md#slender) body type blank mannequin to use in Studio or your modeling application.
    RthroSlenderMannequin_With-Cages.fbxAn [Rthro Slender](../../art/characters/specifications.md#slender) body type blank mannequin with **body cages** to use in Studio or your modeling application to use in Studio or your modeling application for clothing design. Due to unconfigured cage objects, this file may not import correctly into Studio until modified.
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    FileDescription
    Rig_and_Attachments_Template.blendStarting armature rig template for Blender. Contains an armature with correct R15 naming conventions and attachment points. Use this template for rigging bodies and clothing items.
    Clothing_Cage_Template.blendStarting template for Blender that includes a full-body inner and outer cage mesh for creation of layered clothing. Use this template for caging your clothing accessories.
    Combined-Template.blendTemplate file containing all content from previous templates, includes rig skeleton, body cages, attachment points. Use this template to rig and cage bodies and accessories.
    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    FileDescription
    Rig_and_Attachments_Template.maStarting armature rig template for Maya. Contains an armature with correct R15 naming conventions and attachment points. Use this template for creating bodies and clothing items.
    Clothing_Cage_Template.maStarting template for Maya, includes a full-body inner and outer cage mesh for creation of layered clothing. Use this template for caging your clothing accessories.
    Combined-Template.maTemplate file containing all content from previous templates, includes rig skeleton, body cages, attachment points. Use this template to rig and cage bodies and accessories.
    - -
    - - - The following `.fbx` files were exported from Maya for use in modeling applications. If you are using Blender or Maya in your workflow, use the specific template files for those programs instead of the following files. - - - - - - - - - - - - - - - - - - - -
    FileDescription
    Rig_and_Attachments_Template.fbxStarting armature rig template for general modeling software. Contains an armature with correct R15 naming conventions and attachment points. Use this template for creating bodies and clothing items.
    Clothing_Cage_Template.fbxStarting template for general modeling software, includes a full-body inner and outer cage mesh for creation of layered clothing. Use this template for caging your clothing accessories.
    -
    -
    diff --git a/.cursor/rules/roblox/en-us/art/accessories/publish-eyebrows-eyelashes.md b/.cursor/rules/roblox/en-us/art/accessories/publish-eyebrows-eyelashes.md deleted file mode 100644 index 7d68f306..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/publish-eyebrows-eyelashes.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Publish bodies with eyelashes and eyebrows -description: Eyelashes and eyebrows are optional accessory items you can equip to an avatar to publish in the Marketplace. ---- - -Eyelashes and eyebrows are cosmetics that can help emphasize facial features and create a unique way of customizing a character. Similar to clothing, eyelashes and eyebrows are [3D layered clothing](../../art/accessories/layered-clothing.md) that can stretch and fit over different face shapes and can deform and stretch with character face animations. - - -
    - -
    Character body without eyelashes and eyebrows
    -
    -
    - -
    Character body with eyelashes and eyebrows
    -
    -
    - -
    Standalone eyelashes and eyebrows
    -
    -
    - -When publishing eyelashes and eyebrows, you must parent these `Class.Accessory` objects under the avatar character's `Class.Model` prior to uploading the character `Model` to the Marketplace. These `Accessory` face objects must adhere to Roblox's accessory requirements and include layered components such as caging, rigging, and skinning components. For an overview on creating your own eyelashes and eyebrows, see [Create face accessories](../../art/characters/facial-animation/create-face-accessories.md). - - -At this time, you can only bundle **eyelashes**, **eyebrows**, and **hair** with your body on Marketplace upload. Other facial accessories, such as horns, makeup, glitter, or other cosmetics are not acceptable. See [Marketplace policy](../../marketplace/marketplace-policy.md) for specific information on allowable cosmetics and other policy regulations and guidelines. - - -## Configure eyelash and eyebrow accessories - -Use the following steps to import your face accessory and body assets into Studio. After converting the eyelashes and eyebrows to `Accessory` objects, parent the `Accessory` objects within the character `Model` before uploading the character to the Marketplace. - -You can download reference `.fbx` models of [eyelashes](../../assets/art/reference-files/Eyelashes.fbx), [eyebrows](../../assets/art/reference-files/Eyebrows.fbx), and an [avatar body](../../assets/art/reference-files/AnimeFemale-Studio-Ready.fbx) to follow along this process. - -1. In the [3D Importer](../../art/modeling/3d-importer.md), import the `.fbx` files of your face accessory and body. The eyelashes, eyebrows, and body each populate in your Workspace as a `Model`. - 1. If you are using the reference body, set **Rig General** > **Rig Type** to **Rthro**. -2. Use the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) and select the **Eyelash** or **Eyebrow** model and click **Next**. - - - -3. Select the appropriate **Accessory** > **Eyelash** or **Accessory** > **Eyebrow** asset type and click **Next**. -4. (Optional) Preview the fit of your face accessory. - 1. If the face accessory was modeled on a specific character body, you may want to import that character body into Studio and use it as a mannequin in the fitting tool's preview. See [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) for more information on adding custom characters. - 2. If using the provided reference body, you can continue to step 5. -5. Click **Generate MeshPart Accessory** to create your MeshPart. -6. **Repeat steps 2-5** for the other face accessory. -7. In the Outliner, **drag and drop** the face `Accessory` objects within the character `Model` instance. The accessories automatically equip and attach to the correct areas of your avatar character. - - -
    - -
    Workspace preview of body with face accessories
    -
    -
    - -
    Outliner hierarchy
    -
    -
    - -8. If required, rename the accessory objects to `EyelashAccessory` or `EyebrowAccessory` accordingly. - -9. Once you are ready to upload the avatar model with your face accessories, see [Upload an asset](../../marketplace/publish-to-marketplace.md#upload-an-asset) for instructions on uploading and publishing your avatar body with eyelashes and eyebrows to the Marketplace. diff --git a/.cursor/rules/roblox/en-us/art/accessories/rig-and-cage-existing-models.md b/.cursor/rules/roblox/en-us/art/accessories/rig-and-cage-existing-models.md deleted file mode 100644 index 253b2e30..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/rig-and-cage-existing-models.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -title: Rigging and caging models (Blender) -description: Convert a 3D model into a layered 3D model in Blender before importing and converting the model into Studio as an Accessory. ---- - -You can use a third party modeling tool, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview), to modify an existing 3D object into a layerable 3D model that you can [import and convert](../../art/accessories/accessory-fitting-tool.md) into Studio as an `Class.Accessory`. To create a layered model, you must **parent** (Blender) or **bind** (Maya) a 3D model to a mannequin armature and then modify two additional meshes to fit around the inner and outer surface of the accessory model. - -This guide covers the basic workflow for converting a 3D model into a layerable model in Blender using the following steps: - -1. [Importing](#import) a 3D asset into a template Blender project file. -2. [Parenting](#parent-and-weight) the imported mesh object to the project file's armature rig with Blender's Automatic Weights feature. - 1. Manual skinning is not covered, see [Skin a simple mesh](../modeling/skin-a-simple-mesh.md) for an overview of manual skinning. -3. [Editing](#edit-inner-and-outer-cage-meshes) the Inner and Outer Cage meshes to represent the inner and outer surface of the model. - -A full list of asset requirements for a layered model can be found in [Layered model specifications](../../art/accessories/specifications.md). - - -This guide uses Blender version 3.0. If you are -using another version of Blender, there may be minor differences in UI and -settings. - - -## Import - -Set up the project by opening the [rig template project](../../assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip) and importing the [sample accessory model](../../assets/accessories/reference-files/Tshirt-model.fbx). - -To import and parent the accessory model: - -1. In Blender, open the [rig template project](../../assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip). This file contains the default armature required for layered clothing. - - Blender Mannequin Template Project - -2. In the Outliner, toggle the Hide icon to visually remove any non-armature objects in your workspace, such as Attachments. - - - -3. In the File Menu, select **Import** and click **FBX (.fbx)**. Select the accessory model file you intend to fit onto the mannequin. The accessory populates in the workspace and, depending on how the asset was modeled, may need resizing or adjustment to fit on the mannequin. - - - -## Parent and weight - -For this basic accessory, parent the imported mesh to the template mannequin armature using Blender's [Automatic Weights](https://docs.blender.org/manual/en/latest/animation/armatures/skinning/parenting.html#with-automatic-weights) feature. Parenting the accessory model mesh to the armature in this way enables the 3D model to move and deform naturally with the character in Studio. - - -Complex clothing and accessory items with moving parts may require more precise skinning with Blender's Weight Painting or other skinning tools. See [Skin a simple mesh](../modeling/skin-a-simple-mesh.md) for an example of manual skinning. - - -To parent the mesh object with the mannequin armature: - -1. In the Outliner, temporarily hide both of the Cage objects to expose the Armature by toggling the Hide icon. - -2. In the Workspace, click the mesh object, then hold Shift and **click** the mannequin's armature. - -3. Right click, or use CtrlP (⌘P) to parent the accessory to the armature by selecting **Automatic Weights**. - - - -4. Reduce visual clutter by hiding all objects except the **cages** and **model**. Click on the symbol next to the object in the Outliner panel. - - - -## Edit inner and outer cage meshes - -After parenting and weighting your clothing item, you can start adding the cage meshes to your clothing to indicate the inner and outer surfaces of your clothing. - -When setting up the cages, the accessory model needs to fit on top of the inner cage and then the outer cage must be adjusted to fit tightly over the model object. - -You can quickly add these two full-body meshes from the [Clothing_Cage_Template.blend](../../assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip) into your existing project. - - -Don't delete vertices or alter the UVs on the Inner or Outer Cages as this can cause errors when importing in Studio or when equipping onto a character. - - -To quickly add clothing cages to your project: - -1. Download the [Clothing_Cage_Template.blend](../../assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip) project. -2. In your current Blender project, switch to Object Mode and navigate to **File** > **Append**. A file browser displays. - - - -3. Click on the Clothing_Cage_Template.blend file and navigate to the **Object** folder. - - - -4. In the Object folder, hold Shift and select both `YourClothingName_InnerCage` and `YourClothingName_OuterCage` and click **Append**. The two cage mesh objects populate in your project. - - - -To modify cages for your accessory model: - -1. In the Outliner panel, rename the **\_InnerCage** and **\_OuterCage** meshes to match the imported mesh object (ex. Tshirt_InnerCage, Tshirt_OuterCage). Make sure this exactly matches the mesh name that you imported. - - - -2. In the Outliner window, select the \_OuterCage mesh and switch to **Edit Mode** Tab. - -3. In the Viewport, enable **X-Ray** view and **Materials View** to improve visibility and access to the vertices of the outer cage mesh. - - - -4. While in Edit Mode, adjust the vertices with the Edit Mode tools so that the Outer Cage completely covers the top of the accessory. - - - When manipulating vertices, try to keep each face (the space between vertices) consistently sized and retain symmetry wherever possible. Use the symmetry toggles on the top right of the Viewport when applicable. - - - - -A finished outer cage should completely cover the accessory with minimal extra space. For comparison, you can download a completed caged version of the Tshirt model [here](../../assets/accessories/reference-files/Tshirt-caged.fbx). - - - -When finished with the caging and modeling of your asset, see [Exporting requirements](../../art/modeling/export-requirements.md#blender) for details on exporting the model from Blender. - -After exporting, see [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) and [Converting clothing accessories tutorial](../accessories/creating/converting.md) for instructions on importing and converting the model into a usable accessory. - -## Tips for editing cages - -The following tips may be helpful when manipulating your cage vertices: - -- On the top-right of the Viewport, toggle different [Viewport Shading](https://docs.blender.org/manual/en/latest/editors/3dview/display/shading.html) options, such as **Material Preview** and **X-Ray**, when necessary to better access vertices and view your caging progress. -- You can hide vertices you're currently not adjusting by using **Hide** (H) and **Unhide** (AltH; ⌥H). -- Multiple vertices can be selected and adjusted at the same time. Use **Move**, **Scale**, or any other Blender tools to make adjustments to multiple vertices at once. - - diff --git a/.cursor/rules/roblox/en-us/art/accessories/specifications.md b/.cursor/rules/roblox/en-us/art/accessories/specifications.md deleted file mode 100644 index 56edecc7..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/specifications.md +++ /dev/null @@ -1,356 +0,0 @@ ---- -title: Rigid accessory specifications -description: Rigid accessory specifications lists the specific technical requirements for basic avatar accessories. ---- - -When creating rigid accessories for Roblox, it's important to meet specific technical requirements to ensure compatibility and optimize for performance and quality. Many of these requirements must be applied when designing and modeling your asset in a third-party modeling application. - -Although rigid accessories and layerable clothing accessories share many technical requirements, layerable accessories must include [additional components](../../art/accessories/clothing-specifications.md) to ensure the accessories deform and stretch appropriately on different body scales. - -If you are intending to publish and sell these assets on the Marketplace, there are additional [Marketplace policy](../../marketplace/marketplace-policy.md) standards that you must follow for any accessory or clothing item. - -When ready to export, see [Export requirements](../../art/accessories/export-settings.md) for mesh export settings for Blender and Maya. - - -If creating other types of 3D models: -
      -
    • For generic meshes, see [general mesh specifications](../modeling/specifications.md) and [general export settings](../modeling/export-requirements.md).

    • -
    • For layered accessories, see [layered accessory specifications](../accessories/clothing-specifications.md) and [layered export settings](../accessories/clothing-export-settings.md).

    • -
    • For avatar characters, see [avatar specifications](../characters/specifications.md) and [avatar export settings](../characters/export-settings.md).
    • -
    -
    - -## Geometry and budgets - -- **Single Mesh** - Accessories must be a single mesh. -- **Budgets** - Accessories can't exceed **4k** triangles. -- **Watertight** - All geometry must be watertight without exposed holes or backfaces. -- Use **quads** whenever possible. Avoid faces with 5 or more sides. -- **Mesh Size** - Depending on the type of accessory asset, meshes must follow a standard size (in studs, centered on attachment point) depending on the [body scale](#body-scale) it is designed for. - -### Body scale - -Roblox supports 3 types of body scales: `Classic`, `Normal`, and `Slender`. When designing your accessory, the size of your accessory cannot exceed the following sizes based on body scale and accessory asset type. Accessory size is measured based on attachment orientation. - -See [Body scale](../accessories/body-scale.md) for more information on the different types of body proportions Roblox supports. - - -You can use tools like the [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) to help visualize and adjust the scale of your mesh on a mannequin within a visualized boundary before uploading and publishing the asset. - - -#### Classic - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Asset TypeWidth (X)Height (Y)Depth (Z)
    Hat343
    Hair35*
    (Not centered: 2 up, 3 down)
    3.5*
    (Not centered: 1.5 front, 2 behind)
    Face322
    Eyebrow and Eyelashes1.50.50.5
    Neck332
    Shoulder (attached to NeckAttachment)733
    Shoulder (other)333
    Front333
    Back1074.5*
    (Not centered: 1.5 front, 3 behind)
    Waist43.5*
    (Not centered: 1.5 up, 2 down)
    7
    - -#### Normal - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Asset TypeWidth (X)Height (Y)Depth (Z)
    Hat1.872.51.87
    Hair1.873.12*
    (Not centered: 1.25 up, 1.875 down)
    2.18*
    (Not centered: 0.9375 front, 1.25 behind)
    Face1.871.251.25
    Eyebrow and Eyelashes1.50.50.5
    Neck2.953.682.16
    Shoulder (attached to NeckAttachment)6.903.683.24
    Shoulder (attached to RightCollarAttachment, LeftCollarAttachment)2.953.683.24
    Shoulder (attached to RightShoulderAttachment, LeftShoulderAttachment)2.674.403.09
    Front2.953.683.24
    Back9.868.594.87*
    (Not centered: 1.623 front, 3.246 behind)
    Waist3.944.29*
    (Not centered: 1.842 up, 2.457 down)
    7.57
    - -#### Slender - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Asset TypeWidth (X)Height (Y)Depth (Z)
    Hat1.782.51.78
    Hair1.783.12*
    (Not centered: 1.25 up, 1.875 down)
    2.08*
    (Not centered: 1.892 front, 1.189 behind)
    Face1.781.251.18
    Eyebrow and Eyelashes1.50.50.5
    Neck2.593.391.92
    Shoulder (attached to NeckAttachment)6.053.392.88
    Shoulder (attached to RightCollarAttachment, LeftCollarAttachment)2.593.392.88
    Shoulder (attached to RightShoulderAttachment, LeftShoulderAttachment)2.373.962.75
    Front2.593.392.88
    Back8.647.914.32*
    (Not centered: 1.443 front, 2.886 behind)
    Waist3.763.29*
    (Not centered: 1.414 up, 1.885 down)
    6.73
    - -## Textures - -- Textures for Marketplace assets cannot exceed 2048x2048 resolution. -- Textures created for accessories must meet Roblox's [texture specifications](../../art/modeling/texture-specifications.md). - -## Attachment points - -`Class.Attachment` objects indicate where an accessory model attaches to a point on a character body. Whether you are creating rigid or [layered](./layered-clothing.md) accessories, Studio's [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md) (AFT) automatically adds and configures the appropriate `Class.Attachment` with the following specifications: - -- **One attachment** - Each accessory, including layered clothing, require at least one attachment point to its associated body part. -- **Naming Convention** - The `Class.Attachment` name must follow a specific naming convention depending on the `Class.Accessory.AccessoryType`. The AFT generates an appropriate `Class.Attachment` name automatically. - -If setting or configuring attachments manually in Studio, use the following names for your `Class.Attachment` object depending on the accessory type: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Accessory typeAttachment name
    Hat`HatAttachment`
    Hair`HairAttachment`
    Back`BodyBackAttachment`
    Waist`WaistFrontAttachment`, `WaistCenterAttachment`, `WaistBackAttachment`
    Shoulder`RightShoulderAttachment`, `RightCollarAttachment`, `NeckAttachment`, `LeftCollarAttachment`, `LeftShoulderAttachment`
    Face, Eyelash, Eyebrow`FaceFrontAttachment`, `FaceCenterAttachment`
    Neck`NeckAttachment`
    Front`BodyFrontAttachment`
    - - - Importing attachment objects from a third-party tool is not supported for rigid accessories, but is supported for [character bodies](../characters/specifications.md#attachments). - - -- **Shoulders and Collars** - Even though they are in similar locations, Shoulder and Collar attachment points interact with character rigs differently for rigid accessories. - - Items using `RightShoulderAttachment` or `LeftShoulderAttachment` move with the character's arm. - - Items using `RightCollarAttachment` or `LeftCollarAttachment` do not move with the character's arm. - -## Layered properties - -Accessories, such as clothing items, which stretch and fit around any character body type, must include additional configurations to achieve the layering effect. See [Clothing specifications](../../art/accessories/clothing-specifications.md) for specifications required to create layerable accessories. - -## Marketplace requirements - -Your items must meet the following requirements before you upload them to the Marketplace to sell: - -- Ensure that your items adhere to the [Marketplace program guidelines](../../marketplace/marketplace-policy.md). -- Whenever applicable, ensure that your items adhere to Roblox's [custom mesh specifications](../../art/modeling/specifications.md). -- Object `Class.MeshPart.Material|Material` is set to `Plastic`. -- Object `Class.MeshPart.Transparency|Transparency` is set to 0. -- Object `Class.MeshPart.VertexColor|VertexColor` is the default `1, 1, 1`. -- Your `Class.Accessory` instance does not contain extraneous objects, like `Class.Script` or additional `Class.Part` instances. diff --git a/.cursor/rules/roblox/en-us/art/accessories/validation-tool.md b/.cursor/rules/roblox/en-us/art/accessories/validation-tool.md deleted file mode 100644 index ca7798b2..00000000 --- a/.cursor/rules/roblox/en-us/art/accessories/validation-tool.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Clothing Validation Tool -description: The Layered Clothing Validation Tool checks for common clothing creation issues in Blender or Maya before exporting. ---- - -The **Layered Clothing Validation Tool** is a supplemental tool you can install in either [Blender](https://www.blender.org/download/releases/3-0/) or [Maya](https://www.autodesk.com/products/maya/overview) to help quickly identify and fix common issues with layered clothing assets before you export them. - - -
    - -
    Blender Validation Tool
    -
    -
    - -
    Maya Validation Tool
    -
    -
    - -While this tool can save you time in the typical iteration process between your 3D modeling program and Studio, the tool doesn't provide comprehensive verification of all aspects of layered clothing assets. You must ensure your layered clothing model meets both the [general mesh requirements](../../art/modeling/specifications.md) and Roblox-specific [layered clothing requirements](../../art/accessories/specifications.md#layered-requirements) prior to importing it into Studio. - -## Install the Clothing Validation Tool - -There are two separate installation files and instructions for Blender and Maya. - - -The Layered Clothing Validation Tool is designed for both [Blender 3.0](https://www.blender.org/download/releases/3-0/) and [Maya 2022](https://www.autodesk.com/products/maya/overview). You can download and modify the tool for any use. - - -### Blender - -To install the Clothing Validation Tool in Blender: - -1. Download [ValidationTool_Blender.zip](../../assets/accessories/validation-tool/ValidationTool_Blender.zip) and save the `.zip` file locally. -2. In Blender, navigate to **Edit** > **Preferences**. -3. In Preferences, go to the **Add-Ons** section on the left side-bar. - - - -4. Click the **Install...** button. A file browser displays. -5. Select the downloaded `.zip` file and click **Install Add-On**. -6. In the **Add-Ons section**, find the **Validation Tool** and **enable the add-on**. - - - -7. Return to your workspace and **expand the side toolbar** in the Viewport to access the add-on. - - -
    - -
    Sidebar indicator
    -
    -
    - -
    Expanded sidebar
    -
    -
    - -### Maya - -Before you begin the process of installing the Validation Tool in Maya, you must install [Python 3.0](https://www.python.org/downloads/) or higher. If you already have Python installed, you can proceed to installing the Validation Tool. - -To install Python 3.0+ on your device: - -1. Download the appropriate installer from the official [Python website](https://www.python.org/downloads/). -2. Open the installer and follow the installation instructions. - - - Enable **Add Python ### to PATH** before selecting **Install Now**. - - - -To install the Clothing Validation Tool in Maya: - -1. Download [ValidationTool_Maya.zip](../../assets/accessories/validation-tool/ValidationTool_Maya.zip) and unzip the content in a local directory. -2. Open the contents of the `.zip` file in a file browser. - - - If on Windows, **double-click** `install.bat`. This runs a batch script that enables you to quickly run the Validation Tool in Maya. - - If on Mac, **right-click** the `install.command` file and select **Open With** > **Terminal**. This runs a terminal script that enables you to quickly run the Validation Tool in Maya. - - - - - If on Mac, you may need to adjust the read/write permissions for the `install.command` file to run successfully. This step requires administrator access. - - To allow the `install.command` file to have full read and write access: - - 1. Open **terminal** and use the `cd` command to navigate to the directory of the saved `install.command` file. - 2. Type the command `chmod 777 install.command` and press **Enter**. This should enable all read and write privileges for this file. - - - -3. When prompted, type your Maya version and press **Enter**. For example, if using Maya 2020, input **2020** as your version. - - -4. When installation is successful, the following message displays: - - -5. Open Maya and navigate to **Windows** > **General Editors** > **Script Editor**. - -6. When using the plugin for the first time, in the Script Editor, type `import ValidationTool` then press the **Play** button in the top bar of the Script Editor. The plugin UI displays. - - - - When using the plugin after the initial launch, launch the plugin by typing `ValidationTool.validationTool()` and clicking the **Play** button. - - Alternatively, you can set up a shortcut from the plugin UI after initial launch by clicking the **Create shortcut button on Maya shelf** button. - - - -## Validate assets - -With the plugin active and a layered asset in your workspace, you can begin validating content. After the check, results with issues change to **red** (Blender) or **yellow** (Maya). You can resolve some failed checks by clicking the check button. See [Checks and Troubleshooting Steps](#checks-and-troubleshooting-steps) for details on each validation check. - - -
    - -
    Checks without issues display as grey (Blender) or green (Maya).
    -
    -
    - -
    In this example, potential intersection issues are highlighted in the Viewport.
    -
    -
    - -To use the Validation Tool on your asset: - -1. **Select** the object in your scene. -2. Open the Validation Tool and click **Check Assets**. After a few moments, the UI updates and produces an output message. -3. Results with issues are highlighted with red or yellow. Some issues can be automatically corrected by clicking the highlighted button. - - -This Validation Tool only checks for common clothing creation issues. Ensure your layered clothing model meets both the [general mesh specifications](../../art/modeling/specifications.md) and Roblox-specific [layered clothing specifications](../../art/accessories/specifications.md#layered-requirements) before uploading to Studio. - - -## Checks and troubleshooting steps - -Refer to the table below for details on the specific checks and troubleshooting steps: - -
    -
    **Layers**
    -
    Checks for extra layers in the scene. Automatic fix attempts to remove extra layers.

    If the automatic fix fails, manually remove extra layers.

    - -

    **Transforms**
    -
    Checks that geometry location, rotation, and scale are frozen (`0`,`0`,`0`). Automatic fix attempts to freeze the transforms. This may cause changes to your rig.

    If the automatic fix fails, manually freeze your geometry.

    - -

    **Unused Material**
    -
    Checks for any unused data in the scene, such as [orphan data](https://docs.blender.org/manual/en/latest/editors/outliner/interface.html?highlight=orphan) (Blender) or [construction history](https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2022/ENU/Maya-Basics/files/GUID-503E227B-EF49-4A78-B3CA-7EAC588017C9-htm.html) (Maya), or unused materials. Automatic fix attempts to remove extra data.

    If automatic fix fails, manually remove unnecessary data and objects.

    - -

    **Keyframes**
    -
    Checks for any unnecessary keyframes. Automatic fix attempts to remove keyframes.

    If automatic fix fails, manually remove keyframe data.

    - -

    **Attachment Points**
    -
    Checks that attachment points are present and use the correct naming convention. Automatic fix attempts to parent any unexpected attachment points.

    - -

    **Intersection**
    -
    Checks for any intersection between character geometry and the inner/outer cage mesh geometry. In Blender, clicking the button switches to **Edit Mode** and highlights vertices that are intersecting the inner or outer mesh.

    Some edges, such as edges of the holes for the sleeves, neck and torso edges, may be highlighted by default behavior and can be ignored.

    - -

    **Texture Format**
    -
    Checks that textures match texture requirements, such as resolution size. Users can also select an external image file. Refer to the output messages to manually resolve any texture related issues.
    -
    diff --git a/.cursor/rules/roblox/en-us/art/blender.md b/.cursor/rules/roblox/en-us/art/blender.md deleted file mode 100644 index eecf8f27..00000000 --- a/.cursor/rules/roblox/en-us/art/blender.md +++ /dev/null @@ -1,865 +0,0 @@ ---- -title: Blender -description: Learn about Blender tools. ---- - -Blender is a free, open-source 3D creation suite with a broad range of modeling, sculpting, texturing, and animation tools. Running on Linux, macOS, and Windows systems, this cross-platform application is a popular choice for creators who want to make avatars, accessories, and 3D objects for Roblox experiences. - -While this is by no means an exhaustive list, the following guide offers high-level information on essential Blender tools and features for 3D creation, as well as best practice guidance on designing 3D art between Blender and Studio. - - -To download the latest version of Blender, visit [Blender.org](https://www.blender.org/download/). - - -## File setup - -Before you begin creating 3D art on Blender for the Roblox platform, it's important to configure both Blender and Studio settings so that your 3D objects maintain the same position, orientation, and scale as you iterate and move them between the two applications. - -### Configure units - -By default, Blender and Studio use different primary units to measure length: Blender defaults to the metric scale, and Studio defaults to [studs](../physics/units.md). To ensure that your 3D objects retain the same measurements when you move or scale them in either application, you must configure Blender's units to be consistent with studs. - -To set Blender units to be compatible with Roblox's stud units: - -1. Navigate to the **Properties editor**, then in the left-hand navigation, select the **Scene** tab. - - Blender's Properties editor with the Scene tab highlighted. - -1. Click the **Units** dropdown menu to expand the container, then: - 1. Set **Unit System** to **None**. - 1. Set **Rotation** to **Degrees**. - -### Import settings - -3D software and applications use coordinate systems to represent the position and orientation of objects in the 3D space. These coordinate systems typically consist of three axes: - -- One axis represents horizontal position (left and right movement). -- One axis represents vertical position (up and down movement). -- One axis represents depth (forward and backward movement). - -Blender and Studio use **different** coordinate systems, specifically for the axis that represents the "up" direction. Like other modeling software, Blender uses the **Z** axis because 3D objects move up out of the 2D plane to become a 3D object; conversely, like other engines, Studio uses the **Y** axis because characters move on the ground plane and jump up for vertical movement. - -This difference is important to keep in mind as you import your 3D art into Blender or Studio because you must make adjustments to the import settings to ensure your object maintains the correct orientation in either application. - - -
    - -
    Blender's Navigation Gizmo
    - -
    -
    - -
    Studio's View Selector
    -
    -
    - -#### Studio to Blender - -To set Blender import settings for 3D objects from Studio: - -1. In the top left-hand corner, click the hamburger menu. A popup menu displays. -1. Navigate to **File** > **Import** > **Wavefront (.obj)**, **FBX (.fbx)**, or **glTF 2.0 (.glb/.gltf)**. The **Blender File View** window displays. -1. Select one or multiple `.obj`, `.fbx`, or `.gltf` files that you want to import. -1. In the right-hand panel, navigate to the **General** section: - - 1. Set **Scale** to **1** to keep the same scale from Studio. - 1. Set **Forward Axis** to **Z** to keep the same "forward" axis as Studio. - 1. Set **Up Axis** to **Y** to keep the same "up" axis as Studio. - - The Blender File View window with the General section highlighted. - -1. In the bottom right-hand corner, click the **Import** button. - -#### Blender to Studio - -To set Studio import settings for 3D objects from Blender: - -1. Navigate to **File** > **Import 3D**. Your local file browser displays. -1. Select and then confirm the 3D object's `.obj`, `.fbx`, or `.gltf` file(s) you want to import from your local system. The 3D Importer's **Import Preview** window displays. -1. In the right-hand panel, navigate to the **File General** section, then: - - 1. Enable **Import Only as a Model** if you have multiple objects that you want to group into a `Class.Model` object. - 1. Enable **Upload to Roblox** if you want to create an asset with an asset ID that you can reference across projects. - 1. Set **Creator** to **Me** if you are the only one who needs to access the object, or to the group that owns the project you're working on. This latter setting ensures all eligible group members have permission to use the 3D object within the project. - 1. Enable **Insert Using Scene Position** so that the object retains the position you set in Blender. - - The Import Preview window with the File General section highlighted. - -1. Navigate to the **File Transform** section, then set the following settings so that the object retains the same orientation from Blender: - 1. Set **World Forward** to **Front** to keep the same "forward" axis as Blender. - 1. Set **World Up** to **Top** to keep the same "up" axis as Blender. -1. Navigate to the **File Geometry** section, then set **Scale Unit** to **Stud** to keep the same scale from Blender. -1. At the bottom of the window, click the **Import** button. Your 3D object imports with the same scale and orientation from Blender. - -### Export settings - -Similar to the previous file setup section, it's important to consider Blender and Studio's different coordinate systems when you are ready to export your 3D art from Blender. By taking a little extra time in configuring your export settings, you can ensure your 3D objects maintain the correct orientation, scale, and position when you import them into Studio. - - -Avatar items, or other assets using specialized components, require unique export settings. See the following links for additional information: - -
      -
    • For rigid accessories, see [accessory specifications](../art/accessories/specifications.md) and [accessory export settings](../art/accessories/export-settings.md).

    • -
    • For layered accessories, see [layered accessory specifications](../art/accessories/clothing-specifications.md) and [layered export settings](../art/accessories/clothing-export-settings.md).

    • -
    • For avatar characters, see [avatar specifications](../art/characters/specifications.md) and [avatar export settings](../art/characters/export-settings.md).
    • -
    -
    - -To set Blender settings for exporting 3D objects for Studio: - -1. In the top left-hand corner, click the hamburger menu. A popup menu displays. -1. Navigate to **File** > **Export** > **Wavefront (.obj)**, **FBX (.fbx)**, or **glTF 2.0 (.glb/.gltf)**. The **Blender File View** window displays. -1. In the right-hand panel, navigate to the **Include** section, then enable **Limit to Selected Objects** to only export your selected objects. - - The Blender File View window with the General section highlighted. - -1. In the **Transform** section - 1. If exporting `.fbx`, set **Apply Scalings** to **FBX Unit Scale** so that your object(s) keep the same scale in Studio. For more scaling information, see [Adjust scale](#adjust-scale-fbx). - 1. Set **Forward** to **Z Forward** to keep the same "forward" axis as Blender. - 1. Set **Up** to **Y Up** to keep the same "up" axis as Blender. -1. In the bottom right-hand corner, click the **Export** button. Your 3D object is now ready to [import into Studio](#blender-to-studio). - -### Adjust scale (FBX) - -The FBX (`.fbx`) file format is widely used in 3D workflows due to its broad support across modeling tools and engines. However, when exporting from Blender using its default `.fbx` settings, models often import at an unexpectedly large scale in Roblox Studio. - -Roblox Studio also supports GLTF (`.gltf`) formats which do not require these additional scaling configurations. - -Two default Blender cubes imported in Studio with different scales. - -If you rely on `.fbx` in your workflow, proper export settings or project settings are essential to ensure that your models appear at the correct size and maintain their intended proportions across platforms. - -There are many ways to configure your model so your `.fbx` model scales as expected in Studio. See the following popular settings to manage scaling: - - - - - - - - - - - - - - - - - - - - - - - - - -
    Blender settingUIDescription
    During export, set **Transform** > **Apply Scaling** to **FBX Unit Scale**.Two default Blender cubes imported in Studio with different scales.Models exported with this setting import into Studio or back into Blender at the same scale.

    Make sure all other scaling values in project or export settings are set to default (`1.0`).

    - This is the recommended way to export `.fbx` files at the same scale.
    During export, set **Transform** > **Scale** to **.01**.Two default Blender cubes imported in Studio with different scales.This scales down your export so that the model imports into Studio at the expected scale.

    If you intend on importing this model back in Blender or any non-Studio tool, you might need to scale up the model on import, otherwise the model will import unexpectedly small.
    In the **Scene Properties** panel, set **Units** > **Unit Scale** to .**01**. Two default Blender cubes imported in Studio with different scales.This scales down your entire scene so that the model imports into Studio at the expected scale. If you adjusted your scene units, you can export models using default settings into Studio.

    Working on models at `.01` scale can cause unexpected Blender issues, such as camera difficulties, issues with modifiers, or other complications.

    If you intend on importing this model back in Blender, you might need to scale up the model on import, otherwise the model will import unexpectedly small.
    - - Note on existing resources
    Many reference files, demo projects, and downloadable assets may use older or inconsistent scale settings. Likewise, tutorials and guides might recommend different approaches for handling scale between Blender and Studio.

    Always test and validate any external resources to ensure they work correctly with your current export workflow.
    - -## Fundamentals - -Before you take a look at all of the common modeling, sculpting, and texturing tools for making 3D art for Studio, let's review Blender's fundamental interface elements that are important for navigating through the application and finding the appropriate menus and controls for your specific 3D creation task. - -### Workspaces - -Blender's UI with workspaces highlighted. - -**Workspaces** are preset window layouts with specialized UI configurations and tooling for different 3D creation work like modeling, sculpting, or texturing. You can use these workspace configurations as-is, or you can customize them to work for you as you quickly swap between different tasks. - - -For information on additional workspaces, see Blender's official [Workspaces](https://docs.blender.org/manual/en/2.81/interface/window_system/workspaces.html) documentation. - - -There are many default workspaces, but the following are the most common for creating 3D art for the Roblox platform. - - - - -Blender's Topbar with the Layout workspace highlighted. - -The **Layout** workspace is the default workspace when you load a Blender file, and it provides basic tools for previewing and transforming your 3D objects, such as the Move, Scale, and Rotate tools. The default layout of this workspace includes the following UI for easy access as you set up your 3D art: - -- [3D Viewport](https://docs.blender.org/manual/en/latest/editors/3dview/introduction.html) - Displays the entire scene. -- [Outliner](https://docs.blender.org/manual/en/latest/editors/outliner/introduction.html) - Displays all objects in the scene, comparable to Studio's **Explorer** window. -- [Properties Editor](https://docs.blender.org/manual/en/latest/editors/properties_editor.html) - Displays editable data for the active object, comparable to Studio's **Properties** window. -- [Timeline Editor](https://docs.blender.org/manual/en/latest/editors/timeline.html) - Displays all animation keyframes, comparable to the **Animation Editor** timeline. - - - - -Blender's Topbar with the Modeling workspace highlighted. - -The **Modeling** workspace is very similar to the **Layout** workspace, but it offers more space for the 3D viewport so that you can focus on modifying the geometry of your 3D objects. If you swap between the Modeling and Layout workspaces, you can see the **Properties Editor** expand, the **Outliner** shrink in size, and the **Timeline Editor** disappear altogether. - -The default layout of this workspace includes the following UI for modeling your 3D art: - -- [3D Viewport](https://docs.blender.org/manual/en/latest/editors/3dview/introduction.html) - Displays the entire scene. -- [Outliner](https://docs.blender.org/manual/en/latest/editors/outliner/introduction.html) - Displays all objects in the scene, comparable to Studio's **Explorer** window. -- [Properties Editor](https://docs.blender.org/manual/en/latest/editors/properties_editor.html) - Displays editable data for the active object, comparable to Studio's **Properties** window. - -The most common Roblox creator use case for this workspace is to create the geometrical shape of the 3D art before texturing or animating the geometry. - - - - -Blender's Topbar with the Sculpting workspace highlighted. - -The **Sculpting** workspace provides sculpting tools for modifying meshes with over 20 unique brush types, such as Clay, Inflate, Smooth, and Flatten. Like other common sculpting software, this workspace also provides tooling to mask specific geometry so you can focus on sculpting specific areas without affecting the rest of the mesh. - -The default layout of this workspace includes the following UI for sculpting your 3D art: - -- [3D Viewport](https://docs.blender.org/manual/en/latest/editors/3dview/introduction.html) - Displays the entire scene. -- [Outliner](https://docs.blender.org/manual/en/latest/editors/outliner/introduction.html) - Displays all objects in the scene, comparable to Studio's **Explorer** window. -- [Properties Editor](https://docs.blender.org/manual/en/latest/editors/properties_editor.html) - Displays editable data for the active object, comparable to Studio's **Properties** window. - -The most common Roblox creator use case for this workspace is to create organic 3D art like humans, animals, and plants. - - - - -Blender's Topbar with the UV Editing workspace highlighted. - -The **UV Editing** workspace provides tools for UV mapping texture coordinates to 3D surfaces. The most striking visual change in this workspace is the addition of the UV Editor to allow you to view both your texture and your object on the same screen as you unwrap and adjust UVs. - -The default layout of this workspace includes the following UI for UV mapping your 3D art: - -- [UV Editor](https://docs.blender.org/manual/en/latest/editors/uv/introduction.html) - Displays the image texture that you're mapping onto your 3D object. -- [3D Viewport](https://docs.blender.org/manual/en/latest/editors/3dview/introduction.html) - Displays the entire scene. -- [Outliner](https://docs.blender.org/manual/en/latest/editors/outliner/introduction.html) - Displays all objects in the scene, comparable to Studio's **Explorer** window. -- [Properties Editor](https://docs.blender.org/manual/en/latest/editors/properties_editor.html) - Displays editable data for the active object, comparable to Studio's **Properties** window. - -The most common Roblox creator use case for this workspace is to create and use trim sheets that you can apply to multiple 3D objects at once. This allows you to add significantly more visual complexity to your experiences without having to import additional textures, saving you a negative impact on memory. For more information on this process, see [Develop polished assets - Trim sheets](../tutorials/curriculums/environmental-art/develop-polished-assets.md#trim-sheets) in the Environmental art curriculum. - - -For more information on UV unwrapping, see Blender's official [Unwrapping Introduction](https://docs.blender.org/manual/en/latest/modeling/meshes/uv/unwrapping/introduction.html) documentation. - - - - - -Blender's Topbar  with the Texture Painting workspace highlighted. - -The **Texture Paint** workspace provides tools for coloring image textures onto geometry. Similar to the UV Editing workspace, the most striking visual change in this workspace is the addition of the Image Editor in Paint mode to allow you to view both your texture and your object on the same screen as you paint. - -The default layout of this workspace includes the following UI for texture painting your 3D art: - -- [Image Editor](https://docs.blender.org/manual/en/latest/editors/image/introduction.html) - Displays tools to create, view, and edit images that you can apply to the active object. -- [3D Viewport](https://docs.blender.org/manual/en/latest/editors/3dview/introduction.html) - Displays the entire scene. -- [Outliner](https://docs.blender.org/manual/en/latest/editors/outliner/introduction.html) - Displays all objects in the scene, comparable to Studio's **Explorer** window. -- [Properties Editor](https://docs.blender.org/manual/en/latest/editors/properties_editor.html) - Displays editable data for the active object, comparable to Studio's **Properties** window. - -The most common Roblox creator use case for this workspace is to create a unique texture for characters, accessories, or important 3D objects that players regualarly interact with in experiences. - - -For more information on texture painting, see Blender's official [Texture Paint Introduction](https://docs.blender.org/manual/en/latest/sculpt_paint/texture_paint/introduction.html) documentation. - - - - - -### 3D Viewport - -Blender's UI with the 3D Viewport highlighted. - -Comparable to Studio's viewport, the **3D Viewport** lets you view and interact with your 3D objects as they exist in the 3D space. You can navigate through the scene, transform objects with your mouse, and see your changes in real time as you design your 3D art. - - -For more information, see Blender's official [3D Viewport](https://docs.blender.org/manual/en/latest/editors/3dview/introduction.html) documentation. - - -### Modes - -Blender's UI with the Modes selector highlighted. - -**Modes** offer additional tooling for editing 3D objects in the 3D Viewport. When you select a new mode from the Modes selector: - -- The Header displays new menu options. -- The Toolbar displays a new set of tools. -- Editors and their buttons and panels enable or disable appropriately. - -Depending on which mode is active, your cursor can change into a brush, such as in paint or sculpt modes, and the 3D Viewport can change how it displays objects for that particular task, such as darkening an object so you can more easily see your paint strokes. As you learn Blender, it's useful to experiment with different modes to see what tools are available for your particular 3D creation task. - - -For more information on modes, see Blender's official [Object Modes](https://docs.blender.org/manual/en/latest/editors/3dview/modes.html) documentation. - - - - - -Blender's Modes selector with the Object Mode menu item highlighted. - -**Object mode** is the default mode, and it provides tooling that's available for all object types, such as positioning vertices, edges, and faces, rotating and scaling objects, and measuring distance and angles. This mode is useful for high-level object transformations. - - - - -Blender's Modes selector with the Edit Mode menu item highlighted. - -**Edit mode** provides tooling for editing an object's shape. This mode is useful for more detailed object transformations, such as insetting faces, extruding regions, creating loop cuts, and beveling. - - - - -Blender's Modes selector with the Sculpt Mode menu item highlighted. - -**Sculpt mode** provides tooling for editing a mesh's shape. This mode is useful for creating more organic 3D art, such as humans, animals, and plants. - - - - -Blender's Modes selector with the Vertex Paint Mode menu item highlighted. - -**Vertex Paint** mode provides tooling to set a mesh's vertices to specific colors. This mode is useful for when you want to paint the object itself instead of applying a texture onto the geometry. - - - - -Blender's Object Mode dropdown with the Weight Paint Mode menu item highlighted. - -**Weight Paint** mode provides tooling for vertex group weight painting. This mode is useful when you're creating avatars because it allows you to specify which parts of their body are influenced by parts of their armature. - - - - -Blender's Object Mode dropdown with the Texture Paint Mode menu item highlighted. - -**Texture Paint** mode provides tooling to paint a texture directly on a 3D object. This mode is useful for when you want to apply a texture onto the geometry instead of painting the object's vertices. - - - - -### Toolbar - -Blender's UI with the Toolbar highlighted. - -The **Toolbar** is a vertical menu of tools on the left-hand side of the 3D Viewport. Each time you switch modes, the Toolbar responds by displaying a new unique set of tools for that particular mode. - - -For more information on the Toolbar, see Blender's official [Toolbar](https://docs.blender.org/manual/en/latest/editors/3dview/toolbar/index.html) documentation. - - -### 3D Cursor - -Blender's UI with the 3D Cursor highlighted. - -The **3D Cursor** is a moveable reference point in the 3D space that has both location and rotation data. While this tool has many different uses, the most common are using its position and orientation to: - -- Create precise transformations. -- Place new objects into the scene. -- Move objects or their vertices to new points in the 3D space. -- Reposition pivot point locations. - - -For more information on the 3D Cursor, see Blender's official [3D Cursor](https://docs.blender.org/manual/en/latest/editors/3dview/3d_cursor.html) documentation. - - -## Modeling tools - -Now that you know how to navigate the user interface and change tools according to your specific 3D creation task, let's take a closer look at the most common modeling tools that allow you to change the shape of 3D objects by either impacting the entire mesh or one of the three basic elements of meshes: - -- **Vertex** - A single point on the mesh. -- **Edge** - A line that connects two vertices. -- **Face** - A surface area between three or more vertices. - -Each of the following sections details how you can use each tool for objects and/or mesh elements, the hotkeys you can use to activate the tool, and their most common use cases for creating 3D art for the Roblox platform. - - -
    - A single active vertex on a cube mesh. -
    Vertex
    -
    -
    - A single active edge on a cube mesh. -
    Edge
    -
    -
    - A single active face on a cube mesh. -
    Face
    -
    -
    - - -For more information on any of these mesh elements, see Blender's official [Mesh Structure](https://docs.blender.org/manual/en/latest/modeling/meshes/structure.html) documentation. - - -### Grab - - - -The **Grab** tool lets you move objects, vertices, edges, and faces from the 3D space, and it's one of the most essential tools for positioning objects or mesh elements in a scene. Many Roblox creators use this tool for editing purposes, such as positioning vertices, edges, and faces to a particular stud unit in the 3D space. - -To use the Grab tool: - -1. In either **Object** or **Edit** mode, select one or multiple objects, vertices, edges, or faces. -1. Press G to activate the tool. -1. Move the mouse to reposition your selection. For further precision: - - Press X, Y, or Z after you press G to constrain movement to the **X**, **Y**, or **Z** axis, respectively. - - Double-press an axis key to slide vertices or edges along their natural path. - - Hold Shift while moving your mouse to slow down movement for fine adjustments. -1. Left-click or press Enter to confirm the new position. - - -For more information on this tool, see Blender's official [Move](https://docs.blender.org/manual/en/latest/scene_layout/object/editing/transform/move.html) documentation. - - -### Snap - - - -The **Snap** tool lets you align objects and mesh elements by snapping them to other objects, mesh elements, or the 3D space's grid. Many Roblox creators use this tool to precisely position multiple objects together in the scene so that they can evaluate how they work together in an environment, particularly in regard to position, orientation, and scale. - -To use the Snap tool: - -1. In **Object** or **Edit** mode, navigate to the header, then click the **Snapping** button. A contextual menu displays. - -Blender's header with the Snapping button highlighted. - -1. In the contextual menu, - 1. Set **Snap Base** to one of the following: - - **Closest** - Snaps using the vertex that's closest to the target. - - **Center** - Snaps using the pivot point. - - **Median** - Snaps using the median of the selection. - - **Active** - In Object mode, this setting snaps using the origin of the active element; in Edit mode, this setting snaps using the center of the active element. - 1. Set **Snap Target** to one of the following: - - **Increment** - Snaps to grid points from the selection's location. - - **Grid** - Snaps to the grid in the 3D viewport. - - **Vertex** - Snaps to the vertex that's closest to the mouse cursor. - - **Edge** - Snaps to the edge that's closest to the mouse cursor. - - **Face** - Snaps to the face that's closest to the mouse cursor. - - **Volume** - Snaps the selection to a depth that's centered inside the object under the cursor. - - **Edge Center** - Snaps to the centerpoint of the edge that's closest to the mouse cursor. - - **Edge Perpendicular** - Snaps to a specific point on the edge so that the line from the selection's original location to its new location is perpendicular to that edge. - 1. Set **Affect** to one of the following: - - **Move** - Snaps while moving the selection. - - **Rotate** - Snaps while rotating the selection. - - **Scale** - Snaps while scaling the selection. -1. Press ShiftTab to activate the tool. -1. For further precision, hold Shift to snap the selection in finer increments. -1. Move, rotate, or scale an object or mesh element according to your settings. - - -For more information on this tool, see Blender's official [Snapping](https://docs.blender.org/manual/en/latest/editors/3dview/controls/snapping.html) documentation. - - -### Inset - - - -The **Inset** tool lets you create an inset with adjustable thickness and depth from a face or group of faces. Many Roblox creators use this tool to create uniform fine details in their meshes while maintaining a clean edge flow for their topology. - -To use the Inset tool: - -1. In **Edit** mode, select one or multiple faces. -1. Press I to activate the tool. -1. Move the mouse to adjust your inset's size. For further precision: - - Hold Ctrl to adjust the depth of the inset. - - Hold Shift while moving your mouse to slow down movement for fine adjustments. - - Press I again to inset each active face. -1. Left-click or press Enter to confirm your inset(s). - - -For more information on this tool, see Blender's official [Inset Faces](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/face/inset_faces.html) documentation. - - -### Extrude - - - -The **Extrude** tool lets you create new geometry by pulling out new faces, edges, or vertices from existing geometry. Many Roblox creators use this tool to create depth, volume, and complex shapes from Blender's primitive meshes. - -To use the Extrude tool: - -1. In **Edit** mode, select one or multiple vertices, edges, or faces. -1. Press E to activate the tool. -1. Move the mouse to adjust your extrusion's length. For further precision, press X, Y, or Z after you press E to constrain movement to the **X**, **Y**, or **Z** axis, respectively. -1. Left-click or press Enter to confirm your extrusion(s). - - -For more information on this tool, see the following official Blender documentation: -- [Extrude](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/mesh/extrude.html) -- [Extrude Vertices](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/vertex/extrude_vertices.html) -- [Extrude Edges](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/edge/extrude_edges.html) -- [Extrude Faces](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/face/extrude_faces.html) - - -### Subdivide - - - -The **Subdivide** tool lets you cut edges or faces into smaller divisions, a process that adds new vertices and resolution to your meshes. Many Roblox creators use this tool to create smooth curves, add fine details to surfaces, and prepare meshes before applying additional modifiers. - -To use the Subdivide tool: - -1. In **Edit** mode, select one or edges or faces. -1. Right-click to display a contextual menu for your active edges or faces, then select **Subdivide** to activate the tool. The Subdivide panel displays. -1. Set **Number of Cuts** to the number of subdivisions you want for your edges or faces. - - The Subdivide panel with the Number of Cuts setting highlighted. - -1. Left-click to confirm your subdivision(s). - - -For more information on this tool, see Blender's official [Subdivide](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/edge/subdivide.html) documentation. - - -### Bridge Edge Loops - - - -The **Bridge Edge Loops** tool lets you connect multiple edge loops with faces. Many creators use this tool to fill gaps without manually creating new faces, merge complex sections of their meshes, and maintain clean topology for smooth deformations. - -To use the Bridge Edge Loops tool: - -1. In **Edit** mode, select two or more edge loops that you want to connect. -1. Press CtrlE/⌘E to display a contextual menu for your active edge loops, then select **Bridge Edge Loops** to activate the tool.The **Bridge Edge Loops** panel displays. -1. Set **Number of Cuts** to the number of subdivisions you want for your new bridge. -1. **(Optional)** For further precision for curved bridges, increase **Smoothness** to create a more rounded bridge. -1. Left-click to confirm your bridge. - - -For more information on this tool, see Blender's official [Bridge Edge Loops](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/edge/bridge_edge_loops.html) documentation. - - -### Fill - - - -The **Fill** tool lets you create triangular faces between any active edges or vertices, as long as they form one or more complete perimeters. Many Roblox creators use this tool to close gaps in their meshes so that they're watertight, or without exposed holes. - -To use the Fill tool: - -1. In **Edit** mode, select at least three vertices or two or more edges that form at least one complete perimeter. -1. Press AltF/⌥F to activate the tool. -1. **(Optional)** In the **Fill** panel, enable **Beauty** to arrange the triangles nicely. -1. Left-click to confirm your new face. - - -For more information on this tool, see Blender's official [Fill](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/face/fill.html) documentation. - - -### New Faces from Edges - - - -The **New Faces from Edges** tool lets you either create an edge if only two vertices are active, otherwise it creates a face between the active mesh elements. Many Roblox creators use this tool to close many gaps at once in their meshes so that the meshes are watertight, or to create geometry between many solitary vertices. - -To use the New Faces from Edges tool: - -1. In **Edit** mode, select at least three vertices, or two or more edges that form one or more complete perimeters. -1. Press F to activate the tool. -1. Left-click to confirm your new face. - - -For more information on this tool, see Blender's official [New Edge/Face from Vertices](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/vertex/make_face_edge.html) documentation. - - -### Dissolve - - - -The **Dissolve** tool lets you remove geometry without leaving holes in your meshes. Many Roblox creators use this tool to optimize their 3D art, merge geometry, or remove unnecessary mesh elements while retaining the overall structure of the mesh. - -To use the Dissolve tool: - -1. In **Edit** mode, select the vertices, edges, or faces that you want to remove from your mesh. -1. Right-click to display a contextual menu for your active mesh elements, then: - 1. If your selection is made up of vertices, select **Dissolve Vertices** to remove the active vertices and merge their neighboring edges. - 1. If your selection is made up of edges, select **Dissolve Edges** to remove the active edges and join the surrounding faces to maintain the edge's outline. - 1. If your selection is made up of faces, select **Dissolve Faces** to remove the active face(s) and fill the gap with a new face, if necessary. - - -For more information on this tool, see Blender's official [Deleting & Dissolving](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/mesh/delete.html#dissolve) documentation. - - -### Delete - - - -The **Delete** tool lets you completely remove geometry from your meshes, leaving one or many holes wherever geometry was removed. Many Roblox creators use this tool instead of the Dissolve tool whenever they want to restructure their meshes during the iteration process. - -To use the Delete tool: - -1. In **Edit** mode, select the vertices, edges, or faces that you want to remove from your mesh. -1. Press X to display a contextual menu for your selection. -1. Choose one of the following menu items: - 1. Select **Vertices** to delete all active vertices, removing any faces or edges they are connected to. - 1. Select **Edges** to delete all active edges, removing any faces that the edge shares with it. - 1. Select **Faces** to remove all active faces, removing any edges they are connected to. - 1. Select **Only Edges and Faces** to remove only the active edges and adjacent faces. - 1. Select **Only Faces** to remove all active faces without also affecting active edges in the selection. - - -For more information on this tool, see Blender's official [Deleting & Dissolving](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/mesh/delete.html#delete) documentation. - - -### Mirror Modifier - - - -The **Mirror modifier** lets you mirror geometry across one or multiple axes so that you can create symmetrical 3D art with minimal effort. Many Roblox creators use this tool while modeling avatars or architectural objects that are important to be perfectly symmetrical. - -To use the Mirror modifier: - -1. In **Object** mode, select the object that you want to mirror. -1. Navigate to the **Properties editor**, then in the lefthand navigation, select the **Modifiers** tab. - - Blender's Properties editor with the Modifiers tab highlighted. - -1. Click the **Add Modifier** button, then insert the **Mirror** modifier. -1. Set **Axis** to **X**, **Y**, and/or **Z** to mirror along one or many axes. -1. In **Edit** mode, modify your object or any of its mesh elements to see your modifications mirror along an axis or multiple axes. - -## Texturing tools - -After you finish modeling your 3D object, it's time to apply a texture to your mesh so that it has additional visual characteristics, such as color, depth, and roughness through a [texture map](../art/modeling/surface-appearance.md). These are details that modeling alone can't provide, transforming your object from a blank shape to something that looks either realistic or stylized according to your experience's art requirements. - - -
    - -
    Model without a texture
    - -
    -
    - -
    Model with a texture
    -
    -
    - -Each of the following sections details how you can use each tool for either UV editing or vertex painting objects, the hotkeys you can use to activate the tool, and their most common use cases for texturing 3D art for the Roblox platform. - -### UV editing - -UV editing is the process of unwrapping your 3D object's faces and mapping them onto a 2D image texture. This process allows you to use a single texture to apply visual characteristics to multiple objects in Blender, saving you a negative impact on memory in Studio. For example, the following door frame, ceiling, and card reader meshes in the [Laser Tag](../resources/templates.md#laser-tag) template all use the same UV map to add metal adornments. - - -
    - An doorway with trim sheet textures applied. -
    -
    - A group of ceiling tiles with trim sheet textures applied. -
    -
    - A futuristic card reader with trim sheet textures applied. -
    -
    - -The "UV" in UV editing stands for the axes on the 2D image map that you use during the mapping process: - -- U axis - The horizontal position (left and right movement). -- V axis - The vertical position (up and down movement). - -Because 3D objects use the X, Y, and Z axes in the 3D space, 3D creation applications typically use U and V to avoid confusion when referring to coordinates in 2D image space. That being said, many Blender UI workflows still use X and Y, so it's helpful to know the 2D space equivalent axis. - -When you unwrap a 3D object, all active faces flatten into the 2D space in the UV Editor to make up the **UV map**, and different sections of the model split into separate groupings, commonly referred to as **UV islands**. For example, if you were to unwrap a standard Blender cube, each face would become its own UV island in the UV map. - - -
    - A UV map of a 3D cube. -
    UV map in the UV Editor
    -
    -
    - The 3D cube that is being unwrapped. -
    Cube in the 3D Viewport
    -
    -
    - -Every point, line, and face in the UV map corresponds to a vertex, edge, and face in the mesh. This means that when you move UV islands to different parts of the texture, their corresponding vertices, edges, and faces update to reflect the area of the texture that they now overlap. - -Blender often creates UV islands along **seams**, or connected edges, to minimize distortion and make it easier for you to apply your texture. While this default UV island configuration is a great place to start, it's almost always necessary to modify each island's position, orientation, and scale to overlap the area of the texture you want to project, or mark your own seams to focus on texturing specific areas at a time. - -By investing the time to unwrap, arrange, and map your UV islands, you can improve your texture quality and reduce stretching or distortion on all of your 3D art. The following subsections highlight the most common tools for this process, specifically in regards to unwrapping and mapping your objects. - - -For more high-level information on this process, see Blender's official [UV Editor](https://docs.blender.org/manual/en/latest/editors/uv/introduction.html) and [Getting Started with UVs](https://docs.blender.org/manual/en/latest/modeling/meshes/uv/unwrapping/introduction.html#getting-started) documentation. - - -#### Mark Seam - -The **Mark Seam** tool lets you manually break up a 3D object's UV map into smaller, manageable sections. While this step in the unwrapping process is technically optional, many Roblox creators find it useful for concentrating on collections of related faces for complex objects that require a lot of detailed texture work. - -For example, the following rivet gun requires a metal texture for the barrel, and a leather texture for the grip. To make it easier to texture this object, you can mark the seams of the grip, unwrap just the faces between those seams, then map it to a leather texture image. - - -
    - A UV map of a grip on a rivet gun. -
    Grip UV map in the UV Editor
    -
    -
    - The marked seams and enclosed faces on the rivet gun that are being unwrapped. -
    Marked seams in the 3D Viewport
    -
    -
    - -To use the Mark Seam tool: - -1. Open the **UV Editing** workspace. The UV Editor displays on the lefthand side of the screen, and the 3D viewport displays on the righthand side of the screen in Edit mode. -1. In the **3D Viewport**, navigate to your 3D object, then select the edges where you want to create seams. -1. Press CtrlE/⌘E to open the **Edge** contextual menu. -1. Select **Mark Seam**. The seam turns red and is ready for the Unwrap tool. - -When you are ready to unwrap your object, Blender will unwrap the enclosed faces of the seam as its own island. - - -For more information on this tool, see Blender's official [Seams](https://docs.blender.org/manual/en/latest/modeling/meshes/uv/unwrapping/seams.html) documentation. - - -#### Unwrap - -The **Unwrap** tool lets you unwrap and clean up the UV map of any marked seams or active faces of a 3D object so that you have a solid foundation of UV islands to work with. This can quickly take UV coordinates from being a complete mess to something more manageable. - -Many Roblox creators use this tool for complex shapes that they need full control over when applying textures, such as characters, clothes, and curvy objects, because it works quickly and avoids stretching and distortion. - - -
    - A chaotic with disorganized islands. -
    Before using the Unwrap tool
    -
    -
    - A clean UV map with organized islands. -
    After using the Unwrap tool
    -
    -
    - -To use the Unwrap tool: - -1. Open the **UV Editing** workspace. The UV Editor displays on the lefthand side of the screen, and the 3D viewport displays on the righthand side of the screen in Edit mode. -1. In the **3D Viewport**, navigate to your 3D object, then either use the **Mark Seam** tool to create seams, and/or select the specific faces you want to texture. -1. Press U to open the **UV Mapping** contextual menu. -1. Select **Unwrap**. Your selection's UV islands display neatly in the UV Editor. -1. In the **UV Editor**, move, scale, or rotate UV islands to the appropriate position, orientation, and scale on your texture. - - -For more information on this tool, see Blender's official [UV Operators - Unwrap](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/uv.html#Unwrap) documentation. - - -#### Follow Active Quads - -The **Follow Active Quads** tool lets you generate clean and organized UV islands according to the UV coordinates of a previously unwrapped active face. This is particularly useful for grid-like topology, such as when you're unwrapping walls, floors, or mechanical parts using trim sheets. - -Many Roblox creators use this tool to apply a consistent texture to curved 3D objects, such as sidewalks for experiences or belts for accessories. - - - -To use the Follow Active Quads tool: - -1. Open the **UV Editing** workspace. The UV Editor displays on the lefthand side of the screen, and the 3D viewport displays on the righthand side of the screen in Edit mode. -1. In the **3D Viewport**, navigate to your 3D object, then unwrap every face you want to texture using an active face. -1. **(Optional)** Configure your active face. - 1. In the **UV Editor**, select the face you want to be your active face, then press AltM/⌥M to open the **Split** contextual menu. - 1. Select **Selection**. The active face separates from the UV island. - 1. Move, scale, or rotate your active face to the appropriate position, orientation, and scale that you want other faces in the UV map to follow. -1. In the **UV Editor**, select all faces you want to follow the active face. Make sure to select your active face last so that Blender knows to use its layout as the guide. -1. Press U to open the **Unwrap** contextual menu, then select **Follow Active Quads**. Blender aligns your selection's UV coordinates to match the active face's shape and orientation. - - -For more information on this tool, see Blender's official [UV Operators - Follow Active Quads](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/uv.html#follow-active-quads) documentation. - - -#### Projection - -Projection tools are tools that project a 3D object's surface onto the 2D image texture plane. Each projection tool controls how the object's shape unwraps and maps onto the 2D texture: - -- **Cube Projection** - Projects the object's faces onto all six sides of a cube; useful for boxy shapes like crates. -- **Sphere Projection** - Projects the object's surface onto a sphere; useful for round shapes like eyes. -- **Cylinder Projection** - Projects the object onto a cylindrical shape; useful for tubes, pipes, and limbs. -- **Project from View** - Projects the object's selected faces according to the current camera or viewport angle; useful for flat surfaces and decals. -- **Smart UV Project** - Automatically unwraps the model and generates islands according to a set angle between faces. - -It's useful to consider how you can utilize projection tools to save time in the texturing process, especially for simple objects that require repetitive textures. For example, many Roblox creators strategically use these tools to efficiently create UV islands for basic geometric shapes without needing to mark seams from edges. - - -
    - A UV map using Smart UV Project. -
    A UV map using Smart UV Project.
    -
    -
    - A UV map using Cube Projection. -
    A UV map using Cube Projection.
    -
    -
    - -To use a projection tool: - -1. Open the **UV Editing** workspace. The UV Editor displays on the lefthand side of the screen, and the 3D viewport displays on the righthand side of the screen in Edit mode. -1. In the **3D Viewport**, navigate to your 3D object, then select every face. -1. Press U to open the **UV Mapping** contextual menu, then select one of the following options: - - **Cube Projection** - - **Sphere Projection** - - **Cylinder Projection** - - **Project from View** - - **Smart UV Project** - - -For more information, see the following official Blender documentation: -- [Cube Projection](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/uv.html#cube-projection) -- [Sphere Projection](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/uv.html#sphere-projection) -- [Cylinder Projection](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/uv.html#cylinder-projection) -- [Project from View](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/uv.html#project-from-view) -- [Smart UV Project](https://docs.blender.org/manual/en/latest/modeling/meshes/editing/uv.html#smart-uv-project) - - -### Vertex painting - -Vertex painting is the process of storing color information directly on the vertices of your 3D object rather than through traditional textures or materials. In this approach, each vertex holds color data that Blender interpolates across the faces of a mesh, creating either smooth gradients or solid blocks of color without the need for UV mapping or image textures. - -Vertex painting is useful for adding color variation to your assets in a lightweight, efficient way, especially in stylized workflows or experiences where performance is a concern, as it can reduce texture memory usage and draw calls. Many Roblox creators use vertex painting in conjunction with Studio's default materials, `Class.MaterialVariant` objects, and `Class.SurfaceAppearance` objects to create visual complexity on otherwise simple 3D objects. - - -
    - A rocket launcher object in Blender without any color. -
    Object without color
    -
    -
    - A rocket launcher object in Blender with vertex paint on the handle. -
    Object with vertex paint
    -
    -
    - A rocket launcher object in Studio with vertex paint and a SurfaceAppearance texture -
    Object with vertex paint and image texture
    -
    -
    - -To vertex paint: - -1. Add a color attribute to store color information to your object's vertices. - - 1. In the **3D Viewport**, select your 3D object. - 1. Navigate to the **Properties editor**, then in the left-hand navigation, select the **Data** tab. - - Blender's Properties editor with the Data tab highlighted. - - 1. Click the **Color Attributes** dropdown menu to expand the container, then click the **+** button. The **Add Color Attribute** contextual menu displays. - 1. Set **Domain** to **Vertex**, **Data Type** to **Color**, then click the **Add** button. Your object now has a color attribute. - -1. Configure the 3D Viewport to display your color attribute. - - 1. In the **3D Viewport**, navigate to the top right-hand corner **Viewport Shading** options, then click the button for the **Solid** shading mode. - - Blender's Viewport Shading options with the Solid shading mode highlighted. - - 1. Click the **Viewport Shading** dropdown arrow, then in the contextual menu, set **Color** to **Attribute**. The 3D Viewport updates to display your color attribute on your object. - - Blender's Viewport Shading dropdown menu with the dropdown arrow and Color settings highlighted. - -1. Select a color for your brush. - - 1. In **Vertex Paint** mode, navigate to the top left-hand corner, then click on the active color swatch. A contextual menu displays. - 1. Select your color on the color wheel, or with a RGB, HSV, or Hex code. - - Blender's active swatch UI highlighted. - -1. Apply color to your object. - 1. To apply color to individual vertices: - 1. In the **3D Viewport**, click and drag over your object's vertices to apply your color with a smooth gradient. - 1. For further precision, press [ or ] to increase or decrease the brush size, respectively. - 1. To flood fill your color, - 1. In **Edit** mode, select the vertices or faces that you want to apply your color. - 1. In **Vertex Paint** mode, press CtrlX/⌘X. Your selected vertices or faces display the new color. - - -For more information on this process, see Blender's official [Vertex Paint](https://docs.blender.org/manual/en/latest/sculpt_paint/vertex_paint/index.html) documentation. - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/blender-configurations.md b/.cursor/rules/roblox/en-us/art/characters/creating/blender-configurations.md deleted file mode 100644 index 74965fe1..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/blender-configurations.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Blender configuration -description: Roblox avatar template projects have several helper configurations and settings to help expedite the character creation process. -next: /art/characters/creating/modeling-best-practices -prev: /art/characters/creating/head-objects ---- - -The Blender project files of each template include additional helper configurations that are not included in the raw `.fbx` template files. If you intend on using Blender for your character creation process, it's important to understand the additions included in the `.blend` versions of the template and what they do. - -### Hierarchy - -The following is a breakdown of what is included in each Blender template file: - - -
    -- **Cage**: Contains the character's 15 outer body cage meshes. -- **Joints**: The parent armature object that includes the following objects: - - The **bones** that make up the character's rigging armature. - - The **_Geo** mesh objects that make up the avatar appearance. - - The **_Att** attachment objects that define where accessories attach when equipped. - - The **animation data** for saving facial animation data and poses. -- **Fill** and **Sun**: These objects are used to provide lighting, allowing you to preview your characters in a neutral lighting similar to a Studio baseplate. These are not part of the avatar character. -
    - -
    Head-Related Meshes
    Blender Project Hierarchy
    -
    - -### Disabled objects - -When using the template project files for Blender, you might notice some objects, like attachment objects, are permanently hidden in the Viewport even when toggling the **Hide In Viewport** icon . Since attachment objects are often not modified until the end of the character creation process, these objects have **Disable In Viewport** enabled to make the organization of your project more efficient, especially when bulk toggling object visibility. - -If you need access to disabled objects, use the following instructions to access the **Disable In Viewport** toggle: - -1. In your Outliner, click the **Filter** dropdown. - - - -2. Enable the **Disable In Viewport** filter. - - - -3. The **Disable In Viewport** icon now appears next to every object in the Outliner. Toggle the icon to change the Disabled status for your objects. - - -### Custom skin tones - -The Blender project files include a shader configuration that allows you to preview custom skin tones, similar to how they display in Roblox if users customize their skin tones. - -Textures with full or partial transparency allow the underlying `Class.Part.Color` to reveal through the applied texture, enabling a user to personalize their avatar character with custom skin tones. - - -
    A texture map example that uses low opacity to reveal underlying skin color and full opacity to apply a fully-opaque color to the undergarments, eyebrows, mouth, and eyes.
    - -
    The same avatar character using the same texture map. Each model has different underlying part colors except where the texture map applies a full color.
    -
    - -#### Preview skin tones - - -You must use **Blender 3.4+** to ensure that the helper shader configurations render correctly. If you are using a previous version of Blender, textures may not render as expected. - - -The Blender project file includes shader configurations that allow you to preview custom skin tones similar to how they appear in Studio. These custom colors do not export with the model, but can provide you a quick visual reference for how a custom skin color and texture might look in Roblox. - -For this Blender shader configuration, keep in mind the following requirements: - -- You must switch to **Viewport Shading** mode for textures to render as expected. - -- When swapping out textures, the normal map's colorspace reverts to **SRGB** instead of **NonColor**. If this occurs, you might need to change it back in order for the normal map to render correctly. - -To preview your character's skin tone in Blender: - -1. In **Layout**, select any geometry object, such as **Head_Geo**. -2. Go to the **Shading** tab. -3. In the Node panel, ensure **Object** is selected. -4. Find the **PartColor** node that is attached to the **Mix** node. -5. Pick a color and value on the node to apply a reference custom skin tone. - - -#### Export setup - -While the skin tone preview is a critical element to verifying your templates color and tone compatibility in Roblox, it prevents your color texture map from automatically being packaged with the final `.fbx` file. There are two ways to resolve this before exporting your model: - -1. In the Shading tab, disconnect the **Mix** node and replace it with the **ColorMap** node. -2. Export your textures manually as separate image files and add them later in Studio. - -For instructions on how to perform either export workflow, see [Export textures](../../../art/characters/creating/export-textures.md). - -### Scene scale - - -You can skip this section if you are using the Blender downloadable templates. The `.blend` versions of the templates which already contain many of the project settings required when setting up a Blender project configuration. - - -When creating Roblox assets in a modeling application, it's important to ensure your `.fbx` exports scale correctly. The `.fbx` file type scales objects by `100`, meaning that you have to modify your working scale by `.01`. The template files already apply this scaling. - -There are two ways to perform this scaling. You can modify your scene scale properties in your project with the following steps: - -1. In the **Properties** window, navigate to the **Scene Properties** tab. - -2. In the Units section, change the **Unit Scale** to `0.01` and the **Length** to **Centimeters**. - -Alternatively, you can modify your scaling when exporting your files: - -1. Navigate to **File** > **Export** > **FBX (.fbx)**. -2. Set **Transform** > **Scale** to `.01`. - - -### Animation range - - -You can skip this section if you are using the Blender downloadable templates. The `.blend` versions of the templates which already contain many of the project settings required when setting up a Blender project configuration. - - -For custom characters with facial animation, ensure that the timeline range is set between 0 and 330: - -1. In the top right of the Animation Panel, click and set **Start** to `0`. -2. In the top right of the Animation Panel, click and set **End** to `330`. - - - - -After you change your project settings, you can set these as your default Blender project settings by navigating to **File** > **Defaults** > **Save Startup File**. - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/caging.md b/.cursor/rules/roblox/en-us/art/characters/creating/caging.md deleted file mode 100644 index 93eef9f0..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/caging.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -title: Caging character head -description: Cage your avatar characters in Blender to support layerable accessories and clothing. -next: /art/characters/creating/combine-head-geometry -prev: /art/characters/creating/texturing-pbr ---- - -**Caging** is the process of updating the [cage mesh component](../../../art/characters/index.md#cage-meshes) of your avatar character. To allow your character to correctly wear layered clothing and accessories, you must update the default template cage mesh object to match the sculpting changes you made to your custom character. - -Since this tutorial only applies modeling changes to the head, the caging instructions below only apply to the **Head_OuterCage** object. If you make geometry changes to other parts of the character, you must also adjust those specific **\_OuterCage** objects to match your sculpting changes. - - -Do not delete any vertices or faces of the provided cages. Destructive modification of the cages can cause import issues and prevent the character model from equipping clothing and cosmetics. - - - -
    Default head cage mesh no longer fits over sculpted head
    - -
    Head cage mesh after adjustment
    -
    - - -If your character body shape incorporates many changes with different body parts, it may be more efficient to use the [Blender Cage Template](../../../assets/modeling/meshes/reference-files/Body_Cage_Templates.zip). This Blender project file includes a helper full-body `std_cage_deformable` mesh to automatically apply vertex changes to the individual body-part cages at the same time. - - -To begin caging your character: - -1. Starting from the Layout Tab, hide everything in the Outliner except the **Head_OuterCage** and the **Head_Geo** objects. - - - - -2. With the **Head_OuterCage** selected, navigate to **Object Properties** > **Viewport Display** and set the **Display As** to **Wire**. Toggle this setting back to **Solid** when you are finished. - -3. Click on the **Head_OuterCage** object and switch to **Edit Mode**. -4. Enable **X-Axis symmetry** and **Topology Mirror** to ensure you are making symmetrical vertex changes to your cage. - - - -5. Switch to **Edit Mode**. -6. Using the **Grab tool** (G), click and grab parts of the cage mesh and align it to fit tightly over the goblin head mesh. Keep the following in mind: - - 1. **Never delete any of the cage vertices.** Missing vertices can cause errors and issues with equipping clothing accessories. - 2. If editing the base of your head cage, ensure that the base of the Head cage aligns with the top of the UpperTorso cage. - 3. In different Select modes, hold Shift and click multiple vertices/edges/faces to select and edit the geometry. - 4. You can verify a tight fit by grabbing vertices and moving them into the Head_Geo mesh to check where the meshes intersect and moving the cage vertices until the cage mesh just covers the head mesh. - - - - 5. Toggle visibility on your different mesh objects to improve visibility and access to vertices. - 6. After the wireframe is tightly fitted over the head mesh, set the **Display As** back to **Solid** and spot check and fix any intersecting vertices. - - -Your final product should feature a cage mesh that sits directly over the head mesh without any of the Head_Geo geometry intersecting through the solid sections of the cage. - - - - -For a comparison reference, you can download [this version of the tutorial project with caging completed](../../../assets/art/reference-files/checkpoint/3_Goblin-caged.blend). - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/combine-head-geometry.md b/.cursor/rules/roblox/en-us/art/characters/creating/combine-head-geometry.md deleted file mode 100644 index 0138bd83..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/combine-head-geometry.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Combine head geometry -description: When creating characters in Blender, you must combine the head geometry to a single object. -next: /art/characters/creating/remove-extra-bones -prev: /art/characters/creating/caging ---- - -Whenever you are ready to export your model, it's important to clean up your project to ensure that your model is ready to export. This includes the following tasks that ensure the customized template model and all of the avatar components can import into Studio successfully: - -- Combining extra head geometry -- Removing extra head bones -- Verifying attachment points -- Final technical checks - - -Failure to combine head geometry and [remove head bones](../../characters/creating/remove-extra-bones.md) will cause issues with validation, as the character will no longer adhere to the expected R15 geometry and joint hierarchy. - - -## Combine head geometry - -At this point, you should also combine the separate head and face objects within the single Head_Geo object. Some templates don't include some face objects, like lashes. To combine the head and face meshes: - -1. In the Outliner, hold Ctrl/⌘ and click following objects, ending with the Head_Geo: - - 1. UpperTeeth_Geo - 2. LowerTeeth_Geo - 3. Tongue_Geo - 4. RightLash_Geo - 5. RightEye_Geo - 6. LeftLash_Geo - 7. LeftEye_Geo - 8. Head_Geo - - - - - When selecting multiple head objects, make sure that the **Head_Geo** is highlighted as yellow, indicating it as the main object that the others merge into. This correctly preserves the custom properties stored in the head mesh. You can achieve this by selecting the head last in the Outliner. - - -2. While in Object mode, right-click in the Viewport and select **Join**. The objects combine as a single **Head_Geo**. - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/export-character.md b/.cursor/rules/roblox/en-us/art/characters/creating/export-character.md deleted file mode 100644 index 75bbd910..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/export-character.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: Export character model -description: Export your character model from Blender using the correct settings and processes. -prev: /art/characters/creating/export-textures ---- - - -It's important to test your assets multiple times at every point of the asset creation process, whether it is within Blender or after importing into Studio. See [Test characters](../../../art/characters/testing/index.md) for more information. - - -Whether you are exporting your character for testing, or are performing a final export out of Blender, you must apply the appropriate export settings to ensure that Blender exports the proper character data. - -To export your character: - -1. In the topbar, click **File** > **Export** > **FBX (.fbx)**. The Blender file browser window displays. -2. Set **Path Mode** to **Copy** and enable the **Embed Textures** icon. -3. In the Include section, enable **Custom Properties**. -4. Expand the Armature section and uncheck **Add Leaf Bones**. -5. Enable **Bake Animation**. -6. Expand Bake Animation and **uncheck NLA Strips**, **All Actions**, and **Force Start/End Keyframes**. -7. In Bake Animation, set **Simplify** to **0.0**. -8. Click the **Export FBX** button. Save the `.fbx` to the directory of your choice. - - - - -After exporting your .fbx file, see [Test characters](../../../art/characters/testing/index.md) for steps on importing your character model into a test place and verifying your avatar and related components. - - - -After importing the `Class.Model` character to Studio, you can now perform the following with this asset: - -- [Upload the character](../../../art/accessories/creating-rigid/publishing.md) to the Marketplace. -- Use the humanoid character on an existing experience by applying a [HumanoidDescription](../../../characters/appearance.md#manually-modify-appearance)to the `Class.Model` object. -- Save the asset to your [Toolbox](../../../projects/assets/toolbox.md) to share or use within any of your experiences. - - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/export-textures.md b/.cursor/rules/roblox/en-us/art/characters/creating/export-textures.md deleted file mode 100644 index 0970ecff..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/export-textures.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Export textures -description: Export your character textures from Blender using the correct settings and processes. -next: /art/characters/creating/export-character -prev: /art/characters/creating/final-checks ---- - - -It's important to test your assets multiple times at every point of the asset creation process, whether it is within Blender or after importing into Studio. See [Test characters](../../../art/characters/testing/index.md) for more information. - - -Whether you are exporting your character for testing, or are performing a final export out of Blender, you must apply the appropriate export settings to ensure that Blender exports the proper character data. - -## Export textures - -Including the default PBR textures, your template character includes four separate image maps that make up its surface appearance. Depending on your workflow, you can choose to embed the image maps to your export file or export the textures separately as image files. Both methods have advantages: - -- [Embedding textures](#embed-textures) simplifies your export by packing all of your textures within the single `.fbx` file. -- [Exporting texture images](#export-textures) directly allows you direct access to the image textures, so you can test and swap them more quickly. - -### Embed textures - -Embedding the texture maps to your `.fbx` export can simplify the Blender export and Studio import process. When embedding your textures with Roblox's template files, you need to make a quick adjustment to custom skin tone shader nodes in the Blender file. - - -
    Default node configuration: Mix node connected to Base Color
    -
    Exportable node configuration: Color node connected directly to Base Color
    -
    - -To prepare your textures to embed with export: - -1. In Object mode, select any part of the character. -2. Navigate to the **Shading** tab. -3. Ensure the **Type of Data** dropdown is set to **Object**. - - -4. Find the node that connects to the **Principled BSDF's Base Color**. - -5. Click and drag the line from **Base Color** to disconnect the node. - -6. Find the **file26** node with the color texture map and click and drag the **Color** to **Principled BSDF's color** node. - - - -### Unpack image files - -As an alternative to embedding textures, you can export your texture files as separate `.png` image files, which allows you to quickly access and swap image texture maps. - -To export your texture image files: - -1. Navigate to **File** > **External Data** > **Unpack Resources**. -2. Select **Use files in current directory** to save in the same directory as your project. Blender exports your image files to a textures directory in your project's parent directory. - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/final-checks.md b/.cursor/rules/roblox/en-us/art/characters/creating/final-checks.md deleted file mode 100644 index a720a239..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/final-checks.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Final checks -description: Before exporting, verify that your model meets Studio's requirements. -next: /art/characters/creating/export-textures -prev: /art/characters/creating/verify-attachments ---- - -Depending on the types of customizations you made to your template project or model, the following are additional tasks to look out for when cleaning up your project: - -- Ensure that your project doesn't contain additional mesh objects that aren't part of your character model geometry. -- Verify that there isn't additional animation data, such as additional keyframes or saved poses and orientations that are not related to the original facial animation data. -- Double-check that your geometry, rig, and texture adhere to the [avatar technical specifications](../../../art/characters/specifications.md). diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/head-objects.md b/.cursor/rules/roblox/en-us/art/characters/creating/head-objects.md deleted file mode 100644 index 1fd19954..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/head-objects.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Template head structure -description: Each Roblox avatar template contains modular separate pieces that must later be combined or removed. -next: /art/characters/creating/blender-configurations -prev: /art/characters/creating/template-files ---- - -In each template file, each avatar body includes extra head mesh objects and face armature bones. Separating these objects within the templates allow you to make easier changes to each of these separate objects, as demonstrated during the texturing step. - -To avoid validation errors, you must [join](../../../art/characters/creating/combine-head-geometry.md) and [remove](../../../art/characters/creating/remove-extra-bones.md) these extra objects during the cleanup process prior to exporting. - -The extra head mesh objects are the following: - - -
    - - Head_Geo - - UpperTeeth_Geo - - LowerTeeth_Geo - - Tongue_Geo - - RightLash_Geo - - RightEye_Geo - - LeftLash_Geo - - LeftEye_Geo -
    - -
    Head-Related Meshes
    Extra head-related meshes in Blender's Outliner
    -
    - -

    - -The extra head bone children are the following and may differ between templates: - - - -

    - - Tongue - - LowerTeeth - - UpperTeeth - - LeftEye - - RightEye -
    - -
    Head-Related Meshes
    Extra head-related bones in Blender's Outliner
    - - -While these extra objects exist to aid the creation and modification process, leaving them in your project on final export will cause validation issues when uploading these assets to the Marketplace. diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/index.md b/.cursor/rules/roblox/en-us/art/characters/creating/index.md deleted file mode 100644 index 72ac1f95..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/index.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Create with templates -description: Use Roblox's supplied template models to create your own unique avatar character in Blender. -next: /art/characters/creating/template-files ---- - -You can create your own custom avatar character using Blender and one of Roblox's downloadable template models. Using templates can save you a lot of time by skipping the complex processes of setting up your armature, rigging, skinning, and configuring your character for face animations. - -This tutorial is intended for creators of all skill levels with moderate Blender experience to create a unique character by: - -1. Selecting a base template that include time-saving Blender configurations. -2. Modeling using non-destructive sculpting workflows -3. Texturing using Blender's texture paint tools -4. Caging an asset by editing the template's cage mesh objects -5. Cleaning and prepping the project for export -6. Exporting your asset for use or testing in Studio - - -
    Starting template model
    - -
    Example model after modifications
    -
    - - -This guide uses [Blender 3.4+](https://www.blender.org/download/releases/3-4/) as a practical example for customizing a character template. Before you begin, you should have a basic knowledge using Blender's interface, tools, and viewing controls. - -If you are using another program, you can still apply the general workflow of this tutorial with your program's similar tools. - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/modeling-best-practices.md b/.cursor/rules/roblox/en-us/art/characters/creating/modeling-best-practices.md deleted file mode 100644 index 1427a696..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/modeling-best-practices.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -title: Modeling best practices -description: Understand important modeling concepts to prevent major issues before any modeling steps. -next: /art/characters/creating/modeling-tips -prev: /art/characters/creating/blender-configurations ---- - -Modeling, sometimes known as **sculpting**, is the process of shaping the geometry of your model or mesh. This guide covers important concepts and tips you should review before creating your own unique character shape. - -By understanding how to make non-destructive sculpting changes to the head, the character part that contains the most complex components, you can continue to apply these techniques and concepts to other parts of the character model body. - - -
    Starting template model
    - -
    Model after custom sculpting
    -
    - - -When editing templates, **don't delete or add vertices to your character body**. This ensures that your character's skinning and facial animation data remains unaltered and fully functional. - - -## Non-destructive modeling - -Non-destructive modeling means using a process that doesn't alter the physical shape or construction of the base mesh object. When modifying a template model, don't use tools or functions that delete or add vertices to your meshes. Instead, use Blender's sculpting tools to alter the shape of your character by **only changing the position of existing vertices**. This ensures that vertices and faces that have skinning or animation data associated with them retain that important character data. - - -Extreme geometric changes, even if the vertices are not deleted, can still adversely affect your rigging and skinning. It's important to choose a starting template file close to your final design and to make consistent and proportional changes when sculpting. - - -## Edge flow - -Edge flow is a common modeling concept of ensuring that the vertices of your model naturally follow the organic curvature of your model's shape. When making changes to your model's topography, you should maintain a natural edge flow by ensuring that your vertices remain a proportionate distance from each other and follow the common muscle groups and contours of your model. - -Even when maintaining edge flow, you should avoid sculpting certain regions of the character model. The following are examples of important sections of the face that follow a natural edge flow and should be kept in a similar shape: - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Round head regionEdge flow notes
    - - - - - - - **Forehead Wrinkles and Nasolabial Edges**: The edge lines for the forehead wrinkles and nasolabial edges are vital for various expressions involving the mouth, forehead furrowing, eyebrow movement and cheeks. If you modify these sections of your topography, ensure that you retain the original shape whenever possible, and that they maintain a similar relative relationship to each other.
    - - - - - - - **Mouth and Lip Edges**: The topography surrounding the lips and mouth have circular mesh structures for the mouth to open and close. This structure can fold the mesh to shape the lips to naturally visualize *a*, *e*, *i*, *o*, and *u* vowel sounds. The neutral shape is a closed mouth, and the edge flows around the mouth in a continuous line to accurately fold and deform the expected mouth shapes.

    In this tutorial, we don't recommend modifying this area of the facial topography because of the risk of adversely affecting the underlying tongue, upper and lower jaw, and saved facial data. You can use a sculpting mask to ensure that this area is not affected by any modeling changes.
    - - - - - - - **Eyes**: The eyelids have enough mesh lines on the eyelids to close the eyes. The continuous lines on the eyelids enable the eyelids to deform and fold as expected when blinking or widening.

    In this tutorial, it isn't recommended to modify this area of the facial topography because of the risk of adversely affecting the underlying eyeball meshes and saved facial data that contribute to accurate expressions. You can use a sculpting mask to ensure that this area is not affected by any modeling changes.
    - - - - - - - **Eyelids and Eyebrows**: The eyelids and eyebrows require adequate space between the two regions.

    If modifying the topography above the eyes, keep in mind that the eyelids and eyebrows require a natural space between the two regions. Both the eyelids and eyebrows can shift and change positions with various facial expressions and, if improperly modeled, can clash into each other during a facial pose.
    - -Not following edge flow concepts can result in the topology of your model conflicting with each other during animations, sometimes known as crashing. - -
    -
    In this example, the top of the eyelid and bottom eyelid travel past each other when closing causing jagged artifacts where the vertices collide and crash.
    -
    - -By carefully sculpting your template mesh, you can avoid having to correct these topology collisions later, which can often require manually correcting rig, skinning, and/or facial animation data. diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/modeling-tips.md b/.cursor/rules/roblox/en-us/art/characters/creating/modeling-tips.md deleted file mode 100644 index 94e83c23..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/modeling-tips.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Modeling tips -description: Use these Blender modeling tips to expedite your character creation. -next: /art/characters/creating/sculpting -prev: /art/characters/creating/modeling-best-practices ---- - -There are many tips and tricks during the modeling process that can save you time and prevent major issues in your workflow. There are many resources online that can help you make your modeling process more efficient. The following are various beginner-friendly tips and settings in Blender that allow you to visualize and configure objects efficiently in your project. - -### Hide inactive objects - -In your Outliner, hide objects you aren't editing by enabling the **Hide In Viewport** icon . This cleans up your workspace and helps ensure you don't make unintentional changes to another object or collection. - -You can quickly bulk hide and unhide any parent and child objects that are not [disabled](../../../art/characters/creating/index.md#disabled-objects). To bulk hide objects: - -1. In the Outliner, navigate to a parent object, such as **Cage** or **Joints**. -2. Hold Shift and click the **Hide In Viewport** icon to toggle the object's visibility. - -### Enable wireframe view - -Whenever you use a modeling application, switch between different viewport options, like X-Ray and Wireframe, to gain a better perspective on your vertices and shapes. This tutorial uses a wireframe view over the mesh shape, and many examples use various material settings and viewport options. - -Enable wireframes on your material view by setting the following: - -1. Select the **Head_Geo**. -2. In the **Properties** panel, navigate to **Object Properties** . -3. In Viewport Display, enable **Wireframe**. diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/remove-extra-bones.md b/.cursor/rules/roblox/en-us/art/characters/creating/remove-extra-bones.md deleted file mode 100644 index f45a8b8a..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/remove-extra-bones.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: Remove extra bones -description: When creating characters in Blender, you must remove the extra head bones included in the template. -next: /art/characters/creating/verify-attachments -prev: /art/characters/creating/combine-head-geometry ---- - -The helper bones used to help place the head geometries also require removal to validate correctly. While these extra bones do not include any skinning data, do not delete any of the facial animation bones parented within DynamicHead, as these include important skinning data that drives facial animation. - - -Failure to [combine head geometry](../../characters/creating/combine-head-geometry.md) and remove head bones will cause issues with validation, as the character will no longer adhere to the expected R15 geometry and joint hierarchy. - - -Remove the additional head bones by selecting them and deleting them in edit mode: - -1. If required, toggle visibility on your **Armature** object. The bones display in the viewport. -2. In the Outliner, expand the character's armature object and find the **Joints** object that parents the bone structure of the character. - - - -3. Expand the Joints hierarchy by holding **shift** and clicking the expansion dropdown. -4. In the viewport, select any bone and switch to **Edit Mode**. - -5. Under the Head joint, hold **shift** and select all the head children joints except DynamicHead. -6. With the extra head bones selected, right click in the viewport and select **Delete Selected Bones**. - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/sculpting.md b/.cursor/rules/roblox/en-us/art/characters/creating/sculpting.md deleted file mode 100644 index a6b43008..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/sculpting.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Sculpt the head -description: Use Blender's sculpting tools to make unique changes to the shape of your character. -next: /art/characters/creating/texturing-setup -prev: /art/characters/creating/modeling-tips ---- - -After reviewing the modeling best-practices and sculpting tips, you can begin sculpting your character. This tutorial demonstrates sculpting changes to the [RoundMale template](../../../assets/art/reference-files/RoundMale.zip), creating a goblin-like character. - -The sculpting instructions utilize the following Sculpting tools: - -- **Grab** - Selects and pulls a group of vertices. -- **Smooth** - Eliminates irregularities in the area of the brush's influence. -- **Flatten** - Averages out the vertices within the brush's influence on a common plane. -- **Elastic Deform** - Similar to Grab, but adds an organic stretch and elasticity to the neighboring vertices. - - -You can use Blender's other sculpting tools, though it's important to use a tool that aligns with the [Non-Destructive Modeling](./modeling-best-practices.md#non-destructive-modeling) concepts to preserve the vertices of the model. - - -To begin sculpting the head: - -1. With the template project opened, hide the other Geo objects to isolate the head mesh. -2. Select the **Head_Geo** mesh object and switch to **Sculpting** mode. -3. At the top right of the viewport, set the following options: - 1. Enable **X-Axis Symmetry**. - 2. Enable **Wireframe** view. - -4. Using the **Mask** tool, paint over the mouth and eyes where you do not want to sculpt unexpectedly. - -5. With the **Grab** and **Smooth** tools, make the following edits to your template head: - - 1. Reshape the head, flattening and enlarging the top. - - 2. Elongate the ears. - - 1. Expand the surface near the ear to broaden the base - 2. Grab and extend each ear, ensuring it connects smoothly to the base and vertices remain proportionally spaced when possible. - 3. Try the Flatten tool to straighten and align a region. - 4. Use the Elastic Deform tool to stretch and pull multiple vertices. - - - 3. Extend the bridge of the nose and expand the size of the brow - - - 4. Broaden the chin so it prominently protrudes. - - -6. Perform a refinement pass to add final details, polish, and accentuate your main features, such as: - - Adding details in the outer and inner ears - - Adding more detail to chin and cheeks - - Improving edge lines and spacing in areas with crowded vertices - - - -For a comparison reference, you can download [this version of the tutorial project with sculpting completed](../../../assets/art/reference-files/checkpoint/1_Goblin-sculpted.blend). - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/template-files.md b/.cursor/rules/roblox/en-us/art/characters/creating/template-files.md deleted file mode 100644 index e2eefb1b..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/template-files.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -title: Template files -description: Roblox provides template models to create your own unique avatar character in Blender. -next: /art/characters/creating/head-objects -prev: /art/characters/creating/ ---- - -Each template comes pre-baked with the [necessary components of an avatar character](../../../art/characters/index.md#components-of-an-avatar) to save you time and effort in creating a custom avatar character. When creating characters from scratch, these individual components typically take a lot of time and a deep technical background in your modeling application. Templates allow you to skip several steps and work from a variety of base character shapes. - - - - - - - - - - - - - - - - - - - - - -
    Template prototypeSample customizations
    -
    Muzzle head template
    -
    - -
    -
    -
    Round head template
    -
    - -
    -
    - -You can choose from a variety of templates that best match your final design and save time on creating the technical components. The examples in the template tutorials utilize the [Round Blender template](../../../assets/art/reference-files/RoundMale.zip). Experiment with other templates to create your own unique character and final result. - -Each `.zip` contains a `.blend`, `.fbx`, and PBR texture `.png` files for that template model. If using Blender or following the [template creation guides](../../../art/characters/creating/index.md), use the `.blend` project. - - - - -
    Round
    -
    -

    - Female: RoundFemale.zip
    - Male: RoundMale.zip -
    -
    - -
    Square
    -
    -

    - Female: SquareFemale.zip
    - Male: SquareMale.zip -
    -
    - -
    Muzzle
    -
    -

    - Female: MuzzleFemale.zip
    - Male: MuzzleMale.zip -
    -
    -
    - - -
    Realistic
    -
    - Female: SemiRealisticFemale.zip
    - Male: SemiRealisticMale.zip -
    -
    -
    - - -
    Anime
    -
    - Female: AnimeFemale.zip
    - Male: AnimeMale.zip -
    -
    -
    - - -
    Stylized
    -
    - Single body: Stylized.zip -
    -
    -
    - - -
    Caricature
    -
    - Single body: Caricature.zip -
    -
    -
    -
    - -After downloading your template file, review the [unique head object structure](../../../art/characters/creating/head-objects.md) and [additional Blender settings](../../../art/characters/creating/blender-configurations.md) that require adjustment before exporting. It's crucial to understand these concepts prior to committing to any alterations as these can conflict with Roblox's avatar requirements if not addressed. diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/texturing-eyes.md b/.cursor/rules/roblox/en-us/art/characters/creating/texturing-eyes.md deleted file mode 100644 index 20677092..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/texturing-eyes.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Texturing eyes -description: Use Blender's texture painting tools to apply a custom surface appearance on your character's eyes. -next: /art/characters/creating/texturing-face -prev: /art/characters/creating/texturing-setup ---- - -You can apply a fully opaque texture to the eyes to achieve a more non-human visual effect for your character. Before editing the eye textures, join the two eye objects to texture them both at the same time. Then texture paint the entire eye, starting with the outer eye, moving to the inner eye, and finishing with the pupil. - -To texture your eye mesh objects: - -1. Increase the texture image resolution. -2. In the Outliner, toggle the **Hide in Viewport** option for the **Head_Geo**, **LowerTeeth_Geo**, **Tongue_Geo**, and **UpperTeeth_Geo**. Leave the eye mesh objects visible. - -3. In Object Mode, hold Shift and click on both the **LeftEye_Geo** and the **RightEye_Geo**. Then right-click and select **Join** (CtrlJ; ⌘J) to join the objects. The two objects merge using the name of the last object selected. - -4. Switch to **Texture Paint** mode. -5. With the Draw tool active, set the following brush settings for the outer eye shadow: - - 1. In Brush Settings, set **Radius** to **50px** and **Strength** to **1.0**. - 2. In Color Picker, select **black**. - - - -6. In the Texture Paint **3D view window**, completely paint the eye objects black. This serves as the basis for the outer-eye shadow. - -7. With the Draw tool active, set the following brush settings for the outer eye shadow: - - 1. In Brush Settings, set **Radius** to **75px** and **Strength** to **1.0**. - 2. In Color Picker, select a **deep yellow**. - - - -8. In the Texture Paint **2D view window**, line up your cursor to the center of the UV map that corresponds to the eye texture. Click 4-6 times on the center of each eye to create an outer eye color over the base shadow. - - -9. For visibility, enable Head_Geo visibility and reorient the camera to a front-facing view. -10. Paint the inner eye color using the following suggestions: - - 1. Click the **X Symmetry** button to enable symmetry. Toggle this off if creating asymmetrical assets. - - - - 2. In the Overlay view options, **enable Wireframe geometry view**. You can toggle this overlay off when spot checking your visual elements. - - - - - 3. Update your brush settings for the inner eye: - - 1. In Brush Settings, set **Radius** to **5px**. You can quickly change this radius as you paint by holding F. - 2. In Color Picker, select a strong **red** shade for the inner eye. - - - - - - 4. Periodically make the head mesh visible to ensure your eye texture works with the rest of the model. - -11. Update your brush settings for the pupil: - - 1. In Brush Settings, set Radius to **5px**. You can quickly change this radius as you paint by holding F. - 2. In Color Picker, select a bright **red** shade for the pupils. - - - -12. Using the Brush tool, paint the pupils of your model. - -13. After completing your texture painting, switch back to **Edit Mode**. -14. Shift click both of your eye objects, and press P and select **By Loose Parts** to separate the two meshes. -15. Rename your remaining mesh to the original **RightEye_Geo** or **LeftEye_Geo** name. - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/texturing-face.md b/.cursor/rules/roblox/en-us/art/characters/creating/texturing-face.md deleted file mode 100644 index 1ab1f7cc..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/texturing-face.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -title: Texturing face -description: Use Blender to apply a custom surface appearance on your character's face. -next: /art/characters/creating/texturing-pbr -prev: /art/characters/creating/texturing-eyes ---- - -After texturing the eyes, you can begin texturing the face. The concepts are similar to texturing the eyes, though you only use an opaque texture to ensure that the custom skin tone can remain visible. - -To texture the face: - -1. In the Texture Paint tab, resize your texture resolution to **2048** or **4098**: - 1. In the left Paint window, select **Image** > **Resize**. - 2. Set the texture size to **2048 x 2048**. -2. In the Tool sidebar, update your brush settings for the facial features. - - 1. In Brush Settings, start with the following Brush recommendations: - - 1. **Radius** to **5px**. You can change this radius as you paint. - 2. **Strength** to **0.300**. Modify this value when applicable. - 3. In Symmetry, enable **X Axis Mirroring**. - - - - 2. In Color Picker, select a neutral **dark** shade for the shadows. - -3. Apply texture to your character's face features, such as the nostrils, wrinkles, ears, and chin. Keep in mind that the painted textures will look softer and blended with the surface once the texture resolution is resized. - - -4. When complete, resize your texture resolution back to **1024 x 1024**: - 1. In the left Paint window, select **Image** > **Resize**. - 2. Set the texture size back to **1024 x 1024**. - - -Your final result should include various facial textures that help accentuate the features of your character and work well with any custom skin tone. Try exploring various amounts of texturing and the types of surfaces you could expect on skin, such as wrinkles, scars, or dirt/grunge. You should also verify your textures between several skin tones to ensure that your texturing looks acceptable with various skin types. - - -
    Default Green
    - -
    Pink
    - -
    Blue
    - -
    - - -For a comparison reference, you can download [this version of the tutorial project with texturing completed](../../../assets/art/reference-files/checkpoint/2_Goblin-textured.blend). - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/texturing-pbr.md b/.cursor/rules/roblox/en-us/art/characters/creating/texturing-pbr.md deleted file mode 100644 index 41e07c4d..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/texturing-pbr.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -title: PBR textures (optional) -description: PBR textures are high-definition texture maps that can elevate your custom characters. -next: /art/characters/creating/caging -prev: /art/characters/creating/texturing-face ---- - -Physically-based rendering (PBR) textures use multiple texture maps to define how a surface reacts under different lighting and environmental conditions. PBR textures can elevate the look and feel of your assets, including your avatar, accessories, and clothing. Typically, PBR textures are created in a texturing tool, such as [Substance 3D](https://www.adobe.com/products/substance3d-painter) or [ZBrush](https://www.maxon.net/en/zbrush). Many third-party 3D models available online include PBR textures. - - -
    Characters and accessories can make use of PBR textures to apply visual pop and material realism.
    - -
    PBR textures allow for virtually any type of material surface, such as leather and denim.
    -
    - -Although each template includes PBR textures, for the purpose of demonstrating the basic texturing process within Blender, this tutorial doesn't cover the PBR texturing process. For more information and references on advanced texturing, see [PBR textures](../../../art/modeling/surface-appearance.md). diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/texturing-setup.md b/.cursor/rules/roblox/en-us/art/characters/creating/texturing-setup.md deleted file mode 100644 index 1993c2a1..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/texturing-setup.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: Texturing setup -description: Set up Blender to optimize your project for texturing the eyes and face of your template. -next: /art/characters/creating/texturing-eyes -prev: /art/characters/creating/sculpting ---- - -**Texturing** is the process of customizing the color, tone, and shading of your model's surface. Custom meshes and models use a 2D image, known as a texture map, to project various surface appearance elements onto your 3D object. - - -
    Model after custom sculpting
    - -
    Model after texturing
    -
    - -Each template comes with a color texture map, which you can alter and modify using Blender's texture editing tools. Since most Roblox avatars can take advantage of custom skin tones, it's important to understand how to [preview custom skin tones](../../../art/characters/creating/index.md#preview-skin-tones) in Blender to verify how your final asset will look in a Roblox experience. - -For the purpose of demonstrating the basic texturing process, this tutorial goes over basic texture painting setup, applies a completely opaque texture over parts of the character eyes, and partially opaque details over the face. You can apply these same techniques to other parts of your character geometry. - - -When texturing parts of your character model's body, ensure that your character model includes a modesty layer over sensitive regions. See [Community Standards](../../../marketplace/marketplace-policy.md) for more information on Roblox's policies. - - -## Set texture resolution - -Roblox Studio supports a texture resolution of **1024 x 1024** for albedo texture maps. When using applications like Blender or Maya to texture paint directly on a model, extremely fine details may not paint as expected due to the resolution and level of detail of the painting. - - -
    Texture painting at 1024 x 1024 resolution
    - -
    Texture painting at 2048 x 2048 resolution
    -
    - -When adding fine details to your texture, increase the image resolution of your texture map temporarily to **2048 x 2048** or **4096 x 4096**. After completing your texturing, change the image resolution back to **1024 x 1024** to bake in the changes. - -To change your texture image resolution: - -1. Starting from Layout mode, select the **Head_Geo**. -2. Switch to **Texture Paint** mode. -3. In the left Paint window, select **Image** > **Resize**. -4. Set the texture size: - 1. Use **2048** or **4096** for a higher res for detailed texture work. - 2. Use **1024** for the default Roblox-supported resolution. - diff --git a/.cursor/rules/roblox/en-us/art/characters/creating/verify-attachments.md b/.cursor/rules/roblox/en-us/art/characters/creating/verify-attachments.md deleted file mode 100644 index f290d2f8..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/creating/verify-attachments.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Verify attachment placement -description: When creating characters in Blender, the character model requires minor attachment adjustments to be Studio-ready. -next: /art/characters/creating/final-checks -prev: /art/characters/creating/remove-extra-bones ---- - -Attachment points are non-rendered objects of your avatar where rigid accessories attach to. Each template includes the required attachments at their expected locations ending with **\_Att**. Before exporting, it's important to verify the attachment position and, if necessary, adjust the location if you made any changes to the shape of your model. - - -
    Original template attachment positions
    - -
    Attachments after adjustment
    -
    - -Center attachment points at their respective locations. Each attachment should overlap approximately halfway with the character's mesh. - -This tutorial only changes the head of your model, so you only need to adjust the **Hat**, **Hair** and **FaceFront** attachments. To enable visibility and verify your head attachment point: - -1. If you haven't already, enable [disabled objects](../../../art/characters/creating/index.md#disabled-objects) in your Outliner. -2. In the Outliner, find the Joints parent object. -3. Hold Shift and click the **Hide** icon for the Joints object to hide everything. -4. Expand the Joints object and un-hide the Head_Geo and Hat_Att and Hair_Att. - 1. If required, disable **Disable In Viewport** next to the \_Att objects. -5. Toggle Visibility for the **Hat_Att**, **Hair_Att**, and **FaceFront_Att**. -6. Verify the placement of the attachments. The goblin's head is shorter than the starting template, so the attachments require minor vertical adjustment. -7. Select the attachments -8. Switch to **Edit** Mode. -9. Using the Grab tool, position the attachments vertically along the y-axis until they are about halfway embedded in the head. - diff --git a/.cursor/rules/roblox/en-us/art/characters/export-avatar-animations-from-maya.md b/.cursor/rules/roblox/en-us/art/characters/export-avatar-animations-from-maya.md deleted file mode 100644 index d1ba6740..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/export-avatar-animations-from-maya.md +++ /dev/null @@ -1,152 +0,0 @@ ---- -title: Export avatar animations from Maya -description: Explains the process for exporting avatar animations from Maya. ---- - -**Avatar animations** are animations that you can create and assign to play for any avatar action, such as walking, swimming, or dancing. In addition to using the [Animation Editor](../../animation/editor.md) or [Animation Capture](../../animation/capture.md) tools within Studio, you can create avatar animations through third-party modeling and animation tools like [Maya](https://www.autodesk.com/products/maya/overview), then import your avatar animations directly into Studio to apply to any avatar with Roblox. By using this guide as a checklist of the specific settings your rig and animation must meet for the export process, you can ensure that your animations import successfully. - - -
    - A humanoid mannequin in Maya with IK controls. -
    R15 mannequin reference
    -
    -
    - -
    Example walking animation
    -
    -
    - - - This guide uses a downloadable [R15-Mannequin-Rig.ma](../../assets/animation/exporting-avatar-animations-from-maya/R15-Mannequin-Rig.ma) file that contains an R15 mannequin that you can use as a reference to create and export animations. If you choose to animate on your own R15 rig, the same rig configuration and export settings apply. - - -## Configure the rig - -Before you export your avatar animation from Maya, you must configure your rig to be compatible with Studio's import requirements, including making sure that the rig follows a specific hierarchy and naming conventions so that Studio is able to recognize the file as an avatar animation, and that the rig's translation channel is muted so that the root node doesn't move with the animation. - -### Hierarchy and naming conventions - -Studio requires a specific hierarchy and naming conventions for a humanoid rig's internal joint structure so that it can recognize what you're importing as an avatar animation. If you aren't using the downloadable R15 mannequin reference rig to create your animations, make sure your rig uses the following joint hierarchy and naming convention exactly as it is: - -- Root -- HumanoidRootPart -- LowerTorso -- UpperTorso -- Head (representing the base of the neck) -- LeftUpperArm -- LeftLowerArm -- LeftHand -- RightUpperArm -- RightLowerArm -- RightHand -- LeftUpperLeg -- LeftLowerLeg -- LeftFoot -- RightUpperLeg -- RightLowerLeg -- RightFoot - -### Mute the translation channel - -Roblox avatar animations cannot move a character when they play; instead, avatar animations animate rigs at their world position. If your avatar animation is a locomotion-type of animation where the root node moves in space, such as a character that moves forward as their walk animation plays, you must mute the rig's translation channel so that the animation plays without moving the rig on export. - -To mute the translation channel: - -1. Open the **Graph Editor**. - - 1. In the menu bar, click **Windows**. A contextual menu displays. - 1. Hover over **Workspaces**, then click **Animation**. The **Graph Editor** displays. - - A close up view of the Windows dropdown menu in Maya. The Workspaces menu item is highlighted, as well as the Animation submenu. - -1. Move the **Time Marker** to frame 0. - - A close up view of the Graph Editor in Maya. The Time marker for a character's right hand is at frame 0, and is highlighted. - -1. In the **Outliner**, select the root node. If you are using the reference file, this is **TSM3_root**. -1. In the **Channel Box**, right-click on the **Translate Z** value. A contextual menu displays. -1. Select **Mute Selected**. The Translate Z value's channel box color changes to orange to confirm that it's muted. - - -
    - A close up view of the Channel Box in Maya. The Mute Selected menu item in the contextual menu from step 4 is highlighted. -
    -
    - A close up view of the Channel Box in Maya. The Translate Z property channel box color is orange to signify it is muted. The rest of the values are in cyan blue to signify that they remain unmuted. -
    -
    - -When you play the animation, the character's root node doesn't move in space anymore, and the character animates in place at the origin of the scene. - -## Export the animation - -Now that your rig animates in place and has a hierarchy and naming data that is compatible with Studio, you can export the animation into a `.fbx` format. Maya doesn't load this capability by default, so you need to enable an FBX plugin to gain the additional settings necessary to export the file in a format Studio can recognize. - -To export your avatar animation from Maya: - -1. Install the FBX plugin. - - 1. In the menu bar, click **Windows**. A contextual menu displays. - 1. Hover over **Settings/Preferences**, then click **Plug-in Manager**. The **Plug-in Manager** window displays. - - A close up view of the Windows dropdown menu in Maya. The Settings/Preferences menu item is highlighted, as well as the Plug-in Manager submenu. - - 1. In the search field, input **fbxmaya**. The **fbxmaya.mll** plugin displays. - 1. Enable the **Loaded** and **Auto load** options. - - The Plug-in Manager with a close up view of the fbxmaya file. Its Loaded and Auto load settings are highlighted. - -1. In the menu bar, click **File**. A contextual menu displays. -1. Select **Export All**. The **Export All** window displays. - - A close up view of the File dropdown menu in Maya. The Export All menu item is highlighted. - -1. At the bottom of the window, - - 1. In the **File name** field, input a name for your avatar animation. - 1. Click the **Files of Type** dropdown menu, then select **FBX export**. The **Options pane** updates its settings. - -1. In the **Options** pane, click the **Animation** dropdown for additional animation settings, then in the **Bake Animation** section, - - 1. Enable **Bake Animation**. - 1. Verify that the **Start** and **End** fields correlate to the frames you want to export for your animation loop. - 1. Set **Step** to **1**. - - A close up view of the Options pane. The Bake Animation settings are highlighted. - -1. Click the **Advanced Options** dropdown for additional export settings, then in the **FBX File Format** section, - - 1. Set **Type** to **Binary**. - 1. If required, set **Version** to **FBX 2020**. - - A close up view of the Options pane. The FBX File Format settings are highlighted. - -1. In the bottom right corner, click the **Export All** button. After a moment, the avatar animation `.fbx` file displays in your file browser. - -## Test the animation in Studio - -Once you have your avatar animation `.fbx` file, you can test it within Studio to make sure that the animation plays without any errors. - -To test the animation in Studio: - -1. Open a pre-built character rig. - - 1. From the toolbar's **Avatar** tab, click **Character**. - 1. Select any rig you want to use as a test. The rig displays within the viewport. - -1. Connect the rig to the **Animation Editor**. - - 1. From the toolbar's **Avatar** tab, click **Animation**. The [Animation Editor](../../animation/editor.md) window displays. - 1. In the viewport, click your rig. A dialog displays in the editor. - 1. In the **Animation Name** field, enter a new animation name, then click the **Create** button. The editor window displays the media and playback controls, timeline, and track list. - -1. Import your avatar animation into the rig. - - 1. Navigate to the **Media and Playback Controls** and click the **⋯** button. A contextual menu displays. - 1. Hover over **Import**, then select **From FBX Animation**. A file browser displays. - - A close up view of the Animation Editor window. The ellipsis contextual menu displays, and the From FBX Animation submenu item is highlighted. - - 1. Select the FBX animation you just exported from Maya, then click **Open**. The animation's keyframes load into the **Animation Editor**. - -1. Navigate to the **Media and Playback Controls** and click the **Play button** to play the avatar animation. diff --git a/.cursor/rules/roblox/en-us/art/characters/export-settings.md b/.cursor/rules/roblox/en-us/art/characters/export-settings.md deleted file mode 100644 index 800e2c61..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/export-settings.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Character body export settings -description: Use the appropriate export settings in Maya and Blender to generate Studio-ready .fbx files. ---- - - -It's important to test your assets multiple times at every point of the asset creation process, whether it is within your modeling application or after importing into Studio. See [Test characters](../../art/characters/testing/index.md) for more information. - - -Export your model as a `.fbx` or `.gltf` to take advantage of all of Studio's 3D import features. When rigging or skinning a layerable model, these file types contains all the mesh and texture data, including the rig and influence data, you need to later [import](../../art/modeling/3d-importer.md) into Studio. - -Check that your model meets Roblox's [avatar character specifications](../../art/characters/specifications.md) before exporting to ensure Studio compatibility. - - -If creating other types of 3D models: -
      -
    • For generic meshes, see [general mesh specifications](../modeling/specifications.md) and [general export settings](../modeling/export-requirements.md).

    • -
    • For rigid accessories, see [accessory specifications](../accessories/specifications.md) and [accessory export settings](../accessories/export-settings.md).

    • -
    • For layered accessories, see [layered accessory specifications](../accessories/clothing-specifications.md) and [layered export settings](../accessories/clothing-export-settings.md).

    • -
    -
    - - -If you are using Roblox's avatar template files, you must perform the [cleanup steps](../../art/characters/creating/combine-head-geometry.md) in order for the assets to properly validate. - - -## Before exporting - -Before exporting, ensure that you are only exporting the Roblox supported objects related to your model. If you have any modifiers to your mesh or project objects, make sure to apply or delete them before export. - -Use the following guidance before exporting: - -- While your mesh objects must be parented within an armature object, you can also parent your outer cage objects to a single empty object to simplify your workspace. - - Screenshot of a Blender project Outliner with parent objects collapsed. - -- In the cage parent object, ensure you have an [outer cage](../characters/specifications.md#outer-cages) for each of your 15 body parts with appropriate naming affix. - - Screenshot of the 15 outer cage meshes that you must include with a character export. - -- In the armature object, ensure that you include the all [15 mesh objects](../characters/specifications.md#body-parts) and [19 attachments](../characters/specifications.md#attachments) with the appropriate naming affix. - - Screenshot of 15 child objects parented within an Armature object. - - -For more information on supported modeling objects and proper configuration, see [Character specifications](../characters/specifications.md). - - -- When exporting characters with animation or FACS animation, ensure that your animation timeline **Start** and **End** include the entire range of your animations. - -Zoom-in of Blender animation track indicating a Start value of 0 and End value of 308. - -## Blender - -Blender allows you to export in `.fbx` or `.gltf` as well as other formats. If you are using `.fbx` export, familiarize yourself with [Blender's FBX scaling](../blender.md#adjust-scale-fbx) to ensure that you successfully import the model into Studio at the correct scale. - -### Export settings - -1. In the topbar, click **File** > **Export** > **FBX (.fbx)**. The Blender file browser window displays. -2. Set **Path Mode** to **Copy** and enable the **Embed Textures** icon. -3. In the Include section, enable **Custom Properties**. -4. If your project doesn't already have `.01` scene unit scaling, set the **Transform** > **Apply Scalings** to `FBX Unit Scale`. For more details, see [Blender FBX scaling](../blender.md#adjust-scale-fbx). -5. Expand the Armature section and uncheck **Add Leaf Bones**. -6. Enable **Bake Animation**. -7. Expand Bake Animation and **uncheck NLA Strips**, **All Actions**, and **Force Start/End Keyframes**. - 1. Ensure your project animation timeline has the correct **Start** and **End** range of all your keyframes. -8. In Bake Animation, set **Simplify** to **0.0**. -9. Click the **Export FBX** button. Save the `.fbx` to the directory of your choice. - -Screenshot of Blender export settings - -## Maya export settings - -To export a mesh in Maya as a `.fbx` file: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export All**. The **Export All** window displays. -3. Near the bottom of the window, click the **Files of type** dropdown, then select **FBX export**. -4. On the right-hand side of the window, navigate to the **Options...** section. -5. In the **Geometry** section, enable **Smooth Mesh** and **Referenced Asset Content**. -6. In the **Animation** section, enable **Animation**. Avatar characters with [facial animation data](../../art/characters/facial-animation/index.md) require animation data. -7. Enable **Bake Animation**. -8. If you need to import textures as a `.png`, in the **Embed Media** section, enable **Embed Media**. -9. In the **Advanced Options** section, - - Navigate to **Units**, then enable **Automatic**. - - Navigate to **Axis Conversion**, then set the **Up Axis** property to **Y**. -10. Click the **Export All** button. - - Screenshot of Maya export settings for exports with animation. - -11. After exporting, use Studio's [3D importer](../../art/modeling/3d-importer.md) to import your model. See [Test characters in Studio](../../art/characters/testing/studio.md) for additional importing and testing information. - - -After importing the `Class.Model` character to Studio, you can now perform the following with this asset: - -- [Test your character model](../../art/characters/testing/index.md) in Studio using various tools and workflows. -- [Upload the character](../../art/accessories/creating-rigid/publishing.md) to the Marketplace. -- Use the humanoid character on an existing experience by applying a [HumanoidDescription](../../characters/appearance.md#manually-modify-appearance)to the `Class.Model` object. -- Save the asset to your [Toolbox](../../projects/assets/toolbox.md) to share or use within any of your experiences. - - diff --git a/.cursor/rules/roblox/en-us/art/characters/face-caging-best-practices.md b/.cursor/rules/roblox/en-us/art/characters/face-caging-best-practices.md deleted file mode 100644 index 66905821..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/face-caging-best-practices.md +++ /dev/null @@ -1,190 +0,0 @@ ---- -title: Face caging best practices -description: Tips on optimizing face cages for your avatars. ---- - - -The following information applies to character creators who are looking to improve or resolve errors with their character head cages. This improves compatibility with Marketplace items, such as accessories and makeup. - - -A character's head cage helps define the surface of the 3D model. The cage also plays an important role in Marketplace [head validation](../art/characters/head-specifications.md#facial-landmarks), so it's important properly construct cages to ensure accurate fitting with head accessories and animations. - -The following information and examples are best practices that are applicable to face caging as well as other caging processes. For additional best practices for caging, see [clothing caging best practices](../art/accessories/caging-best-practices.md). - -## General - - -
    -
    Realistic face model reference
    -
    -
    -
    Realistic face model caging reference
    -
    -
    - -### Equidistant geometry - -Try to keep geometry equidistant whenever possible. This helps mitigate texture and layered clothing distortion. Keep in mind that this isn't always possible. - - -
    -
    -
    - -### Vertex colored areas - -The template file includes vertex colors in the cages at important areas. Lining up vertex colored areas to the lips, eyebrows, and hairline areas help ensure quality makeup transfer and additionally any hair, facial hair, eyebrows, or eyelash accessories. - - -
    -
    - -### Important non-vertex colored areas - -Line up areas that aren't as obviously defined to the nose, eyes, and ear areas to correctly ensure quality makeup transfer and any hair, facial hair, eyebrows and eyelash accessory fit. - - -
    -
    - -### Middle axis at origin - -Try to keep it at origin if possible. This just keeps some consistency in the middle. - -
    - -### Line up neck cage part - -Cage parts need to line up to the render mesh objects. This doesn't have to be exact but should be close. This ensures that HSR (Hidden Surface Removal) can accurately hide the underlying surface when layered accessories are worn on top. - -Not something you have to worry about if using auto-setup, but may help with troubleshooting issues near the neck. Keep in mind that HSR is disabled on the head, but not on the body where the neck attaches. - - -
    -
    - -### Cage should barely cover render mesh - -The cage needs to be close to the render mesh without actually intersecting it. Because the cage is a different topology and lower resolution than your render mesh, this can be difficult. This helps with the fit of layered accessories and with the accuracy of the makeup transfer. - - -
    -
    - -## Eyes - -### Establish the inner and outer eye - -You should have three verts for the upper eyelid and three verts for the lower eyelid, and they should be equidistant from each other. - -
    - -### Enclose the cage - -When applicable enclose the open edge of the eye section right up to the eye mesh. - -
    - -## Eyebrows - -It's a little easier to visualize the eyebrow shape using the vertex color provided in the template. Once you've established the head and tail of the eyebrow, you should place the three upper and lower verts equidistant from each other. - - - -### Establish the head and tail - -It's a little easier to visualize the eyebrow shape because of the vertex color. Once you've established the head and tail of the eyebrow, you should place the three upper and lower verts equidistant from each other. - -
    - -### Missing eyebrows - -For missing eyebrows, it's important to rely on basic rules of facial proportions to figure out the placement. Take in account of stylization and face shape to account for how to shape them. - -
    - -### Layered clothing eyebrows - -For layered eyebrows try to match up the vertex colored area as best as possible to the shape of the eyebrow. - -
    - -### Textured eyebrows - -Similar rule to layered eyebrows, try to match up the vertex colored area as best as possible to the shape of the eyebrow. Equipable eyebrows should fit right on top. - -
    - -## Mouth - -Outline the outside and inside of the lips. Green vertex color should be on the upper lip, and purple on the lower lip with an equidistant spacing. - -
    - -## Nose - -The bridge of the nose starts at the inner part of the eyes and ends two faces above the lips. Try to keep this generally in the area of where the nose should be. - -
    - -## Ears - -Establish the top of the ear with the triangle portion of the ear, the bottom with the quad. Keep the shape of the hair line around the ear. - - -
    -
    - -## Hairline - -Establish from eyebrows the forehead shape and hairline. -
    - -If working with sideburns, define the shape of the sideburns in front and around the ears and consider where the hairline should end at the base of the neck. This will help determine how layered hair accessories fits to the head. - - -
    -
    - -## Caging examples of other facial types - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - -## Missing features - -For faces that are missing major facial features, use the following guidance. These tips may not always applicable, but they provide a good framework to understand how to cage faces with missing features. - -- The face is divided horizontally into three equal parts - - Hairline to eyebrows - - Eyebrows to the bottom of the nose - - Bottom of the nose to the bottom of the chin. -- Eyes are halfway down the head -- Space between eyes is approximately eye width -- The head is about five eyes wide -- Tear ducts of the eyes line up with the edges of the nostrils -- The corners of the mouth and pupils of the eyes are aligned -- The bottom of the ears lines up With the bottom of the nose - - diff --git a/.cursor/rules/roblox/en-us/art/characters/facial-animation/animate-heads.md b/.cursor/rules/roblox/en-us/art/characters/facial-animation/animate-heads.md deleted file mode 100644 index b5f3c682..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/facial-animation/animate-heads.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: Animate heads -description: You can create facial animations for a character with live heads using the Animation Editor. ---- - - -If you are looking to quickly test a character's head animation, use the [Avatar Setup tool](../../../avatar-setup/index.md) to load your character and use the presets to preview various facial animations and head accessories. - - -You can use the [Animation Editor](../../../animation/editor.md) to animate supported heads in the following ways: - -- You can manually set values to each facial pose on separate [animation tracks](#use-animation-tracks). -- You can use the [Face Animation Editor](#use-the-face-animation-editor) to access facial sliders that let you quickly create and save unique expressions on the timeline. -- You can use the [Animation Capture for Faces](../../../animation/capture.md#face) extension to automatically track and record facial movements with a webcam that converts your movement into keyframes on the timeline. - -In all methods, creating and combining multiple facial expressions over a duration of time results in a face animation. Since you cannot import face animations, these methods are the only ways to create and utilize them. - -After you create and publish a head that supports facial animation to Roblox, you can play the animation from a script or replace a character's default animation with your new animation. These animations can make your characters feel more expressive and full of life, such as playing a silly expression when a character walks, or an annoyed expression when a character is idle. - -A view of Studio where the Face Animation Editor, Animation Editor, and viewport are visible. The viewport shows a close up view of a blocky male avatar blinking with his left eye. - -## Create animations - -After you have [opened](../../../animation/editor.md#open-the-animation-editor) the **Animation Editor** and selected the character model with a head you want to create an animation for, you can either create a head animation by using animation tracks or the **Face Animation Editor**. - -For details on using Animation Capture to track facial movement as keyframes, see [Animation Capture - Face](../../../animation/capture.md#face). - -### Use animation tracks - -Similar to inserting other objects like `Class.MeshPart|MeshParts` or `Class.Bone|Bones` as animation tracks, you can manually add one FACS value at a time to the track list to manipulate a single body part, such as the character's eyes, jaw, or tongue. The [Animation Editor](../../../animation/editor.md) represents FACS values as a percentage between 0 and 1, and these values map directly to `Class.FaceControls` values. While this process provides precise control over individual values, the [Face Animation Editor](#use-the-face-animation-editor) enhances this workflow and lets you quickly change values to multiple facial features at once on the animation timeline. - -To create an animation by inserting individual FACS values: - -1. In the **track list** of the **Animation Editor**, click the **plus icon**. A contextual menu displays additional tracks you can add to the track list. -2. Hover over **Brows**, **Eyes**, **Jaw**, **Mouth**, or **Tongue**. A contextual menu displays all mapped FACS poses for that region of the face. - - A close up view of the Animation Editor with the contextual menu and its submenu expanded. The plus icon is highlighted to signify how to open the contextual menu. - -3. Select a FACS pose. An animation track for that FACS pose displays in the track list. -4. In the values input, enter a number between **0** and **1** to manipulate the body part into a new position. For example, if you change `LeftEyeClosed` to 1, the character's left eye closes. - - A close up view of the track list in the Animation Editor. The values input is highlighted. - -### Use the Face Animation Editor - -The **Face Animation Editor** is an intuitive, visual way to automatically create keyframes as you adjust **sliders** to achieve your desired facial expression. For example, when you drag the thumb of the `LeftEyeClosed` slider all the way down, the character's left eye closes and a new animation track for `LeftEyeClosed` displays with a value of `1` within the track list. - - - -Some sliders affect multiple FACS values in the same region depending on the value of the slider you are adjusting. For example, when you adjust the thumb of the `LeftEyeClosed` slider all the way up to have a value of `0`, a new animation track for `LeftEyeUpperLidRaiser` displays in the track list with a value of `1`. This allows you to manipulate the eye from closed to open, while also raising the upper lid of the eye, all within a single slider. - -You can set multiple sliders to create a complete face expression, then create multiple expressions at different frames of the timeline to create complex animations. For example, you can combine `LeftEyeClosed` and `RightEyeClosed` together to have the character slowly blink, or `LeftLipCornerPuller` or `RightLipCornerPuller` for a smile on one side of the face. - -When you click and drag the thumb of the drag box between the eyes, you can control the direction the character's eyes look at. This creates several FACS property tracks in the track list depending on how you adjust the eyes. - -At the bottom-left of the panel, the **Face Animation Editor** also includes the following controls: - - - - - - - - - - - - - - - - - - - - - - -
    ControlDescription
    Symmetry ToggleLets you use a slider on one side of the face to also adjust the corresponding slider on the other side of the face to the same value. This is useful to create symmetric facial expressions, such as a full smile.
    Focus Face ToggleFocuses the viewport on the face of the avatar without having to manually adjust the camera. This is useful when your camera is either far away from the avatar you want to animate, or if you are navigating from animating one avatar to another.
    Reset All ButtonResets all FACS pose values at your current frame position back to their default value of 0. This is useful when you want to quickly reanimate a single frame.
    - -To create an animation for your head using the **Face Animation Editor**: - -1. In the **track list** of the **Animation Editor**, click the **Face** button. The **Face Animation Editor** displays to the left of the track list. - - A close up view of the track list in the Animation Editor. The Face button is highlighted. - -2. In the **Face Animation Editor**, adjust sliders for the body parts you want to manipulate. Animation tracks for each facial part you manipulate automatically display in the track list along with keyframes for your current position in the timeline. The character's face also updates in the viewport. - - - To undo a step on a slider, press CtrlZ (⌘Z). - - To redo a step on a slider, press CtrlY (⌘Y). - - To reset a slider to its default value, right click on the slider. A contextual menu displays. Select **Reset Selected**. - -3. (Optional) Adjust the scrubber to a new position further along the timeline, then navigate back to the **Face Animation Editor** and adjust sliders to create a new facial expression. When you play the animation, the first facial expression will ease into the second facial expression. -4. When you are finished creating your animation, navigate to the **Media and Playback Controls** and click the **…** button. A pop-up menu displays. -5. Select **Save** or **Save As** to save the animation. The animation displays in the **Explorer** window as a child of the **AnimSaves** object (itself a child of the rig). - -## Export animations - -When you export a head that supports animation to Studio, it becomes available for use in all of your experiences. This means that you only need to create a head animation once, then you can reuse it as many times for as many characters as you want as long as the character has an [animatable head](../../../art/characters/facial-animation/use-heads-in-studio.md). - -You can export head animations using the same workflow outlined for [exporting animations](../../../animation/editor.md#export-an-animation). - -## Script animations - -Once you have created an animation, you need to use a script to play it in your experience. Like generic animations, you can either play animations for heads manually from your scripts or automatically by replacing default animations for player characters. For more information, see [Use animations](../../../animation/using.md). diff --git a/.cursor/rules/roblox/en-us/art/characters/facial-animation/create-basic-heads.md b/.cursor/rules/roblox/en-us/art/characters/facial-animation/create-basic-heads.md deleted file mode 100644 index 8097d475..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/facial-animation/create-basic-heads.md +++ /dev/null @@ -1,463 +0,0 @@ ---- -title: Create basic heads -description: The process of creating a basic animatable head in Blender. ---- - - - This guide covers advanced topics. Before you begin, you should have prior knowledge on modeling, UV mapping, rigging, animation, and how to set up a character in [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). - - -You can create or modify an existing model to support animated heads in a third-party modeling software, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). When creating a head, your character model must meet the following requirements: - -- The model follows standard [modeling requirements](#modeling-requirements), and includes head geometry, such as eyes, a mouth, and teeth. -- The model's head must include a [rig](#rigging), or internal bone structure. These bones drive the various deformation of vertices to create facial expressions. You can create a [control system](#add-controls) to simplify the posing process. -- The model has facial poses [saved to the animation timeline](#pose) and [mapped to the head mesh](#map). Typical animatable heads include [50 standard base poses](../../../art/characters/facial-animation/facs-poses-reference.md) that allow for a diverse range of expressions. - -To meet these requirements, you can apply the steps in this guide when designing and posing your own head. This guide covers the basic processes of adding facial bones, posing, and mapping 5 basic FACS poses in Blender on a simplified reference character (Cubie), then exporting the model. - - - For reference, this guide uses Blender version 3.0. If you are using another version of Blender, there might be minor differences in UI and settings. - - -## Reference files - -The following are head reference files, including all example files from this guide: - - -The reference character model provided is meant for educational purposes and does not meet the avatar character [technical specifications](../../../art/characters/specifications.md) for general use. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Reference filesDescription
    [Cubie-Model-Only.blend](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Model-Only.blend)A Blender project file containing a R15 Cubie character model without facial data.
    [Cubie-Eye-Bones-Skinned.blend](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Bones-Skinned.blend)A Blender project file containing the example Cubie character model with skinned eye bones without posing or mapping data.
    [Cubie-Eye-Poses-Mapped.blend](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Poses-Mapped.blend)A Blender project file containing the Cubie character model with the 5 example poses saved and mapped.
    [Cubie-Complete.fbx](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx)A Cubie character model with a fully rigged face and over 50 poses saved and mapped. You can import this file into Studio, or open the file in your preferred 3D modeling software.
    Cubie-Texture_ALB.pngA Cubie texture image file. After you import the Cubie model into Studio, you can add this file as the head part's TextureID.
    [Cubie-Complete.ma](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.ma)A Cubie Maya project provided as additional reference.
    - -## Modeling requirements - -Many character models already include a head with distinct facial features, but they might require minor modeling adjustments for head compatibility. When modeling a character with a head, ensure the head mesh meets the [Avatar character specifications](../../../art/characters/specifications.md) for Studio import, as well as the following requirements: - -- **Face parts** - Ensure that you include distinct face features, such as eyes, upper teeth, lower teeth, and a tongue. -- **Lip vertices** - If you want your character to use its mouth, separate the lip vertices so that the mouth can open. -- **Inner components** - If your character has inner mouth components, such as a tongue and teeth, model a mouth bag within the head mesh to contain these features. If your character uses eye sockets, model a similar eye bag to contain these features. -- **No extra data** - Ensure that all children face parts of the Head_Geo don't contain history or frozen transformations. -- **Outer cage** - Make sure the character model has an outer cage to support face accessories and layered clothing. For more information, see [Cage Mesh Requirements](../../../art/characters/specifications.md#inner-and-outer-cages). - -You can follow along the rest of this head creation process using a [rigged Cubie character](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Model-Only.blend) that meets these modeling requirements. This version doesn't include any facial rigging or pose data so you can use it as reference in this guide. - -## Rigging - -Your character must have an internal bone structure to drive the vertices of the face geometry and make facial poses. Unlike [rigging a humanoid model](../../../art/modeling/rig-a-humanoid-model.md), Studio doesn't require a specific bone hierarchy for a head. However, in order for the facial rig to work properly, the rig must include a [RootFaceJoint](#rootfacejoint) bone and [additional face bones](#face-bones). - -### RootFaceJoint - -The **RootFaceJoint** is a bone that is parented under the standard R15 head bone. This root bone must parent all other face bones. In Blender, you can quickly add a bone by **extruding** a child bone from the head bone and then map the bone name as a property in the Head_Geo mesh. The RootFaceJoint bone object is commonly named "DynamicHead" in the reference templates and examples, but you can use any name as long as you [map the root bone](#map) in custom properties. - -To add a RootFaceJoint bone: - -1. In Blender, open the **Cubie-Model-Only.blend** project. - - -2. Click on any bones to select the armature, then switch to **Edit Mode**. -3. In the **Outliner**, click on the **Head** bone. -4. In the **Viewport**, press E and drag your mouse up to extrude an additional child bone from the **Head** bone. -5. In the **Outliner**, rename this bone **DynamicHead**. You will reference this bone by name later in the [mapping](#map) section. - - - - - You must map the RootFaceJoint so Studio can properly locate that joint and hide all of the children joints and their bones within the `Class.FaceControls` instance on import. - - -### Face bones - -Face bones drive the bending and deformation of the face geometry. Each poseable face feature of your head typically requires at least one bone. Complex features, such as eyes and mouth, might require several bones to make certain poses possible. - -The rigging and skinning process depends on the character model and differs between tools and modelers. It's important to plan out the full range of facial poses your character requires to avoid additional adjustments to your head bones later. - -The following instructions describe a basic process of [adding face bones](#add-face-bones) and [skinning](#skin-face-bones), or applying influences, to the reference model's **eyes** and **eyelids**. You can continue to apply this technique to the rest of the facial features that need articulation, such as the character's mouth, cheeks, and jaw. After adding your bones and applying influences, you can create [controls](#add-controls) that can help make the next posing process more efficient. - - - You can download a [reference Cubie model](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx) with a completed rig with 30+ facial bones added and skinned. You can use this for a reference for unique bone placements not covered in this guide, such as cheeks, lips, and jaws. - - See [Use heads in Studio](../../../art/characters/facial-animation/use-heads-in-studio.md) for download links of more complex characters. - - -#### Add face bones - -The specific head bones your character requires depend on the poses you intend for it to use. The following examples cover the process for adding 1 bone for each eye and 4 bones for the eyelids to allow for blinking, winking, and gaze direction. - -When creating a face rig, use less than 50 face bones where possible and keep the bones organized and specific for their associated facial features. In general, high numbers of vertices and joints can impact your experience's performance. - -##### Eyes - -Each eye requires one bone each, though you might opt to create a controller bone later that can control both eyes at the same time. To ensure that you position your bones symmetrically, you can enable **X-Axis Mirror** in the top-right of the Viewport. This moves bones that share the same name with opposing suffixes along the X-axis. - -To add bones to the character eyes: - -1. In **Object Mode**, select the **armature** and switch to **Edit Mode**. -2. Click **Add**, then **Single Bone**. Do this twice. -3. Rename one bone **LeftEye**, and rename the other **RightEye**. - - - -4. Enable **X-Axis Mirror**. -5. Position the left or right bone centered at the model's eyes. -6. Adjust the bones horizontally and front-facing. A quick method for setting bones horizontally: - - 1. In the top right of the **Viewport**, extend the **Tool Panel** to the **Transform** section. - 2. With the bones selected, copy the **Head Y** location to the **Tail Y** location. - 3. Set the **Tail Z** to **0.2** centimeters. This sets the Tail Z coordinates 0.2 centimeters offset from the Head Z coordinates. - - - -7. Hold Shift and click both **Eye** bones. -8. While still holding Shift, click the **Face** bone. -9. Right-click in the viewport. A contextual menu displays. -10. Select **Parent**, **Make**, then **With Offset**. - - - -##### Eyelids - -When adding bones, you can quickly create bones parented under the Face bone by selecting existing facial bones and duplicating them. This automatically creates bones parented under the Face bone. - -To add bones to the character eyelids: - -1. In **Edit Mode**, hold Shift and click both **eye bones** to select them. -2. Press ShiftD and click to duplicate the bones in the same position. Do this four times to create 8 total new bones. -3. With **X-Axis mirror enabled**, position each bone at the corners of the eyes. - - - -4. In the **Outliner**, rename all bones to reflect their specific position. Use the following names: - - 1. LeftUpperOuterEyelid - 2. RightUpperOuterEyelid - 3. LeftLowerOuterEyelid - 4. RightLowerOuterEyelid - 5. LeftUpperInnerEyelid - 6. RightUpperInnerEyelid - 7. LeftLowerInnerEyelid - 8. RightLowerInnerEyelid - - - -#### Skin face bones - -You can apply [skinning](../../../art/modeling/rigging.md) to a character rig using several methods. The following example uses Blender's **Weight Paint** mode to paint which vertices a single bone can control. Skinning is typically a time consuming step for complex characters and a background in skinning and facial posing is recommended. - -When applying detailed or shared influences for complex models, it's recommended to enable [Auto Normalize](../../../art/modeling/skin-a-simple-mesh.md#auto-normalize) to prevent influence conflicts between bones. - - - When parenting bones to the character using Automatic Weights, some of your vertices might already have influences applied. Always test your influences to make sure influence assignments are correct. - - -##### Eyes - -Both eyes in the example project require full influences on the pupil within the eye geometry. Depending on the design of the eyes, you might need to adjust influences to create realistic eye poses. - -To add influence to the LeftEye: - -1. In **Object Mode**, click the head mesh, then hold Shift and click any bone to select the armature. -2. Switch to **Weight Paint Mode**. -3. Toggle to **X-Ray viewing mode** or **Material Preview Mode** to better visualize the vertices. -4. Hold Shift and click the **LeftEye** bone to select it. The name of the currently selected bone displays on the top left of the Viewport. -5. Paint influence on the vertices within the eye. For this example, ensure that the pupils are red, or fully influenced by the selected bone. - - - -6. Switch to **Object Mode**, then click on any bone to select the armature. -7. Switch to **Pose Mode** with the armature selected. -8. Test the influences of the eye bone by grabbing the bone and moving it. The mesh below should follow. - - - -9. Repeat these steps for the right eye. - - - -##### Eyelids - -Eyelid bones require their own separate influences. While the example poses only manipulate the top eyelids, being able to control the bottom corners of the eyelids is important for other poses, such as `LeftCheekRaiser` and `RightCheekRaiser`. - -To add influence to the left eyelid: - -1. In **Object Mode**, click the head mesh, then hold Shift and click any bone. -2. Switch to **Weight Paint Mode**. -3. Switch to **X-Ray viewing mode** or **Material Preview Mode** to better visualize the vertices. -4. Paint influences on the closest vertices to the bone. -5. When complete, hold Shift and click another bone to begin applying influences to the closest vertices. Perform this step for each eyelid bone. - - - -6. Switch to **Object Mode**, select the character mesh, then switch to **Pose Mode** to test. - - - -You can download [a version of this project](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Bones-Skinned.blend) with the bones skinned up to this point as reference. - -#### Add controls - -Since creating heads requires saving several poses consecutively, while not required, controls can help you pose your bones quickly and effectively. You can create controls by adding external controller bones that influence the internal ones, making it easier to access and pose as well as reset to a neutral transformation. - -You can create controls in many different ways. The following example uses **Bone Constraints** and simple geometrical shapes included in the reference Blender project to quickly set up easy-to-access controller bones for the character's facial bones. For more information on rigging and constraints, see Blender's documentation for additional details on [character rigging](https://www.youtube.com/watch?v=-gIL6VZ-bkE) and [object constraints](https://www.youtube.com/watch?v=fx33sPEAZEk). - - - Some facial features, such as lips, jaws, and tongue, might require a single controller bone that controls several facial bones at once. See the complete reference file for an example of this type of implementation. - - -To start creating face bone controls: - -1. In **Object Mode**, select the Joints armature and press ShiftD to duplicate the Joints armature object. -2. Rename the new armature to **Controller**. -3. In **Edit Mode**, select all non-face bones, right click and select **Delete Selected Bones**. -4. Rename the bones to include **\_Con**, to denote them as controller bones. You can batch rename them with the following process: - 1. In the **Outliner**, hold Shift and click all the controller bones. - 2. Navigate to **Edit** > **Batch Rename**. A rename modal displays. - 3. Set to **Selected** and use the dropdown to set to **Bones**. - 4. Set **Type** to **Set Name**. - 5. Set **Method** to **Suffix**. - 6. In **Name**, add **\_Con**. - 7. Click the **OK** button. - -5. Switch to **Object Mode** and select the original **Joints armature** object. -6. Switch to **Pose Mode**. -7. Click on the original joint bones, such as **LeftEye**, then navigate to the **Bone Constraints Property Panel**. -8. Add **Copy Location** and **Copy Rotation**, then set each original bone's constraint to target their corresponding Controller Bone, such as **LeftEye_Con**. -9. In the **Copy Rotation** constraint, set the following properties: - 1. In **Axis**, disable the **X**, **Y**, and **Z**. - 2. In **Inverted Axis**, enable the **X**, **Y**, and **Z**. - 3. Set **Mix** to **Offset** (Legacy). - -10. Perform steps 7-9 for each facial bone that requires a controller. - -To create custom bone shapes for easier control bone access: - -1. Switch to **Object Mode** and select the **Controller** armature object. -2. Switch to **Pose Mode**. -3. Select a controller bone, such as **LeftEye_Con**. -4. Switch to the **Bones Properties** panel and expand the **Viewport Display** section. -5. Select one of the custom shapes included in the project. In the reference project, the shape objects share similar names to the face bones. -6. Set the **X** rotation to **-90**. Set any additional scaling if required. - - - -7. Perform steps 3-6 for all your controller bones. You can hide the original face bones at this point. -8. (Optional) Set up **Bone Groups** to assign colors to your controller bones: - - 1. Navigate to the **Object Data Properties** panel. - 2. Create a new bone group. - 3. Change **Color Set** to a color theme of your choice. - 4. Click **Assign** to assign the currently selected controller that color. You can perform this step in batches. - - - -9. Test your controllers in **Pose Mode**. - - - -## Pose - -**Posing** is the process of manipulating the bones of your head mesh into a specific position per animation frame. After the model's head has been rigged, you can begin the process of saving poses to the timeline. This data enables Studio to access each facial movement and animate or blend facial poses to create dynamic expressions. - -When posing the bones of your character's head mesh to new positions, follow the [Facial Action Coding System](../../../art/characters/facial-animation/facs-poses-reference.md) (FACS) as a reference for your facial expression poses. FACS is a comprehensive, anatomically-based system for describing all visually discernible facial movement, and it allows for all facial animations to be shareable between characters. This means that once you create a facial animation, you can reuse it for any character with an [animatable head](../../../art/characters/facial-animation/use-heads-in-studio.md) with a `Class.FaceControls` instance. - -Each frame within your modeling software's animation timeline can contain one unique FACS pose, so when you want to create multiple FACS poses, you must save each FACS pose to a different frame. You must also include a frame with your character having a neutral face with the face controllers and bones set to their default values. This ensures that Studio can calculate the bone position differences between your character's neutral expression and each FACS pose. For this reason, set Frame 0 as your character's neutral expression, and save FACS poses starting at Frame 1. - -The following image is an example of Blender's animation timeline with 5 frames. Frame 0 has the character's neutral expression, and frames 1-4 have FACS pose data. - - -There are [50 base poses](./facs-poses-reference.md) that you can use in Roblox to portray a wide range of face emotions for your characters. When you are deciding which poses you need, remember that FACS pose names are always based on the orientation of the character, not the camera. For example, `LeftEyeClosed` closes the character's left eye, which is to the right of the camera view. - - -If you intend to sell your character head to the Marketplace, you must include the minimum 17 base [FACS poses](./facs-poses-reference.md). - - -You might not require all 50 base poses for your character. For example, a simple robot that opens its mouth and blinks can just have `JawDrop`, `LeftEyeClosed`, and `RightEyeClosed`. Therefore, the more expressive you want your character to be, the more FACS poses you need to include in your animation timeline. It's recommended to save the base poses that you intend to use with your head in alphabetical order, then use any frames afterwards for [combination poses](#combination-poses). - -The following steps outline the process of posing 5 poses with the facial bones created in our reference, but you can apply these steps for any additional poses for a more expressive head. To pose your face bones in Blender: - -1. Ensure that the animation timeline playhead is set to the correct frame. - 1. If you are setting the character's **Neutral pose**, set it to **frame 0**. - 2. If you are posing `EyesLookLeft`, set it to **frame 1**. - 3. If you are posing `EyesLookRight`, set it to **frame 2**. - 4. If you are posing `LeftEyeClosed`, set it to **frame 3.** - 5. If you are posing `RightEyeClosed`, set it to **frame 4**. -2. In **Pose Mode**, set the pose to the maximum position you want your pose to realistically use: - 1. If you are setting the character's `Neutral` pose, set the face controllers and bones to their default values, - 2. If you are posing `EyesLookLeft`, select both eye controller bones and drag the eyes to the character's left. - 3. If you are posing `EyesLookRight`, select both eye controller bones and drag the eyes to the character's right. - 4. If you are posing `LeftEyeClosed`, select both eye controller bones and drag the left eyelids down to meet the bottom eyelids. - 5. If you are posing `RightEyeClosed`, select both eye controller bones and drag the right eyelids down to meet the bottom eyelids. -3. In the **Viewport**, press A to select all bones. -4. Right-click and select **Insert Keyframe** > **Location and Rotation**. This ensures that each frame contains the positional and rotational information for all bones. - - - -When all the poses are saved in your timeline, set the Start and End of the animation timeline to represent the number of frames with saved poses. Always set **Start** to **0** and, in this specific example, you can set the **End** to **4** if you are only mapping the 4 non-neutral example poses. - - - -### Combination poses - -You can combine 2-3 base FACS poses in a single animation frame to display complex facial expressions. However, when you combine FACS poses that control the **same** facial regions, the facial features might either collide or disfigure the character. - -For example, both `LeftEyeClosed` and `LeftCheekRaiser` control movement around the character's left eye: `LeftEyeClosed` closes the eye, and `LeftCheekRaiser` lifts the cheek up and pushes the lower eyelid up, causing a squint-like effect. When you combine both poses with one or more at 100% of their values, the lower eyelid collides with the upper eyelid: - - -
    - -
    Both FACS poses concurrently ease to 100% of their default values.
    -
    -
    - -
    LeftEyeClosed eases to 100% of its default value, and LeftCheekRaiser starts at 100%.
    -
    -
    - -
    LeftCheekRaiser eases to 100% of its default value, and LeftEyeClosed starts at 100%.
    -
    -
    - -A **combination pose**, or **corrective**, is the combination of 2-3 FACS poses that control the same facial features in a single animation frame with a **corrective difference from 100% of their default values**. By defining and mapping a combination pose to your head, you can correct how you want the two or more FACS poses to combine. For example, if you add a corrective for each of the previous use cases, the lower and upper eyelids make contact with each other without colliding: - - -
    - -
    Using a corrective pose, both FACS poses concurrently ease to 100% of their default values.
    -
    -
    - -
    LeftEyeClosed eases to 100% of its default value, and LeftCheekRaiser starts at 100%.
    -
    -
    - -
    LeftCheekRaiser eases to 100% of its default value, and LeftEyeClosed starts at 100%.
    -
    -
    - -On import, Studio calculates and stores the corrective difference for combination poses in the head's `Class.FaceControls` instance, and the `Class.FaceControls` instance corrects the base poses values as they combine in the [Animation Editor](../../../animation/editor.md). - -## Map - -After you finish posing each FACS pose that your character needs, you must map, or link, **each animation frame that you pose** to its corresponding FACS base or combination pose name. Mapping stores the bone positions and translations within the head `Class.MeshPart`, and when you begin to animate your head within the **Animation Editor**, the `Class.FaceControls` instance uses this stored data to transform your character's facial features to the applicable FACS pose. - - -If you intend to sell your character head to the Marketplace, you must include the minimum 17 base [FACS poses](./facs-poses-reference.md). - - -Aside from mapping each pose to its proper pose name, you also need to map the [RootFaceJoint](#rootfacejoint) so that Studio can properly locate that joint and hide all of the children joints and their bones within the `Class.FaceControls` instance on import. - - - If you are using Maya, you can map the RootFaceJoint and facial pose data using the **Extra Attributes** in a similar format as Blender's Custom Properties. To add attributes: - 1. Select the **Head_Geo** object and navigate to the Attribute Editor. - 2. Under the Attributes dropdown, select **Add Attributes...**. - - - - If you leave any empty strings, or try to import the head into Studio with multiple frames per FACS pose name, the head will fail the [import process](../../../art/characters/facial-animation/use-heads-in-studio.md#import-heads). - - -To map your saved poses and the RootFaceJoint: - -1. Switch to **Object Mode**. -2. Select the **Head_Geo mesh**. -3. In the **Object Properties** tab of the **Properties Editor**, navigate to the **Custom Properties** section, then click the **New** button. A new custom property displays underneath the **New** button. - - - -4. To the right of the new custom property, click the **Gear Icon**. The **Edit Property** pop-up displays. - - - -5. Click the **Type** dropdown, then select **String**. -6. In the **Property Name** field: - 1. If you are mapping a pose, input the **frame number** you are mapping, **Frame0** for example. - 2. If you are mapping the RootFaceJoint, input **RootFaceJoint**. -7. Leave the **Default Value** and **Description** fields empty. -8. Click the **OK** button. The new custom property updates with your new property name. -9. In the field to the right of the custom property name: - 1. If you're mapping a base pose, input the corresponding [FACS base pose](./facs-poses-reference.md) or combination pose name exactly as it is spelled. - 2. If you're mapping a combination pose, input each base pose you are combining separated by an underscore, such as **Funneler_JawDrop_Pucker**. - 3. If you're mapping the RootFaceJoint, input the name of the face root bone, commonly **DynamicHead**. -10. Press **Enter**. - - - - - -As you repeat this process, every additional custom property you create displays in the **Custom Properties** section of the **Object Properties** tab within the **Properties Editor**. - - - -You can download a [version of this project](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Poses-Mapped.blend) with the poses saved and mapped up to this point as reference. If importing a head `.fbx` with saved animation data into Blender, make sure to set the **Animation Offset** in the .FBX Import window to **0** to include the Frame 0 of the timeline. - - - -## Export - -After you finish posing and mapping your head for your character, you can export the character model as a `.fbx` to import into Studio, allowing you to access the 4 eye poses using the `Class.FaceControls` instance in Studio. You can also reference the fully configured Cubie head `.fbx` to access all 50+ base poses. - -The export settings for animatable heads differ slightly from [standard third-party modeling export settings](../../../art/modeling/export-requirements.md). To export the basic head model as a `.fbx`: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export**, then **FBX (.fbx)**. The **Blender File View** window displays. -3. Expand **Include** and enable **Limit To > Active Collection**. Note that this step is optional if you do not have additional collections in your Blender project. -4. In the **Include** section, enable **Custom Properties**. -5. Expand the **Armature** section and uncheck **Add Leaf Bones**. -6. Enable **Bake Animation**. -7. Expand **Bake Animation** and uncheck **NLA Strips**, **All Actions**, and **Force Start/End Keyframes**. -8. Click the **Export FBX** button. Save the FBX to the directory of your choice. - -At this point, you can now import the `.fbx` into Studio as a character with a supported animatable head. For model import and usage instructions, see [Use heads in Studio](../../../art/characters/facial-animation/use-heads-in-studio.md). - - - When importing Cubie into Studio, make sure to also save the head texture Cubie-Texture_ALB.png which you can apply to the head mesh of the imported character as a TextureID. - diff --git a/.cursor/rules/roblox/en-us/art/characters/facial-animation/create-face-accessories.md b/.cursor/rules/roblox/en-us/art/characters/facial-animation/create-face-accessories.md deleted file mode 100644 index b5cf3b77..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/facial-animation/create-face-accessories.md +++ /dev/null @@ -1,181 +0,0 @@ ---- -title: Create face accessories -description: Face accessories are 3D accessories that move and animate with a live head. ---- - - - This guide covers advanced topics. Before you begin, you should have prior knowledge on modeling, UV mapping, rigging, animation, and how to set up a character in [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). - - -A face accessory is a cosmetic `Class.Accessory` that attaches to the head and can include items such as hair, eyebrows, glasses, and facial hair. To create a face accessory that is compatible with animatable heads, you use a similar design process as [layered clothing](../../../art/accessories/index.md#creation-process) to allow your accessory model to deform and stretch on a head when the head is posed or animated. - -To create a face accessory, use a third-party modeling tool, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview), to create a 3D model with the following requirements: - -- The accessory model must meet Studio's [mesh requirements](../../../art/characters/specifications.md). -- The model must be parented (Blender) or bound (Maya) to an R15 character rig. -- The model must include an inner and outer cage. - -This guide covers the basic process in Blender for applying rigging and cage data to a basic reference model using the Cubie model referenced in [Create basic heads](../../../art/characters/facial-animation/create-basic-heads.md). - - - This guide uses Blender version 3.0. If you are using another version of Blender, there might be minor differences in UI and settings. - - -## Reference files - -The following are face accessory reference files, including all example files from this guide: - - -The reference character model provided is meant for educational purposes and does not meet the avatar character [technical specifications](../../../art/characters/specifications.md) for general use. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameDescription
    Cubie-Complete.fbxThe complete Cubie reference character, from Creating Basic Heads. This file is ready for import into Studio.
    Cubie-Cage-Only.fbxThe full body cage mesh of the Cubie reference character. This includes the inner and outer cage meshes.
    Cubie-Eyebrow-Geo.fbxA standalone eyebrow model, designed for the Cubie model.
    Cubie-Eyebrow-Rigged-And-Caged.fbxThe Cubie eyebrow model, correctly rigged and caged following the instructions in this guide. This file is ready for import into Studio.
    Cubie-Hawk-Hair.fbxA hair model reference, designed for the Cubie model.
    Creating-Face-Accessories-Reference-Files.zipA collection of all the provided reference files.
    - -## Modeling - -This guide uses a simple eyebrow reference as a demonstration for creating a face accessory. If rigging and caging a different model, ensure that your model meets the [character specifications](../../../art/characters/specifications.md) for Studio import. - - - -If creating your own model, consider the following guidelines: - -- Model your accessory with your character model for best results and fit. -- When possible, try to match up the edges of your model geometry with the edges/vertices of the underlying head topology. This improves the deformation of the accessory with the underlying head model. -- Some accessories, like eyebrows, can extrude or slightly intersect the character model mesh to achieve a certain cosmetic look. -- When working with an accessory with multiple pieces, such as eyebrows, combine the meshes to a single mesh once the modeling and fitting is completed. -- Face accessory meshes do not require a **\_Geo** naming convention. - -## Rigging - -You must [rig](../../../art/modeling/rigging.md) your accessory to the character's bone structure so the accessory can bend and deform along with your character's facial poses. After rigging, you can skin your model in your modeling tool, or you can transfer skinning data from your character to the accessory at runtime by using [Automatic skinning transfer](../../../art/accessories/automatic-skinning-transfer.md). - -### Project setup - -As an example in this guide, we are using the completed [basic Head model](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx) from [Create a basic head](../../../art/characters/facial-animation/create-basic-heads.md) and a [simple eyebrow model](../../../assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieEyebrow_Geo.fbx) in a new Blender project. - -To set up your Blender project: - -1. Open a new **General** project in Blender. -2. Select the default shape, camera, and lights, then press Delete. -3. In the left-hand navigation of the **Properties Editor**, navigate to **Scene Properties**. - - - -4. In the Units section, change the **Unit Scale** to `0.01` and the **Length** to **Centimeters**. - - - -5. Import the character rig you intend to parent the accessory to, in this example: [Cubie-Complete.fbx](../../../assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx). - - - -6. To simplify the workspace, you can delete the R15 inner and outer cage mesh objects since you will later import a full-body cage in the [Caging](#caging) step. - - - -7. Import your accessory model, in this example: [CubieEyebrow_Geo.fbx](../../../assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieEyebrow_Geo.fbx). - - 1. If required, reposition the accessory model on the face. - 2. You can hide the armature temporarily to verify model placement. - - - -### Parent armature - -Connect the mesh object to the character's armature by parenting the armature to the mesh object. To parent the armature: - -1. In Object Mode, hold Shift and **click** the accessory model and then any of the character bones. -2. Right click and select **Parent**, then select **With Automatic Weights**. - - - -Parenting with Automatic Weights automatically applies some influences to your model which can save some time during the [optional skinning](#optional-skinning) step. You can alternatively **Parent** with **Empty Weights** to not apply any skinning influence to your accessory mesh. See Blender's documentation on [Automatic Weights](https://docs.blender.org/manual/en/latest/animation/armatures/skinning/parenting.html#with-automatic-weights) for more information. - - -### Optional skinning - -In many cases, you can skip the [skinning](../../../art/modeling/rigging.md) process for your accessory and use Roblox's [automatic skinning transfer](../../../art/accessories/automatic-skinning-transfer.md) instead. You can still apply manual skinning through a modeling software and opt to use automatic skinning transfer later. With automatic skinning transfer, your end result and quality may vary. - -If you do not intend to apply skinning manually, continue directly to [caging](#caging). - - -If you are skinning your accessory in your modeling software on a character model with a fully posed head, you can test the accessory on various FACS poses saved to the timeline within your modeling software before importing into Studio. - - -## Caging - -The caging process for face accessories is similar to caging layered clothing accessories and shares the same modeling and caging requirements. After rigging, import a full-body inner and outer cage to your project, rename the cages, then stretch the vertices of the Outer Cage to cover the accessory model with minimal space. - -To cage the eyebrow accessory: - -1. With Blender's .fbx importer, import [`Cubie-Cage-Only.fbx`](../../../assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Cubie-Cage-Only.fbx). This includes a single full-body inner and outer cage mesh for the Cubie model. - -2. Rename cages to begin with "CubieEyebrow" before the **\_InnerCage** and **\_OuterCage** affix. -3. In Edit mode, extend the outer cage to fit over the accessory with minimal space. Use various material and viewing options to easily manipulate the correct vertices on the outer cage. - - - -If you are using automatic skinning transfer, you can ensure that automatic skinning transfer only applies to specific parts of the accessory by removing unnecessary sections of the cage. For more information, see [Modifying Character Cages](../../../art/accessories/automatic-skinning-transfer.md#modify-character-cages). - -## Export - -Export your model when ready to test your accessory model in Studio or when setting up for final export. When exporting face accessories, keep in mind the following guidelines: - -- Ensure that the final accessory model follows [Studio's Modeling Requirements](../../../art/characters/specifications.md), including properly named mesh and cage objects. -- Do not export any unnecessary data, such as animation data, or light and camera objects. -- If exporting PBR textures, follow [texture modeling requirements](../../../art/characters/specifications.md#surfaceappearance) when exporting texture images from your texture software. - -To export: - -1. Ensure only the **accessory mesh**, **armature object** and **cages meshes** are exported. Delete all other objects in the workspace. - - 1. You can quickly filter out **Geo** and **Att** named objects in your workspace to quickly delete them. - - - -2. Follow Studio's [Export Requirements for Blender](../../../art/accessories/export-settings.md) and save the file to your preferred location. The final export of the eyebrow `.fbx` is available for reference. - -## Test in Studio - -To use your exported model into Studio as an `Class.Accessory`, use the [Accessory Fitting Tool](../../../art/accessories/accessory-fitting-tool.md) to test and generate the accessory object. At this point, you can equip the accessory to a humanoid character. If you intend to transfer skinning data from your character to the accessory model at runtime, you can enable [automatic skinning transfer](../../../art/accessories/automatic-skinning-transfer.md) for your accessory. - - -If following the references provided by this guide, only **EnabledOverride** applies the skinning transfer in Studio, since some skinning data will have been applied to the model during the [parenting](#parent-armature) process. - diff --git a/.cursor/rules/roblox/en-us/art/characters/facial-animation/facs-poses-reference.md b/.cursor/rules/roblox/en-us/art/characters/facial-animation/facs-poses-reference.md deleted file mode 100644 index dccf6aa6..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/facial-animation/facs-poses-reference.md +++ /dev/null @@ -1,539 +0,0 @@ ---- -title: FACS poses reference -description: The Facial Action Coding System (FACS) ensures that all face animations have a common pose reference and can create similar face animations. ---- - -The [Facial Action Coding System](https://en.wikipedia.org/wiki/Facial_Action_Coding_System) (FACS) is a comprehensive, anatomically-based system for describing all visually discernible facial movement. This system breaks down all facial expressions into individual types of muscle movement, such as `LeftEyeClosed` or `MouthLeft`. You can [configure](../../../art/characters/facial-animation/create-basic-heads.md#pose) and store these muscle movements, or **poses**, within the head model through a third-party modeling software, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). When you import the head model into Studio, you can then access and [animate](../../../art/characters/facial-animation/animate-heads.md) these poses to create lively facial expressions. - -The following is a list of 50 base poses that you can use in Roblox to portray a wide range of face emotions. Except for the first neutral pose, the order of poses you save to your character model doesn't matter since this information is set during the [mapping](../../../art/characters/facial-animation/create-basic-heads.md#map) process as a custom property. - - -If you intend to publish your avatar to the Marketplace, your avatar head must include the required [17 facial base poses](../../../art/characters/specifications.md#facial-animations). Marketplace validation rejects assets that do not include these 17 required base poses. - - -You can combine multiple FACS base poses together in one animation frame to create complex facial expressions. However, some combinations of poses might collide unless you also add a [corrective](../../../art/characters/facial-animation/create-basic-heads.md#combination-poses) to their full default values. - -## LeftEyeClosed - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.LeftEyeClosed|LeftEyeClosed` closes the character's left eyelid. - - - - - - -## RightEyeClosed - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.RightEyeClosed|RightEyeClosed` closes the character's right eyelid. - - - - - - -## EyesLookDown - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.EyesLookDown|EyesLookDown` makes the eyes gaze down. - - - - - - -## JawDrop - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.JawDrop|JawDrop` lowers the jaw downward, opening the mouth. - - - - - - -## Pucker - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.Pucker|Pucker` makes a kiss-like shape with the mouth. - - - - - - -## LeftLipCornerPuller - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.LeftLipCornerPuller|LeftLipCornerPuller` raises the corners of the mouth upwards in a smile. - - - - - - -## RightLipCornerPuller - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.RightLipCornerPuller|RightLipCornerPuller` raises the corners of the mouth upwards in a smile. - - - - - - -## ChinRaiser - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.ChinRaiser|ChinRaiser` raises the chin up; moves the lower lip upwards. - - - - - - -When you use `Class.FaceControls.ChinRaiser|ChinRaiser` and the character's mouth is closed, the character's lower lip collides with their upper lip. When you need to keep the mouth closed while raising the chin, use [`ChinRaiserUpperLip`](#chinraiserupperlip) and `Class.FaceControls.ChinRaiser|ChinRaiser` together to raise both the lower and upper lip, and avoid a collision. Note that if you use this method, you must set both `Class.FaceControls.ChinRaiser|ChinRaiser` and [`ChinRaiserUpperLip`](#chinraiserupperlip) to the same value so the lips move the same distance upwards. - -## ChinRaiserUpperLip - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.ChinRaiserUpperLip|ChinRaiserUpperLip` raises the upper lip up when ChinRaiser is engaged and it is touching the upper lip. - - - - - - -## LeftCheekRaiser - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.LeftCheekRaiser|LeftCheekRaiser` squints the character's left eye. - - - - - - -## RightCheekRaiser - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.RightCheekRaiser|RightCheekRaiser` squints the character's right eye. - - - - - - -## LeftInnerBrowRaiser - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.LeftInnerBrowRaiser|LeftInnerBrowRaiser` raises the interior half of the character's left brow upwards. - - - - - - -## RightInnerBrowRaiser - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.RightInnerBrowRaiser|RightInnerBrowRaiser` raises the interior half of the character's right brow upwards. - - - - - - -## LeftLipCornerDown - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.LeftLipCornerDown|LeftLipCornerDown` lowers the corners of the mouth downwards in a frown. - - - - - - -## RightLipCornerDown - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.RightLipCornerDown|RightLipCornerDown` lowers the corners of the mouth downwards in a frown. - - - - - - -## LeftLowerLipDepressor - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.LeftLowerLipDepressor|LeftLowerLipDepressor` lowers the lower lip downwards away from the upper lip, revealing the lower teeth. - - - - - - -## RightLowerLipDepressor - - - If publishing to the Marketplace, your avatar asset must include this pose. - - -`Class.FaceControls.RightLowerLipDepressor|RightLowerLipDepressor` lowers the lower lip down away from the upper lip revealing the lower teeth. - - - - - - -## EyesLookLeft - -`Class.FaceControls.EyesLookLeft|EyesLookLeft` makes the eyes gaze left. - - - - - - -## EyesLookRight - -`Class.FaceControls.EyesLookRight|EyesLookRight` makes the eyes gaze right. - - - - - - -## EyesLookUp - -`Class.FaceControls.EyesLookUp|EyesLookUp` makes the eyes gaze up. - - - - - - -## LeftLipStretcher - -`Class.FaceControls.LeftLipStretcher|LeftLipStretcher` stretches the corners of the mouth apart. - - - - - - -## LeftUpperLipRaiser - -`Class.FaceControls.LeftUpperLipRaiser|LeftUpperLipRaiser` raises the character's left upper lip away from the lower lip revealing the upper teeth. - - - - - - -## LipsTogether - -`Class.FaceControls.LipsTogether|LipsTogether` brings the character's lips together. However, if the character's mouth is closed, their lips are already together and they collide. - - - - - - -This pose's main use case is in connection with the [`JawDrop`](#jawdrop) property. If you set [`JawDrop`](#jawdrop) and `Class.FaceControls.LipsTogether|LipsTogether` to 100% of their default values, the character's lips stay together as the jaw drops. - - - - - - -In addition, if you set [`JawDrop`](#jawdrop) to 100% of its default value, and ease `Class.FaceControls.LipsTogether|LipsTogether` in and out of 100% of its default value, the character's lips open and close. - - - - - - -## RightLipStretcher - -`Class.FaceControls.RightLipStretcher|RightLipStretcher` stretches the corners of the mouth apart. - - - - - - -## RightUpperLipRaiser - -`Class.FaceControls.RightUpperLipRaiser|RightUpperLipRaiser` raises the right upper lip away from the lower lip, revealing the upper teeth. - - - - - - -## FlatPucker - -`Class.FaceControls.FlatPucker|FlatPucker` brings the corners of the mouth inward and presses the lips back against the teeth. This pose is also known as lip tightener. - - - - - - -## Funneler - -`Class.FaceControls.Funneler|Funneler` makes an 'O' shape with the mouth. - - - - - - -## LowerLipSuck - -`Class.FaceControls.LowerLipSuck|LowerLipSuck` rolls the lower lip up over the teeth. - - - - - - -## LipPresser - -`Class.FaceControls.LipPresser|LipPresser` presses the lips together. - - - - - - -## MouthLeft - -`Class.FaceControls.MouthLeft|MouthLeft` moves the mouth to the character's left. This property doesn't move the character's jaw, teeth, or tongue, only their mouth. If you want to move those additional facial features, use [`JawLeft`](#jawleft) instead. - - - - - - -## MouthRight - -`Class.FaceControls.MouthRight|MouthRight` moves the mouth to the character's right. This property doesn't move the character's jaw, teeth, or tongue to the right, only their mouth. If you want to move those additional facial features, use [`JawRight`](#jawright) instead. - - - - - - -## UpperLipSuck - -`Class.FaceControls.UpperLipSuck|UpperLipSuck` rolls the upper lip around the teeth. - - - - - - -## LeftCheekPuff - -`Class.FaceControls.LeftCheekPuff|LeftCheekPuff` puffs up the character's left cheek. - - - - - - -## LeftDimpler - -`Class.FaceControls.LeftDimpler|LeftDimpler` moves the corners of the left side of the mouth back toward the teeth. - - - - - - -## RightCheekPuff - -`Class.FaceControls.RightCheekPuff|RightCheekPuff` puffs up the character's right cheek. - - - - - - -## RightDimpler - -`Class.FaceControls.RightDimpler|RightDimpler` moves the corners of the right side of the mouth back toward the teeth. - - - - - - -## JawLeft - -`Class.FaceControls.JawLeft|JawLeft` moves the character's jaw, teeth, tongue, and lower lip to their left. If you just want to move the character's mouth to their left, use [`MouthLeft`](#mouthleft) instead. - - - - - - -## JawRight - -`Class.FaceControls.JawRight|JawRight` moves the character's jaw, teeth, tongue, and lower lip to their right. If you just want to move the character's mouth to their right, use [`MouthRight`](#mouthright) instead. - - - - - - -## Corrugator - -`Class.FaceControls.Corrugator|Corrugator` brings the left and right brows inward together. - - - - - - -## LeftBrowLowerer - -`Class.FaceControls.LeftBrowLowerer|LeftBrowLowerer` lowers the character's left brow down. - - - - - - -## LeftOuterBrowRaiser - -`Class.FaceControls.LeftOuterBrowRaiser|LeftOuterBrowRaiser` raises the outer part of the character's left brow upwards. - - - - - - -## LeftNoseWrinkler - -`Class.FaceControls.LeftNoseWrinkler|LeftNoseWrinkler` raises the character's left nostril, pulls the brow down slightly, and wrinkles the left side of the nose. - - - - - - -## RightBrowLowerer - -`Class.FaceControls.RightBrowLowerer|RightBrowLowerer` lowers the character's right brow down. - - - - - - -## RightOuterBrowRaiser - -`Class.FaceControls.RightOuterBrowRaiser|RightOuterBrowRaiser` raises the outer part of the character's right brow upwards. - - - - - - -## RightNoseWrinkler - -`Class.FaceControls.RightNoseWrinkler|RightNoseWrinkler` raises the character's right nostril, pulls the brow down slightly, and wrinkles the right side of the nose. - - - - - - -## LeftEyeUpperLidRaiser - -`Class.FaceControls.LeftEyeUpperLidRaiser|LeftEyeUpperLidRaiser` raises the character's left eyelid upwards to reveal more of the eye white above the iris. - - - - - - -## RightEyeUpperLidRaiser - -`Class.FaceControls.RightEyeUpperLidRaiser|RightEyeUpperLidRaiser` raises the character's right eyelid upwards to reveal more of the eye white above the iris. - - - - - - -## TongueDown - -`Class.FaceControls.TongueDown|TongueDown` bends the tongue down. This pose is only visible if you combine it with [`TongueOut`](#tongueout), otherwise the tongue only bends down within the character's mouth. - - - -## TongueOut - -`Class.FaceControls.TongueOut|TongueOut` sticks the tip of the tongue out of the mouth. - - - -## TongueUp - -`Class.FaceControls.TongueUp|TongueUp` bends the tongue up. This pose is only visible if you combine it with [`TongueOut`](#tongueout), otherwise the tongue only bends up within the character's mouth. - - diff --git a/.cursor/rules/roblox/en-us/art/characters/facial-animation/index.md b/.cursor/rules/roblox/en-us/art/characters/facial-animation/index.md deleted file mode 100644 index d96dfd55..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/facial-animation/index.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -title: Heads -description: Facial animations enable avatars to create dynamic facial expressions. ---- - -Heads are a fundamental component of an avatar character body. Roblox avatar heads, such as those available on the Marketplace, contains components that allow you to: - -- Set default custom facial expressions. -- Trigger emotes that combine both face and body animations. -- Equip face accessories that deform with your facial expressions. For example, facial hair moves accordingly when the character changes facial expressions. - - - -## Create basic heads - - -When creating heads intended for the Marketplace, ensure that your head meets Roblox's [head specifications](../head-specifications.md). - - -Using third-party modeling tools, you can either modify a rigged character model to meet head requirements, or create a head from scratch. For step-by-step instructions on how to add face bones, apply skinning, posing, and mapping poses on a head model in Blender, see [Create basic heads](../../../art/characters/facial-animation/create-basic-heads.md). This guide includes several reference files you can use to compare and track your progress. - -### Resources - -Heads designated for the Marketplace require specific components to ensure universal support across Roblox's platform. Heads are often the most complex part of an avatar character. Use the following docs to best equip your assets to pass validation and work well with other assets: - -- Understand how Roblox tests facial animations in the [validation process](../head-validation.md) and learn common issues that you can self-resolve. -- Similar to character bodies and clothing, Marketplace heads must also follow [Roblox's specifications](../head-specifications.md). -- Ensure that you are following Roblox's [head caging best practices](../face-caging-best-practices.md) to ensure the best results for clothing, validation, and makeup. -- Use the [FACS poses reference](../../../art/characters/facial-animation/facs-poses-reference.md) when posing and mapping your head. - -## Create face accessories - -Similar to creating heads, you can design and model face accessories using a third-party modeling software and import the models as a cosmetic `Class.Accessory` in Studio. When created correctly, equipped accessories stretch and deform as the head animates and emotes. - -See [Create face accessories](../../../art/characters/facial-animation/create-face-accessories.md) for step-by-step instructions on setting up a reference model as a face accessory. This guide includes several project files you can use for reference and covers details on time-saving steps, such as auto-skin transfer. - -## Test heads - -Testing is an important part of the iterative creation process. To test heads in Studio, see [Testing in Studio](../facial-animation/use-heads-in-studio.md). - -## Animate heads - -If you're interested in animating a head, for use in-experience or to further test your character's face rig, see [Animate heads](../../../art/characters/facial-animation/animate-heads.md). - - diff --git a/.cursor/rules/roblox/en-us/art/characters/facial-animation/moods.md b/.cursor/rules/roblox/en-us/art/characters/facial-animation/moods.md deleted file mode 100644 index 5461d8cf..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/facial-animation/moods.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Moods -description: Moods are a type of facial animation that loop indefinitely, allowing users to express persistent facial emotion. ---- - -A **mood** is a type of [facial animation](../../../art/characters/facial-animation/index.md) for animatable heads that loops indefinitely, allowing users to express themselves and react to others with a persistent facial emotion. Moods play simultaneously with other character [default animations](../../../animation/using.md#default-character-animations), such as walking, climbing, and swimming, and if the default animation has a facial animation, the default animation blends with the character's mood. - - -
    - -
    Default mood
    -
    -
    - -
    Open mouth mood
    -
    -
    - - - A mood is a type of facial animation, but not all facial animations are moods. While a mood refers to a specific animation slot that belongs to each character, a facial animation refers to **any** animation that modifies the face channels. - - -## Create moods - -If you have a character model with an animatable head, you can create any mood animation you can think of using the [Face Animation Editor](../../../art/characters/facial-animation/animate-heads.md#use-the-face-animation-editor). If you don't want to use the [Blocky](../../../assets/avatar/dynamic-heads/reference-files/BlockyCharacter.fbx) or [Goblin](../../../assets/avatar/dynamic-heads/reference-files/GoblinCharacter.zip) reference character models, you can create or modify an existing model to support animated heads in a third-party modeling software, such as Blender or Maya. For information on how to create an animatable head, see [Create basic heads](../../../art/characters/facial-animation/create-basic-heads.md). - -To create a mood: - -1. Add a character model with an animatable head to the viewport. -1. Open the **Face Animation Editor**. - - 1. From the toolbar's **Avatar** tab, click **Animation**. The [Animation Editor](../../../animation/editor.md) window displays. - 1. In the viewport, select your character model with an animatable head. A dialog displays. - - - - 1. In the **Animation Name** field, enter a new animation name, then click the **Create** button. The **Animation Editor** window displays the **media and playback controls**, **timeline**, and **track list**. - 1. In the editor's **track list**, click the **Face** button. The **Face Animation Editor** displays to the left of the track list. - -1. In the **Face Animation Editor**, adjust sliders for the facial parts you want to manipulate. Animation tracks for each facial part you manipulate automatically display in the track list along with keyframes for your current position in the timeline. The character's face also updates in the viewport. - - - To undo a step on a slider, press CtrlZ (⌘Z). - - To redo a step on a slider, press CtrlY (⌘Y). - - To reset a slider to its default value, right click on the slider. A contextual menu displays. Select **Reset Selected**. - -1. When you are finished creating your animation, navigate to the **Media and Playback Controls** and click the **…** button. A pop-up menu displays. - - - -1. Select **Save** or **Save As** to save the mood animation. The animation displays in the **Explorer** window as a child of the **AnimSaves** object (itself a child of the rig). - - - -1. **(Optional)** To assign an asset ID to your mood animation and save it to the [Toolbox](../../../projects/assets/toolbox.md) to use across your experiences, - - 1. In the **Explorer** window, right-click on your new mood animation. A contextual menu displays. - 1. Select **Save to Roblox**. The **Asset Configuration** window displays. - 1. Fill in the following fields: - - - **Title**: A name for your plugin. - - **Description**: A description that describes what a potential user should expect the plugin to do. - - **Creator**: The creator you'd like to attribute as the creator of the plugin. - - 1. Click the **Submit** button. After a moment, the Asset Configuration dialog displays your mood's `Class.Animation.AnimationID` that you can use to set the mood to characters within your experiences. - - - -## Set moods - -Every character with an animatable head has a child **Animate** `Class.LocalScript` with a child **mood** `Class.StringValue` that contains the mood animation that plays on the character's head. The mood animation's default `Class.Animation.AnimationID` plays a smiling animation, but you can change the character's mood to something else by either directly editing the `Class.Animation.AnimationID` within the mood `Class.StringValue`, or using the `Class.HumanoidDescription` system. - - - - - The code for playing moods doesn't occur in the **Animate** `Class.LocalScript`, but in a hidden, internal Roblox script. While you can't edit this internal script, the **mood** `Class.StringValue` allows you to interact with it in order to customize moods within your experiences. - - -### Edit AnimationIds - -You can set a specific mood for each character within your experience by editing their mood's `Class.Animation.AnimationID` whenever a user triggers an event. For example, the following `Class.Script` edits any previously set mood to an animation that [opens the character's mouth](https://www.roblox.com/library/7715145252/moods-11-FaceAnimation) as soon as the user enters the experience: - -```lua -local Players = game:GetService("Players") - -local function onCharacterAdded(character) - local humanoid = character:WaitForChild("Humanoid") - local animateScript = character:WaitForChild("Animate") - animateScript.mood.Animation1.AnimationId = "rbxassetid://7715145252" -- Mood -end - -local function onPlayerAdded(player) - player.CharacterAppearanceLoaded:Connect(onCharacterAdded) -end - -Players.PlayerAdded:Connect(onPlayerAdded) -``` - -### Use the HumanoidDescription - -You can also use the `Class.HumanoidDescription` system to find user characters and edit their `Class.Animation.AnimationID|AnimationIDs` for any default animation. For example, the following `Class.Script` edits any previously set mood to an animation that gives the character a [half-smile](https://www.roblox.com/catalog/10725833199/Chiseled-Good-Looks-Mood) on the left-side of their face whenever their character is idling: - -```lua -local humanoid = player.Character and player.Character:FindFirstChildWhichIsA("Humanoid") -if humanoid then - local descriptionClone = humanoid:GetAppliedDescription() - descriptionClone.IdleAnimation = 10725833199 - -- Apply modified "descriptionClone" to humanoid - humanoid:ApplyDescription(descriptionClone) -end -``` - -## Disable moods - -To disable moods from your experience, you can delete the mood object underneath the **Animate** `Class.LocalScript`. For example, the following `Class.Script` removes every character's **mood** `Class.StringValue` as soon as they join the experience: - -```lua -local Players = game:GetService("Players") - -local function onCharacterAdded(character) - local humanoid = character:WaitForChild("Humanoid") - local animateScript = character:WaitForChild("Animate") - animateScript.mood:Destroy() -end - -local function onPlayerAdded(player) - player.CharacterAppearanceLoaded:Connect(onCharacterAdded) -end - -Players.PlayerAdded:Connect(onPlayerAdded) -``` diff --git a/.cursor/rules/roblox/en-us/art/characters/facial-animation/use-heads-in-studio.md b/.cursor/rules/roblox/en-us/art/characters/facial-animation/use-heads-in-studio.md deleted file mode 100644 index c97aed80..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/facial-animation/use-heads-in-studio.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -title: Test heads in Studio -description: If you have a model with a live head, you can import the model into Studio, equip face accessories, and create and save animations. ---- - - -If you are looking to quickly test a character's head animation, use the [Avatar Setup tool](../../../avatar-setup/index.md) to load your character and use the presets to preview various facial animations and head accessories. - - -Manually test your head creations by importing character models with animatable heads into Studio and use the generated `Class.FaceControls` instance to pose or animate the face. - -When importing a head that supports facial animation into Studio, Studio creates a `Class.FaceControls` instance you can use to access and combine these individual poses to create expressions and animations. Unlike typical rigged models, you cannot access the facial `Class.Bone|Bones` of a head mesh directly in Studio. - -To set up heads with facial animation in your experience: - -1. [Import a model with an animatable head](../../../art/characters/testing/studio.md#import). You can either create your own or use one of the provided reference model files. -2. (Optional) [Import face accessories](#import-face-accessories) you want to deform with the facial expressions of your head. You can either create your own or use one of the provided reference accessory files. -3. [Animate the head](#animate-heads) in the **Animation Editor** by either adding in individual animation tracks, or by using the **Face Animation Editor**. - -If you want to experiment with pre-made heads before [making your own](../../../art/characters/facial-animation/create-basic-heads.md), Roblox has a reference experience you can access to see how heads interact with Studio's interface, as well as two reference models and accessories you can import directly into your own experience: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Reference filesDescription
    [Head Animation In-Experience Editor](../../../assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Editor.rbxl)A reference experience that allows you to preview a Goblin and Blocky head with various accessories using an editor.
    [Head Schema Reference](../../../assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Schema.rbxl)A reference experience with a head Blocky model with `Class.FaceControls`.
    [Goblin Character Model](../../../assets/avatar/dynamic-heads/reference-files/GoblinCharacter.zip)A Goblin character model with an animatable head.
    [Blocky Character Model](../../../assets/avatar/dynamic-heads/reference-files/BlockyCharacter.fbx)A Blocky character model with an animatable head.
    [Blocky Face Accessories and Clothing](../../../assets/avatar/dynamic-heads/reference-files/Blocky-Face-Accessories.zip)A `.zip` file of Blocky-specific accessories, including:
    • Angled Eyebrows
    • Round Eyebrows
    • Straight Eyebrows
    • Long Eyelashes
    • Short Eyelashes
    • Long Ducktail Beard
    • Mutton Chops Beard and Hair
    • Shirt and Pants
    - -## Import face accessories - -You can import and equip face accessories that you want to deform with the facial expressions of your head. For example, when you import and equip eyebrows as a face accessory, you can animate the eyebrows to move with the character's eyes. - -By default, when you import a face accessory, it imports as a `Class.MeshPart` object. Using the [Accessory Fitting Tool](../../../art/accessories/accessory-fitting-tool.md) (AFT), you can convert the `Class.MeshPart` into an `Class.Accessory` instance that is compatible with the head. - -To import a face accessory: - -1. From Studio's **File** menu, use the [3D Importer](../../../art/modeling/3d-importer.md) to import the custom model into the workspace. - - - -2. Using the AFT, convert the `Class.MeshPart` into an `Class.Accessory` instance. - - 1. In the toolbar's **Avatar** tab, click **Accessory** to open the AFT. - 2. In the **Explorer** window, select the **MeshPart** you imported as a face accessory. Its name displays in the **Part** field. - 3. Click the **Next** button. - 4. In the **Clothing** category, select **Face**, then click the **Next** button. - 5. (Optional) In the **Edit** panel, use the adjustment options to ensure the accessory fits your model. - 6. In the **Preview** panel, preview the new facial accessory on your head, then click the **Next** button. The tool transforms the `Class.MeshPart` into an `Class.Accessory` instance, and it displays in the **Explorer** window. - -You can preview the accessory on your imported model by making the `Class.Accessory` instance a child of your character `Class.Model`. You can only equip character-specific face accessories with their designed character. - - -
    - -
    Equipped accessory in viewport
    -
    -
    - -
    Equipped Accessory in Explorer
    -
    -
    - -You can also save the `Class.Accessory` instance to your toolbox and use the asset ID at any time in your experiences. For information on equipping accessories by applying a `Class.HumanoidDescription`, see [Customize characters with humanoid description](../../../characters/appearance.md#set-multiple-accessories). - -### AutoSkin property - -You can enable the `Class.WrapLayer.AutoSkin` property in the accessory's `Class.WrapLayer` instance to apply the skinning of the head to the face accessory. This allows a face accessory to fit and follow a character's expressions without having to apply any skinning influences to it during the 3D modeling process. - -The following options are available for the `Class.WrapLayer.AutoSkin` property: - -- **Disabled**: Disables the Automatic Skinning Transfer process. This is the default value. -- **EnabledOverride**: Enables the Auto-Skin Transfer process and allows Studio to override any existing skinning information found on the accessory. Choose this setting when you want to set or replace the existing skinning of an accessory using the Auto-Skin Transfer version. -- **EnabledPreserve**: Enables the Automatic Skinning Transfer process but **doesn't** allow it to override any existing skinning information found on the accessory. Choose this setting when you want to preserve and maintain any existing skinning of an accessory. If there isn't any skinning to maintain, the Auto-Skin Transfer creates new skinning automatically. - -## Animate heads - -Animatable head `Class.MeshPart|MeshParts` include a `Class.FaceControls` instance which allows you to access your facial pose properties. - - -
    - -
    FaceControls in Explorer
    -
    -
    - -
    FaceControls Property Panel
    -
    -
    - -You can adjust these properties in the **Animation Editor** to animate your head. For more information, see [Animate heads](../../../art/characters/facial-animation/animate-heads.md). - -## Troubleshooting - -When importing custom head models, the [Output window](../../../studio/output.md) displays an error or warning message if there were any issues during the configuration process. - -### Error messages - -Error messages indicate a failure to properly import a model with a head. Reference the following table for a summary of all head error messages and troubleshooting tips: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error messageTroubleshooting
    Failed importing head with facial animation.The .fbx file is corrupted.
    Found more than one joint named X. All joints must have unique names.Ensure that every joint that you import has a unique name.
    Failed importing head with facial animation: Correctives can be for at most 3 control names.Studio found a corrective with more than 3 corrective poses. This isn't supported, so you need to delete the corrective.
    Failed importing head with facial animation: Unrecognized FACS control name X.X is an unrecognized FACS pose name. Ensure that X is renamed to one of the [standard FACS poses](../../../art/characters/facial-animation/facs-poses-reference.md).
    Failed importing head with facial animation: Invalid corrective name X: Neutral cannot be part of a corrective.X is an invalid corrective name. Ensure you are following the correct naming format for correctives.
    Failed importing head with facial animation: Found duplicate FACS control name X for corrective Y.X is an invalid corrective name. You can only include a base pose that is listed as part of a corrective once in the corrective name.
    Failed importing head with facial animation: Couldn't parse the frame number in Extra Attribute named X.You must name any extra attributes "Frame0", "Frame1", etc.
    Failed importing head with facial animation: Empty value found for Extra Attribute named X.The extra attribute X has no value. Add a base pose name or corrective, or delete the extra attribute.
    Failed importing head with facial animation: Duplicate control name found.You set a FACS pose or corrective to multiple frames. Ensure that each FACS pose or corrective is set to only a single frame.
    Failed importing head with facial animation: Head_Geo has no Extra Attributes that map FACS controls to animation frames.The "Head_Geo" mesh in the FBX file must have extra attributes in order to animate facial expressions. The imported avatar will not animate facial expressions.
    Failed importing head with facial animation: No frame was set to "Neutral" in animation.Must have one frame set to "Neutral" in the animation timeline.
    Failed importing head with facial animation: X has not been specified. This is needed for corrective Y.All base poses for a corrective must be set in the extra attributes. For example, if the Funneler_JawDrop corrective is set, then there must be poses for Funneler and JawDrop alone.
    Failed importing head with facial animation: Missing key frame X for Y.There is an extra attribute "FrameX" set to Y, but the animation timeline has no frame X.
    Failed importing head with facial animation: No joints were found under DynamicHead.The .fbx file doesn't have any joints under the RootFaceJoint joint.
    Could not load FACS control data.There are corrupted joint parameters in the .fbx file.
    - -### Warning messages - -Warning messages indicate a potential issue with an imported head model. Reference the following table for a summary of all head warning messages and troubleshooting tips: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error messageTroubleshooting
    You have corrective X, but missing corrective Y to support it. This may cause odd deformations.You set a 3-corrective without setting the base 2-corrective. The imported head will animate, but there might be strange deformations.
    Skipping attribute X: YStudio found an extra attribute named X, but since it didn't match the format of "Frame#", it was ignored.
    Control X is nearly identical to Neutral.The pose for X is very similar to Neutral. Studio reports this in case this was a mistake, but the import will be successful as long as there are no other failures.
    Found only N base poses. Your character may not be able to express itself.You only defined a subset of base poses in the .fbx file. The import will still be successful as long as there are no other failures.
    diff --git a/.cursor/rules/roblox/en-us/art/characters/head-comparison.md b/.cursor/rules/roblox/en-us/art/characters/head-comparison.md deleted file mode 100644 index e50cd268..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/head-comparison.md +++ /dev/null @@ -1,572 +0,0 @@ ---- -title: Classic and Dynamic head comparison -description: The Avatar Validation Tool checks for common character model issues in Blender. ---- - -The following table compares the classic decals with the dynamic head equivalent. - - -The references below are not final and are subject to change. We encourage you to provide feedback on specific heads on the [DevForum announcement](https://devforum.roblox.com/t/completing-the-dynamic-head-migration/4301387). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Asset NameClassicDynamic
    **\$.\$**
    **-_-**
    **8-Bit Heart Face**
    **:'(**
    **:-/**
    **:-?**
    **:-[**
    **:-o**
    **:/**
    **:D**
    **:P**
    **=)**
    **>_<**
    **>_>**
    **^_^**
    **Adorable Puppy**
    **Adoration**
    **Aghast**
    **Alexandra Ninniflip - Face**
    **Alien**
    **Alien Ambassador**
    **Alright**
    **Amelia Face**
    **And then we'll take over the world!**
    **Angelic**
    **Angry Zombie**
    **Anguished**
    **Anime Surprise**
    **Astral Isle Clan: Windsor the Blue - Face**
    **Atlantean Warrior Face**
    **Aurora Spark - Face**
    **Awesome Face**
    **Awkward Eyeroll**
    **Awkward Grin**
    **Bad Dog**
    **Bad News Face**
    **Bakonette**
    **Ballerina Face**
    **Bandage**
    **Battle Ready Kenji Face**
    **Beast Mode**
    **Beekeeper - Face**
    **Beekeeper - Face**
    **Big Grin - Tai Verdes**
    **Big Sad Eyes**
    **Biohazard First Responder - Face**
    **Bird of Prey**
    **BiteyMcFace**
    **Blerg!**
    **Bling**
    **Blinky**
    **Blizzard Beast Mode**
    **Blue Amazeface**
    **Blue Bubble Trouble**
    **Blue Eyeroll**
    **Blue Galaxy Gaze**
    **Blue Goof**
    **Blue Moonstruck**
    **Blue Rock Star Smile**
    **Blue Starface**
    **Blue Starry Sight**
    **Blue Trance**
    **Blue Ultimate Dragon Face**
    **Blue Wistful Wink**
    **Blue-eyed Awesome Face**
    **Bluffing**
    **Bored**
    **Braces**
    **Bubble Trouble**
    **Butterfly**
    **C.Y.N.D.I - Face**
    **Camoface**
    **Casey's Face**
    **Cat Eye - Zara Larsson**
    **Catching Snowflakes**
    **Champion Of The Tide Face**
    **Cheerful Grin**
    **Cheerful Hello**
    **Chester Finkleton - Face**
    **Chichiri the Wise Youkai Face**
    **Chill**
    **Chill McCool**
    **Chippy McTooth**
    **Chubs**
    **City Life Man - Face**
    **City Life Woman - Face**
    **Claire's Face**
    **Classic Alien Face**
    **Classic Female - Face**
    **Classic Female v2 - Face**
    **Classic Goof**
    **Classic Male - Face**
    **Classic Vampire**
    **Clown Face**
    **Clown School Dropout**
    **Commando**
    **Concerned**
    **Country Morning**
    **Crank and Zap Mech - Face**
    **Crazy Abstract Artist**
    **Crazy Happy**
    **Crazybot 10000**
    **Crimson Evil Eye**
    **Crimson Laser Vision**
    **Crimson Starface**
    **Crybaby**
    **Cuckookrazybot 10000**
    **Cute Kitty**
    **Cutiemouse**
    **Cyanskeleface**
    **D:**
    **D=**
    **Daring**
    **Daring Beard**
    **Daring Blonde Beard Face**
    **Dark Age Apprentice - Face**
    **Daydreaming**
    **DDotty Smile**
    **Death's Grin**
    **Demented Mouse**
    **Desert Commando**
    **Devil Nas X - Lil Nas X (LNX)**
    **Devilish Smile - 24kGoldn**
    **Dex's Face**
    **Diamond Grill - Lil Nas X (LNX)**
    **Digital Artist - Face**
    **Digital Artist - Face**
    **Disapproving Unibrow**
    **Disbelief**
    **Disbelief Face**
    **Distaught Alien Invader**
    **DIY Cardboard Knight - Face**
    **Dizzy Face**
    **DJ Databaze - Face**
    **Domino Deckard - Face**
    **Don't Wake Me Up**
    **Downcast**
    **Dr. Bunton Madmind - Face**
    **Dr. Fia Tyfoid - Face**
    **Dr. Lauren, Artifact Excavator - Face**
    **Dragonface**
    **Drill Sergeant**
    **Drooling Noob**
    **Druid of the Stag Face**
    **Egg Crazed**
    **Egg on your Face**
    **Eita the Envious Youkai Face**
    **Elegant Evening Dress - Face**
    **Elf Guardian of the Northern Border - Face**
    **Embarrassed**
    **Emerald Ambassador**
    **Emerald Archfey Visage**
    **Emerald Evil Eye**
    **Emerald Laser Vision**
    **Emotionally Distressed Zombie**
    **Emperor**
    **Epic Face**
    **Epic Vampire Face**
    **Erisyphia - Face**
    **Err...**
    **Evil Skeptic**
    **Exclamation Face**
    **Existential Angst**
    **eXtreme**
    **Eyes of Everflame**
    **Eyes of Everfrost**
    **Ezebel Face**
    **Facepalm**
    **Fanciful Leprechaun Face**
    **Fang**
    **Fashion Face**
    **Fast Car**
    **Fawkes Face**
    **Fearless**
    **Finn McCool**
    **Football Player - Face**
    **Freckled Cheeks**
    **Freckles**
    **Friendly Cyclops**
    **Friendly Grin**
    **Friendly Pirate**
    **Friendly Puppy**
    **Friendly Smile**
    **Friendly Trusting Smile**
    **Frightening Unibrow**
    **Frightful**
    **Furious Finn Face**
    **Furious George**
    **Futureglam Bounty Hunter Face**
    **Genni the Snail Knight-Errant - Face**
    **Ghostface**
    **Gigglypuff**
    **Glee**
    **Glided Diver - Face**
    **Glided Diver - Face**
    **Glory on the Gridiron**
    **Golden Bling Braces**
    **Golden Evil Eye**
    **Golden Eyes - 24kGoldn**
    **Golden Lightning Speaker**
    **Golden Shiny Teeth**
    **Good Intentioned**
    **Goofball**
    **Grandma's Lipstick**
    **Green Amazeface**
    **Green Bubble Trouble**
    **Green Drool Angry Zombie**
    **Green Galaxy Gaze**
    **Green Glowing Eyes**
    **Green Goof**
    **Green Starface**
    **Green Super Happy Joy**
    **Green Trance**
    **Green Ultimate Dragon Face**
    **Green Whatchoo Talkin' Bout**
    **Green Wistful Wink**
    **Green-eyed Awesome Face**
    **Gritty Bombo**
    **Grumpy Blox**
    **Gwen "Axe Angel" Rosewood - Face**
    **Happy Girl Face**
    **Happy Wink**
    **Heart Gaze - Zara Larsson**
    **Heeeeeey...**
    **Hilarious**
    **Hmmm...**
    **Hockey Face**
    **Hold It In**
    **Huh?**
    **Hut Hut Hike!**
    **Hypnoface**
    **I <3 New Site Theme**
    **I Am Not Amused**
    **I Didn't Eat That Cookie**
    **I Hate Noobs**
    **I Lack Personal Confidence**
    **I wuv u**
    **iFace**
    **ILOVEFOOTBOLL!**
    **Imagine**
    **Isabella**
    **It's Go Time!**
    **It's so beautiful!**
    **Jack Frost Face**
    **Jacob: The Storm Breaker Face**
    **Jester Equinox - Face**
    **John's Face**
    **Joyful Smile**
    **Joyous Surprise**
    **Jungle Commando**
    **Just Trouble**
    **Kandi's Sprinkle Face**
    **Knight of Chivalry - Face**
    **Knight of Courage - Face**
    **Knight of Splintered Skies Ascendant - Face**
    **Know-It-All Grin**
    **Krezak - Face**
    **Kroma Blitz - Face**
    **Lady Darkshade - Face**
    **Lady Lashes**
    **Laughing Fun**
    **Lavender Amazeface**
    **Lazy Eye**
    **Lightning Speaker**
    **Lin's Face**
    **Lion**
    **Look At My Nose**
    **Lynn - Face**
    **Madbot 10000**
    **Magical Dragon**
    **Man Face**
    **Manicbot 10000**
    **Manlier Face**
    **Masque**
    **McLaren Big Grin**
    **McLaren Smile**
    **Meanie**
    **Meow?**
    **Merciless Ninja - Face**
    **Mermaid Mystique**
    **Mick McCann**
    **Mildly Irritated Face**
    **Minerva Bright - Face**
    **Mischievous**
    **Miss Scarlet**
    **Mixologist's Smile**
    **Mon Cheri Face**
    **Monarch Butterfly Smile**
    **Monster Face**
    **Monster Grumpy Face**
    **Monster Smile**
    **Mr. Bubbles**
    **Mr. Chuckles**
    **Mr. Oinkers**
    **Mr. Toilet - Face**
    **Muttdawg**
    **Mysterious**
    **NeoClassic Female v2 - Face**
    **Nervous**
    **NetHack Addict**
    **Nibbles, Devourer of Worlds**
    **Ninja**
    **No Z**
    **Noriko the Gentle Youkai Face**
    **Not Again!**
    **Not So Friendly Eviscerator**
    **Not sure if...**
    **NOWAI!**
    **O.o**
    **O_o**
    **Oakley's Face**
    **Obvious Wink**
    **Ochre Ogre**
    **Octavia, The Ivory Spider Girl - Face**
    **Ogre Face**
    **Oh Deer**
    **Oh Noes Another Dog**
    **Old Man Jenkins**
    **Old Timer**
    **Oli Zigzag - Face**
    **Optimist**
    **Orange Starface**
    **Orange Trance**
    **Otakufaic**
    **Overjoyed Smile**
    **Overseer: Assassin - Face**
    **Overseer: Prophet Face**
    **Owl**
    **Paintball Enthusiast**
    **Performing Mime**
    **Persephone's Girl Glam**
    **Pieface Jellyfreckles**
    **Pink Galaxy Gaze**
    **Pink Mermaid Princess**
    **Pink Moonstruck**
    **Pink Shades McCool**
    **Pink Wistful Wink**
    **Pizza Face**
    **Playful Vampire**
    **Poisonous Beast Mode**
    **Police Officer Nash - Face**
    **Pony Face**
    **Poor Man**
    **Pop Queen Smilestar Spectacusmile**
    **Prankster**
    **Prideful Smile**
    **Princess Alexis**
    **Puck**
    **Punk Face**
    **Purple Alien**
    **Purple Bubble Trouble**
    **Purple Butterfly Smile**
    **Purple Galaxy Gaze**
    **Purple Mermaid Princess**
    **Purple Moonstruck**
    **Purple Starface**
    **Purple Super Happy Joy**
    **Purple Trance**
    **Purple Wistful Wink**
    **Pwnda Face**
    **Quackface McGraw**
    **Quijibo**
    **Raccoon**
    **Rach - Face**
    **Radioactive Beast Mode**
    **Raig Face**
    **Rainbow Barf Face**
    **Rainbow Spirit Face**
    **RAWR!**
    **Really Embarrassed**
    **Red Fang**
    **Red Glowing Eyes**
    **Red Goof**
    **Red Lip - Tate McRae**
    **Red RAWR**
    **Red Rock Star Smile**
    **Red Serious Scar Face**
    **Red Tango**
    **Red Ultimate Dragon Face**
    **Red White and Starface**
    **Redonkulous**
    **Retro Smiley**
    **ROAR!!!**
    **ROBLOX Madness Face**
    **Rock Star Singer - Face**
    **Rodeo Vampire - Lil Nas X (LNX)**
    **Rogue Era Magus - Face**
    **Rogueish Good Looks**
    **Rose Amazeface**
    **Rosey Smile**
    **Royal Eye of Horus Face**
    **Ruby Archfey Visage**
    **Rudolph**
    **Sad**
    **Sad Clown**
    **Sad Zombie**
    **Sadfaic**
    **Sai-eye Tyler Joseph - Twenty One Pilots**
    **Samantha - Face**
    **Sammy "Slick" Witter - Face**
    **Sapphire Archfey Visage**
    **Sapphire Evil Eye**
    **Sapphire Laser Vision**
    **Scarecrow**
    **Scarecrow Face**
    **Secret Service**
    **Seeing Stars**
    **Semi Colon Open Paren**
    **Serena’s Face**
    **Serious Cat**
    **Serious Dog**
    **Serious Red Eye Scar**
    **Serious Scar Face**
    **Sharkbait - Face**
    **Sharpnine's Face of Disappointment**
    **Sharpnine's Face of Joy**
    **Sheriff Buffington - Face**
    **Shhh...**
    **Shiny Teeth**
    **Shocked**
    **Shutter Shades: The Face**
    **Shy Lady**
    **Sick Day**
    **Silence**
    **Silly Fun**
    **Silver Punk Face**
    **Singing**
    **Sir Rich McMoneyston, III**
    **Skater Boi - Face**
    **Skater Gurl - Face**
    **Skeletar**
    **Skeptic**
    **Slickfang**
    **Slithering Smile**
    **Slobbery Villain**
    **Sly Cat**
    **Sly Guy Face**
    **Smil Nas X - Lil Nas X (LNX)**
    **Smile**
    **Smiling Girl**
    **Smith McCool**
    **Sneaky Green-Eyed Snake**
    **Sneaky Steve**
    **Sniffles**
    **Snow Queen Smile**
    **Snowflake Eyes**
    **Snowman Face**
    **So Funny**
    **So Super Excited - Blue**
    **So Super Excited - Pink**
    **So Super Excited - Purple**
    **Sophisticated Spectacles**
    **Sorority Star Face**
    **Sparkle Time Sparkle Eyes**
    **Sparkling's Friendly Wink**
    **Specter Informant - Face**
    **Spring Bunny**
    **Squad Ghouls: Zoe Saberhagen - Face**
    **Square Eyes**
    **Squiggle Mouth**
    **Squinty Assassin Face**
    **Stare**
    **Starface**
    **Starry Eyed**
    **Starry Eyes Sparkling**
    **Steampunk Inventor - Face**
    **Steampunk Inventor - Face**
    **Stink Eye**
    **Stitchface**
    **Sunny Fun**
    **Sunrise Eyes - Tai Verdes**
    **Sunstar - Face**
    **Super Happy Joy**
    **Super Pink Heart Makeup**
    **Super Super Happy Face**
    **Surprise!**
    **Suspicious**
    **Sweat It Out**
    **Tango**
    **Tattletale**
    **Teal Mermaid Queen**
    **Teal Rock Star Smile**
    **Tears of Sorrow**
    **Terrain Assault Specialist - Face**
    **The Big Dog**
    **The Birdcaller - Face**
    **The Dog Whisperer**
    **The First Time I Ever Played ROBLOX...**
    **The Friendly Eviscerator**
    **The Phantom Phalanx: Cygnus-34 - Face**
    **THE SOUP IS DRY**
    **The Winning Smile**
    **Tiger Chase Fear Face**
    **Timmy McPwnage**
    **Tired Face**
    **Tix Vision**
    **Too Much Candy**
    **Toothless**
    **Toothy Drool**
    **Toothy Grin**
    **Torque the Blue Orc**
    **Torque the Green Orc**
    **Torque the Red Orc**
    **Trance**
    **Troublemaker**
    **True Love Smile**
    **Tsundere Expression**
    **Two Guys on a Boat**
    **Uh Oh**
    **Up To Something**
    **Upside Down Face**
    **Valkyrie of the Splintered Skies - Face**
    **Valorous Knight - Face**
    **Vampire**
    **Vans Checkerboard Blue Eyes**
    **Violet Fang**
    **Violet Starry Sight**
    **Visual Studio Seized Up For 45 Seconds... Again**
    **Walk the Plank You Scurvy Dogs!**
    **Warpaint Josh Dun - Twenty One Pilots**
    **WHAAAaaa!**
    **Whatchoo Talkin Bout**
    **Where are the eggs?**
    **Whistle**
    **Whuut?**
    **Wicked Webbed Berserker Face**
    **William "Big Bill" Conner - Face**
    **Wink-Blink**
    **Winning Smile**
    **Winter**
    **Woebegone**
    **Woman Face**
    **Wonder Woman's Golden Armor - Face**
    **WWE - Seth Rollins Face**
    **Wyldfire Fairy - Face**
    **x_x**
    **XD**
    **XD 2.0**
    **Xtreme Happy**
    **YAAAWWN.**
    **Yawn**
    **Yellow Glowing Eyes**
    **Yellow Starface**
    **You ated my caik!**
    **Yuck!**
    **Zed Face**
    **Zip It!**
    **Zoey Face**
    **Zombie Face**
    **ZOMG**
    **zOMG Hat Selling!**
    **¬_¬**
    **¬_¬ 2.0**
    diff --git a/.cursor/rules/roblox/en-us/art/characters/head-specifications.md b/.cursor/rules/roblox/en-us/art/characters/head-specifications.md deleted file mode 100644 index 37a86550..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/head-specifications.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -title: Head specifications -description: In-depth details on expected head schemas for Marketplace ---- - - -This content is for creators who intend to create character heads designated for the Marketplace, or any character heads that support assets from the Marketplace. - - -Character models designed to be sold on the Marketplace require a specific set of components and configuration standards to ensure all avatar features work as expected. The following guidance applies to character model heads to ensure universal support for head accessories and facial animations. - - -Validation for heads use a specialized process that may require adjustment of your existing head asset. For more information, see [validation process](./head-validation.md). - - - -Auto-setup recommendation -
    -[Avatar auto-setup](../../avatar-setup/auto-setup.md) is an automated tool that automatically generates components for your avatar character, **including the head cage and facial animation** required for Marketplace character models. You can save time by submitting character models without avatar components into the auto-setup tool and modifying the output. - -You can test and refine your auto-setup output by using the Avatar setup tool previews. You can even download your output as a `.gltf` and adjust the FACS or cage data in your DCC tools. - -You can alternatively manually modify your own cages and FACS animations within your DCC tools, which may require more time or additional iteration in your workflow, such as weight-painting adjustments, to ensure it meets Marketplace policies. - -To submit issues or feedback regarding the avatar auto setup tool, submit a [bug report](https://devforum.roblox.com/c/bug-reports/10). -
    - -## Head cage - - -The head cage is used to verify animations during validation. see [validation process](./head-validation.md). - - -Similar to other avatar body parts, an outer cage is required for the head. [High-quality cages](#caging-quality) ensure accessories and clothing items fit properly over the head. Head cages also serves to establish [facial landmarks](#facial-landmarks) for the eyes and mouth of the face for animation validation. - -### Caging quality - -For details on improving the quality of your head cage, see [Face cage optimizations](../characters/face-caging-best-practices.md). - -### Facial landmarks - -During validation, Roblox projects the cage eye/mouth regions to the base mesh to identify the eyes and mouth regions of your character head. Even for non-humanoid faces that don't include visual eyes or mouths, it's important to ensure that these landmarks still exist and can be projected over your base mesh. For more information on this process, see [validation process](./head-validation.md). - -Roblox expects the following 3 distinct landmarks in your cages: - -- Left eye landmark -- Right eye landmark -- Mouth landmark - - -
    - -
    Example face cage UV
    - -
    - -
    - -
    Highlighted vertices of cage are used to track eyes/mouth on base mesh
    -
    - -
    - - -
    Landmarks from cage applied to base mesh, used as an indicator for basic animation support during validation
    -
    -
    - - -The mouth landmark vertices are on the **second loop** of vertices from the mouth opening. This precision may help prevent issues with [landmark validation](./head-validation.md#landmark-projection). - -
    -
    - -## FACS animation - -Roblox supports facial animation on character heads and can support more than 50 base poses. If you are creating an avatar character, it must, at minimum, include the following 17 [FACS reference poses](../../art/characters/facial-animation/facs-poses-reference.md) to support avatar chat: - -- LeftEyeClosed -- RightEyeClosed -- EyesLookDown -- JawDrop -- Pucker -- LeftLipCornerPuller -- RightLipCornerPuller -- ChinRaiser -- ChinRaiserUpperLip -- LeftCheekRaiser -- RightCheekRaiser -- LeftInnerBrowRaiser -- RightInnerBrowRaiser -- LeftLipCornerDown -- RightLipCornerDown -- LeftLowerLipDepressor -- RightLowerLipDepressor - -While the 17 poses are a minimum requirement, it's recommended to include as many facial poses as possible in your asset to improve expressiveness and facial animation fidelity for facial animation and avatar chat. - -To [pass validation](./head-validation.md), the character head must successfully perform the following 5 facial actions. If the head can't deform at the points of the [cage landmarks](#head-cage) for these facial actions, validation fails for the asset. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Action Unit TestNon-Zero Control Values
    Left eye blinkLeftEyeClosed = `1`
    EyesLookDown = `1`
    Right eye blinkRightEyeClosed = `1`
    EyesLookDown = `1`
    Mouth opensJawDrop = `1`
    Happy expression Pucker = `1`
    LeftLipCornerPuller = `1`
    RightLipCornerPuller = `1`
    Sad expressionChinRaiser = `1`
    ChinRaiserUpperLip = `1`
    LeftCheekRaiser = `0.85`
    RightCheekRaiser = `0.85`
    LeftInnerBrowRaiser = `1`
    RightInnerBrowRaiser = `1`
    LeftLipCornerDown = `1`
    RightLipCornerDown = `1`
    LeftLowerLipDepressor = `1`
    RightLowerLipDepressor = `1`
    - -## Marketplace requirements - -Along with the other technical requirements listed, your items must meet the following additional specifications before uploading them to the Marketplace to sell: - -- Ensure that your items adhere to the [Marketplace program guidelines](../../marketplace/marketplace-policy.md). -- Whenever possible, ensure that your items adhere to the following modeling requirements: - - [Custom mesh specifications](../../art/modeling/specifications.md) - - Any applicable [avatar specifications](../../art/characters/specifications.md) -- Object `Class.MeshPart.Material|Material` is set to `Plastic`. -- Object `Class.MeshPart.Transparency|Transparency` is set to `0`. -- Object `Class.MeshPart.VertexColor|VertexColor` is the default `1, 1, 1`. -- If your head includes separate eyelash and eyebrow assets, you must add them to your character model as `Class.Accessory` objects. - - See [accessory specifications](../../art/accessories/specifications.md) for additional technical requirements. -- Your `Class.Model` instance doesn't contain extraneous objects, like `Class.Script` or additional `Class.Part` instances. diff --git a/.cursor/rules/roblox/en-us/art/characters/head-validation.md b/.cursor/rules/roblox/en-us/art/characters/head-validation.md deleted file mode 100644 index cacc1761..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/head-validation.md +++ /dev/null @@ -1,221 +0,0 @@ ---- -title: Head validation -description: In-depth details on how Roblox validates head assets ---- - - -This content is for creators who intend to create character heads designated for the Marketplace, or any character heads that support assets from the Marketplace. - - - -

    - -Roblox runs a rigorous validation to ensure the asset being uploaded to the Marketplace is compatible with all other assets on the Marketplace. For heads, validation primarily ensures that the head asset includes: - -- A correctly **configured cage** — to wear clothing and accessories. -- Correctly configured **facial animation poses** — to perform basic universal expressions, such as blinking and smiling. - -The primary validation check for heads [uses the cage to detect facial animation](#facial-animation-detection). See below for a reference of how validation processes, as well as [common issues](#common-issues). - - -Validation also checks for other issues, such as poor caging or missing required FACS poses. For more information, see [common issues](#common-issues). - - - -Auto-setup recommendation -
    -[Avatar auto-setup](../../avatar-setup/auto-setup.md) is an automated tool that automatically generates components for your avatar character, **including the head cage and facial animation** required for Marketplace character models. You can save time by submitting character models without avatar components into the auto-setup tool and modifying the output. - -You can test and refine your auto-setup output by using the Avatar setup tool previews. You can even download your output as a `.gltf` and adjust the FACS or cage data in your DCC tools. - -You can alternatively manually modify your own cages and FACS animations within your DCC tools, which may require more time or additional iteration in your workflow, such as weight-painting adjustments, to ensure it meets Marketplace policies. - -To submit issues or feedback regarding the avatar auto setup tool, submit a [bug report](https://devforum.roblox.com/c/bug-reports/10). -
    - -## Facial animation detection - -One of the primary dynamic head validation checks verifies if your head asset has **visually discernable** animations. To achieve this, the validation tool uses the head cage to ["project" landmarks](#landmark-projection) onto your base mesh. - -After these landmarks created, validation [tests various face animation poses](#facial-animation-detection) to ensure that these landmarks move and deform appropriately. Validation succeeds when it detects appropriate movement of the landmarks for eyes closed, mouth open, and basic happy/sad expressions. - -Failure to either assign landmarks onto the base mesh, or failure to deform landmarks appropriately can occur for several reasons. For more information, see [common issues](#common-issues). - -### Landmark projection - -Validation uses the head cage to project landmarks onto the head mesh. This helps Roblox establish where the eyes and mouth are and helps guide the facial animation test. - - - -
    - - -
    Cage mesh: Specific vertices of the cage mark eyes and mouth.
    -
    - -
    - - -
    Roblox validation projects these points onto the head mesh.
    -
    -
    - -
    - - -
    Head mesh: All landmarks projected from cage mesh to head mesh.
    -
    -
    - - -Once validation verifies that projection is successful and all landmarks established onto the head mesh, it can move onto testing facial animations. - - -### Test face animations - -Now that the validation system knows where to check for the eyes and mouth, the validation checks for facial animations to ensure that the following basic actions are possible: - -- Left and right eyes can close -- Mouth can open -- Basic happy and sad expressions - - For a full list of basic action units and poses, see [FACS animations](./head-specifications.md#facs-animation). - -The validation looks for the **relative change in the landmarks**. For example, when testing for right eye closing (FACS pose: `RightEyeClosed`), validation checks if the landmarks move from their original neutral state accordingly. - - - -
    - - -
    Face mesh with all projected landmarks applied from cage.
    -
    - -
    - - -
    -Validation verifies that the right eye can close based off of displacement of landmarks. -
    -
    -
    - -## Common issues - -Validation checks for several aspects of your head asset. If you are receiving an error related to dynamic head animation, use the following table for potential culprits: - - - - - - - - - - - - - - - - - - - -
    IssuePotential fixes
    The validation tool is **unable to successfully apply landmarks**.

    See [Unable to project landmarks](#unable-to-project-landmarks).
    - Verify that the **cage landmark vertices are positioned directly over the corresponding areas of the face**.

    - Verify that the **cage is not intersecting with the head mesh**. Landmark projection expects the cage to be over the head mesh.

    - **Check for any gaps, holes, or difficult surfaces** of the face where landmarks can fail to project.
    The validation tool is able to apply landmarks, but **can not detect animation**.

    See [Animations not displacing landmarks](#animations-not-displacing-landmarks).
    - Verify that **landmarks are on the areas of the eyes and mouth that move during animation**.

    - Verify that the **cage is not intersecting with the head mesh**. Landmark projection expects the cage to be over the head mesh.

    - **If using separate meshes for eyeballs and mouthbags**, ensure that your landmarks are applied to the head mesh, not the eyeballs or mouthbag. This can be achieved by slightly widening the area where your cages project landmarks.
    The validation tool doesn't detect [FACS animations](#animation-data-missing).- Your head doesn't include FACS animation. Verify that your head includes FACS poses and mapping.
    - -### Unable to project landmarks - -If validation is unable to apply the projection correctly onto the surface of the head, the validation fails. This often occurs if your **cage extends beyond your head mesh**, or if your head mesh has a **hole or gap** that prevents the application of the landmark. See the following examples: - - - -
    - - -
    Cage **extends too far beyond the mesh** and the validation is unable to apply 3 landmarks to the base mesh.
    -
    - -
    - - -
    -Base mesh has a **hollow gap** in the design, preventing validation from applying 3 landmarks to denote the eye area. -
    -
    -
    - - -In both cases, adjusting the cage to allow the proper projection of landmarks to the base mesh would resolve this issue. - - -### Animations not displacing landmarks - -In the case where landmarks are correctly applied to the base mesh and the base mesh includes FACS data, it's possible that the facial animations do not displace the landmarks enough to pass validation. See the following example: - - -
    - -
    Landmarks successfully established on base mesh, but are not near the expected regions.
    -
    - -
    - -
    When testing animations, validation doesn't detect the expected change to the landmark regions.
    -
    -
    - - -In the example case, adjusting the cage to allow the proper projection of landmarks at the appropriate areas would resolve this issue. - - -There may also be cases where the landmarks are correct, but the animation itself does not alter the projected landscapes enough to pass validation. In these cases, fixing the animation and/or optimizing the cage could help the validation properly identify the facial animation. - -### Animation data missing - -Heads require [17 specific FACS poses](./head-specifications.md#facs-animation) that are used to test the 5 basic actions. Regardless of landmarks or other FACS animations, validation immediately fails if the minimum 17 poses were not detected. - -For information on how to pose and map dynamic heads, see [Creating basic heads](../characters/facial-animation/create-basic-heads.md). - -## Working with non-humanoids - -Some character models, typically non-humanoids, have unnatural or missing eyes and mouths. The most common case of this is the classic blocky features. - -In this case, the cage still applies the expected landscapes to the head surface, and Roblox validates if facial animations correctly displace the facial animations. - - -
    - -
    The cage for a blocky character applies landmarks to the surface of the head.
    -
    - -
    - -
    Ensure that the landmarks are applied in areas where animation can effectively move the landmarks.
    -
    - -
    - -
    Validation checks the displacement of the landmarks to verify facial animation.

    Make sure that your [FACS animations](./head-specifications.md#facs-animation) properly affect the region where landmarks are applied.
    -
    - -
    - -In cases where eyes and mouths might be missing, the validation still projects landmarks and expects facial animation in those areas. - - -
    - -
    Although this character doesn't have eyes or mouth, the cage still attempts to project landmarks for those features.
    -
    - -
    - -
    In this example, the cage landmarks apply to the surface of this eye-less character head.
    -
    - -
    - -
    Validation checks the displacement of the landmarks to verify facial animation.

    Make sure that your [FACS animations](./head-specifications.md#facs-animation) properly affect the regions where the landmarks are applied.
    -
    - -
    diff --git a/.cursor/rules/roblox/en-us/art/characters/import.md b/.cursor/rules/roblox/en-us/art/characters/import.md deleted file mode 100644 index 11a2e1be..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/import.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: Import character bodies -description: Use the 3D Importer to add third-party models to Studio before testing, using, or uploading the character model. ---- - -Use the following instructions to import a full character body model into Studio as a `Model` object that you can save to use in your experience, share with others, or upload to the Marketplace. - - -If you are using a single-mesh character body for the Roblox Auto-Setup tool, see [Avatar auto-setup](../../avatar-setup/). - - -Studio's 3D Importer provides a quick and easy way to import third-party 3D assets into your projects. The importer provides object previews and error-checking to ensure that your asset meets Roblox's [general 3D requirements](../modeling/specifications.md). - -Keep in mind, your character model must also follow Roblox's [avatar character specifications](../characters/specifications.md) to use or sell this asset as an avatar-ready character model, or you may experience errors later in the workflow. - -To import your asset: - -1. From Studio's **File** menu, select **3D Importer**. -2. In the file browser, select the `.fbx` or `.gltf` file saved locally. The 3D Importer loads a preview of the object. - - - - - If textures don't load for your asset, you can manually import your textures later. - - See [3D importer](../../art/modeling/3d-importer.md) for additional information on import settings and troubleshooting. - -3. To begin body validation after import, enable **Validate UGC Body**. This can save you time if you intend on uploading your body to the Marketplace. -4. Set the **Rig Scale** to the appropriate [Body Scale](../characters/specifications.md#body-scale) of your character. - - -5. Select **Import**. The asset populates in your workspace as a `Class.Model` with the appropriate textures applied as a `Class.SurfaceAppearance` or `Class.MeshPart.TextureID`. - - -Manually add textures - - If textures didn't load correctly, add them manually. You may need to save and publish your experience in order to access the [Asset Manager](../../projects/assets/manager.md). - -1. In the **Asset Manager**, click the **Import** button. -2. Upload your image files. -3. After moderation clears for your image, select the `Class.MeshPart` parented within your imported `Class.Model`. -4. If you are using a single basic texture, set the `Class.MeshPart.TextureID` property to your uploaded texture image. -5. If you are using PBR textures: - - 1. Add a `Class.SurfaceAppearance` child to your `Class.MeshPart`. - - - - 2. In the `Class.SurfaceAppearance` properties, click each property value and assign the appropriate texture image from the asset dropdown: - - 1. Set the **ColorMap** to the **\_ALB** texture image. - 2. Set the **MetalnessMap** to the **\_MTL** texture image. - 3. Set the **NormalMap** to the **\_NOR** texture image. - 4. Set the **RoughnessMap** to the **\_RGH** texture image. - - - - - - - -After successful import, your model object should populate in your project as a `Class.Model` with the appropriate textures applied. - - -After successful fitting and converting, your 3D model should populate in your project as an `Class.Model`. - - -
    - -
    Avatar-ready character model in Workspace
    -
    -
    - -
    Avatar-ready character model in Explorer
    -
    -
    - - -Character creation is a complex process that requires lots of testing and iteration. See [Test characters](../../art/characters/testing/index.md) for steps on importing your character model into a test place and verifying your avatar and related components. - - -With this new character `Class.Model`, you can perform any of the following: - -- Begin the process of [uploading and publishing](../../marketplace/publish-to-marketplace.md#upload-an-asset) the character model to the Marketplace. This involves some additional validation and moderation steps. - -- Use the model in your current experience and modify the model's appearance with [HumanoidDescription](../../characters/appearance.md#manually-modify-appearance). - - - Playtest as the character by renaming the `Class.Model` to `StarterCharacter` and moving the `Class.Model` to the `Class.StarterPlayer` folder in the **Explorer** before play testing. - -- Save the model to your [Toolbox](../../projects/assets/toolbox.md) or make it public on the [Creator Store](../../production/creator-store.md) to share or use within any of your experiences. diff --git a/.cursor/rules/roblox/en-us/art/characters/index.md b/.cursor/rules/roblox/en-us/art/characters/index.md deleted file mode 100644 index 943ea180..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/index.md +++ /dev/null @@ -1,187 +0,0 @@ ---- -title: Avatar characters -description: All Roblox users are represented by an avatar character which can be customized with body parts, accessories, and clothes from the Marketplace or within experiences. ---- - - - -

    - -Every Roblox user is represented by a customizable character called an **avatar**. Avatars are character models with many specialized features that allow users to interact with the world and customize themselves with a wide range of clothing and accessories from the Marketplace. - -Custom avatars are first created in 3D modeling programs, such as [Blender](https://www.blender.org/) or [Maya](https://www.autodesk.com/products/maya/overview), before importing into Studio. To create a custom Roblox avatar character for your own experience, it's important to start with the following: - -- An advanced background with 3D modeling tools such as [Blender](https://www.blender.org/) or [Maya](https://www.autodesk.com/products/maya/overview). -- An understanding of the [components that make up an avatar character](#components-of-an-avatar). -- An understanding of the general [character creation process](#creation-process). -- Review the [basic character creation tutorial](../characters/creating/index.md) to get started on creating your first avatar character using Roblox's templates. -- [Various tools, resources, and guides](#resources) provided by Roblox to standardize and expedite the creation process. - -## Components of an avatar - -All avatar character models are made up of several fundamental components that provide users the functionality and flexibility to interact with their world. Many of these components are never made visible to the user, but they enable powerful avatar features that enhance social and environmental interactions. When creating avatar characters, all of these components are typically created first in your modeling software and then converted to their appropriate Roblox Studio instance on import. - -Each avatar character is made up of the following rendered and non-rendered components: - - - - -
    15 body part meshes make up the physical aspects of the character model
    - -
    Texture image maps apply a surface color and appearance. Transparency allows underlying part colors to be exposed, such as custom skin tones.
    - -
    -
    - - -
    A rigging armature allows the body parts to properly connect with each other, driving movement, expressions, and animations
    - -
    Facial animation data allows avatars to express virtually all types of facial expressions for chatting and socializing
    -
    - -
    Cage meshes set the outer boundary of the character, defining the surface where clothing and other layerable items can wrap and stretch over.
    - -
    Attachment points define where rigid accessories attach to a character
    - -
    -
    -
    - -### Body parts - - -
    Each avatar character is made up of 15 separate mesh objects
    - -
    These meshes must follow a standard naming convention
    -
    - -Roblox avatar characters are made up of 15 body parts, pieces of geometry that define the shape and contours of your avatar character. In Studio, these geometries are represented as `Class.MeshPart` objects and are nested under a single `Class.Model`. - -### Textures - - -
    Textures apply color and surface details to your character model.
    - -
    A texture image map's opacity can combine with the `Class.MeshPart.Color` to apply custom skin tones to characters.
    -
    - -Textures are image files that define the surface appearance of your character. You can create textures using a texture painting program or a 3D modeling software. In Studio, you must import textures as image files and access them through the `Class.SurfaceAppearance` instance, or set as a `Class.MeshPart.TextureID` property. - - -When texturing parts of your character model's body, ensure that your character model includes a modesty layer over sensitive regions. See [Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410#safety) for more information on Roblox's policies. - - -### Rigging armature - - -
    The armature is made up of 16 bones, 1 for each body part geometry and a root bone
    - -
    Bones must follow a specific hierarchy and naming convention
    -
    - -An armature allows each character to articulate its limbs and move naturally through the environment. Often referred to as bones or joints, this rigging character information includes skinning data which allows connected limbs, like the knees or elbows to bend organically. In Studio, each bone of the character armature is represented by `Class.Bone` objects that connect the character `Class.MeshPart` objects together. - -### Face animation data - - -
    Each avatar character face is rigged and skinned to create various expressions
    - -
    Each pose is mapped to a pose name within the Custom Properties (Extra Attributes in Maya) of the Head_Geo object
    -
    - -
    Each required face pose is saved as a keyframe in the animation timeline.
    -Facial animation data allow each character to use global facial expressions. Each character includes facial bones and skinning, animation timeline data, and mapped pose data that allows it. In Studio, these facial animation elements are represented by a `Class.FaceControls` instance. - -### Cage meshes - - -
    Head and Upper Torso cage mesh objects (wireframe)
    - -
    Cage objects must exist for each of the 15 body parts
    -
    - -This outer cage sets the invisible surface on which layerable accessories, such as clothing, will stretch and fit over the body. These cage meshes allow clothes to fit over models of different shapes and sizes without having to remodel the clothing item. In Studio, outer cage mesh objects are represented by a `Class.WrapTarget` instance. - -If you are caging your own non-template character model, it's important to use one of Roblox's body cage [project files](../../avatar/resources.md#mannequin-models) to ensure you are using a Roblox standard cage mesh. Removing or adding vertices from this standard mesh can cause issues with clothing fit and import. - -### Attachments - - -
    Each character has common attachment points for equipping rigid cosmetics
    - -
    Each avatar character must include their associated 19 attachment points
    -
    - -Attachment points define where rigid 3D accessories and equipables attach to the character's body. These are not rendered to the end-user but are represented as sphere geometries in 3D modeling software and, when imported into Studio, these geometries are created as `Class.Attachment` instances using the standardized names. - -When wearing layered clothing, the clothing isn't attached directly to the attachment, but it does reference the associated attachment point during ragdoll and dismemberment animations. - -## Creation process - -When designing an avatar model, you must export all of the avatar components in a single `.fbx` or `.gltf` for import into Studio. Since 3D creation isn't a linear process and always requires reiteration and testing, the process of creating an avatar character model can differ between individuals and various creation workflows. - -In general, the creation process follows these typical workflows: - - -
    Basic Creation with Templates
    Customize a Roblox template character that already includes all the necessary components. See [Create with templates](../characters/creating/index.md) for guides and instructions.
    - -
    Advanced Creation from Scratch
    Create characters from scratch, allowing full customization of the avatar character's components.
    -
    - - -Ensure that all assets you create follow any applicable [Marketplace policies](../../marketplace/marketplace-policy.md) and [Roblox Community Standards](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards). - - -## Resources - -There are a variety of resources available for creators of all backgrounds to get started with character creation. - -If you are interested in specific avatar creation topics, use the following table to find guides and resources that best match your needs: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TopicResources
    Tutorials[Basic character creation tutorial](../accessories/creating/index.md)
    Reference files[Avatar references and project files](../characters/project-files.md)

    [Example mesh/model objects](../modeling/project-files.md)
    Technical specs[.FBX export settings](../characters/export-settings.md)

    [Avatar specifications](../characters/specifications.md)

    [General mesh specifications](../modeling/specifications.md)

    [Accessory specifications](../accessories/specifications.md)

    [Marketplace policy](../../marketplace/marketplace-policy.md)
    Cosmetic creation[Accessories overview](../accessories/index.md)

    [Creating face accessories](../characters/facial-animation/create-face-accessories.md)

    [Accessory Fitting Tool](../accessories/accessory-fitting-tool.md)

    [Accessory specifications](../accessories/specifications.md)

    [Marketplace requirements](../../marketplace/marketplace-policy.md)
    Texturing[Texturing requirements](../modeling/texture-specifications.md)

    [PBR textures](../modeling/surface-appearance.md)
    Rigging and skinning[Rigging and skinning overview](../modeling/rigging.md)

    [Humanoid rig requirements](../characters/specifications.md#rig)

    [Rigging facial bones](../characters/facial-animation/create-basic-heads.md#rig)

    [Automatic Skinning Transfer](../accessories/automatic-skinning-transfer.md)

    [Skinning facial bones](../characters/facial-animation/create-basic-heads.md#skin-face-bones)
    Facial animation and live heads[Basic head creation](../characters/facial-animation/create-basic-heads.md)

    [Face accessory creation](../characters/facial-animation/create-face-accessories.md)

    [FACS pose references](../characters/facial-animation/facs-poses-reference.md)
    Testing and validation[Calisthenics Tool](../modeling/calisthenics-tool.md)

    [Clothing Validation Tool](../accessories/validation-tool.md)
    Publishing and Marketplace[Uploading to Marketplace](../../marketplace/publish-to-marketplace.md)

    [Marketplace policy](../../marketplace/marketplace-policy.md)

    [Fees and commissions](../../marketplace/marketplace-fees-and-commissions.md)
    diff --git a/.cursor/rules/roblox/en-us/art/characters/manually-update-catalog-heads.md b/.cursor/rules/roblox/en-us/art/characters/manually-update-catalog-heads.md deleted file mode 100644 index 3e11dda0..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/manually-update-catalog-heads.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: Manually Update Catalog Heads -description: Instructions for creators who need to re-upload their head for validation. ---- - - -The following content applies to **creators with head assets on the Marketplace** who received a notice that their head assets **no longer pass dynamic head validation.** - - - -This document is intended to be updated frequently to include the latest information to help guide you through the head update process. - - -If your head asset no longer passes the dynamic head validation, you need to fix and reupload your head asset to the Marketplace. **You do not need to update the body when the head was published as part of a body bundle**. You just need to update the head asset. - -This guide provides detailed information on how to perform a manual fix by re-caging your asset using a provided cage template using the following 5 main steps: - -1. [Re-validate](#1-verify-the-catalog-head-asset-fails-validation) your catalog head asset to confirm issues. -2. [Export your head](#2-export-your-head-from-roblox) (or body bundle) from Roblox as a glTF. -3. [Fix your Head](#3-fix-your-head-asset-in-blender) asset in Blender. -4. [Import](#4-import-your-fixed-head-back-into-studio) your fixed head back into Studio. -5. [Provide the asset ID](#5-provide-the-assetid-of-your-updated-head) of your updated head to Roblox. - - -While these instructions are provided for Blender, it's possible to perform equivalent steps in your preferred 3D modeling software. It's recommended to familiarize yourself with Roblox's head validation process before making changes to your head assets. - - -## 1. Verify the catalog head asset fails validation - -Roblox recently updated the dynamic head validation parameters to allow more existing catalog heads to pass validation while still enforcing that all heads in the catalog are dynamic. It's important to double check that your head still fails validation before proceeding with the rest of the steps. - -1. Open a new Roblox Studio and verify you have the beta feature **glTF Export** enabled (you might need to restart Studio to pick up the new setting) - 1. Verify your beta settings in **File** > **Beta Features**. -2. Run the following script in the command bar. - 1. You have the option to provide either the head id (asset ID) or the bundle id (for a full body bundle) . Just replace `my_asset_id` with the correct ID and remove the leading `--` to run - 2. Uncomment `createExportFromHeadAssetId(your_asset_id)` to retrieve only the head asset - 3. Uncomment `createExportFromBodyBundleId(your_bundle_id)` to retrieve the full body as a bundle (includes the head) - - ```lua - local AssetService = game:GetService("AssetService") - local Players = game:GetService("Players") - - local function createExportFromHeadAssetId(assetId: number) - local hd = Instance.new("HumanoidDescription") - hd.Head = assetId - - local char = Players:CreateHumanoidModelFromDescriptionAsync(hd, Enum.HumanoidRigType.R15) - local headMesh = char.Head :: MeshPart - headMesh.Size = headMesh.MeshSize - headMesh.CFrame = CFrame.identity - headMesh.Locked = false - - local exportModel = Instance.new("Model", workspace) - exportModel.Name = "ExportThisAsGLTF" - headMesh.Parent = exportModel - end - - local function getOutfitId(bundleInfo) - for _, item in pairs(bundleInfo.Items) do - if item.Type == "UserOutfit" then - return item.Id - end - end - error("Could not find outfit ID") - end - local function createExportFromBodyBundleId(bundleId: number) - local bundleInfo = AssetService:GetBundleDetailsAsync(bundleId) - local outfitId = getOutfitId(bundleInfo) - local hd = Players:GetHumanoidDescriptionFromOutfitIdAsync(outfitId) - local char = Players:CreateHumanoidModelFromDescriptionAsync(hd, Enum.HumanoidRigType.R15) - char:PivotTo(CFrame.identity) - char.Name = "ExportThisAsGLTF" - char.Parent = workspace - end - - -- createExportFromHeadAssetId(your_asset_id) - -- createExportFromBodyBundleId(your_bundle_id) - ``` - -3. Once the script runs, you will see a "ExportThisAsGLTF" model in workspace. Right-click and select **Save To Roblox**. This will popup the publish window: - 1. In Content type, select **Avatar Item**. - 2. In Asset Category, select **Head or Body** (if you used a body bundle). - 1. Wait for the validation result. - 3. If the dynamic head validation passes then you don't have to update this asset. - 4. **Cancel** the publish operation (so you don't incur fees). - -If your asset failed the dynamic head validation then you need to continue with the following steps. - -## 2. Export Your Head from Roblox - -Export your head or entire body from Blender as a glTF file: - -1. In the explorer, right-click on the "ExportThisAsGLTF" model and select **Save/Export** > **Save as glTF**. - -## 3. Fix your Head asset in Blender - -Fix your asset in Blender, or preferred 3D modeling software. In many cases, you may save time using a brand new head cage and fitting the cage over your character head. You may also see other validation issues that need to be addressed from the first step. - -1. In Blender, open a new empty scene and import the glTF file. -2. Ensure everything you need for the head is present, including the cage, attachment points, facial joints and facial animations. -3. Roblox Studio flips avatars by 180 degrees on import, so you need to rotate your asset back by 180 in Blender (Hotkeys: R+Z then type `180`). -4. Most often heads fail validation due to cage issues. For example, the cage may be completely inside the head, has incorrect UVs or looks completely misplaced in the model. In most cases we recommend you do not spend time editing the original cage and instead: - 1. Delete it from the asset. - 2. Select the cage from the head template in this folder that best matches the shape of your head asset. These are [Roblox provided templates for cages with the correct UV settings](../../assets/art/reference-files/HeadCages.zip). - - -5. Ensure the Blender animation start value is set to 0. -6. Remove vertex colors. In Blender this can be done by clicking on the mesh and then under the data tab selecting color attributes and removing any that exist. - -7. Modify your head asset to pass validation: - 1. Align cage eyes and mouth regions to the head. - 2. Ensure your head includes a rig, with poses keyframed and mapped to the FACs standard so that: - 1. Eyes must blink. - 2. Mouth must open and close. - 3. Face must express happy and sad. -8. Export your updated head asset to FBX file format using the correct settings explained here (If you have PBR, you may want to use glTF). - 1. Setup textures for FBX export (if needed). Blender will import the glTF textures in such a way that they won't be able to be exported in an FBX file by default. - 1. To fix this go through each image and save it to your disk locally. - - -## 4. Import your fixed head back into Studio - -Import your head back into Studio and verify that it passes validation. If validation fails, check the error messages and address the issues in your 3D modeling software again. If validation passes, use the following steps to upload as a **Development Item** (not Avatar item). - -1. Import the FBX/glTF file with your (fixed) head asset back into Studio. -2. Make sure your head asset passes validation. - 1. The easiest way to accomplish this is: - 1. Select **Save to Roblox** on your asset. - 2. Select **Avatar Item**. - 3. Set its **Asset Category** to Head. - 4. Wait for the Dynamic Head validation result (pass or fail). - 5. **Cancel** the save operation so you don't incur publishing fees at this time. - 2. If your head doesn't pass validation then you need to go back to Blender, Maya and make the appropriate fixes to pass validation. -3. If your head passes validation, publish your asset as a Development Item. - 1. Select **Save to Roblox** on your asset. - 2. Select **Development Item**. - 3. Set its **Asset Category** to Model. - 4. Save the model to Roblox (no publishing fees are incurred). - 1. Get the asset ID of the head asset (not the body bundle). - -## 5. Provide the assetID of your updated head - -Use the following steps to provide Roblox the updated asset ID to replace your head with: - -1. Use the link to the web form in the email notification corresponding to your asset to communicate back the asset ID of your updated head. - 1. You will be asked to enter your date of birth for each update. This is a legal requirement we can't bypass. - 2. You can submit multiple times. We will use your last submission as the "final" version to the update. -2. Roblox will complete the update of your catalog asset with the modifications you provided. - -## Additional Resources - -Roblox has published a series of documentation and video tutorials on best practices for creating dynamic head assets. - -- [Dynamic head overview](./facial-animation/) -- [Head validation process](./head-validation.md) -- [Avatar Auto-Setup](../../avatar-setup/auto-setup.md) -- [Caging Best Practices](../accessories/caging-best-practices.md) diff --git a/.cursor/rules/roblox/en-us/art/characters/project-files.md b/.cursor/rules/roblox/en-us/art/characters/project-files.md deleted file mode 100644 index faf52935..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/project-files.md +++ /dev/null @@ -1,216 +0,0 @@ ---- -title: Avatar project files and references -description: Download various character-related project files and reference files. ---- - - -See [Resources](../../avatar/resources.md) for a complete list of avatar-related downloadable content. - - -## Project files - -The following `.fbx`, `.blend`, and `.ma` project files are available to use as examples, boilerplate, or reference: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FilenameDescription
    Lola.fbxA skinned R15 character created from the Skin a humanoid model guide. Since this reference model doesn't yet have [inner and outer cage mesh data](../../art/characters/specifications.md#inner-and-outer-cages), this model can't equip layered clothing or accessories.
    Fish-Person.zipA rigged and skinned humanoid character model with a full body cage, facial animation rig, and associated PBR texture maps.
    BlockyCharacter.fbxA Blocky character model with an [animatable head](../../art/characters/facial-animation/index.md) and a full body cage.
    GoblinCharacter.zipA Goblin character model with an [animatable head](../../art/characters/facial-animation/index.md) and a full body cage.
    ClassicMannequin.fbxA [classic body](../../art/characters/specifications.md#classic) type blank mannequin to use in Studio or your modeling application.
    ClassicMannequin_With-CagesA [classic](../../art/characters/specifications.md#classic) body type blank mannequin with **body cages** to use in Studio or your modeling application for clothing design. Due to unconfigured cage objects, this file may not import correctly into Studio until modified.
    RthroMannequin.fbxAn [Rthro Normal](../../art/characters/specifications.md#normal) body type blank mannequin to use in Studio or your modeling application.
    RthroMannequin_With-Cages.fbxAn [Rthro Normal](../../art/characters/specifications.md#normal) body type blank mannequin with **body cages** to use in Studio or your modeling application for clothing design to use in Studio or your modeling application. Due to unconfigured cage objects, this file may not import correctly into Studio until modified.
    RthroSlenderMannequin.fbxAn [Rthro Slender](../../art/characters/specifications.md#slender) body type blank mannequin to use in Studio or your modeling application.
    RthroSlenderMannequin_With-Cages.fbxAn [Rthro Slender](../../art/characters/specifications.md#slender) body type blank mannequin with **body cages** to use in Studio or your modeling application to use in Studio or your modeling application for clothing design. Due to unconfigured cage objects, this file may not import correctly into Studio until modified.
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    FileDescription
    Rig_and_Attachments_Template.blendStarting armature rig template for Blender. Contains an armature with correct R15 naming conventions and attachment points. Use this template for rigging bodies and clothing items.
    Body_Cage_Template.blendStarting template for Blender, includes individual body part cages for each 15 humanoid parts. Use this template for caging your avatar bodies.

    To save time, edit the full-body `std_cage_deformable` mesh to automatically apply vertex changes to the individual body-part meshes. When importing the `.fbx` into Studio, you can remove this helper mesh.
    Combined-Template.blendTemplate file containing all content from previous templates, includes rig skeleton, body cages, attachment points. Use this template to rig and cage bodies and accessories.
    - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    FileDescription
    Rig_and_Attachments_Template.maStarting armature rig template for Maya. Contains an armature with correct R15 naming conventions and attachment points. Use this template for creating bodies and clothing items.
    Body_Cage_Template.maStarting template for Maya, includes individual body part cages for each 15 humanoid parts. Use this template for caging your avatar bodies.

    To save time, edit the full-body `std_cage_deformable` mesh to automatically apply vertex changes to the individual body-part meshes. When importing the `.fbx` into Studio, you can remove this helper mesh.
    Combined-Template.maTemplate file containing all content from previous templates, includes rig skeleton, body cages, attachment points. Use this template to rig and cage bodies and accessories.
    - -
    - - - The following `.fbx` files were exported from Maya for use in modeling applications. If you are using Blender or Maya in your workflow, use the specific template files for those programs instead of the following files. - - - - - - - - - - - - - - - - - - - -
    FileDescription
    Rig_and_Attachments_Template.fbxStarting armature rig template for general modeling software. Contains an armature with correct R15 naming conventions and attachment points. Use this template for creating bodies and clothing items.
    Body_Cage_Template.fbxStarting template for general modeling software, includes individual body part cages for each 15 humanoid parts. Use this template for caging your avatar bodies.

    To save time, edit the full-body `std_cage_deformable` mesh to automatically apply vertex changes to the individual body-part meshes. When importing the `.fbx` into Studio, you can remove this helper mesh.
    -
    -
    - -## Templates - -If you are creating character models, you can choose from a variety of starting templates that best match your final design and save time on creating the [avatar components](../../art/characters/index.md#components-of-an-avatar). See [Create with templates](../../art/characters/creating/index.md#template-files) for important information on using these template files. - -Each `.zip` contains a `.blend`, `.fbx`, and PBR texture `.png` files for that template model. If using Blender or following the [template creation guides](../../art/characters/creating/index.md), use the `.blend` project. - - -If you are using Roblox's avatar template files, you must perform the [cleanup steps](../../art/characters/creating/combine-head-geometry.md) in order for the assets to properly validate before publishing to the Marketplace. - - - - - -
    Round
    -
    -

    - Female: RoundFemale.zip
    - Male: RoundMale.zip -
    -
    - -
    Square
    -
    -

    - Female: SquareFemale.zip
    - Male: SquareMale.zip -
    -
    - -
    Muzzle
    -
    -

    - Female: MuzzleFemale.zip
    - Male: MuzzleMale.zip -
    -
    -
    - - - -
    Realistic
    -
    - Female: SemiRealisticFemale.zip
    - Male: SemiRealisticMale.zip -
    -
    -
    - - -
    Anime
    -
    - Female: AnimeFemale.zip
    - Male: AnimeMale.zip -
    -
    -
    - - -
    Stylized
    -
    - Single body: Stylized.zip -
    -
    -
    - - -
    Caricature
    -
    - Single body: Caricature.zip -
    -
    -
    -
    diff --git a/.cursor/rules/roblox/en-us/art/characters/specifications.md b/.cursor/rules/roblox/en-us/art/characters/specifications.md deleted file mode 100644 index 6ec82822..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/specifications.md +++ /dev/null @@ -1,721 +0,0 @@ ---- -title: Character specifications -description: Character specification lists the specific technical requirements for custom characters created outside of Studio. ---- - -Character models require a specific set of components and configuration standards to ensure all avatar features work as expected. Check that your model meets the following modeling specifications and guidelines before exporting to ensure Studio compatibility. - -When ready to export, see the [export requirements](../../art/characters/export-settings.md) for mesh export settings for Blender and Maya. - - -If creating other types of 3D models: -
      -
    • For generic meshes, see [general mesh specifications](../modeling/specifications.md) and [general export settings](../modeling/export-requirements.md).

    • -
    • For rigid accessories, see [accessory specifications](../accessories/specifications.md) and [accessory export settings](../accessories/export-settings.md).

    • -
    • For layered accessories, see [layered accessory specifications](../accessories/clothing-specifications.md) and [layered export settings](../accessories/clothing-export-settings.md).

    • -
    -
    - -## Geometry - -Avatar character models are made up of 15 separate mesh objects and require additional geometry requirements to import into Studio and publish successfully. In addition to the body [types](#body-scale), [parts](#body-parts), and [budget](#triangle-budgets) specifications, ensure that your models also fulfill the following general requirements when modeling: - -- **Watertight** - All geometry must be watertight without exposed holes or backfaces. Meshes used as outer cages do not need to be watertight. -- **No N-gons** - Model your assets in quads where possible. -- **Transformations** - All translation, rotation, and scale values must be frozen and pivots set to `0`, `0`, `0`. -- **Orientation** - Characters must face positive Z and stand up in positive Y. -- **Pose** - Before exporting, set your character to an I-Pose, A-Pose, or T-Pose when possible. - -### Body scale - -Roblox supports 3 standards of body scales: **Normal**, **Slender**, and **Classic**. These standards allow developers to create experiences and spaces with consistent body sizes for standardizing movement and interaction. You can select a body scale on import using [Rig Scale options](../modeling/3d-importer.md#rig-general), or modify the [body scale manually](../../art/accessories/body-scale.md). Body scale persists when the asset is [uploaded to the Marketplace](../../marketplace/publish-to-marketplace.md#upload-an-asset). - -
    -
    - -
    -A visualization of how Roblox combines the 15 body parts into 6 distinct assets. -
    -
    -
    - - -Since body assets partially overlap with each other, the total body dimensions do not represent the sum of the avatar's asset dimensions. The total body dimension is the most important factor of each body scale to ensure a standard avatar size and scale. - - -#### Normal - -
    -
    - -
    -A Rthro Normal body scale [downloadable mannequin](../../avatar/resources.md#references). -
    -
    -
    - -In the [3D importer](../../art/modeling/3d-importer.md#avatar-general), use **Rig Type** > **Rthro** to import your model as a Normal body scale. - -
    - - -
    -
    Minimum (in studs)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PartX (width)Y (height)Z (depth)
    Head.5.5.5
    Arm.251.5.25
    Torso.851.7.7
    Leg.251.4.5
    **Total****1.35****3.6****.7**
    -
    -
    -
    Maximum (in studs)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PartX (width)Y (height)Z (depth)
    Head322
    Arm24.52
    Torso4.63.52.25
    Leg1.542
    **Total****8.6****9.5****2.25**
    -
    -
    - -#### Slender - -
    -
    - -
    -A Rthro Slender (Narrow) body scale [downloadable mannequin](../../avatar/resources.md#references). -
    -
    -
    - -In the [3D importer](../../art/modeling/3d-importer.md#avatar-general), use **Rig Type** > **Rthro Narrow** to import your model as a Slender body scale. - -
    - - -
    -
    Minimum (in studs)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PartX (width)Y (height)Z (depth)
    Head.5.5.5
    Arm.251.5.25
    Torso.851.7.7
    Leg.251.4.5
    **Total****1.35****3.6****.7**
    -
    -
    -
    Maximum (in studs)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PartX (width)Y (height)Z (depth)
    Head222
    Arm1.542
    Torso33.52
    Leg1.542
    **Total****6****9.5****2**
    -
    -
    - -#### Classic - -
    -
    - -
    -A Classic body scale [downloadable mannequin](../../avatar/resources.md#references). -
    -
    -
    - -In the [3D Importer](../../art/modeling/3d-importer.md#avatar-general), use **Rig Type** > **Default** to import your model as a Classic body scale. - -
    - - -
    -
    Minimum (in studs)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PartX (width)Y (height)Z (depth)
    Head.5.5.5
    Arm.251.5.25
    Torso.851.7.7
    Leg.251.4.5
    **Total****1.35****3.6****.7**
    -
    -
    -
    Maximum (in studs)
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PartX (width)Y (height)Z (depth)
    Head1.51.82
    Arm232
    Torso43.82
    Leg1.53.52
    **Total****8****9.1****2**
    -
    -
    - -### Triangle budgets - -Although model geometries are typically created using quads, the Roblox Engine converts imported assets into tris. Each asset of your character model must not exceed our maximum tri budget. To quickly get the number of expected tris in your third-party modeling application, you can double the number of quads in your model. - -When character models are uploaded to Studio and created into assets for the Marketplace, the body is split into 6 individual assets: **DynamicHead**, **Torso**, **LeftArm**, **RightArm**, **LeftLeg**, **RightLeg**. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Asset typeIncluded mesh objectsMaximum triangles
    DynamicHeadHead4000
    TorsoUpperTorso, LowerTorso1750
    LeftArm LeftUpperArm, LeftLowerArm, LeftHand1248
    Right ArmRightUpperArm, RightLowerArm, RightHand1248
    LeftLeg LeftUpperLeg, LeftLowerLeg, LeftFoot1248
    Right LegRightUpperLeg, RightLowerLeg, RightFoot1248
    TotalHead, UpperTorso, LowerTorso, LeftUpperArm, LeftLowerArm, LeftHand, RightUpperArm, RightLowerArm, RightHand, LeftUpperLeg, LeftLowerLeg, LeftFoot, RightUpperLeg, RightLowerLeg, RightFoot10,742
    - -### Body parts - -See the following specifications for the individual mesh objects that make up a character model: - -- **Naming Convention** - Limbs must all be specifically named: - - UpperTorso_Geo - - LowerTorso_Geo - - LeftUpperArm_Geo - - LeftLowerArm_Geo - - LeftHand_Geo - - RightUpperArm_Geo - - RightLowerArm_Geo - - RightHand_Geo - - LeftUpperLeg_Geo - - LeftLowerLeg_Geo - - LeftFoot_Geo - - RightUpperLeg_Geo - - RightLowerLeg_Geo - - RightFoot_Geo - - Head_Geo -- **Caps** - Limbs must be capped, so that they form a full watertight mesh when separated from the body. Caps can be rounded or flat depending on design. - - - -### Face accessories - -Face accessories, such as hair, eyebrows, and eyelashes are unique accessories that you can bundle with an avatar body upload. At this time, eyebrows and eyelashes can not be uploaded as standalone accessories and must be bundled with an avatar body. See [Accessory specifications](../accessories/specifications.md#face-accessories) for additional information on face accessories. - -### Visibility - -To ensure that avatar sizes are visually consistent, you must standardize body part visibility with the following requirements: - -- **Opacity** - Body parts must be fully opaque. -- **Bounding Boxes** - Body part assets must take up a significant visible portion of their bounding box in a front, side, and back view. - - Body parts, such as Torso, Left Arm, Right Leg, must take up at least 50% of body part's bounding box. - - The head part must take up at least 50% of the mesh's bounding box. - -
    - -
    An acceptable head mesh example that takes up a majority of the bounding box in the front view
    -
    -
    - -
    A non-acceptable head mesh example that does not take up the appropriate amount of bounding box space in the front view
    -
    -
    - -## Attachments - -Attachments are points on the humanoid model where rigid accessories attach. Like many [character components](./index.md#components-of-an-avatar), attachment points are set up in third-party modeling software and imported as `Class.Attachment` objects. - -The 3D Importer automatically recognizes and converts mesh objects as attachment points if the objects include the affix `\_Att` and follow the naming conventions below. This only applies when importing meshes with caging data, such as bodies (accessory attachment points are created using the Accessory Fitting Tool). Check out examples of this implementation in any of the [downloadable reference models](../../avatar/resources.md#references). - -Generally, when placing attachment points, position them so they overlap halfway with the character model's mesh part. - - -
    - -
    Incorrect placement of collar attachments
    -
    -
    - -
    Correct placement of collar attachments
    -
    -
    - -Attachments must follow a specific naming convention and positional consistency: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Mesh partAttachment nameDetails
    HeadFaceCenter_AttAnywhere within mesh bounding box
    FaceFront_AttFront half of mesh bounding box
    Hat_AttTop half of mesh bounding box, can overlap with Hair_Att
    Hair_AttTop half of mesh bounding box, can overlap with Hat_Att
    UpperTorsoLeftCollar_AttLeft top half of mesh bounding box
    RightCollar_AttRight top half of mesh bounding box
    Neck_AttTop half of mesh bounding box
    BodyBack_AttBack half of mesh bounding box
    BodyFront_AttFront half of mesh bounding box
    LowerTorsoRoot_AttMust set to `0`, `0`, `0` position
    WaistFront_AttFront half of mesh bounding box, can overlap with WaistCenter_Att
    WaistBack_AttBack half of mesh bounding box
    WaistCenter_AttAnywhere in mesh bounding box, can overlap with WaistFront_Att
    RightUpperArmRightShoulder_AttTop half of mesh bounding box
    RightHandRightGrip_AttAnywhere in mesh bounding box.

    Orient grip attachments **perpendicular** to the lower arm bone. For example, for I-Pose (arms pointing down), set the grip attachment to `90`, `0`, `0` (grip attachment pointing forward).

    LeftUpperArmLeftShoulder_AttTop half of mesh bounding box
    LeftHandLeftGrip_AttAnywhere in mesh bounding box.

    Orient grip attachments **perpendicular** to the lower arm bone. For example, for I-Pose (arms pointing down), set the grip attachment to `90`, `0`, `0` (grip attachment pointing forward).

    RightFootRightFoot_AttAnywhere in mesh bounding box
    LeftFootLeftFoot_AttAnywhere in mesh bounding box
    - -## Rigging - -Unlike generic rigs, humanoid models require a specific hierarchy and naming conventions for the internal bone or joint structure. - - -
    - -
    Humanoid rig model
    -
    -
    - -
    Humanoid rig bone structure (Blender)
    -
    -
    - -See the following requirements for humanoid rigging: - -- **Rig Hierarchy** - Humanoid rigs require a specific bone hierarchy and naming convention: - - - Root - - HumanoidRootNode - - LowerTorso - - UpperTorso - - Head (representing the base of the neck) - - LeftUpperArm - - LeftLowerArm - - LeftHand - - RightUpperArm - - RightLowerArm - - RightHand - - LeftUpperLeg - - LeftLowerLeg - - LeftFoot - - RightUpperLeg - - RightLowerLeg - - RightFoot - - -
    - -
    Blender rig hierarchy
    -
    -
    - -
    Maya rig hierarchy
    -
    -
    - -- **LowerTorso and Root** - The LowerTorso and Root bone or joint position must be set to `0`, `0`, `0`. -- **Pose** - Export your character model in an I-Pose, A-Pose, or T-Pose for the best Studio compatibility. The LeftUpperArm and RightUpperArm bones can be exported with rotation values to meet this requirement. - -## Skinning - -Roblox supports skinning for rigged meshes. See [Rigging and Skinning](../../art/modeling/rigging.md) for more details on implementing skinned meshes in your experience. - -See the following requirements for skinning: - -- **Max Influences** - A vertex can not be influenced by more than 4 bones or joints. -- **No Root Influences** - Do not apply influences to the Root bone or joint. -- **Symmetry** - When possible, maintain symmetry when applying influences to a rig. - -## Facial animation - -For information on required facial animation support, see [head specifications](./head-specifications.md#facs-animation). - -## Textures - -- Textures for Marketplace assets can't exceed 2048x2048 resolution. -- Textures created for accessories must meet Roblox's [texture specifications](../../art/modeling/texture-specifications.md). High resolution textures are automatically converted to lower-resolution textures to optimize performance. -- Avatar characters must follow Roblox's [texture specifications](../../art/modeling/texture-specifications.md). Characters created for the Marketplace can take advantage of [custom skin tones](#custom-skin-tone) which use alpha layers allow users to select their own base color. - -### Custom skin tone - -When texturing an avatar character model where the user can set their own skin tone, set the exposed skin areas as transparent so a default color or texture is not baked into the texture. When rendering, the Studio engine applies the transparent layer on top without any layer effects. This step applies mostly to human-like characters with exposed skin that you intend users to customize. - -The following are examples of skin tone shading for the face, and you can apply this process with any part of an avatar with exposed skin: - - -
    - -
    -
    - - Use 100% opacity for areas not related to a customized skin tone, such as eyes and brows. - - When applying shading, use black at low opacity and adjust opacity when needed. - - For areas that are partially translucent, such as shading contours or certain cosmetic features, leave some transparency for partial visibility of the skin tone. - - You should consistently test out how various colors layers can interact with your shading. -
    -
    - - -
    - -
    Beige
    -
    -
    - -
    Blue
    -
    -
    - -
    Brown
    -
    -
    - -
    Pink
    -
    -
    - -## Outer cages - -Outer cages on your character model allow your character to wear layerable accessories, such as clothing. Models, such as an avatar character, that are the target of meshes that will stretch over it, only require an outer cage, but meshes that deform, like [layered clothing](../accessories/clothing-specifications.md#cage-meshes), require an inner and outer cage. - -For general use, see the following requirements for adding outer cage meshes to your model: - -- Use Roblox's [auto setup tool](../../avatar-setup/auto-setup.md) or Roblox's [body cage templates](../../avatar/resources.md#project-files) to ensure naming convention and other configurations are correct. -- **Naming Conventions** - The outer cage of a body part must be named after the primary mesh object with **\_OuterCage** affixed, for example `LeftUpperArm_OuterCage`. -- **Vertices and UV Map** - Don't delete vertices or alter the UVs on the Outer Cages as this can cause errors when importing in Studio or when equipping onto a character. Use the Roblox provided templates for the cage meshes to ensure compatibility with other layered assets. -- **Symmetry and consistency** - Keep each face (the space between vertices) consistently sized and retain symmetry wherever possible. Use symmetry tools in your modeling software whenever possible. -- For information on head cages and best practices, see [head specifications](../characters/head-specifications.md#head-cage). - -## Marketplace requirements - -Along with the other technical requirements listed, your items must meet the following additional specifications before uploading them to the Marketplace to sell: - -- Ensure that your items adhere to the [Marketplace program guidelines](../../marketplace/marketplace-policy.md). -- Whenever possible, ensure that your items adhere to the following modeling requirements: - - [Custom mesh specifications](../../art/modeling/specifications.md) - - Any applicable [avatar specifications](../../art/characters/specifications.md) -- Object `Class.MeshPart.Material|Material` is set to `Plastic`. -- Object `Class.MeshPart.Transparency|Transparency` is set to `0`. -- Object `Class.MeshPart.VertexColor|VertexColor` is the default `1, 1, 1`. -- If your head includes separate eyelash and eyebrow assets, you must add them to your character model as `Class.Accessory` objects. - - See [accessory specifications](../../art/accessories/specifications.md) for additional technical requirements. -- Your `Class.Model` instance doesn't contain extraneous objects, like `Class.Script` or additional `Class.Part` instances. diff --git a/.cursor/rules/roblox/en-us/art/characters/testing/blender.md b/.cursor/rules/roblox/en-us/art/characters/testing/blender.md deleted file mode 100644 index 0832d227..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/testing/blender.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Test in Blender -comments: -description: Verify the important aspects of your character model in Blender before importing into Studio. -next: /art/characters/testing/studio -prev: /art/characters/testing/ ---- - -You can quickly verify many of your components in Blender, allowing you to catch out problems that may cause issues later on. You can use a mix of Blender native tools and Roblox's helper plugins to check for many common issues in your character model. - -## Facial animation data - -Facial animation uses multiple modeling components to work effectively. If using a template, or making changes to a model with existing facial animation data, it's sometimes possible to make a change that affects the saved poses, either in the animation timeline, or in the custom property of the head mesh. - -Use the following steps to help verify the integrity of your facial animation data: - -1. With the Armature object selected, check the animation frame in the **timeline**: - - 1. The timeline typically ranges between **0–330**, though not all templates use the entire range, and there may be gaps between poses. - - 2. The **neutral pose** should be on **frame 0**. - 3. There shouldn't be any keyframe gaps between the frames with animation data. - -2. Verify the **Object Properties** > **Custom Properties** panel for the Head_Geo object: - - - 1. There should be a **RootFaceJoint** attribute set to the name of the first facial animation bone. - - 1. This bone should be a child of the **Head** bone, one of the 15 required bones in an avatar's armature. - 2. In templates and some reference models, this bone is commonly named `DynamicHead` and indicates the beginning of the facial animation rig. - - 2. There should be about the same number of custom properties as unique animation frames, with each animation pose having its own mapped custom property. - 3. The names for the mapped poses here should match the spelling and capitalization of the [FACS pose reference](../../../art/characters/facial-animation/facs-poses-reference.md). - - - - -If you discover issues with your face animation data, you may need to repeat the skinning, posing, or mapping processes for your character's head. See [Creating Heads](../../../art/characters/facial-animation/create-basic-heads.md) for a general overview of the avatar head creation process. - -If you are using a template and run into issues, it's possible the facial data was overridden by a saved animation, or the rigging or mapped data was mistakenly deleted. If it's difficult to quickly identify and resolve the issue, it may be quicker to restart your character customization from the original template file. - - -## Body skin - -Properly skinning your character models ensures natural joint movements and realistic poses and expressions. There are several ways to verify skinning data, like using Blender's Pose Mode to pose the joints and examine how certain orientations can affect the joint skinning. - -Use the following steps in Blender to verify your joint skinning in Pose mode: - -1. With the **Armature** object selected, navigate to the **Object Properties** > **Viewport Display** and enable **Show In Front**. This allows you to see and access bones within your character. -2. With the armature selected, and switch to **Pose Mode**. -3. Select all the face bones of your model and press H to hide. You can reveal these again later with AltH (⌥H) in Pose mode. -4. Select any body bone and press R to rotate. Verify that your body bones correctly deform and bend the character mesh as expected in natural poses. - - 1. While actively rotating a bone, right-click to cancel the rotation and set the bone to its original position. - 2. While actively rotating a bone, you can **click to confirm** the rotation and save the current position. You can combine this to make various poses of your character by changing the rotation of various limbs at once. - 3. If you've saved a rotation, press AltR (⌥R) to clear any rotation in Pose Mode. Make sure to reset your pose whenever you complete testing. - - - -You can also run through common poses and movements using Roblox's [Calisthenics Tool](../../../art/modeling/calisthenics-tool.md) add-on, which applies several common animations to an avatar armature that you can play back and review in Blender's animation timeline. - - -The [Calisthenics Tool](../../../art/modeling/calisthenics-tool.md) adds animations to your timeline to quickly preview body animations. Be careful when saving or exporting your character when using this tool, as it may conflict with saved facial animation data that uses the same timeline. - - - - - -If you discover issues with your skinning, you may need to troubleshoot and reapply rigging and skinning steps to your humanoid. See [Rigging and skinning](../../../art/modeling/rigging.md) for an overview of the rigging and skinning processes. - -If you are using a template, it's possible the skinning data was affected by a destructive modeling change. This may require reskinning, or starting over your character customization from the original template file. - - -## Technical specifications - -Your avatar components should match the requirements provided in the [avatar specifications](../../../art/characters/specifications.md). When using templates and following appropriate non-destructive modeling practices, most of these components should not be touched, but you should still double-check that each component is compliant with the technical requirements. - - -If you are using Roblox character templates and are ready to export into Studio, see [Exporting instructions](../../../art/characters/creating/export-textures.md) for specific export instructions for template files. - diff --git a/.cursor/rules/roblox/en-us/art/characters/testing/index.md b/.cursor/rules/roblox/en-us/art/characters/testing/index.md deleted file mode 100644 index 87fd4769..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/testing/index.md +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: Testing characters -comments: -description: Verify the important aspects of your character model in Blender and in Studio. -next: /art/characters/testing/blender ---- - -It's important to constantly test your models during and after the creation process to ensure that your character can interact with various social and environmental elements in any experience. - -Whether you are using a template character, or your own custom assets, use the information provided in [Test in Blender](../../../art/characters/testing/blender.md) and [Test in Studio](../../../art/characters/testing/studio.md) throughout your workflow to comprehensively test your assets and quality check your models. - -Use the following table as an overview of common tests and resources to verify each component of your character model. - - - - - You can apply the following workflows with any modeling software, though certain interfaces and instructions may differ between platforms. See [Testing in Blender](../../../art/characters/testing/blender.md) for additional information. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ComponentTesting recommendations

    **Body Parts**
    When modeling, confirm that your geometry follows [avatar geometry specifications](../../../art/characters/specifications.md#geometry).

    **Textures**
    When texturing, confirm that your geometry follows [avatar texture specifications](../../../art/characters/specifications.md#textures).

    **Rigging**
    Use [Blender's posing tools](../../../art/characters/testing/blender.md#body-skinning) to check the rigging and skinning quality of your asset.

    **Face Animation**
    Confirm that [your FACS data](../../../art/characters/testing/blender.md#facial-animation-data) is present and correctly configured.

    **Cage Mesh**
    Manually verify that your cage mesh completely and tightly covers your character model and follows [avatar outer cage specifications](../../../art/characters/specifications.md#outer-cages).

    **Attachments**
    Manually verify that your attachment points are correctly positioned and follow [avatar attachment specifications](../../../art/characters/specifications.md#attachments).
    -
    - - - - Roblox provides an uncopylocked testing place that includes quick access to various environments and testing features. See [Testing in Studio](../../../art/characters/testing/studio.md) for additional information. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ComponentTesting recommendations

    **Body Parts**
    Verify your character's geometry while in [movement and animation](../../../art/characters/testing/studio.md#movement-and-animation).

    **Textures**
    Test your character in [various lighting environments and skin tone colors](../../../art/characters/testing/studio.md#lighting-and-color).

    **Rigging**
    Use [animations and testing environments](../../../art/characters/testing/studio.md#movement-and-animation) to verify your character's rigging, skinning, and movement.

    **Face Animation**
    [Cycle through various facial animations](../../../art/characters/testing/studio.md#movement-and-animation) to ensure your character can express common expressions.

    **Cage Mesh**
    [Equip various clothing items](../../../art/characters/testing/studio.md#clothing-and-accessories) to check for fit and for any unexpected cosmetic issues.

    **Attachments**
    [Equip various accessory items](../../../art/characters/testing/studio.md#clothing-and-accessories) to verify rigid accessory placement and orientation.
    -
    -
    diff --git a/.cursor/rules/roblox/en-us/art/characters/testing/studio.md b/.cursor/rules/roblox/en-us/art/characters/testing/studio.md deleted file mode 100644 index 083188ac..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/testing/studio.md +++ /dev/null @@ -1,272 +0,0 @@ ---- -title: Test in Studio -comments: -description: Verify the important aspects of your character model in a custom Studio test experience. ---- - -Test your character model in Studio to understand how it looks and feels within a Roblox experience. To test your custom character in Studio, first [import the character model](../../characters/import.md) into your Studio project. - -You can test in Studio using the [Avatar Setup](../../../avatar-setup/) tool to preview and test various components of your avatar character. - -You can also playtest your character in the [Avatar Test experience](https://www.roblox.com/games/13176231501/Avatar-Test-Place). This experience provides a wide variety of environmental and clothing tests to ensure that your character model and related components work as expected. - -## Set up test experience - -The following is the general testing process setting up the Avatar Test experience: - -1. Download and open the [Avatar Test experience](https://www.roblox.com/games/13176231501/Avatar-Test-Place) in Studio. -2. Import your avatar model into Studio. -3. Set your model as the starter character. -4. Launch a playtest of the experience. - -### Open in Studio - -In order to use the [Avatar Test experience](https://www.roblox.com/games/13176231501/Avatar-Test-Place), you must first download it from Roblox. You can save the experience locally and make any changes that may help your testing workflow. Roblox may update this experience periodically to add or improve features. - -To download the Avatar Test experience: - -1. Navigate to the [Avatar Test experience](https://www.roblox.com/games/13176231501/Avatar-Test-Place). -2. In the button next to the experience title, select **…** > **Edit**. The page navigates to the Studio launcher. - - - - -### Import - -After you open the test experience in Studio, import your custom character model. - -1. From Studio's **File** menu, select **Import 3D**. A file browser displays. - - - -2. Select your custom character `.fbx` file. -3. Verify the following: - - 1. With the highest level object selected, ensure **Rig Type** is set to R15. - - - - 2. If using the template files, set **Rig Scale** to **Rthro**. Otherwise, use the appropriate rig scale for your [character body type](../../../art/characters/specifications.md#body-scale). - 3. Check for any red errors that may block import into Studio. - 4. Verify any yellow warnings that may indicate a quality issue with your avatar components. - - - The 3D Importer may incorrectly report some cage meshes as not watertight. You can ignore these warnings for those cage objects. - - -4. Click **Import**. The character's model populates into the workspace. - - - If an error or warning message displays in the **Output** window, see [Troubleshooting](../../../art/characters/facial-animation/use-heads-in-studio.md#troubleshooting) for guidance on how to handle your specific error or warning message. - - -### Add SurfaceAppearance - -If you exported your textures separately, or if the 3D Importer fails to pick up your PBR textures, you can add them manually. - -To add individual image texture files: - -1. Open the **Asset Manager**. You may need to publish your experience first. -2. **Bulk Upload** the image map assets. - - - -3. In the **Explorer**, expand the **Head_Geo** and check if a `Class.SurfaceAppearance` object exists. - - If `Class.SurfaceAppearance` is present, continue to step 4. - - If `Class.SurfaceAppearance` is not present, select the ⊕ next to the Head_Geo and add a `Class.SurfaceAppearance` object. -4. Set each property to the corresponding uploaded image map - - - -5. Copy the `Class.SurfaceAppearance` with the populated image map with CtrlC (⌘C). -6. Hold Shift and click all of your model's MeshParts to select all of your character's geometry. -7. Use CtrlShiftV (⌘ShiftV) to paste into all of the head geometries. An updated `Class.SurfaceAppearance` populates in each `Class.MeshPart` object. - - - -### Set model as StarterPlayer - -In order to play as the character during a playtest, rename and move the model instance: - -1. In the **Explorer**, rename the character **model** as `StarterCharacter`. -2. In the **Explorer**, navigate to the `Class.StarterPlayer` directory. If a `StarterCharacter` model already exists, remove it. -3. Click and drag the model under the directory. - - - -After you rename and add your model, [playtest](../../../studio/testing-modes.md#playtesting) the experience as the custom model. - -## Use test experience - -The Avatar Test experience includes several features in the interface and environment to quickly perform comprehensive tests of your avatar characters. You can use the [test checklist](#checklist) to ensure you are reviewing all the important aspects of your avatar character. - -When playtesting the experience, use the following UI buttons on the right side to open various testing tools and options: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Button
    Description
    -

    Avatars and facial animation
    -
    Use this menu to swap between the custom avatar and control avatars. An additional button option allows you to loop through various facial animations to test your character's face expressions.

    Emotes and animations
    Use this menu to test various animations on your avatar character.

    Skin tone color palette
    Use this menu to select a new skin tone for your character. See Custom Skin Tones for more details on this implementation with template character models.

    Clothes and accessories
    Use this menu to select various clothing items to try on.

    Movement settings
    Use this menu to change movement settings for your character model, such as **jump height** and **walk speed**.

    Body proportion settings
    Use this menu to change various aspects of your character's body proportions.

    Lighting presets
    Use this menu to change the environment lighting to various presets, such as **Mountains - Sunset**, or **Indoor - Midday**.
    - -### Checklist - -Use the following checklists to ensure that you are comprehensively testing each component of your avatar. Use the Avatar menu to switch between your custom avatar and a control avatar to verify expected behavior. - -#### Movement and animation - - -
    Testing guitar animation emote
    - -
    Testing water movement
    - -
    Testing ramp movement
    - -
    - -Check the following for any anomalies: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionHow to test
    WalkingMove the character around the environment, ramps, and platforms.
    SittingMove to any of the seats in the environment and press E to sit.
    ClimbingMove to any of the trusses and ladders. Your character automatically begins climbing when near.
    SwimmingUse the pool of water at the top of the ramp area to verify your swimming animation.
    JumpingPress Space to jump.
    DyingUse any of the death cubes to set your character to a ragdoll state and respawn.
    Facial AnimationUse the **Face UI menu** to toggle a face animation cycle.
    Emotes and AnimationUse the **Emote UI menu** to access and play the available emotes.
    - -If you see unexpected behavior with your character's movement, there may be some issues with the rigging or skinning of your character. It may require revisiting the rigging and armature components of your avatar model in your modeling application. - -#### Lighting and color - - -
    Testing skin tones
    - -
    Testing environmental lighting
    -
    - -Check the following for any anomalies: - - - - - - - - - - - - - - - - - - -
    FunctionHow to test
    Skin toneUse the **Skin Tone UI** menu to test various skin tones for texturing and lighting compatibility.
    Environmental lightingUse the **Lighting UI menu** and the environment to check how your character's surface appearance displays in various conditions.
    - -If you see unexpected behavior with your character's appearance in various lighting and color selections, there may be some issues with the texturing of your character. It may require re-adjusting the texturing components of your avatar model in your modeling application. - -#### Clothing and accessories - - -
    Test a mix of clothing and accessories
    - -
    Use the UI menu or pedestals to equip or reset clothing and accessories
    -
    - -Check the following for any anomalies: - - - - - - - - - - - - - - - - - - -
    FunctionHow to test
    Equipping accessoriesUse the **Clothes and Accessories UI menu** or environmental pedestals to equip rigid accessories to your character.
    Equipping clothingUse the **Clothes and Accessories UI menu** or environmental pedestals to equip rigid accessories to your character. Test your clothing in motion and in animations to verify the fit.
    - -If you see unexpected behavior with your character wearing clothes or equipping rigid accessories, there may be issues with the caging or attachment points of your character. You may need to re-adjust the cage mesh shapes or attachment objects of your avatar model in your modeling application. - - -Clothes can layer in unconventional orders, such as a jacket worn below a tshirt. You can reset the equipped clothing and try various combinations of clothing options and ordering. - diff --git a/.cursor/rules/roblox/en-us/art/characters/validation-tool.md b/.cursor/rules/roblox/en-us/art/characters/validation-tool.md deleted file mode 100644 index 80ef4cd4..00000000 --- a/.cursor/rules/roblox/en-us/art/characters/validation-tool.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -title: Blender validation tool -description: The Avatar Validation Tool checks for common character model issues in Blender. ---- - - -This tool is no longer in active development. You are free to use the tool for any purpose. The tool may be out of date or incompatible with modern Roblox assets. - - -The **Avatar Validation Tool** is a supplemental Blender add-on you can use to quickly identify common issues with your character model. This tool checks that your model meets most of Roblox's avatar [technical specifications](../../art/characters/specifications.md) and, when possible, attempts to automatically resolve them. - - - -This tool can save you time by checking for common validation specifications before you export your model, but it doesn't provide a comprehensive verification of all aspects of your character model. You should always continually test your character model, including testing your characters [in Studio](../../art/characters/testing/studio.md) and verifying on your own if your model meets Roblox's [character specifications](../../art/characters/specifications.md). - -## Install - - -The Validation Tool plugin is compatible with Blender 3.5.1+. You may experience unexpected behavior if using earlier versions of Blender. - - -To install the Validation Tool in Blender: - -1. Download [ValidationTool_Blender.zip](https://github.com/Roblox/avatar/tree/main/Tools/ClothingValidationTool) and save the .zip file locally. Do not open the .zip file. -2. In Blender, navigate to **Edit** > **Preferences**. -3. In Preferences, go to the **Add-Ons** section on the left sidebar. - - - -4. Click the **Install...** button. A file browser displays. -5. Select the downloaded .zip file and click **Install Add-On**. -6. In the Add-Ons section, find the Validation Tool and **enable** the add-on. - - - -7. Return to your workspace and expand the side toolbar in the Viewport to access the add-on. - - -
    - -
    Sidebar indicator
    -
    -
    - -
    Expanded sidebar
    -
    -
    - -## Validate - -After installing the plugin, you can begin validating your character models. When validating, results with issues display as red. In some cases, you can apply an automatic fix to checks that have issues. See [Checks and Troubleshooting Steps](#checks-and-troubleshooting) for details on each validation check. - -To use the validation tool on your asset: - -1. In the Target Armature field, select the **eyedropper**. -2. With the eyedropper active, select your character's **armature object**. This object is often named Joints or Armature. -3. Select **Run All Checks** to go through each individual check. Alternatively, you can click individual buttons to run a specific check. -4. Checks that detect issues display as red and an error output displays at the bottom of the tool. - - - - -This validation tool only checks for common validation issues. You should always continually test your character model, including testing your characters [in Studio](../../art/characters/testing/studio.md) and verifying on your own if your model meets Roblox's [character specifications](../../art/characters/specifications.md). - - -## Checks and troubleshooting - -Each button on the validation tool performs a different check against the expected [character specifications](../../art/characters/specifications.md). The following are the specific types of verification each check performs, as well as general troubleshooting steps to resolve discovered issues: - -
    -
    **Layers**
    -
    Checks for extra layers in the scene. Automatic fix attempts to remove extra layers.

    If the automatic fix fails, manually remove extra layers.

    - -

    **Transforms**
    -
    Checks that geometry location, rotation, and scale are frozen (`0`,`0`,`0`). Automatic fix button attempts to freeze the transforms. This may cause changes to your rig.

    If the automatic fix fails, manually freeze your geometry.

    - -

    **UV**
    -
    Checks if the body Geometry UVs are within `0`-`1`. You must resolve issues manually by setting your body object UVs within a `0`-`1` range.

    - -

    **Cage UV Modifications**
    -
    Checks if cage object UVs have incorrect modifications. Automatic fix attempts to resolve UV coordinates.

    If automatic fix fails, you may want to use a new template cage.

    - -

    **Asset Size**
    -
    Checks if the character total size and individual parts are within expected bounds. You must resolve issues manually by resizing your character model or individual parts.

    - -

    **Unused Data**
    -
    Checks for any unused data in the scene, such as orphan data, or unused materials. Automatic fix attempts to remove extra data.

    If automatic fix fails, manually remove unnecessary data and objects.

    - -

    **Keyframes**
    -
    Checks for any unnecessary keyframes. Keyframes related to facial expressions are expected and ignored. Automatic fix attempts to remove keyframes associated with non-face objects.

    If automatic fix fails, manually remove keyframe data from non-face objects. Do not delete keyframes that also contain facial data.

    - -

    **Attachment Points**
    -
    Checks that attachment points are parented to the armature and use the correct naming convention. Automatic fix attempts to parent any unexpected attachment points.

    - -

    **Joint Positions**
    -
    Checks for the following: -
    • Root and HumanoidRootNode bones exist
    • -
    • Root bone is at `0`,`0`,`0` world space
    • -
    • Bones with Left/Right naming conventions are on correct axes.
    Refer to the output messages to manually resolve joint position issues.

    - -

    **FACS Data**
    -
    Checks for the following FACs data: -
    • `Neutral Pose` exists as a mapped pose
    • -
    • Mapped Custom Properties under the Head_Geo exists
    • -
    • Property name and values correctly set
    • -
    • Corrective poses must include existing base poses
    • -
    • Corrective poses do not use more than 3 base poses Refer to the output messages to manually resolve FACS data issues.

    - -

    **Head Joint Names**
    -
    Checks for duplicate head bone names, including duplicates with Blender's duplicate affixes .001, .002, .003, and such. Refer to the output messages to manually resolve face joint names.

    - -

    **Intersection**
    -
    Checks for any intersection between character geometry and cage mesh geometry. The tool switches to Edit mode and highlights areas where potential intersections are detected.

    - -

    **Polygon Data**
    -
    Checks for common polygon issues:
      -
    • Meshes are watertight
    • -
    • Meshes are within polycount budgets
    • -
    • Meshes don't use N-Gons Meshes
    • -
    • Meshes are non-manifold
    • -
    • Meshes don't have vertex color information

    Refer to the output messages to manually resolve any polygon data issues.

    - -

    **Texture Format**
    -
    Checks that textures match texture requirements, such as resolution size. Users can also select an external image file. Refer to the output messages to manually resolve any texture related issues.
    -
    diff --git a/.cursor/rules/roblox/en-us/art/classic-clothing.md b/.cursor/rules/roblox/en-us/art/classic-clothing.md deleted file mode 100644 index 11120418..00000000 --- a/.cursor/rules/roblox/en-us/art/classic-clothing.md +++ /dev/null @@ -1,152 +0,0 @@ ---- -title: Classic clothing -description: Classic clothing are decals you can apply to a classic character model's surface. You can create classic clothing items on Roblox and upload them to the Marketplace. ---- - - -Current user-generated avatars on the Marketplace do not support 2D classic clothing. For information on creating modern 3D cosmetics, including rigid accessories and clothing items, see [Get started](../avatar). - - - - - - -
    - -
    - -Create and sell your first 2D classic clothing item. - -
    -
    - - - - -
    - -
    - -A high-level overview of avatar items on Roblox. - - -
    -
    -
    - -Classic clothing are the most basic type of avatar item available to purchase and sell on Roblox. With any image editor and web browser, you can create classic clothing items and sell them on the [Marketplace](https://www.roblox.com/catalog). - -To create classic clothing items: - -1. Decide on the [type of classic clothing](#types-of-classic-clothing) you'd like to create. -2. [Create](#creating-classic-clothing) an image for your asset using an image editor of your choice. -3. [Test](./test-classic-clothing.md) your creation in Studio to ensure it looks as intended. -4. [Upload](./upload-classic-clothing.md) the image file to the Marketplace through a web browser. - 1. Adding an item to the Marketplace requires a Robux [fee](../marketplace/marketplace-fees-and-commissions.md#classic-clothing). - 2. Upon successful moderation, you gain a copy of the asset in your inventory. - -## Types of classic clothing - -The three types of classic clothing items are **T-shirts**, **Shirts**, and **Pants**. Each has different design and format requirements. - -3 different examples of blocky characters with a different type of image displayed on its surface. - -### T-shirts - -T-shirts are a square image, such as 512x512 pixels. When properly configured, classic t-shirts display on the front torso of a blocky character. - -### Shirts and pants - -Classic shirts and pants are image assets that wrap around an avatar's body. Because classic shirts and pants have specific size requirements, download and modify the provided template files to begin creating these assets. - - -
    - -
    Shirt (torso and arms)
    - -
    -
    - -
    Pants (torso and legs)
    -
    -
    - - - -Table of sizes for each template part - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ShapePixel size (width x height)Clothing parts
    Large square128 × 128FRONT and BACK
    Tall rectangle64 × 128Sides of torso (R, L)
    Sides of arms and legs (L, B, R, F)
    Wide rectangle128 × 64UP and DOWN
    Small square64 × 64Top and bottom of arms and legs (U, D)
    -
    -
    - -## Creating classic clothing - -To begin creating classic clothing: - -1. If you are creating a classic shirt or pants, [download and unzip](../assets/accessories/classic-clothing/Classic-Clothing-Templates.zip) the following clothing templates to use as a canvas for your art. -2. Modify the image in an image editor of your choice. -3. Export the image as a `.png` or `.jpg` before [testing](./test-classic-clothing.md) or [uploading](upload-classic-clothing.md) to Roblox. - -When applying clothing to avatars in Roblox, some limits exist with the templates and may require some testing to get right, as shown in the following examples: - - -
    - -
    The shoe designs in this example are near the bottom of the leg regions (L, B, R, F) but don't extend too far up. This provides a distinct separation between the shoes and the bottom of the jeans.
    -
    -
    - -
    The shoe designs in this example extend too far up the leg regions (L, B, R, F) which make them appear as if they're part of the pants. The same issue may occur near other joints on the avatar's body.
    -
    -
    - - -After creating your classic clothing, [test](./test-classic-clothing.md) your creation in Roblox Studio before [uploading](./upload-classic-clothing.md) and selling your asset on the Marketplace. - diff --git a/.cursor/rules/roblox/en-us/art/emotes/export-settings.md b/.cursor/rules/roblox/en-us/art/emotes/export-settings.md deleted file mode 100644 index d4f74aff..00000000 --- a/.cursor/rules/roblox/en-us/art/emotes/export-settings.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: Animation export settings -description: Use the appropriate export settings in Maya and Blender to generate Studio-ready .fbx files. ---- - -You can export animation data from a third-party software, such as Blender or Maya to use in Studio. Both `.fbx` and `.gLTF` formats support animation data. - -Typically, creators will use a third-party modeling tool to animate a character model. Once the animation is complete, you export both the model and the animation data into Roblox Studio. - -After exporting, you can [import and configure](./import.md) the animation data into Studio. - -## Before exporting - -When exporting characters with animation or FACS animation, ensure that your animation timeline **Start** and **End** include the entire range of your animations. - -Zoom-in of Blender animation track indicating a Start value of 0 and End value of 308. - -## Blender - -Blender allows you to export in `.fbx` or `.gltf` as well as other formats. If you are using `.fbx` export, familiarize yourself with [Blender's FBX scaling](../blender.md#adjust-scale-fbx) to ensure that you successfully import the model into Studio at the correct scale. - -1. In the topbar, click **File** > **Export** > **FBX (.fbx)**. The Blender file browser window displays. -2. Set **Path Mode** to **Copy** and enable the **Embed Textures** icon. -3. In the Include section, enable **Custom Properties**. -4. If your project doesn't already have `.01` scene unit scaling, set the **Transform** > **Apply Scalings** to `FBX Unit Scale`. For more details, see [Blender FBX scaling](../blender.md#adjust-scale-fbx). -5. Expand the Armature section and uncheck **Add Leaf Bones**. -6. Enable **Bake Animation**. -7. Expand Bake Animation and **uncheck NLA Strips**, **All Actions**, and **Force Start/End Keyframes**. - 1. Ensure your project animation timeline has the correct **Start** and **End** range of all your keyframes. -8. In Bake Animation, set **Simplify** to **0.0**. -9. Click the **Export FBX** button. Save the `.fbx` to the directory of your choice. - -Screenshot of Blender export settings - -## Maya - -For additional context on exporting animations from Maya, see the [Exporting Characters from Maya](../../art/characters/export-avatar-animations-from-maya.md) tutorial. - -To export a mesh in Maya as a `.fbx` file: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export All**. The **Export All** window displays. -3. Near the bottom of the window, click the **Files of type** dropdown, then select **FBX export**. -4. On the right-hand side of the window, navigate to the **Options...** section. -5. In the **Geometry** section, enable **Smooth Mesh** and **Referenced Asset Content**. -6. In the **Animation** section, enable **Animation**. Avatar characters with [facial animation data](../../art/characters/facial-animation/index.md) require animation data. -7. Enable **Bake Animation**. -8. If you need to import textures as a `.png`, in the **Embed Media** section, enable **Embed Media**. -9. In the **Advanced Options** section, - - Navigate to **Units**, then enable **Automatic**. - - Navigate to **Axis Conversion**, then set the **Up Axis** property to **Y**. -10. Click the **Export All** button. - - Screenshot of Maya export settings for exports with animation. - -11. After exporting, use Studio's [3D importer](../../art/modeling/3d-importer.md) to import your model. See [Test characters in Studio](../../art/characters/testing/studio.md) for additional importing and testing information. diff --git a/.cursor/rules/roblox/en-us/art/emotes/import.md b/.cursor/rules/roblox/en-us/art/emotes/import.md deleted file mode 100644 index e3697f22..00000000 --- a/.cursor/rules/roblox/en-us/art/emotes/import.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: Import and configure animations -description: Use the 3D Importer to add third-party models to Studio before testing, using, or uploading the character model. ---- - -Use the following steps to import and configure the animation for publishing emotes: - -1. [Import](#import-into-animation-editor) the animation into Studio. -2. [Convert](#convert-to-curveanimation) the animation to a `CurveAnimation`. -3. [Generate an asset ID](#generate-asset-id) from your animation data. -4. [Create an Animation object](#create-an-animation-object) using the asset ID -5. [Upload](#upload-and-publish-an-emote) the animation as an avatar emote. - -## Import into Animation Editor - -If your animation data is saved to a `.fbx` file and your animation meets the emote [technical specifications](./specifications.md), use the **Animation Editor** to import your animation. If your animation is already in Studio, skip this step. -
    -To import your animation in Studio: - -1. If you don't already have a rigged R15 character in your workspace, add one by selecting **Avatar** > **Character**. -2. Select **Avatar** > **Animation** to open the **Animation Editor**. -3. With editor open, select the rigged character in the 3D viewport. -4. In the **Animation Editor**, select **⋯** > **Import** > **From FBX Animation** and select your `.fbx` file. - - - -5. Verify your animation populates and correctly animates on the target rig. -6. Follow steps to [convert to CurveAnimation](#convert-to-curveanimation). - -## Convert to CurveAnimation - -To generate an asset ID for your animation, use the **Animation Editor** to convert the animation to a `CurveAnimation` and save the animation to Roblox to generate an asset ID. - - -The animation data for emotes must be a `CurveAnimation` clip. - - -To convert an existing keyframe sequence to a `CurveAnimation`: - -1. In the **Animation Editor**, select the **Curve Editor** button next to the timeline. A confirmation prompt displays. - - - -2. Press **Confirm** to convert your keyframes into a `CurveAnimation` clip. - - - -## Generate Asset ID - -To create an asset ID of the `CurveAnimation`: - -1. In the **Animation Editor**, select the **⋯** > **Publish to Roblox**. - - - -2. Add a title and description and save the animation. -3. After processing, you should see a successful upload and an asset ID to copy. - - - -## Create an Animation object - -To submit an emote to the Marketplace, you must submit an `Class.Animation` object with the `AnimationId` property set to the asset ID of your `CurveAnimation`. - - -
    - -
    `Animation` object in the Explorer.
    - -
    -
    - -
    `AnimationId` property in the Properties window.
    -
    -
    - -To create an `Class.Animation` object you can publish as an emote: - -1. In the **Explorer**, add a new `Animation` object. -2. In the **Properties** window, add the asset ID of the emote animation. - -## Upload and publish an emote - -When you have an `Class.Animation` with your emote animation asset ID set, you can upload the emote to the Marketplace. This process requires an [upload fee](../../marketplace/marketplace-fees-and-commissions.md#upload-fees). - -1. Right-click the `Animation` object and select **Save to Roblox**. -2. In the upload window, set the following fields: - 1. Add a title and description. - 2. Set the **Content Type** to **Avatar Item**. - 3. Set the **Asset Category** to **Emotes**. -3. Press Submit to upload your asset for moderation. - -For more information on the upload and publishing process, see [publishing Marketplace items](../../marketplace/publish-to-marketplace.md#upload-an-asset). diff --git a/.cursor/rules/roblox/en-us/art/emotes/index.md b/.cursor/rules/roblox/en-us/art/emotes/index.md deleted file mode 100644 index e2294dac..00000000 --- a/.cursor/rules/roblox/en-us/art/emotes/index.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Emotes -description: All Roblox users are represented by an avatar character which can be customized with body parts, accessories, and clothes from the Marketplace or within experiences. ---- - -**Emotes** are short animations that an avatar performs, making it easier to communicate and celebrate with others, enhancing the experience to feel more social and more lively. - -Creators sell their own emotes, such as gestures, reactions, dances, and more, by publishing their animation to sell on the Marketplace or within experiences. - - -Developers can access and modify emotes within their own experiences. For more information, see [character emotes](../../characters/emotes.md). - - -## Components of an emote - -Emotes are made up of an `Class.Animation` object with the unique `Class.Animation.AnimationId` property set to the asset ID of your animation sequence. - - -
    - -
    `Animation` object in the Explorer.
    - -
    -
    - -
    `AnimationId` property in the Properties window.
    -
    -
    - -Emotes must meet [technical specifications](./specifications.md) as well as [Marketplace](../../marketplace/marketplace-policy.md) and [Community](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards) policies. - -## Creation process - -There are several ways to create an animation both in Studio or using a third-party tool. See the following table for common workflows and various resources to create your own. - - - - - - - - - - - - - - - - - - - - -
    Animation workflowDescription
    Animation CaptureUse the [Animation Capture (Body)](../../animation/capture.md#body) to convert a video of your emote into a keyframe sequence.
    Manual animation with Animation EditorUse the [Animation Editor](../../animation/editor.md) to manually animate a character rig. For an in-depth tutorial on creating a character animation, see [Create character animations](../../tutorials/use-case-tutorials/animation/create-an-animation.md).
    Third-party plug-insUse a third-party animation plugin, such as [Moon Animator](https://create.roblox.com/store/asset/4725618216/Moon-Animator-2), to generate your animation.
    - -To convert your keyframe sequence into an animation and upload to the Marketplace, see [import and configure emotes](../emotes/import.md#configure). diff --git a/.cursor/rules/roblox/en-us/art/emotes/specifications.md b/.cursor/rules/roblox/en-us/art/emotes/specifications.md deleted file mode 100644 index d5dc3611..00000000 --- a/.cursor/rules/roblox/en-us/art/emotes/specifications.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Emotes specifications -description: Character specification lists the specific technical requirements for custom characters created outside of Studio. ---- - -Emotes are made up of an `Class.Animation` object with the `Class.Animation.AnimationId` property set to the asset ID of your animation sequence. - - -
    - -
    `Animation` object in the Explorer.
    - -
    -
    - -
    `AnimationId` property in the Properties window.
    -
    -
    - -Only the `Class.Animation` object is required to upload an emote to the Marketplace. Animations do not require meshes, textures, or other 3D art components. - -## Animation requirements - -Emotes must also meet the following requirements or may fail validation: - -- Emotes must be less than 10 seconds. -- The joint root of the character can not move too far from its starting position. -- Movement speed can't exceed a certain threshold to prevent teleportation abuse (measured from a frame-by-frame basis). -- Animation data must reference an R15 rig. -- Animation must be sourced from a `CurveAnimation`. For information on converting animation data, see [import and configure](./import.md#generate-asset-id). -- Animations must meet [Marketplace](../../marketplace/marketplace-policy.md) and [Community](https://en.help.roblox.com/hc/en-us/articles/203313410-Roblox-Community-Standards) policies. diff --git a/.cursor/rules/roblox/en-us/art/index.md b/.cursor/rules/roblox/en-us/art/index.md deleted file mode 100644 index 32b29b14..00000000 --- a/.cursor/rules/roblox/en-us/art/index.md +++ /dev/null @@ -1,442 +0,0 @@ ---- -title: 3D art in Roblox -description: An overview of 3D art tools, resources, and workflows for creators of all experience levels. -hideInPageNavigation: true ---- - -3D art in Roblox refers to the creation and integration of models, environments, effects, sounds, and more to create an engaging and immersive experience. 3D artists bring the world, objects, and characters to life with a variety of tools and techniques using Roblox Studio and external applications. - -No matter your creative background, Roblox provides a variety of tools, guides, tutorials, and reference files to help inspire and level up your 3D art creation in your experiences and beyond. - -
    - -

    Quick reference

    -Whether you're just getting started with Roblox or need a quick refresher, use the following popular resources to get up to speed. - - - - - -
    - -
    - 3D art in Roblox Studio - Get up to speed with the many powerful tools and functions in Roblox Studio! - Studio for artists -
    -
    - - - - -
    - -
    - Use third-party applications - Understand how to use incorporate your creations from off-platform into Studio. - Overview - General modeling requirements - Downloadable references - -
    -
    - - - - -
    - -
    - Create avatar items - Create accessories, clothing, and bodies that you can sell on the Marketplace. - Overview - Marketplace overview - Fees and commissions - -
    -
    -
    - -

    - -

    Tutorials

    - -To dive deeper, follow along with guided curriculum -that teaches you the skills you need to create and monetize your experiences. - - - - - - -
    - -
    - Environmental art - Environmental art teaches you how to recreate a high-quality environment for a first-person laser tag experience. - -
    -
    - - - - -
    - -
    - Avatar item tutorials - Check out our tutorials on creating your own Avatar items ready for the Marketplace. - Create accessories - Create clothes - Create characters from templates -
    -
    - -
    - -

    Showcases

    - -Check out the following showcases made by Roblox and the community. Each of these highlight amazing creativity and technical accomplishments by talented creators. - - - - - - -
    - -
    - Roblox creations - Check out various experiences created by Roblox. Click to see documentation, downloadable resources, and links to try out the experiences yourself! - Mystery of Duvall Drive - Beyond the Dark - Modern City template -
    -
    - - - - -
    - -
    - Community creations - Check out these amazing showcase experiences created members of the community! - Toyokawa Inaru Shrine by @nezko - Hotel Resort by @ChooShu_Cho - Lab by @thisfall -
    -
    -
    - -

    From the staff

    - -The following articles are from the staff, covering a broad array of topics that can help you on your creative journey both within Studio and beyond. - - - - - - -Create buttes and mesas with Studio terrain - -Create beautiful and striking landscapes using Studio's powerful terrain and material tools. - - - - - - - - - -
    - -
    -Custom skyboxes 101 - -Apply your own custom skyboxes to your experience to add some flair and elevate your world. - - - -
    -
    - - - - -Use alpha masks to customize colors - -Save time and optimize for performance by using alpha masks in your PBR textures. - - - - - - - - - -Create perfect audio loops - -Learn a quick technique to make seamless loops in your audio files. Great for ambience, music, sound effects, and more. - - - - - - - - - -Use radial symmetry with Zbrush - -Radial symmetry is an extremely versatile sculpting technique applicable in many third-party tools. This article is a primer on radial symmetry in Zbrush. - - - - - - - - - -Looking for more? - -Stay up to date with new articles written by our staff on the [DevForum](https://devforum.roblox.com/c/resources/roblox-staff/278). Topics can range from third-party tools, behind-the-scenes, tutorials, and more. - - - - -
    - -
    - -

    Additional resources

    - -The following is a list of common 3D art resources ordered by subject, as well as other Studio and Avatar documentation. You can also use the side navigation bar, search bar, or assistant to find specific articles and topics. - -Get started and tutorials - - - - -Topic overviews - -Get started in Studio -Get started with third-party software -Get started with avatar items -Create your first experience -Creator Store overview -Marketplace overview - - - - - -3D art tutorials - -Core curriculum -Environmental art -Gameplay scripting -
    - -

    See Engine tutorials for additional 3D Art tutorials.

    - -
    -
    - - - - -Avatar tutorials - -Creating accessories -Create clothing -Create avatar characters from templates -
    - -

    See Avatar tutorials for additional avatar tutorials.

    - -
    -
    - -
    - -Specifications and references - - - - - - -Technical specs - -Blender and Maya .FBX export settings -General mesh specifications -Accessory specifications -Clothing specifications -Avatar character specifications -Marketplace policy - - - - - - -Reference files -Example models -Reference avatar items -Add-ons and tools - - - - - - -Texturing - -Texturing requirements -PBR textures -Create customizable colors with alpha masks (staff) - - - - - -Guides and workflows - - - - - -Studio tools - -3D Importer - -Accessory Fitting Tool - -Animation Editor - -Animation Capture - -Avatar Setup - -Material Generator - -Terrain Editor - -Texture Generator - -Toolbox and Asset Manager - -

    See Studio overview for more.

    -
    -
    - - - -Environment, lighting, and effects - -Environmental art curriculum -Assemble modular environments -Light with props -Add 3D audio -Add 2D audio -Add text-to-speech -Enhance outdoor environments with realistic lighting -Custom skyboxes 101 (Staff) - -
    - -

    See Lighting and effects for additional environment resources.

    - -
    -
    - - - -Avatar item creation - -Avatar overview -Accessories overview -Clothing overview -Character bodies overview -Marketplace overview - - - - - - -Animation - -Animation Capture -Animation Editor -Export animations from Maya -Inverse kinematics -
    - -

    See Animation for additional resources.

    -
    -
    - - - -Facial animation and live heads - -Basic head creation -Create face accessories -FACS pose references - - - - - - - -Rigging and skinning - -Rigging and skinning overview -Avatar rig requirements -Rig basic meshes -Rig facial bones -Skin facial bones -Auto skin transfer - - - - - - - -Publish to Creator Store and Marketplace - -Creator Store overview -Marketplace overview -Marketplace policy -Publish avatar items to Marketplace -Marketplace fees and commissions - - - -
    diff --git a/.cursor/rules/roblox/en-us/art/modeling/3d-importer.md b/.cursor/rules/roblox/en-us/art/modeling/3d-importer.md deleted file mode 100644 index 0677abfa..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/3d-importer.md +++ /dev/null @@ -1,398 +0,0 @@ ---- -title: 3D Importer -description: 3D Importer imports third-party .fbx, .gltf, and .obj 3D model assets into Studio. ---- - -The 3D Importer allows you to import `.fbx`, `.gltf`, or `.obj` 3D models into Studio as a custom `Class.Model`. This includes meshes with PBR textures, meshes with rigging, skinning, and animation data, and meshes designed as avatar items. - - - - - -
    - -
    - -Import general 3D custom models into Studio. - - -
    -
    - - - - -
    - -
    - -Use the 3D importer to import assets with avatar item components. - -
    -
    -
    - -To import a 3D object: - -1. From Studio's **File** menu, select **Import 3D**. -2. In the file browser, select the supported `.fbx`, `.gltf` or `.obj` files you intend to import. - 1. If selecting one object, the [import preview](#import-preview) window screen appears for that object. - 2. If selecting multiple objects, the files are added to the [import queue](#import-queue). -3. Configure your import settings and verify any [warning or error messages](#warnings-and-errors). -4. Click **Import**. - - -To directly import 3D assets using HTTP requests, see the [Open Cloud usage guide for assets](../../cloud/guides/usage-assets.md). - - -## Supported file types - -Before importing a 3D object, ensure that the `.fbx`, `.gltf` or `.obj` meets Studio's [mesh requirements](../../art/characters/specifications.md) to reduce errors or unexpected behavior. - - - - - - - - - - - - - - - - - - - - - - - -
    **File type****Studio compatibility****Best for**
    OBJ (`.obj`)— Basic single mesh objectsSimple mesh geometry use-cases.
    FBX (`.fbx`)— Multiple mesh objects and hierarchies
    — Textures, including basic and [PBR textures](../../art/modeling/surface-appearance.md).
    — Cage mesh objects
    — [Rigging and armature data](../../art/modeling/rigging.md)
    — Additional components for [avatar](../../avatar/index.md) items
    — Animation data
    — [Vertex colors](../blender.md#vertex-painting)
    Any type of 3D import, including but not limited to [game assets](../../assets.md) or [avatar items](../../avatar).
    gLTF (`.gltf`)— Multiple mesh objects and hierarchies
    — Textures, including basic and [PBR textures](../../art/modeling/surface-appearance.md).
    — Cage mesh objects
    — [Rigging and armature data](../../art/modeling/rigging.md)
    — Additional components for [avatar](../../avatar/index.md) items
    — Animation data
    — [Vertex colors](../blender.md#vertex-painting)
    Any type of 3D import, including but not limited to [game assets](../../assets.md) or [avatar items](../../avatar).
    - -## Import queue - -If you selected multiple files with the 3D Importer, you can use the import queue to bulk manage your various imports. - -The 3D importer interface, showing a preview of the mesh in the top left, a list of 3D objects on the bottom left, and a list of toggle-able properties on the right side. - - - - - The **top bar** allows you to add new files, clear the queue, search and filter, and import all enabled models. - - - - - - The **import queue** lists all added files, with quick access dropdowns to change creator, presets, and file paths. - - - -### Add files to queue - -To open a file browser and add additional files to the import queue, you can: - -- Click the **Add file** button in the top bar of the import queue window. -- From Studio's **File** menu, select **Import 3D**. - -### Remove files from queue - -To remove all files from the queue, click the **Clear queue** button with the broom icon. To remove an individual file from the queue, right-click an item in the queue and select **Delete from queue**. - -### Apply preset settings - -Use the **Import Preset** column to select a preset configuration to apply to your model. For more information, see [Presets](#presets). - -You can also apply the settings of one item to all items by right-clicking an item with the desired settings and selecting **Apply settings to all**. - -### Access individual preview and settings - -Click the individual **Asset** name of an unimported model to access the import preview for that item. Use the import preview to view and check your model, as well as set any individual [import settings](#import-settings). - -### Import files - -Ensure that each item you want to import has a checkbox enabled in the first column. By default, all items are selected if they are importable. - -Press the **Import** button to start the import process. - -## Import preview - -The import preview window appears if you are importing a single file, or if you selected an individual item from the import queue. This preview window provides individual controls for the various objects in your model. - -The preview window is divided into multiple sections: - -The 3D importer interface, showing a preview of the mesh in the top left, a list of 3D objects on the bottom left, and a list of toggle-able properties on the right side. - - - - - The **file path** of your model file. Click **Browse** to edit. - - - - - - The **preset** applied to your import. Use the dropdown to select multiple presets, or the hamburger menu to set a new preset. - - - - - - The **3D preview** of your model. Use mouse buttons and top-right icons for various camera options and views. - - - - - - The **object hierarchy** of the imported object. Includes mesh objects and other supported components. - - - - - - The **import settings** for your import. For a complete list of settings, see [Import settings](#import-settings). - - - -### Import settings - -Depending on the object selected in the hierarchy panel, the inspector panel displays the following groups of settings: - -- **File General**: Affects the entire imported file. -- **Rig General**: Affects the selected mesh object if rigging data is present. -- **File Transform**: Affects the transform properties of the imported file. -- **File Geometry**: Affects the geometry properties of the imported file. -- **Object General**: Affects the selected child object. -- **Object Geometry**: Affects the geometry of the selected child object. - -#### File general - -The 3D Importer provides the following settings for all meshes: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    SettingDescription
    NameSets the name of the imported asset as it will appear in your project.
    Import Only As ModelIf enabled, the 3D Importer imports the model as a single asset even if the model contains multiple children. By default, this is **enabled**.

    If disabled, the 3D Importer imports the model and all descendants, such as the multiple meshes, as individual assets.
    Add Model To InventoryIf enabled, the 3D Importer adds the model to your **Toolbox** and **Asset Manager** inventory as a new asset. By default, this is **enabled**.

    If disabled, the 3D Importer does not add the asset to your inventory.
    Insert In WorkspaceIf enabled, the 3D Importer inserts the model into the `Class.Workspace` as well as your **Toolbox** and **Asset Manager** inventory. If importing from a saved or published experience, this setting also grants permission to the experience to use the restricted asset. By default, this is **enabled**.

    If disabled, this setting only adds the model to your inventory and does **not** grant the experience permission to use the asset.
    Insert Using Scene PositionIf enabled, the 3D Importer uses the current scene position when inserting the model into the workspace. By default, this is **disabled**.
    Set Pivot to Scene OriginIf enabled, the 3D Importer sets the pivot point of the entire model to the scene origin. By default, this is **enabled**.
    AnchoredIf enabled, the 3D Importer sets the `Class.BasePart.Anchored|Anchored` property to `true` on all the imported `Class.MeshPart|MeshParts`. This is disabled for meshes with rig data / avatars. By default, this is **disabled**.
    Uses CageIf enabled, the 3D Importer finds cage meshes in the model and converts them to `WrapInstance` objects, such as `Class.WrapLayer` or `Class.WrapTarget`. If disabled, the Importer treats them as regular meshes. If the 3D Importer initially detects cage meshes in the model, this is **enabled** by default.
    - -#### Rig general - -The 3D Importer provides the following settings for meshes with rigging data, typically character bodies or clothing accessories: - - - - - - - - - - - - - - - - - - - - - - -
    SettingDescription
    Rig TypeSets the type of rig the mesh should be associated with. The options are:
    - **R15**
    - **Custom**
    - **No Rig**

    By default, the 3D importer attempts to select the most appropriate setting based on the detected rigging and skinning data of the mesh.
    Validate UGC BodyAfter importing, Studio opens the assets in the [Avatar Setup](../../avatar-setup/index.md) tool, allowing you to quickly begin testing and uploading avatar assets to the Marketplace.
    Rig ScaleIf Rig Type is set to R15, the importer provides additional options to specify [body type scaling](../../art/characters/specifications.md#body-scale). The options are:
    - **Default**
    - **Rthro**
    - **Rthro Narrow**
    - -#### File transform - -The 3D Importer provides the following settings for all meshes: - - - - - - - - - - - - - - - - - - -
    SettingDescription
    World ForwardSets the forward facing axis of the object. By default, this is set to **Front**.
    World UpSets the upward facing axis of the object. By default, this is set to **Top**.
    - -#### File geometry - -File geometry includes information on the file dimensions and polycount of the entire model. You can edit the following settings for all meshes: - - - - - - - - - - - - - - - - - - - - - - -
    SettingDescription
    Scale UnitSets what units the file was modeled in so that it's sized appropriately when imported. By default, this is set to **Studs**.
    Merge MeshesIf enabled, merges all MeshParts in the model into a single MeshPart and creates one MeshPart rather than a Model. By default, this is **disabled**.
    Invert Negative FacesInverts the orientation of negative faces in the mesh. By default, this is **disabled**.
    - -#### Object general - -When selecting a specific child object of your mesh, the 3D Importer populates Object General settings. You can edit the following settings for the selected child objects: - - - - - - - - - - - - - - - - - - - - - - -
    SettingDescription
    NameSets the name of the selected child object within the model.
    AnchoredIf enabled, sets the `Class.BasePart.Anchored|Anchored` property to `true` on the selected child object. By default, this is **disabled**.
    Use Imported PivotIf enabled, imports the object using the pivot point set within the child object. By default, this is **enabled**.
    - -#### Object geometry - -Object Geometry includes information on the dimensions and polycount of the selected child object of the model. You can edit the following settings for the selected child objects: - - - - - - - - - - - - - - - - - - -
    SettingDescription
    Make Double SidedIf disabled, sets the vertices as one-sided. One-sided vertices means that you can see through them from one side.

    If enabled, sets the vertices as double-sided. Vertices that are double sided visually render on both sides. Double-sided is more performance intensive.

    By default, this is **disabled**.
    Ignore Vertex ColorsIf enabled, ignores the vertex color data in the child object. By default, this is **disabled**.
    - -## Presets - -You can save presets of various import settings to quickly apply later within the [import preview](#import-preview) or [import queue](#import-queue). - -By default, you can select between two presets: - -- **Studio Default**: The default import behavior. -- **Last Imported**: Uses the settings applied to the most recent import. - -You can use the **⋯** menu next to the Presets dropdown for additional options: - -- **Reset all**: Removes any changes to the current configuration, putting settings back in the default state for the current preset. -- **Save selection**: Allows you to save any new changes to the importer settings into the currently selected preset. -- **Save as new**: Sets the current settings as a new preset. A dialogue box displays allowing you to set a name. -- **Set as default**: Sets the current preset as the default for all imports moving forward. -- **Rename**: Renames the current preset. -- **Delete**: Deletes the current preset. Resets to `Studio Default` preset. - -## Warnings and errors - - -
    - -If Studio detects any issues with your model, a small indicator displays in the hierarchy panel or the settings panel. - -If you see a warning icon in the hierarchy, expand the hierarchy until you reach the specific child object to see more information about the issue. Warning and error messages display in the settings panel or as a tooltip. - - -
    - A warning message in orange stating an error about cages mismatching. -
    Warning and error messages display in the appropriate section in the inspector panel.
    -
    -
    - An error message in red with a pop-up message about missing textures. -
    Some errors display a tooltip when hovering over the error icon.
    -
    -
    diff --git a/.cursor/rules/roblox/en-us/art/modeling/assign-textures.md b/.cursor/rules/roblox/en-us/art/modeling/assign-textures.md deleted file mode 100644 index dbf34933..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/assign-textures.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: Blender and Maya texture settings -description: Learn to assign basic or PBR textures in Blender or Maya to natively import into Studio. ---- - -This guide covers the process to assign texture images in Blender or Maya to your 3D model so that they import seamlessly into Studio. The import process supports both basic textures and realistic PBR textures, as long as they meet Roblox's [texture specifications](./texture-specifications.md). - - -The following information is **specific for applying makeup textures generic meshes**. For more information on reassigning textures for makeup assets, see [Reassign textures in Blender and Maya](../../makeup/reassign-textures.md). - - -## Blender - -To assign Roblox-supported textures to your 3D model in Blender: - -1. In the Outliner, select your mesh object. -2. In the Properties panel, navigate to the **Materials tab**. -3. Verify that your object has a Material assigned with the Surface set to `Principled BSDF`. - -4. If no material is assigned, click the + symbol to add a material. - 1. Click the New button. A new `Principled BSDF` material populates. - -5. Navigate to the **Shading tab**. -6. With your mesh object selected, check the node graph. There may already be texture image nodes connected to the `Principled BSDF` node. -7. In the node graph area, add a texture image node with right-click > **Add** > **Texture** > **Image Texture**. - -8. In the new Image Texture node, click Open to open a file browser and insert your custom texture. - - - Alternatively to steps 7-8, you can **drag and drop** texture file from another window into the graph editor space. - -9. After adding image texture nodes and assigning the appropriate files, drag the `Image Texture` sockets to the appropriate sockets in the `Principled BSDF` node: - - -- **Basic texture** or **PBR color/albedo**: connect `Color` to `Base Color`. -- **Metallic texture**: connect `Color` to `Metallic`. -- **Roughness texture**: connect `Color` to `Roughness`. -- **Normal texture** images need to be added to a NormalMap node: - 1. Right-click in the graph-editor area and select **Add** > **Vector** > **Normal Map**. - 2. Connect Image Texture `Color` to NormalMap's `Color`. - 3. Connect NormalMap's `Normal` to PrincipledBSDF's `Normal` socket. - - -After replacing your PBR textures, [export the entire model](../../art/modeling/export-requirements.md#blender) and follow instructions to [import into Studio](./3d-importer.md). - - -## Maya - -To assign Roblox-supported textures to your 3D model in Maya: - -1. In the Status Line near the top of the default layout, click on the Hypershade icon. - -2. In the Create Window panel on the Hypershade popup, navigate to **Maya** > **Surface** and click **Standard Surface**. A surface node appears in the node editor. - -3. If adding a normal map, navigate to **Maya** > **Utilities** and click **Bump 2d**. A node required for normal maps appears in the node editor. - - - -4. Drag and drop your PBR textures to the graph network. - - - - 1. If adding a normal map, select the Bump 2d node, and change to Tangent Space Normals. - -5. Select your model and navigate to your material you intend to assign. Right-click and hold over the material and select **Assign Material to Selection**. - - - -After replacing your PBR textures, [export the model](../../art/modeling/export-requirements.md#maya) and follow instructions to [import into Studio](./3d-importer.md). - diff --git a/.cursor/rules/roblox/en-us/art/modeling/calisthenics-tool.md b/.cursor/rules/roblox/en-us/art/modeling/calisthenics-tool.md deleted file mode 100644 index 3f012555..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/calisthenics-tool.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: Calisthenics Tool -description: Calisthenics Tool is a Blender plugin that you can use to verify skinning quality of an asset. ---- - - -This tool is no longer in active development. You are free to use the tool for any purpose. The tool may be out of date or incompatible with modern Roblox assets. - - -The **Calisthenics Tool** is a supplemental [Blender](https://www.blender.org/) add-on that allows you to quickly test your asset through a set of animation cycles to verify your skinning data. At any point during the animation testing, you can pause and use Blender's skinning Tools, such as [Weight Painting brushes](https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/introduction.html), to resolve any skinning imperfections. - -Skinning your clothing and characters is a critical and often time-intensive process to create high quality assets that move and fit with different character bodies. Similar to the [Layered Clothing Validation Tool](../../art/accessories/validation-tool.md), the Calisthenics Tool can save you time when testing your character models after rigging and skinning. - - -The Calisthenics Tool doesn't provide complete verification of all potential skinning issues. You must also ensure that your custom models meet Studio's [avatar character specifications](../../art/characters/specifications.md) and any applicable [layered clothing specifications](../../art/accessories/specifications.md) for the best results in your experience. - - - -
    - -
    Walking Animation
    -
    -
    - -
    Running Animation
    -
    -
    - -
    Generic Movements
    -
    -
    - -## Installation - - -The Calisthenics Tool plugin is designed for [Blender 3.0+](https://www.blender.org/download/). You can download and modify the tool for any use. - - -To install the Calisthenics Tool in Blender: - -1. Download the [CalisthenicsTool.zip](https://github.com/Roblox/avatar/tree/main/Tools/CalisthenicsTool) and save the `.zip` file locally. -2. In Blender, navigate to **Edit** > **Preferences**. - - -3. In the left sidebar of the **Preferences** window, navigate to the **Add-Ons** section. -4. Click the **Install…** button. A file browser displays. -5. Select the `.zip` and click **Install Add-On**. -6. Using the search bar, search for "Calisthenics Tool" and select the add-on. -7. Enable the add-on by checking the box next to the add-on name. - - - -8. Close the Preferences window. You can now access the Calisthenics Tool by expanding the tool sidebar in the Viewport. - - -
    - -
    Use the arrow on the side of the Viewport to open the sidebar.
    -
    -
    - -
    Access the Calisthenics Tool by selecting the tab in the sidebar tool menu.
    -
    -
    - -## Use the Calisthenics Tool - -After installation, you can use the Calisthenics Tool whenever you want to test an R15 character rig with skinning data. With the Calisthenics Tool, you can check how a character would move with generic animations, as well as attach rigid reference accessories to verify attachment during these movements. The tool also includes an option to automatically export your character, removing reference animation and accessory data. - -You can try out the Calisthenics Tool using an [example character model](../../assets/modeling/skinned-meshes/calisthenic-tool/Fish-Character-No-FACS.fbx). - - -For demonstration purposes, this reference model doesn't contain FACS data. If you require a reference with facial animation, you can download the same model with FACS data from our [reference models](../../art/characters/specifications.md#reference-files). - - -### Test animations - -When testing your character model, first set the armature in the Calisthenics Tool then select one of the reference animations. It is important to visually verify your skinning quality using various movements and angles to ensure the best results for your model. - - -If you encounter any errors or warnings when setting armature or playing animations, verify that your model uses an appropriate bone hierarchy and naming convention outlined in Roblox's [custom mesh requirements](../../art/characters/specifications.md). - - -To test animations: - -1. Open a Blender project with an existing R15 character model, or import an appropriate character model `.fbx` using **File** > **Import** > **FBX (.fbx)**. - -2. For easier visualization, hide non-rendered mesh objects, such as armature, cages, and attachments to better preview the reference animations. - - - -3. Set which rig you want to test a reference animation on: - 1. In the add-on's **Armature** field, select the Eyedropper. - 2. In the Outliner, select the **Armature** object that contains your character's rig data. -4. Click on an animation cycle to preview, such as **Walk**, **Run**, **Move** or **Idle**. -5. Press **Stop Animation** to clear animation data. - - -6. If you notice any unexpected skinning deformations, pause on the frame and switch to **Weight Paint mode** or use Blender's other skinning tools to resolve. See [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md) for additional instruction. - - -### Test accessory attachments - -You can add reference attachments to your character model using the **Attach Test Accessory** buttons. These test accessories help preview how rigid accessories attach to your character and how they can move with your model. The tool includes two sets of rigid accessories to apply to your character. - - -
    - -
    **Normal Size** - Loads normal accessory references.
    -
    -
    - -
    **Slender Size** - Loads slender accessory references.
    -
    -
    - -To test accessories: - -1. Use the following **Attach Test Accessory** buttons to add or remove sample accessories to your character's attachment points: - - **Normal Size**: Adds normal scale test accessories. - - **Slender Size**: Adds slender scale test accessories. - - **Detach Test Accessories**: Removes any test accessories from your character. -2. If an accessory is not attaching at an expected location, reposition the associated **Attachment object** in your character rig. - -### Export models - -When you are ready to export your model, you can export your character directly through the Calisthenics Tool. The tool automatically clears any of the test data and applies appropriate export settings. - - -Using this tool to export models with [facial animations](../../art/characters/facial-animation/index.md) may result in unexpected behavior because the stored FACS data can conflict with the tool's reference animations. - - -To export from the Calisthenics Tool: - -1. In the **Export Path** field, set the export directory by clicking the folder icon and browsing to the appropriate file directory. - - -2. Click the **Export Model** button. The character model `.fbx` populates in the designated folder as `Character_Model_Export.fbx`. - - -If you are manually exporting your model with Blender's `.fbx` importer instead of the Calisthenics Tool, ensure the following before export: -- Detach the Calisthenics Tool's test accessories. -- Use the **Stop Animation** button to clear test animations from the timeline. -- Return the model to the default pose with no additional pose data. -- Verify your settings follow Roblox's [Blender export settings](../../art/modeling/export-requirements.md). - diff --git a/.cursor/rules/roblox/en-us/art/modeling/export-requirements.md b/.cursor/rules/roblox/en-us/art/modeling/export-requirements.md deleted file mode 100644 index eb49d057..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/export-requirements.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Export settings -description: Use the appropriate export settings in Maya and Blender to generate Studio-ready .fbx files. ---- - -Export your mesh or model as a `.fbx` to take advantage of all of Studio's 3D import features. When rigging or skinning a model, a `.fbx` export contains both the rig and influence data you need to later [import](../../parts/meshes.md#import-meshes) into Studio. - -Check that your model meets Roblox's [modeling specifications](../../art/modeling/specifications.md) before exporting to ensure Studio compatibility. Specific types of assets, like characters and accessories, have additional specifications: - - -If creating other types of 3D models: -
      -
    • For rigid accessories, see [accessory specifications](../../art/accessories/specifications.md) and [accessory export settings](../accessories/export-settings.md).

    • -
    • For layered accessories, see [layered accessory specifications](../accessories/clothing-specifications.md) and [layered export settings](../accessories/clothing-export-settings.md).

    • -
    • For avatar characters, see [avatar specifications](../../art/characters/specifications.md) and [avatar export settings](../characters/export-settings.md).
    • -
    -
    - -## Blender - -Before exporting a mesh from Blender, make sure to set the Scene Unit Length to **Centimeters** and, if applicable, set the Unit Scale to **.01** to ensure similar `.fbx` scaling within Studio. - -To export the `.fbx` file in Blender: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export**, then **FBX (.fbx)**. The **Blender File View** window displays. -3. On the right-hand side, change the **Path Mode** property to **Copy**, then toggle the **Embed Textures** button. - - Blender export sidebar showing Path Mode set to Copy and the Embed Textures button enabled. - -4. If your project doesn't already have .01 scene unit scaling, set the **Transform** > **Scale** to `.01`. - - - -5. Under the **Armature** section, disable **Add Leaf Bones**. - - Blender export sidebar showing Transform Scale set to .01 - -6. Unless exporting content with animation keyframes, such as a walk cycle or a character with [facial animation data](../../art/characters/facial-animation/index.md), disable **Bake Animation**. - - Blender export sidebar showing Add Leaf Bones as unchecked
    - -7. Click the **Export FBX** button. - -## Maya - -To export a mesh in Maya as a `.fbx` file: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Export All**. The **Export All** window displays. -3. Near the bottom of the window, click the **Files of type** dropdown, then select **FBX export**. -4. On the right-hand side of the window, navigate to the **Options...** section. -5. In the **Geometry** section, enable **Smooth Mesh** and **Referenced Asset Content**. -6. In the **Animation** section, disable **Animation**, unless you need to import an animation to Studio. Some avatar assets require animation. - 1. If you are exporting animation, enable **Bake Animation**. -7. If you need to import textures as a `.png`, in the **Embed Media** section, enable **Embed Media**. -8. In the **Advanced Options** section, - - Navigate to **Units**, then enable **Automatic**. - - Navigate to **Axis Conversion**, then set the **Up Axis** property to **Y**. -9. Click the **Export All** button. - - Maya export sidebar showing Bake Animation as unchecked diff --git a/.cursor/rules/roblox/en-us/art/modeling/gltf-export.md b/.cursor/rules/roblox/en-us/art/modeling/gltf-export.md deleted file mode 100644 index 41d812b9..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/gltf-export.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: 3D Export -description: 3D Importer imports third-party .fbx, .gltf, and .obj 3D model assets into Studio. ---- - -import BetaAlert from '../../includes/beta-features/beta-alert.md' - - - -You can export your 3D Roblox assets as a **.glTF** ([GL Transmission Format](https://en.wikipedia.org/wiki/GlTF)) file format. This open standard format allows for efficient transfer of 3D assets and associated data between Studio and other software, such as Blender or Maya. - -
    -Some common use cases for .glTF export includes: - -- Running [Avatar auto setup](../../avatar-setup/index.md#auto-setup), exporting the output and finalizing the meshes, cages, or rigging in a third-party tool. -- Exporting your entire place for high-fidelity scene renders in another 3D application. -- Creating 3D content in Studio, such as part-based models or editable meshes and making modifications in an external application. - -Keep in mind that glTF supports specific 3D [components](#supported-components), has some [limitations](#limitations), and requires correct [permissions](#limitations) to export assets from Studio. Some of these specifications may change over the course of the beta. - -## Supported components - -glTF export supports the following types of 3D data: - -- Meshes -- Textures -- Rigging and skinning data -- Vertex colors -- Cages -- Dynamic head FACS data. - -## Limitations - - -See the beta announcement for the latest information on limitations and currently known bugs. - - -At this time, glTF has the following limitations: - -- Does not support animation data. -- Inconsistent support for layered clothing — clothing accessories may not always position correctly and won't deform to avatar bodies outside of Roblox. - -## Permissions - - -See the beta announcement for the latest information on permissions and upcoming changes. - - -You must have the correct permissions to export assets as .glTF. When exporting .glTF, Studio verifies that you have permissions to export that asset and may warn you if there are any conflicts. - -
    -You can export the following assets: - -- Assets directly uploaded to your account -- Assets directly uploaded to one of your group accounts -- Mesh and image assets that have been explicitly shared with you or your group - -You cannot export the following assets: - -- Avatar Marketplace assets -- Acquired Creator Store assets -- Shared collaborator assets where the underlying meshes/images have not been explicitly shared -- Other `Open Use` (public) assets that have not been explicitly shared with you or your group - -## How to use .glTF export - - - -You can export selected items from the Explorer, or export the entire place. - -
    -To export from the Explorer: - -1. Select the items you intend to export. -2. Right-click and navigate to **Save / Export** > **Export as glTF**. -3. Follow the prompts on screen to fine-tune your export components. Click **Export** when ready. - 1. After clicking Export, Studio runs a permission check. If there are any permission conflicts, a permission prompt appears with additional details. -4. In the file browser, select a location to save the .glTF file. - -To export an entire place: - -1. Navigate to **File** > **Export as glTF**. -2. Follow the prompts on screen to fine-tune your export components. Click **Export** when ready. - 1. After clicking Export, Studio runs a permission check. If there are any permission conflicts, a permission prompt appears with additional details. -3. In the file browser, select a location to save the .glTF file. diff --git a/.cursor/rules/roblox/en-us/art/modeling/index.md b/.cursor/rules/roblox/en-us/art/modeling/index.md deleted file mode 100644 index 4946bfde..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/index.md +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Custom meshes -description: External modeling is the use of a third-party modeling software to create custom meshes. ---- - -**Custom meshes** are 3D objects that enhance the visual appeal and uniqueness of your environment and characters. In Studio, custom meshes are represented as `Class.MeshPart` objects, and you can use them to create assets like characters, clothing, environment props, and cosmetics. To create a custom mesh, you must use a third-party modeling application, such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview), to design and model the asset before importing the 3D object into Studio. - -Many 3D assets, like characters, are made up of several meshes and are represented in Studio as a single `Class.Model`. See [Models](../../parts/models.md) for more information. - -In Roblox, custom 3D assets generally fall under three types of applications: - -- **Generic meshes or models** you can use for environmental props, buildings, characters, and decoration within an experience. -- **Avatar models** for users or non-player characters (NPCs). -- **Accessory models** that character models can equip and wear, like clothing and cosmetics. - -If you meet certain account requirements, you can publish and sell your avatar-ready models on the Marketplace and earn a commission for each sale. For more information, see [Roblox avatars](../../avatar/index.md). - - -
    - A Roblox avatar wearing a glossy puffy jacket and jeans -
    Create custom accessories, clothing, and characters that anyone can wear and use
    -
    -
    - A floating alien creature in space, from the Beyond The Dark experience -
    Design a custom character unique to your experience
    -
    -
    - A cluttered interior room with a candle in the forefront and spooky interior lighting from the Mystery of Duvall Drive experience -
    Use custom meshes and models to give your environments ambiance and depth
    -
    -
    - -## Supported meshes - -Roblox supports many types of custom meshes, as long as they adhere to the [general mesh specifications](../../art/modeling/specifications.md). A basic custom mesh consists of at least one mesh object and one texture: - - -
    - A plain white tree mesh without a texture -
    A mesh object sets the shape and geometry of the 3D object
    -
    -
    - Various color maps used to apply textures to the tree bark, and inner, middle, and outer leaves -
    A texture image map applies a surface appearance and color
    -
    -
    - The tree mesh and the image maps combined to create a single tree -
    The mesh and texture combine to make a unique custom 3D object
    -
    -
    - -Studio also supports meshes that include [rigging and skinning](#rigging-and-skinning) data, [PBR textures](#pbr-textures), and other [Studio-related objects](#studio-related-objects) like cage meshes and attachments. Many of these various components are required if you are creating avatar character models or accessories. - -### Rigging and skinning - -A **rigged mesh** is a mesh with an internal poseable skeleton rig and bone structure. Rigged meshes allow mesh surfaces to rotate and move where internal bone joints are placed within a model, such as a character's knee or elbow. Skinning a rigged mesh allows the mesh object to bend organically, imitating the natural way joints would move in real life. - - -
    - -
    Without skinning, the entire head mesh rotates on a single axis
    -
    -
    - -
    With skinning, the head mesh bends naturally at the neck, and the bottom of the neck stays connected to the torso
    -
    -
    - -For more information on rigging and skinning, see [Rigging and skinning](../../art/modeling/rigging.md). - -### PBR textures - -**Physically-Based rendering** (PBR) textures allow you to represent realistic shading and lighting by using multiple types of texture images, or **maps**, on a single object. Combining multiple texture maps can more accurately simulate color, roughness, and reflectivity in any lighting environment and can enhance the visual elements of your assets and environment. - - - A realistic looking leafy bush with shadows and depth. - A realistic looking rock with moss on the top. - - -For more information on PBR textures, see [PBR textures](../../art/modeling/surface-appearance.md). - -### Studio-related objects - -Studio automatically converts certain types of objects found in 3D modeling files as specific workspace objects in the experience. These are typically used when creating a character or accessory, and configuring these in your modeling software can sometimes be the primary way of correctly setting up these Studio objects. - -The following objects are automatically created in Studio if they are detected by the importer: - -- `Class.Attachment` - Created when Studio detects mesh objects that include `_Att` at the end of their name. -- `Class.WrapTarget` - Created when Studio detects mesh objects that include `_OuterCage` at the end of their name. -- `Class.WrapLayer` - Created when Studio detects a mesh object with `_InnerCage` and similarly named mesh object with `_OuterCage` at the end of their names. -- `Class.FaceControls` - Created when Studio detects an avatar character head and the appropriate facial animation data in the model. - -## Resources - -There are a variety of resources available for creators of all backgrounds to get started with custom meshes. - -If you are interested in specific avatar creation topics, use the following table to find guides and resources that best match your needs: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TopicResources
    Reference files[Example models, project kits, and templates](../../art/modeling/project-files.md)
    Technical specs[.FBX export settings](../../art/modeling/export-requirements.md)

    [General mesh specifications](../../art/modeling/specifications.md)

    - [Avatar specifications](../../art/characters/specifications.md)

    [Accessory specifications](../../art/accessories/specifications.md)

    [Marketplace policy](../../marketplace/marketplace-policy.md)
    Bodies and clothing creation[Accessories overview](../../art/accessories/index.md)

    [Bodies overview](../../art/characters/index.md)

    [Face accessory creation](../../art/characters/facial-animation/create-face-accessories.md)

    [Accessory Fitting Tool](../../art/accessories/accessory-fitting-tool.md)

    [Accessory specifications](../../art/accessories/specifications.md)

    [Marketplace requirements](../../marketplace/marketplace-policy.md)
    Texturing[Texture specifications](../../art/modeling/texture-specifications.md)

    [PBR textures](../../art/modeling/surface-appearance.md)
    Rigging and skinning[Rigging and skinning overview](../../art/modeling/rigging.md)

    [Basic mesh rigging](../../art/modeling/rig-a-simple-mesh.md)

    [Facial bone rigging](../../art/characters/facial-animation/create-basic-heads.md#rigging)

    [Facial bone skinning](../../art/characters/facial-animation/create-basic-heads.md#skin-face-bones)

    [Avatar rigging requirements](../../art/characters/specifications.md#rigging)

    [Automatic skinning transfer](../../art/accessories/automatic-skinning-transfer.md)
    Facial animation and live heads[Basic head creation](../../art/characters/facial-animation/create-basic-heads.md)

    [Face accessory creation](../../art/characters/facial-animation/create-face-accessories.md)

    [FACS pose references](../../art/characters/facial-animation/facs-poses-reference.md)
    Testing and validation[Calisthenics Tool](../../art/modeling/calisthenics-tool.md)

    [Clothing Validation Tool](../../art/accessories/validation-tool.md)
    Publishing and Marketplace[Upload to Marketplace](../../marketplace/publish-to-marketplace.md)

    [Marketplace policy](../../marketplace/marketplace-policy.md)

    [Fees and commissions](../../marketplace/marketplace-fees-and-commissions.md)
    diff --git a/.cursor/rules/roblox/en-us/art/modeling/material-reference.md b/.cursor/rules/roblox/en-us/art/modeling/material-reference.md deleted file mode 100644 index 7f2fa28d..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/material-reference.md +++ /dev/null @@ -1,181 +0,0 @@ ---- -title: Material references -description: PBR texture examples and various texture map values. ---- - -When combining different combinations of metalness and roughness values with your PBR textures, Roblox can render virtually every type of surface with a high level of realism. The following includes various material values for common materials and [clothing examples](#clothing-examples) that you can use when creating your own PBR surfaces. - -The following figure illustrates the various base surface types you can achieve with various roughness and metallic values: - -
    - -
    - -## Common materials - -You can use the following material reference values as a baseline for creating your own custom surfaces: - - -
    - -
    Glossy Plastic
    Roughness: 0.1
    Metalness: 0.0
    -
    -
    - -
    Matte Plastic
    Roughness: 0.4
    Metalness: 0.0
    -
    -
    - -
    Rubber
    Roughness: 0.5-0.6
    Metalness: 0.0
    -
    -
    - -
    Latex
    Roughness: 0.0
    Metalness: 0.0
    -
    -
    - -
    Glossy Wood
    Roughness: 0.2-0.3
    Metalness: 0.0
    -
    -
    - -
    Worn Wood
    Roughness: 0.7-0.9
    Metalness: 0.0
    -
    -
    - -
    Cotton, Canvas, Denim
    Roughness: 0.8-0.9
    Metalness: 0.0
    -
    -
    - -
    Polyester, Nylon
    Roughness: 0.6-0.8
    Metalness: 0.0
    -
    -
    - -
    Wool, Linen
    Roughness: 0.9-0.096
    Metalness: 0.0
    -
    -
    - -
    Silk, Satin
    Roughness: 0.4-0.6
    Metalness: 0.4-0.6
    -
    -
    - -
    Velvet, Suede
    Roughness: 0.6-0.8
    Metalness: 0.4-0.6
    -
    -
    - -
    Glossy Leather
    Roughness: 0.2-0.4
    Metalness: 0.0
    -
    -
    - -
    Worn Leather
    Roughness: 0.5-0.7
    Metalness: 0.0
    -
    -
    - -
    Fur
    Roughness: 0.65-0.75
    Metalness: 0.0
    -
    -
    - -
    Scales
    Roughness: 0.5-0.6
    Metalness: 0.0
    -
    -
    - -
    Bone
    Roughness: 0.5
    Metalness: 0.0
    -
    -
    - -
    Skin
    Roughness: 0.65
    Metalness: 0.0
    -
    -
    - -
    Wax
    Roughness: 0.38
    Metalness: 0.0
    -
    -
    - -
    Marble
    Roughness: 0.375
    Metalness: 0.0
    -
    -
    - -
    Jade
    Roughness: 0.15
    Metalness: 0.0
    -
    -
    - -
    Painted Metal
    Roughness: 0.3
    Metalness: 0.0
    -
    -
    - -
    Pure Metals (Gold, Silver, Bronze)
    Roughness: 0.2-0.3
    Metalness: 1.0
    -
    -
    - -
    Worn Metals
    Roughness: 0.2-0.4
    Metalness: 1.0
    -
    -
    - -
    Glass Mirror
    Roughness: 0.0
    Metalness: 0.1
    -
    -
    - -## Clothing examples - -Layered clothing can take advantage of PBR textures to achieve realistic and visually popping cosmetics for avatar characters. Use the following reference examples to compare how various material values are used to achieve a certain cosmetic effect and its comparable real-time rendering in Substance Painter and Roblox Studio: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Substance Painter render
    Roblox Studio render
    Material values
    **Leather fabric:**
    - Roughness: 0.62
    - Metalness: 0.0

    - **Brass zipper:**
    - Roughness: 0.25
    - Metalness: 1.0
    **Metallic puffer fabric:**
    - Roughness: 0.62
    - Metalness: 1.0

    - **Brass zipper and buttons:**
    - Roughness: 0.482
    - Metalness: 1.0

    - **Fur hood:**
    - Roughness: 0.75
    - Metalness: 0.0

    - **Cotton band:**
    - Roughness: 0.8
    - Metalness: 0.0
    **Silk fabric:**
    - Roughness: 0.52
    - Metalness: 0.3

    - **Steel zipper and buttons:**
    - Roughness: 0.25
    - Metalness: 1.0

    - **Cotton band:**
    - Roughness: 0.9
    - Metalness: 0.0

    **Denim fabric:**
    - Roughness: 0.9
    - Metalness: 0.0

    - **Tarnished steel buttons:**
    - Roughness: 0.33
    - Metalness: 1.0
    diff --git a/.cursor/rules/roblox/en-us/art/modeling/project-files.md b/.cursor/rules/roblox/en-us/art/modeling/project-files.md deleted file mode 100644 index 69a0a16c..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/project-files.md +++ /dev/null @@ -1,590 +0,0 @@ ---- -title: Modeling project files and references -description: Download various modeling-related project files and reference files. -hideInPageNavigation: true ---- - -The following `.fbx`, `.blend`, and `.ma` project files are available to use as templates or as reference: - - - - - - - -
    Maple leaf tree
    -
    -
    A green maple tree mesh
    -
    -
    -A skinned tree model with the soil, branches, and leaves as separate meshes bound to a single armature. This is packaged with UV textures that can be applied with `Class.SurfaceAppearance`. This is an advanced version of the tree model used in the Skin a simple mesh guide. -
    -
    - - - -
    -
    - - - - - -
    Shoebot
    -
    -
    A white round robot with arms and orange trim.
    -
    -
    -A robot non-player character used in the Beyond The Dark showcase. -
    -
    - - - -
    -
    - - - - - -
    Creature
    -
    -
    A black and blue alien creature with tentacles.
    -
    -
    -Creature model from the Beyond The Dark showcase. This model is made up of 11 meshes and over 50 bones. -
    - -
    - - - -
    -
    - -
    - -## Avatar and accessories - -The following include examples and templates utilizing Roblox's required [avatar components](../../art/characters/index.md#components-of-an-avatar). Many of these project files and references require additional configuration in your modeling software before importing into Studio as a complete avatar character. See [Avatars](../../art/characters/index.md) for additional resources and template usage instruction. - -### References - - - - - - - -
    Fish person
    -
    -
    A blue-green scaly creature with a bulb-ish head ornament.
    -
    -
    -A rigged and skinned humanoid character model with a full body cage, facial animation rig, and associated PBR texture maps.

    If this asset were to be uploaded to the Marketplace, the bulb antenna must be a separate head accessory and not part of the character's head geometry. -
    -
    - - - - - -
    -
    - - - - - -
    Goblin
    -
    -
    A brown goblin with bright green eyes.
    -
    -
    -A rigged and skinned humanoid character model with a full body cage, facial animation rig. -
    -
    - - - - - -
    -
    - - - - - -
    Blocky
    -
    -
    A colorless blocky-like character.
    -
    -
    -A Blocky character model with an animatable head and a full body cage. -
    -
    - -
    - - - - - -
    - -
    - - - - - -
    Lola
    -
    -
    A pink-haired character complete with brown jacket, goggles, leggings, and pants.
    -
    -
    -A skinned R15 character created from the Skin a humanoid model guide. Since this reference model doesn't yet have [inner and outer cage mesh data](../../art/characters/specifications.md#outer-cages), this model can't equip layered clothing or accessories. -
    -
    - -
    - - - - - -
    - -
    - - - - - -
    Tshirt - uncaged
    -
    -
    A tie-dye tshirt with a rainbow of colors in a general spiral toward the torso.
    -
    -
    -Uncaged example clothing ready for caging in a 3D modeling software. -
    -
    - - - -
    - -
    - - - - - -
    Clothing examples
    -
    -
    -
    -
    -Caged 3D accessory models and associated PBR textures. Ready for import into Studio or in a modeling tool. -
    -
    - - - - - -
    - -
    - - - - - -
    Caging Examples
    -
    -
    -
    -
    -Additional caged clothing items from How to cage Roblox's 3D [clothing video guide](https://www.youtube.com/watch?v=QwZaA9Gc-WQ). -
    -
    - - - - - -
    - -
    - - - - - -
    Classic mannequin
    -
    -
    A white untextured mannequin in the blocky style.
    -
    -
    -A blank mannequin using Roblox's [Classic](../../art/characters/specifications.md#classic) avatar proportions.

    Use this reference to aid your creation process for accessories, clothing, and characters in third-party applications.

    The caged `.fbx` contains the individual outer body cages for the body and may not import correctly into Studio without modification. -
    -
    - - - - - - -
    -
    - - - - - -
    Rthro mannequin
    -
    -
    A white untextured mannequin in a larger build humanoid style.
    -
    -
    -A blank mannequin using Roblox's [Rthro Normal](../../art/characters/specifications.md#normal) avatar proportions.

    Use this reference to aid your creation process for accessories, clothing, and characters in third-party applications.

    The caged `.fbx` contains the individual outer body cages for the body and may not import correctly into Studio without modification. -
    -
    - - - - - - -
    -
    - - - - - -
    Rthro slender mannequin
    -
    -
    A white untextured mannequin in a slimmer build humanoid style.
    -
    -
    -A blank mannequin using Roblox's [Rthro Slender](../../art/characters/specifications.md#slender) proportions.

    Use this reference to aid your creation process for accessories, clothing, and characters in third-party applications.

    The caged `.fbx` contains the individual outer body cages for the body and may not import correctly into Studio without modification. -
    -
    - - - - - - -
    -
    -
    - -## Templates - -These project files require additional configuration before they are ready for Studio import. See [Create with templates](../characters/creating/index.md) for additional information. - - -If you are using Roblox's avatar template files, you must perform the [cleanup steps](../../art/characters/creating/combine-head-geometry.md) in order for the assets to properly validate before publishing to the Marketplace. - - - - - - - - -
    -A male and female presenting pair with a prominently round shaped head. -
    -
    -Blender and .fbx template files with pre-baked avatar components. -
    - -
    - - - - - -
    -
    - - - - - - -
    -A male and female presenting pair with a prominently square shaped head. -
    -
    -Blender and .fbx template files with pre-baked avatar components. -
    - -
    - - - - - - -
    -
    - - - - - - -
    -A male and female presenting pair with a prominently elongated snout and mouth. -
    -
    -Blender and .fbx template files with pre-baked avatar components. -
    - -
    - - - - - - -
    -
    - - - - - -
    -A male and female presenting pair with realistic body proportions and facial shape. -
    -
    -Blender and .fbx template files with pre-baked avatar components. -
    - -
    - - - - - - -
    -
    - - - - - -
    -A male and female presenting pair with larger anime-like eyes and prominently oval shaped faces. -
    -
    -Blender and .fbx template files with pre-baked avatar components. -
    - -
    - - - - - - -
    -
    - - - - - -
    -A humanoid cartoonish figure with exaggerated features, including a prominent forehead, nose, and chin. -
    -
    -Blender and .fbx template files with pre-baked avatar components. -
    - -
    - - - - -
    -
    - - - - - -
    -A cartoonish figure with a round head and exaggerated forehead. -
    -
    -Blender and .fbx template files with pre-baked avatar components. -
    - -
    - - - -
    -
    - -
    - -### Project files - - - - - - - -
    R15 rig and attachments
    -
    -
    A Blender visualization of bones and attachment meshes in a neutral humanoid pose.
    -
    -
    -Standard armature rig template for Blender. Use this template for rigging **bodies** and **clothing** items. -
    - -
    - - - -
    -
    - - - - - -
    Cages for clothing
    -
    -
    A humanoid shaped mesh in a neutral A-pose.
    -
    -
    -Project files for creation, includes a full-body inner and outer cage mesh for creation of **clothing** items. -
    - -
    - - - -
    -
    - - - - - -
    Cages for bodies
    -
    -
    A humanoid shaped mesh in a neutral A-pose. Each section of the mesh is colored differently based on the body part.
    -
    -
    -Project files for creation, includes the 15 individual body part cages required for caging your avatar **bodies**. -
    - -
    - - - - -
    -
    - - - - - -
    Combined project files
    -
    -
    -
    -
    -Template file containing all content from previous templates, includes rig skeleton, body cages, attachment points.

    Use this template to rig and cage bodies and clothing. -
    - -
    - - - - -
    -
    - -
    - -### Add-ons and tools - - - - - - - -
    Blender Studio plugin
    -
    -
    -
    -
    -Open-source Blender Studio add-on that allows you to upload assets directly from Blender to Studio. -
    - -
    - - - -
    - -
    - - - - - -
    Blender validation tool
    -
    -
    -
    -
    -Blender add-on for verifying avatar technical compatibility before importing into Studio. -
    -
    - - - -
    - -
    - - - - - -
    Blender Calisthenics tool
    -
    -
    -
    -
    -Blender add-on for checking skinning data on characters and clothing. -
    -
    - - - - - -
    - -
    - -
    diff --git a/.cursor/rules/roblox/en-us/art/modeling/reimport.md b/.cursor/rules/roblox/en-us/art/modeling/reimport.md deleted file mode 100644 index 0d843b17..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/reimport.md +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: Reimport -description: Reimport allows you to update an existing custom mesh and textures without generating a new instance. ---- - - -Reimport is currently in beta. Enable the Reimport beta by navigating to **File** > **Beta Features** and enable **Reimport**. - -For latest information on updates and limitations, see the [DevForum Announcement](https://devforum.roblox.com/t/studio-beta-reimport-one-click-updates-for-imported-3d-content/4068650). - - -**Reimport** allows you to update existing custom models and their textures from an external 3D file. Unlike regular [import](./3d-importer.md#import-files), which creates brand new instances, the reimport function updates existing objects non-destructively to help support the iterative nature of 3D development. - -
    - -Along with asset updates, reimport remembers the file and settings used to import the original asset. This means you can easily update an imported asset with a single click or hotkey without going through all the initial import settings. This memory persists across Studio sessions. - -## Supported instances - -At this time, reimport supports `Class.MeshPart` and `Class.SurfaceAppearance` objects parented within a `Class.Model` container. This is the common object structure of an imported custom model with PBR textures. Reimport also supports [packages](../../projects/assets/packages.md), allowing you to reimport batches of asset instances at once. - -- `Class.Model` - The reimport feature scans the container, updating any changed `Class.MeshPart` and `Class.SurfaceAppearance`. - - `Class.MeshPart` - Reimport replaces meshes based off of mesh names saved in Studio and the external 3D file. For specific behavior, see [MeshPart detection](#meshpart-detection). - - `Class.SurfaceAppearance` - Reimport replaces images for PBR textures based off of filenames. For specific behavior, see [SurfaceAppearance detection](#surfaceappearance-detection). - - -Reimport memory is local to your device. A Reimport ID is stored on the `Class.Model` instance and referenced locally. Keep in mind the following: - -- Filepaths are never saved in the place file. -- Reimport supports different reimport paths on different devices for the same instance. -- Reimport supports copy-pasting, saving and loading from rbxm/rbxl, and Asset Manager workflows. - - -### MeshPart detection - -Reimport updates meshes based off of the path and name of the 3D source file, and the path and name of the mesh object in Studio. Reimport only updates the mesh content and transform properties and preserves other Roblox-specific properties. - -Reimport relies on matching mesh names between the Studio and the 3D source file: - -- If a mesh's `path/name` in the 3D source file **matches** a `Class.MeshPart` `path/name` in Studio, reimport updates the matching `Class.MeshPart`. -- If a mesh's `path/name` in the 3D source file **doesn't exist** as `Class.MeshPart` `path/name` in Studio, reimport creates a new `Class.MeshPart` within the `Class.Model`. -- If a `Class.MeshPart` `path/name` in Studio **doesn't exist** in the 3D source file, reimport does not modify the `Class.MeshPart` in Studio. - -#### Known Asset Cache - -Studio uses a **Known Asset Cache**, which helps detect duplicate imports in the same Studio session. If an imported or reimported asset is detected, Roblox reuses the existing asset ID instead of creating and uploading a new asset. - -If you attempt to reimport a single mesh object, but the 3D file contains a larger number of meshes or textures, Roblox only applies a single asset upload for that object. - -#### Duplicates - -Reimport detects duplicate meshes, and doesn't reupload matching meshes that are the same in both Studio and the 3D source file. - -In the scenario where a mesh in Blender is renamed from "Mesh1" to "Mesh2", reimport creates a new `Class.MeshPart` named "Mesh2" and doesn't apply changes to the original "Mesh1". - -#### Pivot points - -In cases where you may want to use the pivot point of the `Class.MeshPart` and not the `Class.Model`, right-click any `Class.MeshPart` with reimport information and select **Reimport** > **Reimport relative to this**. - -**Reimport relative to this** triggers a reimport for the entire model using the pivot point of right-clicked `Class.MeshPart` as an anchor instead of the `Class.Model` pivot point. You can use this for models that have custom pivots by reimporting relative to a mesh that that has not changed position in the 3D file. - -### SurfaceAppearance detection - -Reimport can quickly batch update the textures of a model with [PBR textures](./surface-appearance.md) based off of the naming convention of the image files. - -Reimport detects a set of known suffixes for color, metalness, normal, and roughness maps. You can find the full list of supported suffixes in the following table: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Map TypeSuffixesExample
    Colordiffuse, diff, albedo, base, col, color, albTree_**Color**.png
    Metalnessmetallic, metalness, metal, mtl, metTree_**Metal**.png
    Roughnessroughness, rough, rghTree_**Normal**.png
    Normalnormal, nor, nrm, nrml, normTree_**Rough**.png
    - -When reimporting an asset with a `Class.SurfaceAppearance` selected, a file dialog displays allowing you to select a new image file to use as a PBR texture. Reimport automatically detects other PBR images in the directory based off of naming and maps them to the `Class.SurfaceAppearance` object. - -## Reimport models - -To enable reimport for an imported `Class.Model`, first configure your imported asset to save reimport configuration information for the model: - -1. Right-click the `Class.Model` of your imported asset and select **Reimport** > **Configure**. - Right-click menu of an imported model, displaying reimport options -2. In the Reimport configuration window, set the correct file path and import presets for future reimport actions. -3. Click **Save & Reimport** to initiate the reimport process. -4. For future reimports, right-click the `Class.Model` and select **Reimport** > **Reimport**. - 1. Alternatively, when selecting the object, use the reimport hotkey ShiftAltR. - 2. A loading indicator appears after selecting reimport. If there are any issues, a popup displays with any errors or warnings. - - -Since reimport relies on matching mesh paths/names to update a `Class.Model` from a 3D file, it’s important to maintain unique naming of meshes and their paths in your external 3D tools. - -In Studio, you should also maintain the naming/tree structure of the `Class.MeshPart` objects within your model in order for reimport to update correctly. - diff --git a/.cursor/rules/roblox/en-us/art/modeling/rig-a-humanoid-model.md b/.cursor/rules/roblox/en-us/art/modeling/rig-a-humanoid-model.md deleted file mode 100644 index 5b04eaf4..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/rig-a-humanoid-model.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: Rig a humanoid model -description: Explains the process for rigging a humanoid R15 model in Blender. ---- - -An R15 humanoid character model, such as those that make up user avatar characters, is made up of 15 individual mesh objects. Similar to rigging a simple mesh, you can bind or parent a group of meshes to an internal rig. Models made up of multiple meshes require additional steps to rig in a third-party modeling tool such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). - -This advanced guide covers the process of rigging a humanoid model in Blender using a provided template and humanoid model. This rigging step is required before [skinning the humanoid model](../../art/modeling/skin-a-humanoid-model.md). You should be familiar with [rigging a basic model](./rig-a-simple-mesh.md) before continuing. - -To rig a humanoid model in Blender: - -- [Import a character model](#import-model) into a template file to easily access a premade R15 bone structure. -- [Create, size, and position bones](#set-bones-and-armature) symmetrically for a humanoid character. -- [Parent](#parent-armature) multiple meshes to a single armature to bind the skeleton rig. -- [Assign full influence](#assign-meshes-to-bones) to each mesh object and bone by assigning influences. - - -This guide uses a downloadable [Rig and Attachment Template Blender Project](../../assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip), a reference [Lola Character model](../../assets/modeling/meshes/reference-files/lola-base-model.fbx), and [Blender version 3.0](https://www.blender.org/download/releases/3-0/). If you are -using another version of Blender, there may be minor differences in UI and -settings. - - -## Set up Blender - -To begin creating a humanoid rigged mesh, first set up the following in your Blender project: - -- [Import](#import-model) the Lola character model in the Mannequin Template Blender project. -- Set up your [Viewport visualizations](#viewport-visualizations) to optimize the rigging process. - -### Import model - -When rigging a model, make sure the character model you are using follows Studio's [Avatar character specifications](../../art/characters/specifications.md). For this guide, import a [Lola reference model](../../assets/modeling/meshes/reference-files/lola-base-model.fbx) into the mannequin template project. - -To import your model: - -1. In Blender, navigate to **File** > **Open** and select `Rig_and_Attachments_Template.blend`. -2. Navigate to **File** > **Import** > **FBX (.fbx)** and import the reference Lola model file. -3. If required, scale the model to roughly match the scale of the armature bone structure. You can select all the mesh geometries in the Outliner and press G to reposition and S to scale the mesh objects by dragging your mouse. - - - -### Viewport visualizations - -For better visualization and access to your bone objects, set your bone objects to always be displayed in front of the Viewport. - -To set the bone visualization: - -1. In the **Viewport**, click on any of the bones in your armature. -2. In the **Properties Editor** panel, select the **Object Data Properties** tab. -3. Expand **Viewport Display**, navigate to the **Show** property, then enable **In Front**. - - -At any point during the skinning process, you can also toggle one of the various material previews options in the top right of your 3D Viewport to change the visualization of your character model, such as enabling X-ray or texture view. - -## Set bones and armature - -In this guide, set up X-Axis Mirroring to make symmetrical changes to the left and right bones before repositioning the bones to the imported model. Try to maintain symmetry whenever possible when rigging a model. - - -If modifying bones or creating a new bone structure, keep in mind the specific bone hierarchy and naming requirements for R15 character models. - - -### Enable x-axis mirror - -The X-Axis Mirror setting allows you to maintain symmetry with your left and right bones by mirroring changes to their positions. To reduce issues with posing and animating, it is important to retain symmetry with your bone structure whenever possible. - -To set up X-Axis Mirror: - -1. In **Object Mode**, select your **armature** by clicking on any bone. -2. Switch to **Edit Mode** (Tab). -3. In the Viewport's right sidebar, extend the Tool panel and enable **X-Axis Mirror**. - - - -### Position bones - -With the model added to the project, you can reposition the bones provided in the template to match the character structure. In most cases, each bone should be positioned in the center of their corresponding mesh objects, such as the Head bone being centered within the Head_Geo mesh object. - -Bone positioning may differ based on use-case and may need to be revisited after weight painting and testing if a certain pose or animation doesn't work as intended. - -To position your individual bones: - -1. In Object Mode, click on the **bone** you intend to reposition to highlight it. -2. From the Mode dropdown, switch to **Edit Mode**. -3. Click on the **tip** of the bone so that the tip is highlighted and press G. The top of the bone moves with your cursor. -4. Pull this bone to align with the interior center of the model, then click to set the bone's position. - - - -5. Click and hold your mouse's scroll wheel or use one of the various perspective views to verify that the bone is within the mesh object. - - - -### Parent armature - -After you position the bone structure, you need to parent the bone armature to the model. You must parent all 15 mesh objects to one armature. - -For this example, the mesh objects are parented to the armature with Empty Groups to illustrate the vertex group assignment and weight painting process in the following [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md) guide. - -To parent the model to the armature: - -1. Switch to **Object Mode**. -2. In the Outliner, filter your mesh objects by typing **"geo"** in the search bar. -3. Select all of the mesh objects in the Outliner by holding Shift and clicking on the first and last mesh objects. -4. With the meshes highlighted, hold Shift and click on the Armature object in the Viewport or Outliner. -5. Right click in the Viewport and select **Parent** > **With Empty Groups**. - - - -## Assign meshes to bones - -Now that you have connected your armature to the mesh object, you can assign the vertices of your individual limbs to be fully influenced by one corresponding bone. After this process is completed, the model will be ready for skinning. See [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md) for instructions on applying multiple bone influences to a mesh. - - -The **Root** and **HumanoidRootNode** parent bones in a humanoid rig should not have any influences applied to them. Any added influences are dropped when importing into Studio. - - -To assign full influence to the head mesh: - -1. In **Object Mode**, click on the **head mesh object** to highlight it. -2. Switch to **Edit Mode**. -3. Select all the vertices of your mesh object by pressing A. -4. After all the head vertices are highlighted, navigate to the **Object Properties** panel on the right side of the screen. -5. In the **Vertex Group** section of the panel, select the name of the bone you want to assign the Head geometry to and click **Assign**. - - - -You can quickly iterate through all of your mesh objects in this mode by selecting the next mesh object in the Outliner and assigning it to the appropriate Vertex Group. For this guide, **assign all of your character's mesh objects to their appropriate bone**. - -To quickly assign vertex groups to the rest of the body meshes: - -1. In the **Outliner** panel, **click** the dot next to the object you intend to edit. The dot switches to the active edit icon when pressed. -2. If the vertices are not highlighted, press A to select all vertices. -3. In the **Object Properties** panel > **Vertex Groups** section, select the appropriate vertex group and click **Assign**. You can use the search bar to find the specific vertex group name. - - - -## Test - -You can test and pose bones and their assigned mesh objects in Pose Mode. It is important to test your model after applying or editing any influences. - -To navigate to Pose mode and test your poses: - -1. In **Object Mode**, select any part of your model. -2. Click on the Mode dropdown, then switch to **Pose** mode. -3. Hold Shift and click the bone you want to test to highlight it, then press R to test the rotation. -4. Press AltA (⌥A) to deselect the current bone, then reselect and test another bone. - - - - - To reset the rotation of a selected bone to neutral, press Alt+R. While rotating, you can also press your mouse's scroll wheel to change the axes of your rotation. - - -At this stage, if all of your mesh objects are influenced by their corresponding bones, you can [export](../../art/modeling/export-requirements.md) this rigged model as an `.fbx` for use in Studio or continue on to the next stage of [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md). diff --git a/.cursor/rules/roblox/en-us/art/modeling/rig-a-simple-mesh.md b/.cursor/rules/roblox/en-us/art/modeling/rig-a-simple-mesh.md deleted file mode 100644 index 161beff6..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/rig-a-simple-mesh.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -title: Rig a simple mesh -description: Explains the process for rigging a basic model in Blender. ---- - -You can create a **rigged mesh** using a third party modeling tool such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). You should rig a model after designing it, but prior to [exporting](../../art/modeling/export-requirements.md). - -To rig a simple model in Blender: - -- [Set up Blender](#set-up-blender) to Studio's relative scene units before importing a model to rig. -- [Create and reposition bones](#create-a-bone-structure) within the mesh object. -- [Parent the mesh to the armature](#parent-armature) to bind the bone armature to the mesh object. -- [Assign vertices to specific bones](#assign-vertices-to-bones) to define which parts of the mesh is driven by which bones. -- [Test your rigged mesh](#test) to ensure that the bones are properly positioned and influenced within the mesh. - - - This guide uses a downloadable [example robot model](../../assets/modeling/meshes/reference-files/shoebot-base-model.fbx) and [Blender version 3.0](https://www.blender.org/download/releases/3-0/). If you are using another version of Blender, there may be minor differences in UI and settings. - - -## Set up Blender - -To start the process of creating a rigged mesh, first set up the following in your Blender project: - -- Set up Blender's [scene unit and unit scale properties](#set-scene-and-scale) to Studio's proportions. -- [Import the model into Blender](#import-a-model) using Blender's file importer. - -### Set scene and scale - -When setting up Blender projects for Roblox Studio to import, you should modify Blender's default **scene units** and **unit scale** properties to ensure they closely align with Studio's scale. - -To start a new Blender project and set scene unit properties: - -1. Open a new **General** project in Blender. -2. Select the default shape, camera, and lights, then press Delete. -3. In the left-hand navigation of the **Properties Editor**, navigate to **Scene Properties**. - - - -4. In the **Units** section, change the **Unit Scale** to **0.01** and the **Length** to **Centimeters**. - - - -### Import a model - -For this example, import a [robot model](../../assets/modeling/meshes/reference-files/shoebot-base-model.fbx) into Blender as your mesh object. - -To import an existing `.fbx` model: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Import**, then the file format of the model you're importing. For this example, select **FBX (.fbx)** and the `.fbx` reference model. The model displays on the 3D viewport. - - Imported Model - -## Create a bone structure - -Now that your model is within Blender, you must add an **armature** and **bones** to your mesh object. An **armature** is a skeleton-like rigging object that acts as a container for bones, while **bones** are objects that control the movement and deformation of the group of vertices, or **vertex group**, that surround the bone. - -### Add an armature - -An armature is a structure required to add bones to your mesh. After you add in an armature, you can create and reposition any number of bones inside of your mesh object. - -To add an armature: - -1. At the top of the 3D viewport, select **Add** → **Armature**. - -2. For better visualization of the bones, in the left-hand navigation of the **Properties Editor**, navigate to **Armature Object Properties**. - -3. In the **Viewport Display** section, navigate to the **Show** property, then enable **In Front**. - - - -### Add and position bones - -When you add an armature to your project, Blender automatically adds one bone to the armature at a default position and scale which will act as the root bone. - -To add and position two additional bones: - -1. Click on the **bone** to highlight it. -2. At the top of the 3D viewport, click on the Mode dropdown, then switch to **Edit Mode**. -3. In the Viewport, click **Add** → **Single Bone**. Perform this step twice. - - - -4. In the Viewport or Outliner, click on **a newly created bone** to highlight it. -5. Press G and use your mouse to drag the bone onto the **right arm**. -6. Click on the second bone and press G to drag the bone on the **left arm**. - - -7. Click on the top of the **right bone** so that the tip is highlighted. Press G to drag and orient the bone horizontally toward the right. -8. Click on the top of the **left bone** so that the tip is highlighted. Press G to drag and orient the bone horizontally toward the left. - - - -9. In the Outliner, double-click and **rename** your bones so they can be easily referenced later. - - - -## Parent armature - -After you create and position the bone structure, you need to connect the armature to the mesh object by parenting the armature to the mesh object. - -In this guide, you should also use Blender's **Automatic Weights** function when you are parenting an armature, as it automatically adds weights and influences to your mesh. - -To parent an armature to a mesh: - -1. At the top of the 3D viewport, click on the Mode dropdown, then switch back to **Object Mode**. -2. Press AltA (Windows) or ⌥A (Mac) to deselect every object. -3. Hold Shift and select the **mesh object** and then the **armature**. The selection order is important. -4. In the **Viewport**, right-click on the mesh object. A pop-up menu displays. -5. Select **Parent**, then **With Automatic Weights**. - - - -## Assign vertices to bones - -With your armature connected to the mesh object, you can now assign the mesh vertices of your limbs to be fully influenced by their corresponding -bones. As a rigid model, each limb will completely bend and articulate when the bones are rotated, which is ideal for a non-organic character like a robot. - -To assign bone influence to the left and right arms: - -1. In Object Mode, select the **robot mesh object**. -2. In the Mode dropdown, switch to **Edit Mode**. -3. At the top-right of the Viewport, switch to **X-Ray** view using the Material Preview options. - - - -4. Drag and select the vertices you want to move with the right bone. -5. Navigate to the **Object Properties** panel. -6. In the **Vertex Group** section, select the name of the bone you want to assign and click **Assign**. -7. **Repeat steps 4-6** for the other bone and arm vertices. - - - -8. Drag and select the rest of the vertices in the center of the robot. -9. Navigate to the **Object Properties** panel. -10. In the Vertex Group section, select the **Middle bone** and click **Assign**. - - - -## Test - -You can test your rig in different poses in Pose mode. It's important to test your rigs after applying or changing influences before exporting. - -To test your applied influences: - -1. In **Object Mode**, select any part of your model. -2. At the top of the 3D viewport, click on the Mode dropdown, then switch to **Pose** mode. -3. Hold Shift and click the bone you want to test to highlight it, then press R to test the rotation. -4. Press AltA (⌥A) to deselect the current bone, then reselect and test another bone. - - - - - To reset the rotation of a selected bone to neutral, press Alt+R. While rotating, you can also press your mouse's scroll wheel to change the axes of your rotation. - - -The robot model is now a rigged mesh and ready to [export](../../art/modeling/export-requirements.md) to Studio. For reference, you can download the [final export](../../assets/modeling/meshes/reference-files/shoebot-rigged-model.fbx) (`.fbx`) of the model rigged in this guide. diff --git a/.cursor/rules/roblox/en-us/art/modeling/rigging.md b/.cursor/rules/roblox/en-us/art/modeling/rigging.md deleted file mode 100644 index f43795cc..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/rigging.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: Rigging and skinning -description: Rigging and skinning is a modeling process that connects an armature to a mesh, allowing it to be animated or posed in Studio. ---- - -**Rigging** is the process of connecting a mesh with an internal poseable skeleton rig and bone structure. Rigged meshes allow mesh surfaces to rotate and move where internal bones are placed within the model during the modeling process. Rigging is often performed in conjunction with **skinning**, creating a natural looking stretch and bend when models are animated or repositioned. You can create rigged meshes with third-party software such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). - - -
    - -
    A normal model can only rotate on its pivot point.
    -
    -
    - -
    A rigged model (or mesh) can rotate with any bone of its associated rig.
    -
    -
    - - -
    - -
    A rigged model with no skinning data.
    -
    -
    - -
    A skinned model that bends organically with the bone rotation.
    -
    -
    - -See the following resources to learn the basics and intermediate steps required to skin models in Blender: - -- [Rig a simple mesh](../../art/modeling/rig-a-simple-mesh.md) -- [Skin a simple mesh](../../art/modeling/skin-a-simple-mesh.md) -- [Rig a humanoid model](../../art/modeling/rig-a-humanoid-model.md) -- [Skin a humanoid model](../../art/modeling/skin-a-humanoid-model.md) - -## Rigs and bones - -The **rig**, or bone structure, within a rigged mesh creates additional poseable points for the 3D model in Studio. By rotating or moving the bones of a mesh, the parts of the mesh assigned to those bones can move independently from the rest of the mesh. The assignment of influence between meshes and bones, such as a **LowerLeftArm** bone driving the movement of the **LowerLeftArm** geometry, is set in a third-party application like Blender or Maya. When imported into Studio, Roblox saves this influence assignment data to the `Class.MeshPart` asset data. - -Once you successfully [import](../../parts/meshes.md#import-meshes) a rigged mesh model into Studio, Studio represents this rig structure with `Class.Bone` instances that you can then pose and animate. You can view bones in Studio by enabling **Show Constraint Details** from the **View** menu, or when you are using the [Animation Editor](../../animation/editor.md). - - -When `Class.Bone` objects are used in animation, they affect the appearance of the parts but don't change the physical shape in cases such as [collision detection](../../workspace/collisions.md). - - - -
    - A translucent humanoid outline, showing various sphere points where the constraints exist. -
    Constraint Details enabled
    -
    -
    - A translucent humanoid outline, showing 15 pink bones objects over various limbs. -
    When using the Animation Editor
    -
    -
    - -## Types of rigs - -Rigged models use a naming convention starting with "R" and ending with the number of individual meshes that make up the model. This is used to quickly identify the type and number of meshes that a model has. Although R6 and R15 models are common, a model can be of varying subjects, sizes and can have any number of individual meshes, such as a R5, R20, or R200. - -- **R1** refers to a single mesh that is rigged, or associated with an internal skeleton structure. Many models, such as a tree or accessory item, are good candidates to be made into an R1 model. Even humanoid characters, such as NPCs, can be created as R1 models but they will not be able to take full advantage of the animation and humanoid options available for R15 characters. - - See [Rig a simple mesh](../../art/modeling/rig-a-simple-mesh.md) for instructions on turning a basic mesh into an R1 model in Blender. - -- **R15** typically refers to humanoid models used as player or avatar characters. An R15 model is made up of 15 specific meshes that are parented to a single rig. A R15 character model often includes skinning data to allow the model to bend and pose naturally. Roblox uses the R15 standard for all avatars, and requires the [R15 technical specifications](../../art/characters/specifications.md) to ensure universal behavior and quality. - - See [Rig a humanoid model](../../art/modeling/rig-a-humanoid-model.md) for instructions on turning a character model into an R15 humanoid model in Blender. diff --git a/.cursor/rules/roblox/en-us/art/modeling/roblox-blender-plugin.md b/.cursor/rules/roblox/en-us/art/modeling/roblox-blender-plugin.md deleted file mode 100644 index 5f299b74..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/roblox-blender-plugin.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Roblox Blender plugin -description: The Roblox Blender plugin allows you to transfer assets directly from Blender to Studio. ---- - -The Roblox Blender plugin is a Blender add-on that allows you to link your Roblox account and quickly transfer 3D modeling objects directly from Blender to your Studio session. This tool helps you save time and reduce errors by skipping the process of exporting and importing third-party modeling files between applications. - -The Roblox Blender plugin is an open-source implementation of Roblox's [Open Cloud API](../../cloud/guides/index.md) and developers are encouraged to extend and build upon this tool for their own projects. For installation, use, licensing, and contribution details, see the [Roblox Blender plugin GitHub page](https://github.com/Roblox/roblox-blender-plugin). - - diff --git a/.cursor/rules/roblox/en-us/art/modeling/skin-a-humanoid-model.md b/.cursor/rules/roblox/en-us/art/modeling/skin-a-humanoid-model.md deleted file mode 100644 index 3a7ec112..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/skin-a-humanoid-model.md +++ /dev/null @@ -1,224 +0,0 @@ ---- -title: Skin a humanoid model -description: Explains the process for skinning a humanoid R15 model in Blender. ---- - -A humanoid skinned mesh is a character model that, when posed or animated, bends and stretches naturally at its joints. You can create a skinned mesh using a third party modeling tool such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). - -This is an advanced guide on skinning a humanoid model into an R15 model in Blender using the humanoid model completed in [Rig a humanoid model](./rig-a-humanoid-model.md). Before skinning a humanoid model, you should also familiarize yourself with the basic concepts in [Skin a simple mesh](../../art/modeling/skin-a-simple-mesh.md). - -To skin a humanoid model in Blender, you need to: - -- [Set up Blender](#set-up-blender) with a rigged model to optimize the weight painting process with bone visualization settings and Auto Normalize. -- [Weight paint](#weight-painting) vertices of your mesh objects by balancing influence of your vertices between two or more bones of a humanoid rig architecture. - - -This guide uses the humanoid model rigged in [Rig a humanoid model](./rig-a-humanoid-model.md) and [Blender version 3.0](https://www.blender.org/download/releases/3-0/). If you are -using another version of Blender, there may be minor differences in UI and -settings. - - -## Set up Blender - -This guide uses the rigged model completed in [Rig a humanoid model](./rig-a-humanoid-model.md). You can also download the rigged model [Blender project](../../assets/modeling/meshes/reference-files/lola-rigged-r15.blend) to follow along with this guide. - -To optimize the process of skinning a rigid character, first set up the following in your Blender project: - -- Open the Blender project and configure the [bone visualization](#bone-visualization) settings. -- Enable [Auto Normalize](#auto-normalize) to help optimize the weight-painting process. - -### Bone visualization - -By default, Blender displays bone objects as octahedral shapes. This original shape is useful when positioning bones but can get in the way while weight painting. To help visualization during the weight painting process, change your bone visualization to sticks. - -To update the visualization of your bones: - -1. In Object Mode, click the **armature**. -2. In the **Object Data Properties**, change the **Display As** value to **Sticks**. - - - -### Auto normalize - -The Auto Normalize setting forces the influence on your vertices to equal one. This makes weight painting multiple meshes and bones more efficient by ensuring that each vertex in your character is fully influenced by at least one bone. See Blender's documentation on the [Auto Normalize](https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/tool_settings/options.html) for more information. - -Auto Normalize also prevents cases where a vertex is fully influenced by multiple bones and can prevent common weight painting mistakes. - - -
    - -
    Without Auto Normalize, it is not clear until testing that this fully influenced head is also influenced by another bone due to a painting mistake.
    -
    -
    - -
    With Auto Normalize, painting influence to an incorrect bone removes the existing influence from the original bone. This makes mistakes easier to catch and resolve.
    -
    -
    - - -Studio doesn't support more than 4 bones to influence any single vertex. This may occur in complex rigs or inadvertently with Auto Normalize disabled. - - -To enable Auto Normalize: - -1. In **Object Mode**, select the **armature**. -2. Hold Shift and select **any mesh object** on your model. -3. At the top of the 3D viewport, click on the Mode dropdown and switch to **Weight Paint** mode. -4. On the right side of the viewport, expand the **Tool** tab. -5. Under **Options**, enable **Auto Normalize**. - - - -## Weight painting - -Weight painting applies specific weights, or influences, that bones will have over parts of a mesh using a painting workflow. There are also additional ways to apply influences through weight painting or other tools, some which are covered in [Skin a simple mesh](../../art/modeling/skin-a-simple-mesh.md). See additional online resources such as Blender's [Character Rigging](https://www.youtube.com/watch?v=f2pTkW-1JkE) and [Vertex Groups](https://www.youtube.com/watch?v=dKZrzG5r13g) fundamental guides for more information on skinning and applying weights. - -This guide will cover one process of weight painting the head and arm meshes of a humanoid model. These weight painting techniques can be used to weight paint the rest of the model. - - -Do not apply influences on the Root or HumanoidRootNode parent bones in a humanoid rig. Any added influences are dropped when importing into Studio. - - -### Paint the head mesh - -The head mesh connects to the upper torso at the bottom vertices of the neck. To create a realistic bend in the model, the head mesh needs to share influence with the Head bone and the Upper Torso bone near the neckline. - -To begin weight painting the Head mesh object: - -1. In Object Mode, click the **armature** then hold Shift and click the **Head mesh object**. -2. In the Mode dropdown, switch to **Weight Paint** mode. -3. Hold Shift and click the **Upper Torso bone**. The head should be completely blue as the Upper Torso doesn't yet influence any head vertices. - - - - - A common error is to apply weights with the incorrect bone selected. Make sure to Shift select and un-select the correct bones when applying weights. The name of the bone currently being painted will populate in the Viewport. - - -4. In the top right of the Viewport, open the **Tool** menu and set the **brush strength** to **1**. -5. With the Upper Torso bone selected, **paint** the Head of your model at the neckline. You can temporarily **Hide** the Upper Torso mesh in the Outliner to have direct access to the bottom of the neck. - - -6. At any point, check the applied influences by holding Shift and deselecting the Upper Torso bone and selecting the Head bone. Press R to rotate the Head bone with your mouse and test how the mesh object shares influences between the Head and Upper Torso bone. - - -7. If additional painting is required, hold Shift and select the bone you want to add or remove influence from, and use the Brush tool to apply. - -The final result of weight painting the head of the model should balance the head mesh influences with the Head bone and the Upper Torso bone: - - -
    - -
    The Head bone fully influences the Head_Geo mesh from the neck up.
    -
    -
    - -
    The Upper Torso bone fully influences the Head_Geo mesh from the neck down.
    -
    -
    - -### Paint the arm meshes - -Similar to the process for balancing influences between the Head bone and Upper Torso bone, arms and legs require a similar weight painting process. - -The right arm includes the Right Hand, Right Lower Arm, and Right Upper Arm, each with their corresponding bones. The following instructions provide guidance on painting influences to all of the arm mesh objects. You can then apply these techniques to the rest of the meshes in your model. - -#### Hand - -Starting with the Right Hand, you can balance the influences of the mesh between the **Hand bone** and the **Lower Arm bone** to create a natural bend at the wrist. - -To weight paint influences to the right hand: - -1. From Object Mode, click the **armature**, hold Shift, and click the right **hand** geometry. -2. In the mode dropdown, switch to **Weight Paint** mode. With the hand bone selected in this mode, you can press R and test the current rotation of the hand mesh object. - - - -3. In the top right of the Viewport, open the **Tool** menu and set the **brush strength** to **1**. -4. With the Lower Arm bone selected, **paint** the hand of your model at the wrist. You can temporarily **Hide** the Lower Arm mesh in the Outliner to get better access to the wrist. - - - -5. During and after weight painting the hand, press R with the bone selected to test the rotation and flexibility. - - - - -You can add and skin additional bones, such as fingers, if you want additional controls to your skinned mesh. - -Extra bone objects that are skinned to a mesh but do not share a Humanoid bone object name (such as LowerTorso, LeftFoot, Right UpperArm) are imported into Studio as a `Class.Bone` with the same name it was assigned with in the 3D modeling software. - - -#### Lower arm - -After the wrist of the right hand is weight painted, you can proceed to balance the influences of the Lower Arm mesh between the **Lower Arm bone** and the **Upper Arm bone** to create a natural bend at the elbow. - -To weight paint influences to the lower arm: - -1. Switch back to Object Mode. -2. Click the **armature** and hold Shift and click the right **lower arm** geometry. -3. In the mode dropdown, switch to **Weight Paint** mode. -4. Hold Shift and deselect other bones besides the Lower Arm bone. You can test the current rotation of the highlighted Lower Arm bone by pressing R. - - - -5. Hold Shift and select the Upper Arm bone. -6. With the Upper Arm bone selected, **paint** the lower arm of your model at the elbow. You can temporarily **Hide** the Upper Arm mesh in the Outliner to get better access to the elbow. -7. During and after weight painting the lower arm, press R with the lower arm bone selected to test the rotation and flexibility. - - - -#### Upper arm - -After the elbow of the right lower arm is weight painted, you can proceed to balance the influences of the Upper Arm mesh between the **Upper Arm bone** and the **Upper Torso bone** to create a natural bend at the underarm. - -To weight paint influences to the upper arm: - -1. Switch back to Object Mode. -2. Click the **armature** and hold Shift and click the right **upper arm** geometry. -3. In the mode dropdown, switch to **Weight Paint** mode. -4. Hold Shift and deselect other bones besides the Upper Arm bone. You can test the current rotation of the highlighted Upper Arm bone by pressing R. - - - -5. Press R and drag your mouse to rotate the Upper Arm so that the arm is horizontal. This makes it easier to access the vertices of the underarm. -6. Hold Shift and select the Upper Torso bone. -7. With the Upper Torso bone selected, **paint** the upper arm of your model at the underarm. You can temporarily **Hide** the Upper Torso mesh in the Outliner to get better access to the elbow. -8. During and after weight painting the lower arm, press R with the upper arm bone selected to test the rotation and flexibility. - - -#### Shoulder - -After the underarm is weight painted, you can proceed to balance the influences of the Upper Torso mesh between the **Upper Torso bone** and the **Upper Arm bone** to create a natural bend at the shoulder when the arm is moved. Since this movement is subtle, you only need to apply a partial strength influence to these vertices. - -To weight paint a partial strength influence to the upper torso: - -1. Switch back to Object Mode. -2. Click the **armature** and hold Shift and click the **upper torso** geometry. -3. In the mode dropdown, switch to **Weight Paint** mode. -4. Hold Shift and deselect other bones besides the Upper Arm bone. You can test the current rotation of the highlighted Upper Arm bone by pressing R. - - - -5. In the top right of the Viewport, open the **Tool** menu and set the **brush strength** to **.25**. You may want to adjust this based on the results when testing. -6. With the Upper Torso bone selected, **paint** the upper torso of your model at the shoulder. -7. During and after weight painting the lower arm, press R with the upper arm bone selected to test the rotation and flexibility of your influences to the upper torso. - - - - - -
    - -
    -
    - When rotating arms to their full range of motion, a candy-wrapping effect may occur between the shoulder and torso where the skinning loses volume and doesn't deform naturally. This effect may not be avoidable in many cases. -
    -
    -
    - -You can continue to weight paint the rest of the limbs of your model using these processes. When completed, you can [export](../../art/modeling/export-requirements.md) your skinned model as a `.fbx` using the Blender export settings for use in Studio. For reference, you can download a [Blender project](../../assets/modeling/meshes/reference-files/lola-skinned-s15.blend) with the model fully skinned. - - -Since this reference model doesn't yet have [inner and outer cage mesh data](../../art/characters/specifications.md#inner-and-outer-cages), this model can't equip layered clothing or accessories. - diff --git a/.cursor/rules/roblox/en-us/art/modeling/skin-a-simple-mesh.md b/.cursor/rules/roblox/en-us/art/modeling/skin-a-simple-mesh.md deleted file mode 100644 index 44b63327..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/skin-a-simple-mesh.md +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: Skin a simple mesh -description: Explains the process for skinning a basic model in Blender. ---- - -A skinned mesh is a rigged mesh that bends and flexes naturally when the internal skeleton rig is posed or animated. You can create a skinned mesh using a third party modeling tool such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). Skinning must be completed after the model is [rigged](./rigging.md). - -This guide covers the process for rigging and then skinning a simple tree model in Blender with 3 bones. For basics on rigging, see [Rig a simple mesh](./rig-a-simple-mesh.md) before continuing this guide. - -To skin a simple mesh, you need to: - -- [Set up Blender](#set-up-blender) to Studio's relative scene units before importing a model. -- [Create, size, and position bones](#position-bones) inside of an armature. -- [Parent a mesh to an armature](#parent-armature) to bind the skeleton rig to the mesh object. -- [Weight paint](#weight-paint) the mesh to assign which parts of the mesh will move with which bone. - - -This guide uses a downloadable [example tree model](../../assets/modeling/skinned-meshes/MapleLeafTree.fbx) and [Blender version 3.0](https://www.blender.org/download/releases/3-0/). If you are -using another version of Blender, there may be minor differences in UI and -settings. - - -## Set up Blender - -To start the process of creating a skinned mesh, first set up the following in your Blender project: - -- Set [scene unit and unit scale properties](#adjust-scene-and-scale) to Studio's proportions. -- [Import the model into Blender](#import-a-model) using Blender's file importer. - -### Adjust scene and scale - -When setting up Blender projects for Roblox Studio import, modify Blender's default **scene units** and **unit scale** properties to ensure they closely align with Studio's scale. - -To modify Blender's scene and scale units in a new project: - -1. Open a new **General** project in Blender. -2. Select the default shape, camera, and lights, then press Delete. -3. In the left-hand navigation of the **Properties Editor**, navigate to **Scene Properties**. - - - -4. In the **Units** section, change the **Unit Scale** to **0.01** and the **Length** to **Centimeters**. - - - -### Import a model - -For this guide, you'll import a [maple tree model](../../assets/modeling/skinned-meshes/MapleLeafTree.fbx) into Blender as your mesh object. - -To import a model into Blender: - -1. In the topbar, click **File**. A pop-up menu displays. -2. Select **Import**, then the file format of the model you're importing. For this example, select **FBX (.fbx)** and the `.fbx` reference model. The model displays on the 3D viewport. - - Viewport Display Settings - -## Create a bone structure - -Now that your model is within Blender, add an armature and **bones** to your mesh object. An **armature** is a skeleton-like rigging object that acts as a container for bones, while **bones** are objects that control the movement and deformation of the group of vertices, or **vertex group**, that surround the bone. - -### Add an armature - -An armature is a structure required to add bones to your mesh. After you add in an armature, you can create and reposition any number of bones inside of your mesh object. - -To add an armature: - -1. At the top of the 3D viewport, select **Add** → **Armature**. - - - -2. For better visualization of the bones, in the left-hand navigation of the **Properties Editor**, navigate to **Armature Object Properties**. - -3. In the **Viewport Display** section, navigate to the **Show** property, then enable **In Front**. - - - - - -### Position bones - -When you add an armature to your project, Blender also adds one bone to the armature at a default position and scale. You can rotate and scale the bone to more accurately represent the internal structure of your mesh object. - -To reposition the bone: - -1. Click on the **bone object** to highlight it. -2. At the top of the 3D viewport, click on the Mode dropdown, then switch to **Edit Mode**. -3. Click on the **top of the bone** and press G. The top of the bone moves with your cursor. -4. Pull this bone to align with the interior center of the model, then click to set the bone's position. - - - -5. Press and hold your mouse's scroll wheel to move the camera around the mesh object to see different views and angles to ensure that the bone is centered within the mesh object. - -### Add additional bones - -In this guide, you need 3 bones within your mesh so the tree can move and rotate at three points. - -To add additional bones into the armature: - -1. While still in **Edit Mode**, click on the tip of the bone. -2. Press E and drag your mouse upward. This extends an additional bone out of the original root bone. - - - -3. Repeat this process for the second bone. - - - -4. Press and hold your mouse's scroll wheel to move the camera around the mesh object to see different views and angles to ensure that the bones are within the mesh object. [Reposition the bones](#position-bones) as necessary. -5. In the Outliner, expand the **Armature** object. The armature's bone hierarchy displays. -6. In the Outliner, double-click and **rename** each bone. Bone object names remain the same when you import the mesh object into Studio. - - - -## Parent armature - -After the bone structure is created and positioned, you need to connect the armature to the mesh object by parenting the armature to the mesh object. - -This guide uses Blender's **Automatic Weights** function when you are parenting an armature, as it automatically adds weights and influences to your mesh. This can save you time during the [weight painting](#weight-paint) process. - -To parent an armature to a mesh: - -1. At the top of the 3D viewport, click on the Mode dropdown, then switch back to **Object Mode**. -2. Press AltA (Windows) or ⌥A (Mac) to deselect every object. -3. Hold shift and select the **mesh object** and then the **armature**. The selection order is important. -4. In the viewport, right-click on the **mesh object**. A pop-up menu displays. -5. Select **Parent**, then **With Automatic Weights**. - - - -## Weight paint - -With your armature connected to the mesh object, you can use the process of **weight painting** to change the amount of influence (weight) the bones will have on specific vertices to allow for more natural movement and flexibility. - -Blender represents weight strength with a [blue to red gradient](https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/introduction.html#the-weighting-color-code), where **blue** represents a value of **0** and **red** represents a fully influenced value of **1**. Vertices on a mesh object that are painted red will be fully influenced by that specific bone's rotation while vertices that are yellow or green will be partially influenced by the bone's rotation. - -You can quickly assign influence with the [Brush tool](https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/tools.html) in Blender's **Weight Paint** mode using the **Draw**, **Add**, or **Subtract** brush tools. For each brush, you can set the influence weight and radius in the **Tools** setting to the right of the **Viewport**. - - - -To optimize the painting process, [set up visualization and brush settings](#setup) before [painting influences](#paint-influence) to the mesh. - -### Setup - -When assigning influences for complex models, you can configure the following Blender settings to optimize the Weight Painting process. - -#### Bone visualization - -By default, Blender displays bone objects as octahedral shapes. This original shape is useful when positioning bones within the rig but can get in the way while painting. To help visualize the weight painting process, change your bone visualization to sticks. - -To update the visualization of your bones: - -1. In **Object Mode**, select the **Armature**. -2. In the left-hand navigation of the **Properties Editor**, navigate to **Object Data Properties**. -3. Change the **Display As** value to **Stick**. - - - -#### Auto normalize - -The [Auto Normalize](https://docs.blender.org/manual/en/latest/sculpt_paint/weight_paint/tool_settings/options.html) setting forces the influence on your vertices to equal one. This makes weight painting more efficient by ensuring that each vertex in your character is fully influenced by at least one bone. In this guide, Auto Normalize allows you to first apply full influence to the entire mesh quickly and then make minor adjustments with each bone. - -To enable Auto Normalize: - -1. In **Object Mode**, select the **Armature**. -2. Hold shift and select the **mesh object**. -3. At the top of the 3D viewport, click on the Mode dropdown, then switch to **Weight Paint** mode. - - - You must select the appropriate object to access specific modes, such as selecting a mesh object to access **Weight Paint** mode. If you are unfamiliar with switching to different modes, refer to Object Modes. - - -4. On the right side of the viewport, click the **Tool** tab. -5. Under the **Options** section, enable **Auto Normalize**. - - - -#### Projected brush - -A projected brush allows you to easily apply influence through a mesh, instead of just the surface. This is useful when painting influences on meshes that may be geometrically layered, such as the foliage of the tree. - -To set up a projected brush: - -1. In **Object Mode**, select the **Armature**. -2. Hold shift and select the **mesh object**. -3. At the top of the 3D viewport, click on the Mode dropdown, then switch to **Weight Paint** mode. -4. On the right side of the viewport, click the **Tool** tab. -5. Expand the **Advanced** section, then uncheck **Front Faces Only**. -6. Expand the **Falloff** section, then select **Projected**. - - - -### Paint influence - -With the [projected brush](#projected-brush) set up, you can now begin applying influence to the tree. Take advantage of the [Auto Normalize](#auto-normalize) setting by painting full red influence to the entire tree to the bottom bone and then assigning a partial influence on the middle and top bones. - -#### Bottom bone - -The bottom bone should fully influence the movement of the entire tree starting from the trunk. - -To start painting influence to the bottom bone: - -1. In **Object Mode**, hold shift, select the bones and then the mesh object. -2. At the top of the 3D viewport, click on the Mode dropdown, then switch to **Weight Paint** mode. -3. Hold shift and click on the bottom bone. -4. Use the brush tools to paint a red area of influence from the base of the bone and the rest of the tree. - - - - - You can adjust the radius of the brush in the Tool tab, or by holding F and dragging your mouse to change the size. - - -5. With the bone highlighted, test that the bone is influencing the entire model by pressing R and rotating the mouse. Paint any vertices that are not influenced correctly to apply influence to them. - - - -#### Middle bone - -The middle bone represents most of the foliage above the bottom bone. For a more subtle effect, apply a 50% influence (green) from the middle bone upwards. - -To paint influence to the middle bone: - -1. In **Weight Paint** mode, press AltA (Windows) or ⌥A (Mac) to deselect the current bone object. -2. Hold shift and click on the middle bone. -3. On the right side of the viewport, click the **Tool** tab. -4. Change the **Weight** value to **.5**. -5. Starting from the area at the middle bone, paint the middle and top area of the tree. -6. Press R to rotate the bone and test the influence at different angles. - - - -#### Top bone - -The top bone should influence the top leaf area above the middle bone. Paint this top area using 25% influence (teal) for a more natural effect. - -To paint influence to the top bone: - -1. In **Weight Paint** mode, press AltA (Windows) or ⌥A (Mac) to deselect the current bone object. -2. Hold shift and click on the top bone. -3. On the right side of the viewport, click the **Tool** tab. -4. Change the **Weight** value to **0.25**. -5. Starting from the area at the top bone, paint the top area of the tree. -6. Press R to rotate the bone and test the influence at different angles. - - - -After weight painting each bone, each section of this tree should now be influenced by the bottom, middle, or top bones. The bottom bone fully controls the trunk of the tree while the middle and top bones have a reduced influence on the branches and leaves. - - - -### Test - -It is important to constantly test the influences of your bone **throughout** the weight painting process. - -Blender allows you to test and pose bones **while** painting if both the armature and mesh are selected in Object Mode **before** switching to Weight Paint mode. This hybrid pose and weight paint functionality doesn't work unless you select both armature and mesh before entering Weight Paint mode. - -To test your weight painting: - -1. In **Object Mode**, select the **Armature**. -2. Hold shift and select the **mesh object**. -3. At the top of the 3D viewport, click on the Mode dropdown, then switch to **Weight Paint** mode. -4. Hold shift and click the bone you want to test, then press R to test the rotation. -5. Press AltA (⌥A) to deselect the current bone, then reselect and test another bone. - - - - - To reset the rotation of a selected bone to neutral, press Alt+R. While rotating, you can also press your mouse's scroll wheel to change the axes of your rotation. It is recommended to prioritize testing positions you expect to use in your animations and poses in Studio. - - -Your S1 tree model is now a skinned mesh and is ready for [export](../../art/modeling/export-requirements.md) for Studio. The Blender project file and [final export](../../assets/modeling/skinned-meshes/MapleLeafTree.fbx) (`.fbx`) are available for reference. diff --git a/.cursor/rules/roblox/en-us/art/modeling/specifications.md b/.cursor/rules/roblox/en-us/art/modeling/specifications.md deleted file mode 100644 index 1974e5f6..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/specifications.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: General specifications -description: Lists the specific technical requirements for custom models created outside of Studio. ---- - -Roblox supports a wide variety of mesh configurations created from third-party software such as [Blender](https://www.blender.org) or [Maya](https://www.autodesk.com/products/maya/overview). - -Check that your model meets the following modeling specifications and guidelines before exporting to ensure Studio compatibility. Specific types of assets, like characters and accessories, have additional specifications: - - -If creating other types of 3D models: -
      -
    • For rigid accessories, see [accessory specifications](../accessories/specifications.md) and [accessory export settings](../accessories/export-settings.md).

    • -
    • For layered accessories, see [layered accessory specifications](../accessories/clothing-specifications.md) and [layered export settings](../accessories/clothing-export-settings.md).

    • -
    • For avatar characters, see [avatar specifications](../characters/specifications.md) and [avatar export settings](../characters/export-settings.md).
    • -
    -
    - -When ready to export, see the [export settings](../../art/modeling/export-requirements.md) for mesh export settings for Blender and Maya. - - -If you meet certain account requirements, you can sell your custom meshes as accessories on the Marketplace. See [Rigid accessories](../../art/accessories/index.md) for an overview on the creation process for these types of accessories. - - -## Geometry - -See the following specifications for general geometry: - -- **Budgets** - Individual meshes can not exceed 20,000 triangles. Avatar items have their own individual budget requirements for [characters](../../art/characters/specifications.md) and [accessories](../../art/accessories/specifications.md). -- **Watertight** - All geometry must be watertight without exposed holes or backfaces. -- **No N-gons** - Meshes must be in quads where possible. -- **Volume** - Meshes cannot be 0 thickness and must have some volume. - -## Rigging and skinning - -Roblox supports third-party meshes with an internal rig, or skeleton structure that can be used as additional articulation points in your model. See [Character rigs](../../art/characters/specifications.md#rig) for specific standards for an R15 character rig. - - -
    - A cartoon-ish low polygon model of a puffer fish. -
    Generic rig model.
    -
    -
    - The Outliner in Blender of the puffer fish model, showing the armature bone structure. -
    Generic rig bone structure (Blender).
    -
    -
    - -See the following requirements for general rigging and skinning: - -- **Transformations** - All bones (Blender) or joints (Maya) must be frozen and have scale values set to `1`, `1`, `1` and rotation values set to `0`, `0`, `0`. -- **Symmetry** - When possible, maintain symmetry when applying influences to a rig -- **Root joint** - The root bone or joint should always be set to `0`, `0`, `0`. -- **Max influences** - A vertex can not be influenced by more than 4 bones or joints. -- **No Root influences** - Do not apply influences to the Root bone or joint. - -## Textures - -- Roblox supports basic color textures and modern [PBR textures](../../art/modeling/surface-appearance.md). -- For instructions on assigning texture images to natively import with your mesh, see [Assign textures in modeling tools](./assign-textures.md). -- For technical requirements and best practices when generating individual texture images, see [Texture specifications](../../art/modeling/texture-specifications.md). - -## Animations - -An animation can be included on any `.fbx` mesh export. For information on prepping a character animation from a modeling software for export, see [Export animations from Maya](../../art/characters/export-avatar-animations-from-maya.md). - -See the following requirements for assets with animation: - -- **Single track animation** - Only a single animation track can be exported with a mesh or model. If you want to export multiple animations, you need to create separate exports for each animation you want to import. - -## Inner and outer cages - -Inner and Outer cages are non-rendered meshes that Roblox uses to define the inner and outer surfaces of a mesh using a `Class.WrapLayer` or `Class.WrapTarget` instance. These cages are most often used with characters and accessories, though you can use cage meshes for any mesh object. - - -Character models must include an outer cage in order to properly equip layered clothing and accessories. See [Character specifications](../../art/characters/specifications.md) for additional information. - - -For general use, see the following requirements for adding inner and outer cage meshes to your model: - -- **Naming conventions** - The inner and outer cage must be named after the primary mesh object with **\_InnerCage** and **\_OuterCage** affixed. - - The Outliner in Blender showing two mesh objects called Tshirt_InnerCage and Tshirt_OuterCage. - -- **Outer cage** - Models, such as a playable character, that aren't expected deform but are the target of meshes that will stretch over it, only require an Outer Cage. - - For more information on applying and implementing cages on non-Humanoid targets, see [layered clothing on non-R15](../../characters/appearance.md#layered-clothing-on-non-r15). -- **Vertices and UV map** - Don't delete vertices or alter the UVs on the Inner or Outer Cages as this can cause errors when importing in Studio or when equipping onto a character. -- **Symmetry and consistency** - Keep each face (the space between vertices) consistently sized and retain symmetry wherever possible. Use symmetry tools in your modeling software whenever possible. diff --git a/.cursor/rules/roblox/en-us/art/modeling/surface-appearance.md b/.cursor/rules/roblox/en-us/art/modeling/surface-appearance.md deleted file mode 100644 index 19b3eb2e..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/surface-appearance.md +++ /dev/null @@ -1,450 +0,0 @@ ---- -title: PBR textures -description: PBR textures are advanced textures using multiple texture maps. ---- - -import BetaAlert from '../../includes/beta-features/beta-alert.md' - -**Physically-Based Rendering** (PBR) textures allow you to represent realistic shading and lighting by using multiple types of texture images, or **maps**, on a single object. Combining multiple texture maps can more accurately simulate color, roughness, and reflectivity in any lighting environment and can enhance the visual elements of your assets and environment. - - - - -A humanoid avatar with dreadlocks, a glossy jacket, jeans with decals, and boots. -A humanoid avatar with a short haircut, leather jacket, capri pants, and orange shoes. - - - - - A realistic leafy bush - A realistic mossy rock - - - - -Various applications and workflows are available for creating PBR textures. You can use these during the modeling and texturing phases of custom 3D object creation, provided that Roblox Studio [supports](../../art/characters/specifications.md#textures) the specific texture maps you're using. - - -For information on how to properly connect PBR textures to your model in Blender and Maya for import into Studio, see [Blender / Maya texture settings](./assign-textures.md). - - -This guide provides instructions on [setting up](#enable-surface-appearance) your mesh objects to use PBR texture maps, and describes common use-cases and best practices for Roblox's supported PBR [texture maps](#texture-maps). When creating your own surfaces, see [material references](../../art/modeling/material-reference.md) for common material values, image comparisons and clothing examples. - -## Enable surface appearance - -You can add PBR textures to any `Class.MeshPart` by adding a `Class.SurfaceAppearance` object which overwrites the original assigned texture. In general, you can't modify `Class.SurfaceAppearance` properties by scripts during an experience because the engine requires some pre-processing to display these graphics. Similar to adding a basic texture, each texture image map must point to the appropriate uploaded image asset ID. - -To enable surface appearance for a `Class.MeshPart`: - -1. In the [Explorer](../../studio/explorer.md) window, hover over the `Class.MeshPart` and click the ⊕ button. -2. Insert a `Class.SurfaceAppearance` from the contextual menu. - - A SurfaceAppearance object parented within a MeshPart in Studio's Explorer window. - - When you're ready to add texture maps to the `Class.SurfaceAppearance` object, you can click each map property in the [Properties](../../studio/properties.md) window and enter an asset ID. - -## Texture maps - -Studio currently supports 4 types of PBR texture maps: [color](#color-albedo), [normal](#normal), [roughness](#roughness), and [metalness](#metalness). Each of these maps correspond to an important aspect of the object's surface appearance. Texture maps only change visual appearance and don't affect the geometry of the `Class.MeshPart` object. - - -Avoid adjusting material values to look better in one specific lighting situation. You should base your material values on the physical characteristics and test and iterate to achieve a result that remains visually accurate in various lighting environments. - - -See the following examples for an overview of Roblox's supported texture maps and additional resources: - - - -The `Class.SurfaceAppearance.ColorMap|ColorMap` property sets the color data of the surface, including any transparency present in the map. See [color (albedo)](#color-albedo) for additional information. - -
    - A completely filled image, mostly red with various black splotches and white scratches. -
    Example map
    -
    -
    - A blank white sphere with a dark background. -
    Example mesh
    -
    -
    - A red sphere with black splotches and white scratches with a dark background. -
    Mesh and texture
    -
    -
    -
    - -The `Class.SurfaceAppearance.NormalMap|NormalMap` texture property defines the topography of the surface allowing you to add visual textures such as bumps, dents, or cracks to your surface. See [normal](#normal) for additional information. - -
    - A completely filled image, mostly cyan with streaks and bumps across the surface giving the impression of a tactile surface. -
    Example map
    -
    -
    - A blank teal sphere with a dark background. -
    Example mesh
    -
    -
    - A teal sphere with tactile streaks and bumps across the surface. -
    Mesh and texture
    -
    -
    -
    - -The grayscale `Class.SurfaceAppearance.RoughnessMap|RoughnessMap` texture property defines the smoothness of the surface, allowing for a glossy or matte visual appearance. See [roughness](#roughness) for additional information. - -
    - A completely filled image of black diamond shapes over a light grey background. -
    Example map
    -
    -
    - A blank purple sphere with a dark background. -
    Example mesh
    -
    -
    - A purple sphere that has glossy diamond shapes over its surface. -
    Mesh and texture
    -
    -
    -
    - -The grayscale `Class.SurfaceAppearance.MetalnessMap|MetalnessMap` texture property defines the metallic visual properties of the surface. See [metalness](#metalness) for additional information. - -
    - A completely filled image with a completely black border and scratch-like streaks revealing a white center. -
    Example map
    -
    -
    - A blank light blue sphere with a dark background. -
    Example mesh
    -
    -
    - A light blue sphere with parts of its surface looking scratched. The scratched areas reveal a metal-ness quality that is more reflective. -
    Mesh and texture
    -
    -
    -
    -
    - - -For technical details on texture file requirements, see [texture requirements](../../art/modeling/texture-specifications.md). - - -### Color (albedo) - -The **color**, or **albedo**, map determines the color of your texture and consists of mostly color information with little to no lighting or textural information. For additional customization, you can also add [transparency](#alpha-modes) in your albedo texture by adding opacity to your image map. - - -While albedo maps and generic [non-PBR texture maps](../../parts/textures-decals.md), commonly known as **diffuse maps**, contain very similar base color data for a surface, diffuse maps often include shading and lighting values to imitate a specific visual element that are more effectively handled by PBR's [normal](#normal), [roughness](#roughness), and [metalness](#metalness) maps. Using a typical diffuse map instead of an albedo map may often look incorrect when the lighting doesn't match with these added baked-in texture elements. - - -#### Alpha modes - -For objects that require partial or complete sections of transparency, such as grass, leaves, lace, or decals like dirt or grunge, you can use various **alpha modes** to apply transparency to your color map. If your color map image format supports alpha channels, you can apply a grayscale alpha map where `0.0` is transparent and `1.0` is opaque. Similarly, when using an image format such as a `.png`, any opacity on the color map applies as transparency on the asset. - -You can apply transparency in two different behaviors by setting the following `Class.SurfaceAppearance.AlphaMode|AlphaMode` values: - -- [Opaque](#opaque) — Ignores the alpha channel of the `Class.SurfaceAppearance.ColorMap|ColorMap` and uses the color value directly from the color map. -- [Overlay](#overlay) — Overlays the `Class.SurfaceAppearance.ColorMap|ColorMap` over the underlying mesh's `Class.MeshPart.Color`. Color maps using overlay mode reveal the base color of the mesh anywhere transparency is present. This is the default setting. -- [Transparency](#alpha-modes) — Removes the visible mesh based on transparency in the `ColorMap`. This renders the mesh see-through and does not reveal the original mesh color whenever transparency is present. -- [TintMask](#tintmask) — Blends the tinted `Class.SurfaceAppearance.ColorMap|ColorMap` over the un-tinted `Class.SurfaceAppearance.ColorMap|ColorMap`. - -##### Opaque - - - -You can use `Enum.AlphaMode.Opaque` mode to ignore the alpha channel of the `Class.SurfaceAppearance.ColorMap|ColorMap` altogether. In this case the alpha value is assumed to be 1 (fully opaque). - -The following example demonstrates how the `Enum.AlphaMode.Opaque|Opaque` mode works using a white object as reference: - - -
    - A polkadot texture with transparency. The background is completely transparent. -
    Example color/albedo map with transparency
    -
    -
    - A white torus on a plane. -
    Example mesh object (white)
    -
    -
    - The torus has the polkadot patterns scattered over its surface. Transparency value is ignored. -
    `Class.SurfaceAppearance.AlphaMode|AlphaMode` set to `Enum.AlphaMode.Opaque|Opaque` using reference map and material
    -
    -
    - -##### Overlay - -You can use `Enum.AlphaMode.Overlay` to reveal sections of the mesh's original color. Since the transparent areas of the color map expose the underlying color, you can design a unique texture map that partially or fully reveals the mesh's `Class.MeshPart.Color|Color` property for custom skin tones or other situations with unique colors. - -The following example demonstrates how the `Enum.AlphaMode.Overlay|Overlay` mode works using a white sphere reference: - - -
    - A completely filled image of a semi-repeating pattern with 8 by 8 small light blue squares. The background is checkered to indicate transparency. -
    Example color/albedo map with transparency
    -
    -
    - A blank white sphere over a dark background. -
    Example mesh object (white)
    -
    -
    - A white sphere with small blue squares scattered over the surface. -
    `Class.SurfaceAppearance.AlphaMode|AlphaMode` set to `Enum.AlphaMode.Overlay|Overlay` using reference map and material
    -
    -
    - -The following example uses the `Enum.AlphaMode.Overlay|Overlay` mode for custom characters, revealing the character's original skin-tone: - - -
    -A completely filled image of a texture map for a 3D humanoid model. Various parts of the image is checkered or partially checkered to indicate varying levels of transparency. -
    Color map containing transparency in sections to expose the original mesh color
    -
    -
    -Four of the same humanoid models with different skin tones: light brown, black, white, dark green. -
    Several variations of characters with a single color map using `Enum.AlphaMode.Overlay|Overlay` mode
    -
    -
    - -See [custom skin tone](../../art/characters/specifications.md#custom-skin-tone) for additional details on optimizing an overlay for skin and similar applications. - -##### Transparency - -You can use the `Enum.AlphaMode.Transparency` mode to create complex or extremely fine objects, such as lace or netting, by removing visible parts of the mesh as an alternative to sculpting the mesh geometry. Since this does not affect the geometry of the mesh object, this can allow you to create detailed objects without the performance impact of an intricate mesh model. - -The following example demonstrates how a partial and full transparency in this mode visually removes sections of the mesh: - - - - -
    -A sphere with a basket-like surface. -
    No transparency
    -
    -
    -A sphere with regular triangular patterns on its surface partially invisible. -
    Half transparency in sections
    -
    -
    -A sphere with regular triangular patterns on its surface completely invisible. -
    Full transparency in sections
    -
    -
    -
    - - -
    -A completely filled image of a thatched basket-like surface. -
    No transparency
    -
    -
    -A completely filled image with a thatched basket-like surface with a regular triangle pattern partially transparent. -
    Half transparency in sections
    -
    -
    -A completely filled image with a thatched basket-like surface with a regular triangle pattern fully transparent. -
    Full transparency in sections
    -
    -
    -
    -
    - -There are two outcomes of `Enum.AlphaMode.Transparency|Transparency` mode, depending on whether the `Class.MeshPart.Transparency` is set to `0` or **at least** `0.02`, although numerical precision may result in small values such as `0.01` triggering the opaque transparency. - -- When alpha is used to cut out the shape of mostly opaque objects with hard edges such as foliage, lace fabric, and netting, set the `Class.MeshPart.Transparency` to `0`. When parts of the surface are fully opaque, the Roblox engine can render them with proper depth‑based occlusion. Opaque surfaces also generally work better with depth‑based effects like `Class.DepthOfFieldEffect`, glass and water refraction, and water reflection. -- When alpha is used to add detail to semi‑transparent objects or objects with smooth gradients of transparency, set the `Class.MeshPart.Transparency` to **at least** `0.02`. This improves the quality of blending for objects such as dirty windows and soft‑edged feathers, but it will not work with all effects. - -##### TintMask - -You can use the `Enum.AlphaMode.TintMask` mode to apply `Class.SurfaceAppearance.Color` tinting to selective areas of a surface. The tinting is strongest where the alpha channel is fully visible and not applied where the alpha channel is transparent. - - - -
    -A warm, light colored brick texture with darker grey textured grout between the bricks. -
    -
    Example brick texture, showing the color detail on brick faces as well as in the grout between the bricks.
    -
    -
    -
    - -
    -A monochrome brick texture showing white in the brick face areas and solid black in between the bricks. -
    -
    Example brick texture alpha, with areas of the brick faces opaque (white) and the grout areas in between bricks transparent (black).
    -
    -
    -
    - -
    -Four square panels with a brick texture arranged in a vertical stack. They are tinted blue, yellow, purple, and red. -
    -
    Example brick texture with four different tint colors applied. The tint is affecting only the raised brick faces and not the grout between them.
    -
    -
    -
    -
    - - -When creating `Class.SurfaceAppearance.ColorMap` textures for use with a tint mask, preserve color in the transparent regions and turn off options such as pre-multiplied alpha that darken the color in transparent areas. The alpha values can also be semi-transparent to apply a partial tint to areas of the texture. - - -#### Color tinting - -You can apply a tint to your color map by modifying the `Class.SurfaceAppearance.Color` property. Tinting does not affect performance and you can save on memory by reusing a single color map with different tints. Use color tinting to create additional low-cost variation between your `Class.MeshPart` PBR textures or to programmatically modify your PBR surface colors in real-time. - - -
    -A statue with a default yellow tint and reflective jade-like properties. -
    Statue mesh from [The Mystery of Duvall Drive](../../resources/the-mystery-of-duvall-drive/index.md) with no tinting.
    -
    -
    -A statue with a red tint and continues to have a shiny reflective properties from its other texture maps. -
    Statue mesh with `Class.SurfaceAppearance.Color|Color` set to red.
    -
    -
    -A statue with a green tint and continues to have a shiny reflective properties from its other texture maps. -
    Statue mesh with `Class.SurfaceAppearance.Color|Color` set to green.
    -
    -
    - -`Class.SurfaceAppearance.Color` tinting applies as a multiplier, so the final appearance is a function of `Datatype.Color3` (texel color) times `Class.SurfaceAppearance.Color`. This means that authoring your original `Class.SurfaceAppearance.ColorMap` in near-white grayscale colors creates the strongest tinting effect when this property is applied. - -Tinting only applies to the `Class.SurfaceAppearance.ColorMap` and not the `Class.MeshPart.Color`. You can continue to use alpha channels when applying [transparency](#transparency). - -When `Class.SurfaceAppearance.AlphaMode` is set to `Enum.AlphaMode|Overlay` and an alpha channel is present, the underlying `Class.MeshPart.Color` is revealed and `Class.SurfaceAppearance.Color` tinting only applies to the visible `Class.SurfaceAppearance` color map. - -When `Class.SurfaceAppearance.AlphaMode` is set to `Enum.AlphaMode|TintMask` and an alpha channel is present, the alpha channel controls the amount of `Class.SurfaceAppearance.Color` tinting. The tinting is strongest where the alpha channel is fully visible and not applied where the alpha channel is transparent. - - - -
    -A floating square plane with a cyan slate texture, that gradually changes from fully transparent on the left to fully opaque on the right. A thin horizontal bar below the floating plane has a gradient with black on the left and white on the right. -
    -
    `Class.SurfaceAppearance.AlphaMode|AlphaMode` set to `Enum.AlphaMode|Transparency`. The greyscale gradient bar at the bottom indicates the alpha value. `Class.MeshPart.Color` is set to red and `Class.SurfaceAppearance.Color` is set to cyan.
    -
    -
    -
    - -
    -A floating square plane that gradually turns from a solid red color on the left to a cyan slate texture on the right. A thin horizontal bar below the floating plane has a gradient with black on the left and white on the right. -
    -
    `Class.SurfaceAppearance.AlphaMode|AlphaMode` set to `Enum.AlphaMode|Overlay`. The greyscale gradient bar at the bottom indicates the alpha value. `Class.MeshPart.Color` is set to red and `Class.SurfaceAppearance.Color` is set to cyan.
    -
    -
    -
    - -
    -A floating square plane that gradually turns from a white slate texture on the left to a cyan slate texture on the right. A thin horizontal bar below the floating plane has a gradient with black on the left and white on the right. -
    -
    `Class.SurfaceAppearance.AlphaMode|AlphaMode` set to `Enum.AlphaMode|TintMask`. The greyscale gradient bar at the bottom indicates the alpha value. `Class.MeshPart.Color` is set to red and `Class.SurfaceAppearance.Color` is set to cyan. Tint masking is not affected by `Class.MeshPart.Color`.
    -
    -
    -
    -
    - -### Normal - -The **normal**, or **surface**, map adds texture depth to your surface and behaves similarly to a [height map](../../parts/terrain.md#heightmaps). As a result, the effect may fade or intensify depending on the viewing angle and lighting environment. When a normal map is not present, the value is set to `0.0`. - -In the following figure, you can switch between the mesh reference and the map reference for comparisons of normal map values: - - - - -
    -A clay colored smooth sphere. -
    0.0
    -
    -
    -A clay colored sphere with a moderately rocky surface. -
    0.5
    -
    -
    -A clay colored sphere with an extremely rocky surface -
    1.0
    -
    -
    -
    - - -
    -A completely filled teal image. -
    0.0
    -
    -
    -A completely filled teal image with a moderate amount of surface aberrations in slightly lighter and darker shades -
    0.5
    -
    -
    -A completely filled teal image with a heavy amount of surface aberrations in slightly lighter and darker shades -
    1.0
    -
    -
    -
    -
    - -The **R**, **G**, and **B** channels of the image correspond respectively to the **X**, **Y**, and **Z** components of the local surface vector. A uniform image of color `[127, 127, 255]` translates to a completely flat normal map. Roblox only supports **OpenGL format - Tangent Space** normal maps. - -Normal maps prominently affect the visual surface of a mesh and can accentuate awkward seams in your texture. Whenever possible, keep your texture seams hidden to avoid visual issues with your mesh. - -### Roughness - -**Roughness**, or **microsurface**, maps determine how light is spread across your model's surface. When roughness is at `0.0`, the surface doesn't scatter light at all, resulting in a much sharper and brighter reflection and glossiness on your material. At `1.0`, light and reflections evenly scatter over the model resulting in a less reflective matte-like surface. - -Roughness may impact how reflective an object is at different angles, referred to as the **Fresnel** effect. See [fresnel](#fresnel) for more details and best-practices to maintain consistent reflective behavior. - -The following figure shows comparisons of various roughness map values: - - -
    -A blue glossy sphere with a legend indicating the roughness map is completely black. -
    0.0
    -
    -
    -A blue semi-glossy sphere with a legend indicating the roughness map is exactly grey. -
    0.5
    -
    -
    -A blue matte sphere with a legend indicating the roughness map is completely white. -
    1.0
    -
    -
    - - -Various combinations of the roughness and metalness can represent almost every possible real-world material surface. See [material references](../../art/modeling/material-reference.md) for examples and references of how combinations of material values can create various surface appearances. - - -#### Fresnel - -**Fresnel** refers to the amount of reflection of a surface in reference to the current viewing angle. Studio's Fresnel processing aims for physical real-world accuracy, although you may get unexpected specular contribution at certain angles even with rough surfaces. In some cases, you can compensate by making your roughness map around `0.1` more rough to achieve a consistent lighting response with your materials. - -Even though Roblox renders this lighting effect accurately, the brightness and reflectivity of a surface may not respond consistently between your texture content creating software, such as Substance Painter, and Studio. See [clothing examples](../../art/modeling/material-reference.md#clothing-examples) for differences in rendering between applications. - -### Metalness - -**Metalness** determines the reflectivity of a surface. Metalness values range between `0.0` and `1.0`. Roblox sets the default value to `0.0` if a metalness map is not present. - -See the following figure for comparisons of various metalness map values: - - - -
    -A brown sphere with light splotches. A legend indicates the metalness map is completely black. -
    0.0
    -
    -
    -A brown sphere with light splotches and some reflectiveness. A legend indicates the metalness map is exactly grey. -
    0.5
    -
    -
    -A brown sphere with moderate splotches and lots of reflectiveness. A legend indicates the metalness map is completely white. -
    1.0
    -
    -
    - -Different PBR renderers use various workflows for processing reflectiveness. Studio only uses the **metalness workflow** which determines whether a material is a **nonmetal** or a **metal**, sometimes referred to as an **insulator** or **conductor**. - -In most cases, you should set this value to either `0.0` (non-metal) or `1.0` (metal). You can use partial metalness values when creating more uncommon surfaces with moderate reflective properties, like satin or silk. This practice can subtly fake the reflections in the material to highlight the color from the [color/albedo map](#color-albedo) over colors reflected in the environment. - - -Various combinations of the roughness and metalness can represent almost every possible real-world material surface. See [material references](../../art/modeling/material-reference.md) for examples and references of how combinations of material values can create various surface appearances. - diff --git a/.cursor/rules/roblox/en-us/art/modeling/texture-specifications.md b/.cursor/rules/roblox/en-us/art/modeling/texture-specifications.md deleted file mode 100644 index 71974d09..00000000 --- a/.cursor/rules/roblox/en-us/art/modeling/texture-specifications.md +++ /dev/null @@ -1,215 +0,0 @@ ---- -title: Texture specifications -description: Texture Specifications lists the specific technical requirements and best practices for custom textures created outside of Studio. ---- - -A texture is a digital image applied to the surface of a 3D object to simulate and enhance its visual appearance. Roblox supports various texture types that you import with a custom 3D object, or upload directly as individual image files. For details on implementing basic textures, see [Textures and decals](../../parts/textures-decals.md). - -Roblox also supports [physically-based rendering (PBR) textures](../../art/modeling/surface-appearance.md) which override a mesh's existing `Class.MeshPart.TextureID|TextureID` and can be used to create immersive environments and objects. - - -For information on how to properly connect textures to your model in Blender and Maya for import into Studio, see [Blender / Maya texture settings](./assign-textures.md). - - -See the following requirements when creating your own basic and advanced textures: - -- **File formats** — File formats for textures that are uploaded separately in Studio must be submitted as a `.png`, `.jpg`, `.tga`, or `.bmp`. - -- **Resolution** — Roblox supports up to 4096x4096 pixel texture resolutions (4K). As an experience loads, the engine automatically starts with lower quality versions of the texture and ramps up quality based on device resources. Even still, manually sizing textures before you upload them can improve memory usage in some situations. Consider the following general guidance: - - - For smaller 5×5 stud objects, use 256×256 texture resolutions. - - For medium 10×10 stud objects, use 512×512 texture resolutions. - - For larger 20×20 stud objects, use 1024×1024 texture resolutions. - - See [PBR texture budgets](#surfaceappearance) for similar guidances with PBR texture maps. - -- **Single material** - Mesh objects can only have one material assigned. - - -Roblox default [materials](../../parts/materials.md) follow a similar texel resolution pattern: -- Parts display a 1024×1024 on an 8×8 stud face. -- Terrain displays 512×512 across 8×8 studs. - - -## SurfaceAppearance - -You can add a [surface appearance](../../art/modeling/surface-appearance.md) to your mesh in Studio to add PBR texture options. The `Class.SurfaceAppearance` instance uses UV mapping, a form of texture mapping, to accurately map up to four 2D images onto the mesh object. - - -For information on how to properly connect PBR textures to your model in Blender and Maya for import into Studio, see [Blender / Maya texture settings](./assign-textures.md). - - -See the following requirements for `Class.SurfaceAppearance` assets: - -- **Texture files** — Ensuring your textures follow consistent conventions optimizes assets for tools like the [3D Importer](../../art/modeling/3d-importer.md) and helps with organization. When possible, texture files should include the appropriate name affix and follow the appropriate image details: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Texture typeTexture schema suffixTexture image details
    Albedo_ALBRGB (24-bit)
    Metalness_METSingle Channel Grayscale (8-bit)
    Normal_NORRGB (24-bit) - Roblox only supports **OpenGL format - Tangent Space** normal maps.
    Roughness_RGHSingle Channel Grayscale (8-bit)
    - -- **PBR Texture Budget** — Use an appropriate texture map size based on the asset you are texturing to optimize for visual quality and performance. As a general guideline, each asset should have a texture resolution of 256×256 for every 2×2×2 unit space the asset occupies. If larger than a 2×2×2 cube, use the next highest resolution. The following are some baseline texture sizing examples: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Recommended map sizeApproximate asset size (unit cube)Example assets
    64×64 - 128×1281×1×1Jewelry, sunglasses, eyebrows, mustaches.
    256×2562×2×2Hair, shoes, tank tops, t-shirts, shorts, short skirts.

    256x256 is the **maximum budget** for non-albedo maps (RGH, MTL, NOR) for [rigid accessories](../accessories/specifications.md#textures).
    512×5124×4×4Jackets, pants, overalls, long-sleeve shirts, long skirts.
    1024×1024 (maximum)8×8×8Full body clothing (onesies, robes), humanoid characters.
    - - - When rendering many textures at the same time, Roblox may downsample textures to optimize for performance. - - -## UV mapping - -All textures use UV mapping, a 3D modeling process to project a 3D model's surface to a 2D image, or UV atlas. See the following requirements for UV mapping, especially if you're manually editing or optimizing your UV atlas: - -- **Single UV Set** — Use a single UV set for each component, such as a humanoid or accessory. Studio doesn't allow for multiple UV sets. -- **Coordinates** — All UVs must be created within a 0:1 space. -- **Overlaps** — Overlapping UVs are allowed. -- **Maximum Texture Resolution** — Roblox supports up to 1024×1024 pixel spaces for texture maps. See [Optimizations](#optimizations) for more details on efficiently texturing your assets. - -### Optimizations - -Studio's UV compositor allows you to pack and size your UVs to best suit your needs because it can detect and repackage UVs for performance and storage efficiency. The compositor looks to each component of the model, such as a character (arms, legs, torso, head), and repackages and loads the UVs as needed when in-experience changes occur, such as swapping body parts. - -Especially with character models and other advanced models, optimizing your UV layouts can help prevent texture issues, save loading time, and improve performance. Keep in mind the following best practices for optimizing your UV islands for Roblox's UV compositor: - -- **Pixel space** — Studio's texture compositor repacks UVs by breaking up the following pixel spaces: - - - **1024×1024** pixel space into **64×64 16 pixel** blocks. - - **512×512** pixel space into **32×32 16 pixel** blocks. - - **256×256** pixel space into **16×16 16 pixel** blocks. - - -
    - -
    1024×1024 UV example
    -
    -
    - -
    512×512 UV example
    -
    -
    - -
    256×256 UV example
    -
    -
    - -- **Avoid Sharing 16 Pixel Blocks** — To maximize your UV space and the resolution of your model, keep all UV islands within these 16 pixel blocks when possible, and do not let two UV islands share the same 16 pixel block. - - -
    - -
    - - Inefficient UV Layout - UV islands share blocks in the same 16 pixel grid. The compositor treats this as one large group. - -
    -
    -
    - -
    - - Optimized UV Layout - UV islands are near each other but do not share any blocks on the 16 pixel grid. The compositor treats these as separate groups. - -
    -
    -
    - -- **Use Smaller Islands** — When possible, use smaller islands to simplify layout and packing. This can help prevent a UV island for one body part incorrectly applying to another as the compositor can't differentiate the islands. - - -
    - -
    - - Inefficient UV Island - Several UV islands overlap into other island spaces on the 16 pixel grid. The compositor treats them as a single large object and may not optimize efficiently. - -
    -
    -
    - -
    - - Optimized UV Islands - By using smaller islands, none of the UV islands overlap on 16 pixel blocks. The compositor can easily identify them as smaller block groups to repack efficiently. - -
    -
    -
    - -By optimizing your UV layouts, you can prevent unexpected texture conflicts, save space, and improve performance. The following is an example of how Studio's compositor can process the same character body UV layouts with and without optimizations: - -
    - -
    - - Texture Repacking with Inefficient UVThe islands share too many of the same 16 pixel blocks and causes the compositor to combine many islands as one. In this example, the compositor incorrectly packs the island for the torso area by including several other islands as well. - -
    -
    - -
    - -
    - - Texture Repacking with Optimized UVThe islands do not share any 16 pixel blocks and allows the compositor to correctly identify each island. This ensures that the compositor correctly packs the island specifically for the required part and prevents unnecessary UV space from being saved and repacked. - -
    -
    diff --git a/.cursor/rules/roblox/en-us/art/overview-dcc.md b/.cursor/rules/roblox/en-us/art/overview-dcc.md deleted file mode 100644 index 4570215f..00000000 --- a/.cursor/rules/roblox/en-us/art/overview-dcc.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: Work with third-party software -description: An overview of how to incorporate content created from other software into Studio. ---- - -Creators on Roblox often leverage third-party creation tools to make custom assets and content. These external tools typically specialize in areas like **3D modeling**, **texture creation**, or **audio editing**, and offer additional features and flexibility that complement the Roblox Engine. Check out [Roblox staff 3D art articles](https://devforum.roblox.com/tags/c/resources/roblox-staff/278/art) for guides, tips, and tutorials on using various third-party software. - -In most workflows, you create custom assets in [third-party software](#examples-of-third-party-software), export them as a common file type, and then [import the file into Studio](#import-to-studio). - -## Examples of third-party software - -The following are examples of third-party software that creators commonly use: - -- **3D modeling software** - - - Creators use external 3D modeling software such as [Blender](https://www.blender.org/), [Maya](https://www.autodesk.com/products/maya/overview), or [Cinema 4D](https://www.maxon.net/en/cinema-4d) to design intricate and detailed 3D models. These models can include characters, props, and environmental assets. - -- **Image editors and texture creation tools** - - - Graphics designers and texture artists can use tools like [Photoshop](https://www.adobe.com/products/photoshop) or [Substance Painter](https://www.adobe.com/products/substance3d-painter) to create high-quality images. You can use these images for graphic interfaces or as textures for your 3D models. These tools allow for detailed painting, mapping, and manipulation of textures to achieve realistic or stylized effects. - -- **Audio editing software** - - - Creators working on sound design or music for their Roblox experiences might use external audio editing software like [Audacity](https://www.audacityteam.org/) or [Reaper](https://www.reaper.fm/). These tools allow for precise control when creating audio assets. - -By using third-party software, creators can tap into specialized features, workflows, and expertise, while expanding their creative possibilities and enhancing the overall quality of their Roblox experiences. - -## Import to Studio - -Studio provides several tools to get your third-party content into Studio depending on the type of asset you upload: - -- Models - - - Uploaded models must follow Studio's [modeling specifications](../art/modeling/specifications.md). - - Studio's [3D Importer](../art/modeling/3d-importer.md) supports `.gltf`, `.fbx`, `.obj` file formats. - - You can also use tools like the [Roblox Blender plugin](../art/modeling/roblox-blender-plugin.md) to connect your modeling software to Studio and directly upload your modeling assets between applications. - -- Images - - - Uploaded textures must follow Studio's [texture specifications](../art/modeling/specifications.md). - - Studio's [Asset Manager](../projects/assets/manager.md) supports `.png`, `.jpg`, `.gif`, `.tga`, or `.bmp` file formats and allows for bulk file imports. - -- Sounds - - - Uploaded sounds must follow Roblox's [audio asset requirements](../audio/assets.md#import-audio). - - Studio's [Asset Manager](../projects/assets/manager.md) supports `.ogg`, `.mp3`, `.flac`, and `.wav` file formats and allows for bulk file imports. - -- Video - - - You can import video assets in either `.mp4` or `.mov` format if all of the [requirements](../ui/video-frames.md) are met. - - -Roblox performs asset moderation on upload of any asset type. Roblox can also moderate assets after the initial upload. For more information, see [Asset moderation](../projects/assets/index.md#asset-moderation). - diff --git a/.cursor/rules/roblox/en-us/art/overview-studio.md b/.cursor/rules/roblox/en-us/art/overview-studio.md deleted file mode 100644 index d621aec6..00000000 --- a/.cursor/rules/roblox/en-us/art/overview-studio.md +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: 3D art and Studio -description: An overview of fundamental 3D art tools, concepts, workflows, and resources for Roblox Studio. ---- - -[Roblox Studio](../studio/setup.md) includes free powerful 3D creation tools that enable you to effectively contribute to asset creation, world building, and more. Whether you are just getting started, or are looking for a refresher on Studio tools, this guide provides an overview on using Studio for 3D art creation. - -Each of the following sections include a brief description as well as additional links for further learning: - -- [Basic layout of Studio's interface](#studio-interface) — Familiarize yourself with the various panels and tools available in Studio to navigate effectively. -- [How to use assets and packages](#assets-and-packages) — Learn to import, edit, and share assets and packages to enhance your workflow and collaboration. -- [3D modeling within Studio](#3d-modeling) — Explore the fundamentals of creating and importing 3D models within Studio. -- [Materials and textures](#materials-and-textures) — Discover how Roblox uses materials and textures with your models to enhance the surface appearance of your objects. -- [Environments](#environments) — Craft immersive environments using terrain tools, lighting effects, and atmospheric elements. - -## Studio interface - -After [installing Studio](../studio/setup.md), familiarize yourself with Studio's many 3D art tools and interfaces. While you can customize Studio to show various layouts and tools, Studio opens with the most commonly used windows by default. - - - -- [Viewport](../studio/ui-overview.md#3d-viewport) — Represents the workspace of a place. The items here are rendered similarly to how a user may view the environment they were to play your experience. - -- [Explorer](../studio/explorer.md) — Shows a hierarchical list of all objects and services in a place. This includes visible objects, like parts and lights, and non-rendered objects like scripts, sounds, and folders. - -- [Properties](../studio/properties.md) — Populates all the properties of a selected object such as size, position, material, and much more. Many properties can be set through this window, or programmatically through a script. - -- [Toolbox](../projects/assets/toolbox.md) — Contains a selection of [models](../parts/models.md), [images](../parts/textures-decals.md), [meshes](../parts/meshes.md), [audio](../audio/assets.md), [plugins](../studio/plugins.md), [videos](../ui/video-frames.md), and fonts made by Roblox or Roblox community members. - -- [Asset Manager](../projects/assets/manager.md) — Lets you manage [places](../production/publishing/publish-experiences-and-places.md) and bulk import assets into your experience. - -- [Output](../studio/output.md) — Displays all error, warning, or manually returned messages from the Roblox engine. This window is useful for troubleshooting behavior in your experience. - -For more information on the Studio interface and individual tools, see the [Studio overview](../studio/index.md). - -## Assets and packages - -Before you begin creating, it's important to understand how Roblox handles **assets** and **packages**, the most basic object or group of objects that you can save, use, and share. - -- [Assets](../projects/assets/index.md) are a cloud-based version of an object that you can access any time to use, share, and modify. You can make nearly any object into an asset, such as a prop, building, character, sound, image, script, and more. - -- [Packages](../projects/assets/packages.md) are the Roblox equivalent of Unity **Prefabs** or Unreal **Blueprints**, or a group of assets bundled together to reuse in one or more experiences. Packages can update and propagate their changes to any of their copies across one or more experiences, letting you take advantage of powerful versioning and asset management controls. Roblox recommends that most developers work with packages whenever possible. - -All assets and packages save to your account's [Toolbox](../projects/assets/toolbox.md) for you or any associated [groups](../projects/groups.md) to access. You can also manage your saved assets and packages in the **Creations** section of your [Creator Dashboard](https://create.roblox.com/dashboard/creations?activeTab=Model). - -You can also upload your assets to share on the [Creator Store](#creator-store), and sell certain avatar assets to Roblox's [Marketplace](#marketplace) for users to purchase and equip. - -### Creator Store - -The [Creator Store](../production/creator-store.md), accessible through the [web](https://create.roblox.com/store/) and directly inside Studio's [Toolbox](../projects/assets/toolbox.md), contains millions of assets by Roblox and the Roblox community for use in Studio and your experiences. Anyone can contribute their assets to the store, including models, images, meshes, audio, plugins, and more. - -Roblox also provides [free high quality assets](https://create.roblox.com/store/models?creatorName=Roblox), many of which are used in the following showcases: - - -
    -

    [Mystery of Duvall Drive](https://www.roblox.com/games/7902470429/The-Mystery-of-Duvall-Drive)

    - -
    ⟩  [Behind-the-scenes](../resources/the-mystery-of-duvall-drive/index.md)
    -
    ⟩  [Official model packs](https://create.roblox.com/store/models?creatorName=Roblox&includeOnlyVerifiedCreators=true&keyword=duvall+drive&pageNumber=1&querySource=0)
    -
    -
    -

    [Beyond the Dark](https://www.roblox.com/games/7208091524/Beyond-the-Dark-Vistech-Showcase)

    - -
    ⟩  [Behind-the-scenes](../resources/beyond-the-dark/index.md)
    -
    ⟩  [Official model packs](https://create.roblox.com/store/models?creatorName=Roblox&includeOnlyVerifiedCreators=true&keyword=beyond+the+dark&pageNumber=1&querySource=0)
    -
    -
    -

    [Realistic Forest Demo](https://www.roblox.com/games/5326950832/Roblox-Realistic-Forest-Demo)

    - -
    -
    - -### Marketplace - -The **Marketplace** is where all Roblox users can purchase virtual cosmetics, such as accessories and clothing, and various character bodies that they can save to their Roblox account and set as their Roblox avatar character. - -To sell assets on the Marketplace, your creation must follow specific avatar specifications and meet certain policies and guidelines. For more information, see [Avatar](../avatar/index.md) and [Marketplace](../marketplace/index.md). - -## 3D modeling - -3D modeling is the process of creating three-dimensional digital representations of objects or environments. Roblox supports [basic 3D modeling](#basic-parts) in Studio, using primitive parts and allowing you to combine, subtract, and intersect the basic parts into more complex models. - -Roblox also supports [custom 3D models](#mesh-parts) created from 3D modeling software such as Maya and Blender. This includes advanced support for custom models and meshes that include modern textures, animation, and avatar-related features. - - -
    - A single gray sphere part -
    Basic sphere part
    -
    -
    - A bright blue hollow bowl that was made with solid modeling operations. -
    Bowl created with solid modeling
    -
    -
    - A high-quality treasure chest mesh with a texture. -
    [Mesh](#mesh-parts) with texture
    -
    -
    - -### Basic parts - -Studio natively supports basic parts that allow you to quickly add simple geometry to your experience. This is ideal for creating simple environments or even greyboxing or prototyping a more complex 3D space. - -Basic parts include the following benefits: - -- You can quickly add and modify parts directly in Studio. -- Parts are performant and work well with Roblox's native physics behavior. -- You can quicly modify the surface appearance of parts using materials and textures. -- In many cases, a mix of basic parts and advanced custom mesh and models can work together to quickly create an immersive and performant environment. - -For more information on using basic parts, as well as solid modeling operations, see [Parts](../parts/index.md). - -### Mesh parts - -Meshes are collections of vertices, edges, and faces that make up a 3D object. Unlike parts, which you can directly create in Studio, you first create meshes in a third-party modeling application like Blender or Maya before importing the model file into Studio. After importing a mesh, Studio represents the mesh object as a `Class.MeshPart`. - - - -
    - A Roblox avatar wearing a glossy puffy jacket and jeans -
    Create custom accessories, clothing, and characters that anyone can wear and use.
    -
    -
    - A floating alien creature in space, from the Beyond The Dark experience -
    Design a custom character unique to your experience.
    -
    -
    - A cluttered interior room with a candle in the forefront and spooky interior lighting from the Mystery of Duvall Drive experience -
    Use custom meshes and models to give your environments ambiance and depth.
    -
    -
    - -For more information on creating custom meshes, see [Custom meshes](../art/modeling/index.md). - -## Materials and textures - -It's always important to consider the surface appearance of your objects, as this empowers you to create cohesive and engaging assets and environments. Studio includes many tools to manage the look and feel of your assets, primarily by customizing your objects with [materials](#materials) and [textures](#textures). - -### Materials - -Materials allow you to quickly set the visual and physical properties of objects. While Roblox provides dozens of preset materials that you can set your parts to, you can also use the [Material Generator](../parts/materials.md#material-generator) to create your own custom materials using a prompt. - -
    - - - - - - -
    Materials generated by [Material Generator](../parts/materials.md#material-generator) using a natural language prompt
    -
    - -Materials also affect physical properties beyond appearance. See [Materials](../parts/materials.md) for more information. - -### Textures - -Textures are 2D images that you can apply to the surface of an object to change its appearance. Unlike materials, textures are purely visual and never affect the physical properties of the object. In general, you create texture images with third-party software and import them into Studio directly as image files, or baked-in with an imported custom 3D object. You can also use Studio's [Texture Generator](../studio/texture-generator.md) to create brand new textures for your mesh using a natural language prompt. - - -
    - -
    A mesh object sets the shape and geometry of the 3D object
    -
    -
    - -
    A texture image map applies a surface appearance and color
    -
    -
    - -
    The mesh and texture combine to make a unique custom 3D object
    -
    -
    - - -Textures are different from user interface objects which can apply customizable text or an image to the [surface](../ui/in-experience-containers.md) of a part, like a billboard or computer screen. - - -There are two types of textures in Roblox, single image **basic textures** and **advanced PBR textures** that dynamically react to different lighting and environment scenarios. Whether creating assets directly for the [Creator Store](#creator-store) or [Marketplace](#marketplace) or designing content for an experience, you should incorporate PBR textures whenever you need realistic and impressive surface textures. - - -Loading many unique PBR textures at once can affect performance in your experience. When working with many similar meshes, you can save processing power and memory by using a single set of PBR textures and [modifying alpha channels in combination with your mesh object base colors](https://devforum.roblox.com/t/using-alpha-masks-in-color-maps-to-customizetint-base-colors). - -For additional tips on improving performance with your assets, see [Improve performance](../performance-optimization/improve.md#rendering). - - - -
    A humanoid avatar with dreadlocks, a glossy jacket, jeans with decals, and boots. -
    A character model wearing cosmetic assets with PBR textures.
    -
    -
    A realistic leafy bush -
    An environmental prop with PBR textures.
    -
    -
    - -For more information see [Textures and decals](../parts/textures-decals.md) and [PBR textures](../art/modeling/surface-appearance.md). - -## Environments - -Environments refer to the visual and spatial world within your experience. Environments are a combination of elements, such as [terrain](#terrain), [lighting](#lighting), architecture, effects, and more. Roblox provides many tools and services to quickly create high definition environments to elevate your experiences. - -### Terrain - - - -**Terrain** refers to the landscape or outdoor environment of a Roblox experience. Features such as mountains, valleys, hills, bodies of water, and vegetation all make up terrain. To quickly generate terrain, Studio provides a [Terrain Editor](../studio/terrain-editor.md) that allows you to quickly create various types of environments, such as mountains, grass-colored hills, deserts and more. - -While many experiences are include interior spaces, such as a city building or spaceship, it's important to use terrain for outdoor environments whenever possible to ensure performance and expected lighting and environmental behavior. - -For more information, see [Environmental terrain](../parts/terrain.md). - -### Lighting - -A campfire in a glade with a setting sun in the background illuminating the campsite. - -**Lighting** refers to the illumination and visual effect applied to the environment and objects in your experience. It plays a crucial role in setting the mood, atmosphere, and general visual quality of your creations. - -Lighting can be categorized into the following: - -- **Global lighting** — Refers to the luminescence from either the sun or moon in an outdoor environment. You can set the properties of your global lighting by adjusting the `Class.Lighting` service. For additional hands-on instructions on adjusting global lighting, see the [Customize global lighting](../tutorials/curriculums/core/building/customize-global-lighting.md) lesson of our Core Curriculum. -- **Local lighting** — Refers to light sources placed within your experiences, such as pointlights, spotlights, and surface lights. You can modify lighting scenarios based on different interior rooms or sections of your experience by using one or more light sources. - -For additional information on modifying your environment's lighting, see [Global lighting](../environment/lighting.md). diff --git a/.cursor/rules/roblox/en-us/art/reaper.md b/.cursor/rules/roblox/en-us/art/reaper.md deleted file mode 100644 index 963a508b..00000000 --- a/.cursor/rules/roblox/en-us/art/reaper.md +++ /dev/null @@ -1,395 +0,0 @@ ---- -title: Reaper -description: Learn about Reaper tools. ---- - -Reaper is a Digital Audio Workstation (DAW) with a broad range of audio editing tools that allow you to create, manipulate, and export audio streams. Running on Linux, macOS, and Windows systems, this cross-platform application is a popular choice for creators who want to make custom music and sound effects for Roblox experiences. - -While this is by no means an exhaustive list, the following guide offers high-level information on essential Reaper tools and features for audio editing, as well as best practice guidance on designing audio files for Studio. - - -Reaper’s free trial mode is fully functional and extendable, allowing you to try the software and see if you’d like to purchase a license for its use in commercial projects. - -To download the latest version of Reaper, visit [Reaper.fm](https://www.reaper.fm/download.php). - - -## Fundamentals - -Before you take a look at all of the common workflows for creating custom audio for Studio, let's review Reaper's fundamental interface elements that are important for navigating through the application and finding the appropriate menus and controls for your specific audio editing task. - -### Toolbar - -Reaper's UI with the main toolbar highlighted. - -The **Toolbar** contains various tools that let you perform actions common to most audio workflows, such as: - -- Opening or saving a project. -- Accessing your project's settings. -- Enabling a metronome. -- Configuring ripple editing. -- Disabling audio track snapping behavior. - -As you get more familiar with Reaper, you can customize the Toolbar with additional commands and actions for your own workflows. - -### Track Control Panel - -Reaper's UI with the Track Control Panel highlighted. - -The **Track Control Panel** controls the behavior of your audio tracks, such as each track's volume, gain, and effects from plugins, as well as their relationships to other audio tracks. There is only one audio track in the example image, but you can add as many audio tracks as you need for your project. - -### Timeline - -Reaper's UI with the Timeline highlighted. - -The **Timeline** measures the length of your project and provides visual markers to help you position entire or segments of audio tracks in relation to each other. The Timeline in the example image measures time in both measures/beats and minutes/seconds, but you can customize its units of measurement for your own project requirements. - -### Arrange Area - -Reaper's UI with the Arrange Area highlighted. - -The **Arrange Area** lets you view and edit audio tracks within your project using the green scrubber, also known as the cursor. This area represents the main workspace for audio manipulation. - -### Transport Bar - -Reaper's UI with the Transport Bar highlighted. - -The **Transport Bar** lets you control audio recordings and playback, such as: - -- Jumping to the start or end of an audio track. -- Recording additional audio. -- Modifying the time signature, tempo, or playback rate. - -It's recommended to experiment with hotkeys for these actions to make your workflows for efficient. - -### Mixer Control Panel - -Reaper's UI with the Mixer Control Panel highlighted. - -The **Mixer Control Panel** offers a different way to view your tracks. Having the volume meters laid out horizontally in the mixer can allow for more visual clarity on what elements are the loudest in your arrangement, but this is simply a visual preference. All features of Reaper can be utilized with the mixer closed, and many sound designers don't even use the view. - -### FX Plugins - -Reaper's UI with the FX Plugins window highlighted. - -Similar to plugins in Studio, the **Plugins Window** lets you add additional features or functionality to Reaper to make audio editing and workflows easier. Reaper offers over 200 fx plugins with the creation suite for your convenience, and you can import additional plugins from third-party creators. - -## Common workflows - -Now that you know how to navigate the user interface, let's take a closer look at the most common audio editing workflows that allow you to create, manipulate, and export audio streams for Roblox experiences. - - -For more information on any of these workflows, see Reaper's official [Up and Running: A Reaper User Guide](https://www.reaper.fm/userguide.php) documentation. - - -### Create fade ins and outs - -In audio design, it's common to trim a small section off of an audio file, then fade it in and out to help smooth the sound's transition from start to finish. This process is important because ambient sounds in the real world don't often start and stop suddenly; if they did, it would feel extremely jarring. - -For example, let's review the following two audio clips of a wind gust; the first audio clip includes fade ins and outs to help the sound feel more natural while the second keeps the initial cut. As you listen to both, notice how the first clip feels realistic while the other feels abrupt. Without these transitions, the sound would break a player's sense of immersion in an experience. - - - - - - - - - - - - -
    Audio with transitionsAudio without transitions
    - -To create fades ins and outs: - -1. Import your audio file. - 1. Select a `.mp3`, `.ogg`, or `.wav` file on your computer. - 1. Drag-and-drop the audio file into the **Arrange Area**. -1. Crop the sample until you have a portion of the sound you want to play in your experience. - 1. Hover over the left-side of your audio file until your cursor changes to a double-sided arrow icon. - 1. Click-and-drag the audio sample to where you want to start your fade in. - 1. In a similar process, click-and-drag the right-side of your audio file to where you want to finish your fade out. - - - -1. Transition the sample in and out. - 1. Hover over the top-left corner of your audio sample until your cursor changes to a curve icon. - 1. Click-and-drag the audio sample to where you want to finish your fade in. - 1. In a similar process, click-and-drag the top-right corner of your audio sample to where you want to start your fade out. - - - -1. **(Optional)** Change the transition's curve type. - 1. Right-click either your fade in or out curve. A pop-up menu displays with multiple curve types. - 1. Select a new curve. The sound fades in or out according to the new curve type. - - - -### Compress audio - -In audio design, the dynamics of a sound refer to the sound's volume and how that volume changes over time. For example: - -- An explosion's sound is **dynamic** because it starts extremely loud, then fades to a quiet echo in a few seconds. -- A waterfall's sound is **non-dynamic** because even if you were to record the waterfall for a few minutes, it would likely remain at roughly the same volume. - -While both of these examples have their time and place in projects, compressing audio allows you to reduce the dynamic range of a sound by lowering the volume of loud peaks within a set ratio. This results in the loudest parts of a sound becoming more similar in volume to the quietest parts of a sound. - - - - - - - - - - - - -
    Audio with compressionAudio without compression
    - -This is important because without compression, some sounds can be significantly louder than others and drown out important audio cues throughout your experiences, especially when they play through speakers that struggle with wide dynamic ranges, like mobile devices. - -To compress audio: - -1. In the **Track Control Panel**, navigate to the audio track that you want to compress, then click the **FX** button. The **Plugins window** displays. -1. Search for **ReaComp**, short for Reaper Compressor, select the result, then click the **Add** button. A new compressor window displays. - - Reaper's Plugins Window with the ReaComp plugin highlighted. - -1. Lower the **Threshold** to the highest peak you want your audio to be able to have before it starts being compressed. - - Reaper's Compressor UI with the Threshold toggle highlighted. - -1. Play your audio while looking at the compressor window. A bright red section displays when sounds go over your set threshold. In the example image, the red meter reads roughly -8; this means that the loud parts of the sound have been turned down by about 8 decibels. - - Reaper's Compressor UI with the compression bar highlighted. - -1. For further compression configurations: - 1. Increase the **Ratio** to make the effect of volume reduction more pronounced. - 1. Customize your **Attack** and **Release** times to change how quickly the compressor starts and finishs compressing your audio track. - -### Equalize frequencies - -As you are editing your audio, it occasionally becomes necessary to make adjustments to its frequency balance so that you can do things like: - -- Increase the volume of its bright, high frequencies. -- Lower the volume of its bassy, low frequencies. -- Remove a shrill, harsh tone from the middle range of frequencies. - -This process is called **equalizing**, and it's important because it allows you to mimic realistic acoustics for different gameplay areas. For example, if a player is underwater, high frequencies would naturally be muffled and low frequencies would be easily audible, but if the player moved to an open space outside, no muffling would occur, and high frequencies would be audible again. - -Let's look at this in practice with two audio clips of a rain sound; the first audio clip includes a lowered high shelf while the second doesn't include any equalizing. As you listen to both, notice how the first clip feels muted and warm like it's hitting the window while you are inside, and the second clip feels cold like you are outside. - - - - - - - - - - - - -
    Audio with equalizing frequenciesAudio without equalizing frequencies
    - - -Equalizing frequencies is an art form, and it takes time to figure out what configurations work to meet the needs of your experiences. It's recommended to experiment often until you find what sounds best to you. - - -To equalize frequencies in a sound: - -1. In the **Track Control Panel**, navigate to the audio track that you want to equalize its frequencies, then click the **FX** button. The **Plugins window** displays. -1. Search for **ReaEQ**, short for Reaper Equalizer, select the result, then click the **Add** button. A new equalizer window displays with four enabled bands. - - Reaper's Plugins Window with the ReaEQ plugin highlighted. - -1. Select any of the enabled bands, then set **Type** according to what frequencies you want to equalize. Most use case use one of the following: - - - **Low Shelf** - Moves the gain below the frequency setting. This is typically the first band. - - **High Shelf** - Moves the gain above the frequency setting. This is typically the last band. - - **Band** - The volume is raised or lowered on either side of the frequency, and the range is determined by the bandwidth setting. - - **Low Pass** - Filters frequencies above the frequency setting. - - **High Pass** - Filters frequencies below the frequency setting. - - Reaper's Equalizer UI with the first band highlighted and the Type dropdown set to Low Shelf - -1. Play your audio while looking at the equalizer window, and make any necessary adjustments for the sound quality you want. - -### Reduce noise - -When you record audio, it is almost impossible to completely avoid capturing additional undesirable noise, such as the hum of an air conditioning unit, street traffic, or planes flying overhead. For this reason, it's important to reduce noise in your audio clips so that players can focus on what matters most without distraction. - - - - - - - - - - - - -
    Audio with noise reductionAudio without noise reduction
    - -While subtle noise reduction may seem unnecessary, when multiple layered sounds play at the same time, such as a character's footsteps, dialogue, and an ambient backdrop, the subtle noise becomes much more noticeable. This process ensures that all of our audio stands out, especially when players are wearing headphones. - -To reduce noise: - -1. In the **Track Control Panel**, navigate to the audio track that you want to equalize its frequencies, then click the **FX** button. The **Plugins window** displays. -1. Search for **ReaFir**, short for Reaper Finite Impulse Responser, select the result, then click the **Add** button. A new finite impulse response window displays. - - Reaper's Plugins Window with the ReaFir plugin highlighted. - -1. Configure the following settings: - - 1. Set **Mode** to **Subtract**. New settings display. - 1. Enable **Automatically build noise profile**. - - Reaper's Plugins Window with the noise reduction settings highlighted. - -1. Play the part of your sound that contains the noise you want to reduce for several seconds, but do **not** play the part of the sound you want to keep. This step teaches the plugin what the undesirable frequencies are. -1. When the plugin has learned the spectrum of your noise, disable **Automatically build noise profile**. -1. Play your audio to hear it again to hear it with reduced noise. - -### Create audio variations - -For audio design in experiences, it's important to create variations of sounds that players will hear often during their gameplay, such as footsteps, sword swings, or collection feedback. In the same way that real world sounds almost never repeat exactly the same, variations in sound improves player immersion and leads to a dynamic player experience. - - - - - - - - - - - - -
    Audio with variationsAudio without variations
    - -There are many ways to create variation in your audio, but the following step-by-step instruction will focus on a few simple steps you can take to create three alternatives in less than three minutes. - -To create variations in your audio: - -1. In the **Arrange Area**, duplicate your audio clip until you have three exact copies. The first copy will remain your original sound while the other two will become your variations. - - Reaper's Arrange Area with three copies of an audio segment. - -1. Right-click the second copy, then from the contextual menu, select **Item properties…**. The **Media Item Properties** window displays for the second copy. - - - -1. In the **Pitch Adjustment** field, raise or lower the pitch of the sound. -1. Click the **Apply** button. -1. Right-click the third copy, then from the contextual menu, select **Item properties…**. The **Media Item Properties** window displays for the third copy. -1. In the **Playback rate** field, increase or decrease the playback rate. -1. Click the **Apply** button, then play your original and both variations to hear the difference between all three. - -### Loop audio - - -For a step-by-step tutorial from an official Roblox Sound Designer on looping sounds for experiences, see [Creating Perfect Audio Loops](https://devforum.roblox.com/t/creating-perfect-audio-loops/2849057). - - -When you record an ambient sound in the real world, it almost never loops perfectly. Even monotonous, non-dynamic sounds like the hum of an air conditioner will click and pop as they loop, breaking player immersion and pulling them out of their gameplay. - - - - - - - - - - - - -
    Audio with seamless loopsAudio without seamless loops
    - -This becomes more obvious when there are multiple looping ambient tracks that layer on top of one another. For example, let's say you have an exploration experience with frog croaking, insects chirping, wind gently breezing by, and an upbeat background track. As these sounds loops, there may be harsh volume and/or frequency jumps. - -In the best case scenario, this just annoys players, but in the worst case scenario, it can cause them to leave the experience altogether. With a little extra effort, you can create seamless loops that keep your intended mood without disruption. - -To create a loop: - -1. Ensure your audio clip is long enough to avoid the risk of being too obvious if it loops. For most use cases, it should be at least 15 seconds. -1. In the **Arrange Area**, find a small point in the sound where your waveform(s) cross the Z axis, or `0`. This means that the sound has no amplitude, so it won't pop or click when the sound loops. - - An audio track with the cursor over the loop point. - -1. Press S to split the track. Your audio track is now cut into two segments. - - An audio track with two segments, seperated at the loop point. - -1. Move the second clip so that it plays before the first clip and has a slight overlap indicated by the red outline. - - - -1. Play your audio to hear it loop seamlessly. - - - -### Export audio - -After you finish editing your audio, you can export it for use in Studio. The following settings meet the requirements of most use cases, but as you become a more advanced user of Reaper, you can customize the settings for your own projects - -To export audio: - -1. In the **Arrange Area**, click-and-drag over your audio sample to highlight what you want to export. -1. In the menu bar, navigate to **File** > **Render…**. The **Render to File** window displays. - - - -1. Configure the following settings: - 1. Set **Source** to **Master mix**. - 1. Set **Bounds** to **Time selection** to export your selection in the Arrange Area. - 1. Set **Directory** to the location you want to download your file. - 1. Set **Name** to what you want to call your file. - 1. Set **Sample Rate** to `48000` **Hz** to ensure a high quality level at standard pitch, while also keeping the file size optimally small for lower memory footprint. - - - If you want a higher quality and plan to pitch the sound down at runtime dynamically, you can increase the quality to `96,000` **Hz**. - - - 1. Set **Channels** to **Stereo** for 2 channels or **Mono** for 1 channel. - 1. Set **Primary output format** to **OGG vorbis**. This is the preferred file type for experiences as it doesn't add any additional silence to the start or end of your audio. - - - Do not use the `.mp3` output format as it will add a few milliseconds of silence to the beginning of your audio. - - - 1. Set **VBR quality** to `0.9` to increase the quality. - 1. At the bottom of the window, click **Render 1 file**. A new window displays with a preview of what your audio looks like. - - - - -For information on how to use your new custom audio files in experiences, see the [Audio](../audio/index.md) guides. - diff --git a/.cursor/rules/roblox/en-us/art/test-classic-clothing.md b/.cursor/rules/roblox/en-us/art/test-classic-clothing.md deleted file mode 100644 index 9ab59c63..00000000 --- a/.cursor/rules/roblox/en-us/art/test-classic-clothing.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Test classic clothing -description: How to test your classic clothing items before uploading them to the Marketplace. ---- - - -Current user-generated avatars on the Marketplace do not support 2D classic clothing. For information on creating modern 3D cosmetics, including rigid accessories and clothing items, see [Get started](../avatar/index.md). - - -To ensure the best quality results, you can test your classic clothing before uploading or selling. You can test your clothes without needing to pay any fees by using [Roblox Studio](../studio/setup.md). - -1. From the toolbar's **Avatar** tab, click **Character**. -2. Choose a **Block Avatar** rig type from the popup menu. An avatar mannequin named **Rig** appears in the 3D workspace. - - - -3. In the **Explorer** window, hover over the **Rig** object, click the **⊕** button and insert either a **ShirtGraphic** (T‑shirt), **Shirt**, or **Pants** object according to the clothing you want to test. - -4. Locate and select the new **Shirt Graphic** or **Clothing** object parented under **Rig**. - - - -
    - -
    Shirt Graphic (T-shirt)
    -
    -
    - -
    - -
    Clothing (Shirt/Pants)
    -
    -
    -
    - -5. In the **Properties** window, locate the associated property as follows: - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Clothing TypeParent ClassProperty
    **T-Shirt**`Class.ShirtGraphic``Class.ShirtGraphic.Graphic|Graphic`
    **Shirt**`Class.Shirt``Class.Shirt.ShirtTemplate|ShirtTemplate`
    **Pants**`Class.Pants``Class.Pants.PantsTemplate|PantsTemplate`
    - -6. Click inside the property's row and select the image you uploaded to Roblox. This applies the clothing texture to the **Rig** character. - - - - -After testing, you can [upload and sell](./upload-classic-clothing.md) your asset to the Marketplace. - diff --git a/.cursor/rules/roblox/en-us/art/upload-classic-clothing.md b/.cursor/rules/roblox/en-us/art/upload-classic-clothing.md deleted file mode 100644 index f6189969..00000000 --- a/.cursor/rules/roblox/en-us/art/upload-classic-clothing.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: Upload classic clothing -description: How to upload your classic clothing to the Marketplace and check moderation status. ---- - - -Current user-generated avatars on the Marketplace do not support 2D classic clothing. For information on creating modern 3D cosmetics, including rigid accessories and clothing items, see [Get started](../avatar). - - -After [creating](./classic-clothing.md#creating-classic-clothing) and [testing](./test-classic-clothing.md) your classic clothing design, you can upload the clothing item to the Marketplace for a [fee](../marketplace/marketplace-fees-and-commissions.md#classic-clothing). - -## Upload new creations - -To upload a custom clothing item: - -1. Navigate to your [Creator Dashboard](https://create.roblox.com/dashboard/creations). -2. Navigate to **Avatar Items**. -3. Select the **Classics** tab. -4. Drag and drop your image file into the upload box. Alternatively, you can click **Upload Asset** and upload your file on the next page. -5. On the Upload Asset page, set the Asset Type dropdown to **T-Shirt**, **Shirt**, or **Pants**. -6. Complete the **Name** and **Description** fields. These fields help users find your assets and allow you to organize your creations. -7. Click the **Upload** button at the bottom of the page. - 1. See [Fees and commissions](../marketplace/marketplace-fees-and-commissions.md#classic-clothing) for more information on the fees for listing avatar items on the Marketplace. - 2. See [Manage existing assets](#manage-existing-assets) for information on modifying and selling your creations. - -## Manage existing assets - -To see your moderation status, place your item on sale, or modify your item settings: - -1. Navigate to your [Creator Dashboard](https://create.roblox.com/dashboard/creations). -2. Navigate to **Avatar Items**. -3. Select the **Classics** tab. -4. Use the **Classic Type** dropdown to filter by the type of classic clothing creation. -5. Click on the asset to navigate to the asset's Configure page. -6. You can modify the following fields: - 1. **Item Name** — sets the public-facing name of the asset. - 2. **Item Description** — sets the public-facing description of the asset. - 3. **On Sale** — when enabled, users can view and purchase this item on the Marketplace. - 4. **Set a price** — value of Robux that the creation sells for on the Marketplace. - 1. See [Fees and commissions](../marketplace/marketplace-fees-and-commissions.md#classic-clothing) for more information. diff --git a/.cursor/rules/roblox/en-us/art/validation-errors.md b/.cursor/rules/roblox/en-us/art/validation-errors.md deleted file mode 100644 index dd64becb..00000000 --- a/.cursor/rules/roblox/en-us/art/validation-errors.md +++ /dev/null @@ -1,780 +0,0 @@ ---- -title: Validation Errors -description: A list of all validation errors that can occur when uploading avatar items to the Marketplace. ---- - -When [uploading avatar items](../marketplace/publish-to-marketplace.md#upload-an-asset) to the Marketplace, Roblox validates the submission to ensure that the asset meets the appropriate specification for that asset type, such as [clothing specifications](./accessories/clothing-specifications.md). - - -Assets that aren't intended for the Marketplace, such as those used only in-experience, do not need to pass this validation process. However, you may find this validation check useful to troubleshoot issues with any custom accessories or bodies. - - -## Mesh - -Mesh validation errors refer to generic issues with your `Class.MeshPart`. This can range between geometry budget issues, size, missing IDs, unexpected data models, and more. - -See the following specifications for mesh requirements: - -- [Generic mesh specifications](./modeling/specifications.md) -- [Rigid accessory mesh specifications](./accessories/specifications.md#geometry-and-budgets) -- [Clothing mesh specifications](./accessories/clothing-specifications.md#geometry-and-budgets) -- [Body mesh specifications](./characters/specifications.md#triangle-budgets) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    `%s` asset size is larger than the max allowed bounding size of `%s`. You need to scale down or remodel the asset.

    Full body size is larger than the max allowed bounding size of `%s`. You need to scale down or remodel the asset
    Try rescaling your asset to keep the original aspect ratio. If that doesn't resolve the issue, try to scale along the axis that is failing validation.
    `%s` asset size is smaller than the min allowed bounding size of `%s`. You need to scale up or remodel the asset.

    Full body size is smaller than the min allowed bounding size of `%s`. You need to scale up or remodel the asset
    Try rescaling your asset to keep the original aspect ratio. If that doesn't resolve the issue, try to scale along the axis that is failing validation.
    `%s` has size larger than max allowed bounding size. The max size for type `%s` is [`%f`, `%f`, `%f`]Your model has one or more small pieces of geometry disconnected from your main mesh that contribute to the overall size. This issue is usually associated with small pieces or particles. You need to either remove these small pieces from your model or scale them to become visible.
    Mesh resolution of `%d` for model `%s` is higher than max supported number of triangles `%d`. You need to retopologize your model to reduce the triangle count. The resolution of your model mesh is too high. You need to retopologize the model to bring the resolution down below the [allowed limits](../art/modeling/specifications.md#geometry).
    Model mesh `%s` resolution of `%d` is higher than max supported value of `%d`. You need to retopologize your model and try again.

    Your mesh exceeds the max triangle limit for UGC upload requirements.
    The resolution of your model (number of triangles) is higher than the maximum [allowed limit](../art/modeling/specifications.md#geometry). You need to retopologize and remove enough triangles to bring the total count below this limit.
    `%s` is not visible enough from the `%s`. The most visible region found scored `%.2f` but needs to be above `%.2f`.

    Mesh for `%s` is completely invisible from the `%s`.
    Your accessory or body part is too thin along one dimension (`X`, `Y`, or `Z`) and can become invisible (or hardly visible) during gameplay. You need to scale up your asset along the axis failing validation.
    Model meshId mismatch between `MeshPart.MeshId` and `SpecialMesh.MeshId` for `%s`. You need to match the meshIds and try again.Verify `Class.Model` includes a `Class.MeshPart` or `Class.SpecialMesh` with the correct IDs.
    The total surface area of model mesh `%s` is `%f`, it cannot be greater than `%d`. You must reduce the number and/or size of all triangles.

    The total surface area of model mesh `%s` is greater than `%d`. You must reduce the number and/or size of all triangles.
    Your model mesh has too many triangles on screen that cannot be culled. This will cause performance problems during gameplay when using lower powered mobile devices. You need to reduce the triangle count of your model.
    Detected zero-area triangle in model mesh `%s`. You need to edit the mesh to remove zero-area triangles.Your model mesh has some vertices too close to each other that they create zero area triangles. You need to move these vertices apart to resolve this issue.
    Detected two or more vertices in model mesh `%s` sharing near identical positions. You need to position vertices by at least `%s` apart from each other.Make sure there are no coincident vertices in your model mesh.
    Bounds for the mesh `%s` are not centered at the origin. The max allowed distance is `%f`The asset model mesh is too far away from the origin. Usually the center of the model and the origin of the coordinate system should coincide.
    `%s` mesh is too small or made of disconnected pieces that are too small.

    Detected `%s` centered around `%s` that increases `%s` bounding box. Remove the geometry or increase its size so that it is more visible.
    The model mesh is too large. You need to scale it down.
    `%s` is more than max difference `%f` in size compared to the other mesh `%s`. You need to edit the model to adjust its size.The model mesh is too big. You need to scale it down.
    - -## Texture - -Texture errors refer to generic issues with your `Class.MeshPart.TextureID` or `Class.SurfaceAppearance`. Depending on the type of asset and texture you are creating, you may need to use a third-party software to fix and re-export. - -See the following resources: - -- [General texture requirements](./modeling/texture-specifications.md) -- [PBR texture overview](./modeling/surface-appearance.md) -- [Clothing texture requirements](./accessories/clothing-specifications.md#textures) -- [Body texture requirements](./characters/specifications.md#textures) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    Failed to execute UV check for `%s`. Make sure the UV map exists and try again.
    Failed to execute texture size check for `%s`. Make sure the textureId is valid and try again.
    Model textureId mismatch between `MeshPart.TextureID` and `SpecialMesh.TextureId` for `%s`. You need to match the textureIds and try again.Verify textures are properly set up.
    Invalid material setup for `%s`. Accepted values are: `%s`
    Invalid vertex color found in mesh model `%s`. You need to edit the color map to be all white and try again.

    Invalid vertex color found in mesh model `%s`. You need to edit the color map to be all white with no transparency and try again.
    TextureID and Surface Appearance are both defined for MeshPart `%s`. Publishing will only use Surface Appearance
    `%s` has an empty TextureID and no child surface appearance instance. You need to define at least one of them.
    Invalid textureID used in mesh `%s`. Make sure the texture exists and try again.
    Your textures exceeds the max texture size limit for UGC upload requirements.

    Texture resolution `%d`x`%d` px found in `%s` is higher than max size supported value of `%d`x`%d` px. You need to reduce the texture resolution.
    You need to change the [resolution of your textures](../art/modeling/specifications.md#textures) to be within the allowed limits.
    Model textureId mismatch with rigid accessory `SpecialMesh.TextureId` for `%s`. You need to match the textureIds and try again.Verify textures are properly set up.
    Failed to execute UV mismatch check for `%s`. Make sure UV map exists and try again.
    - -## Rigging and skinning - -Rigging and skinning errors refer to issues with your rigging and skinning data. Depending on the type of error, you may need to use a third-party software to fix and re-export. - -See the following specifications for rigging and skinning requirements: - -- [Generic mesh specifications](./modeling/specifications.md#rigging-and-skinning) -- [Clothing rigging specifications](./accessories/clothing-specifications.md#rigging-and-skinning) -- [Body rigging specifications](./characters/specifications.md#rigging) - -Skinning is the assignment of vertices of your rendered mesh to the underlying rig. For additional resources, see the rigging and skinning requirements for [clothing](./accessories/clothing-specifications.md#rigging-and-skinning) and [bodies](./characters/specifications.md#rigging). - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    Detected mismatch between model and skinned data for `%s`. You need to re-skin your model to fix this issue.The number of vertices in the model mesh do not match the number of skin weights provided. You need to reskin your model.
    Missing skinning data for `%s`. You need to skin your model.
    - -## Cage mesh - -Cage errors refer to generic issues with your `Class.WrapLayer` or `Class.WrapTarget`. Depending on the type of error, you may need to use a third-party software to fix and re-export. - -See the following resources for caging: - -- [Caging best practices and video](./accessories/caging-best-practices.md) -- [Clothing caging specifications](./accessories/clothing-specifications.md#cage-meshes) -- [Body outer cage specifications](./characters/specifications.md#outer-cages) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    WrapTarget `%s` found under `%s` has a CageOrigin position greater than %. You need to set `CageOrigin.Position` to `0`,`0`,`0`.Cage origin must be zero to properly align with its corresponding body or accessory.
    Average distance between outer cage to mesh is too high. Mesh seems to be outside of the outer cage.

    Average distance between outer cage to mesh is too high %. Make adjustment to cage to fit the mesh better.
    The outer cage is too far away from its corresponding body or accessory model mesh. You need to [remodel the outer cage](../art/accessories/caging-best-practices.md) and bring its vertices closer to the model mesh.
    Validation detected `%d`% of the accessory is outside its outer cage. Make adjustments to have more of the accessory placed between the cages.The outer cage needs to envelop the model mesh of its corresponding accessory. This check has detected a large portion of the model mesh is outside its outer cage. You need to edit the model and/or the cage to fix this issue.
    The average distance between the layered accessory `%s` and its outer cage is too large. You need to edit the cage to be within `%s` from the accessory.The outer cage is too far away from its corresponding body or accessory model mesh. You need to [remodel the outer cage](../art/accessories/caging-best-practices.md) and bring its vertices closer to the model mesh.
    There are cage vertices inside the layered accessory mesh `%s`, which could lead to interpenetration issues during fitting. You need to edit the cage mesh to fix this intersection issue.The layered accessory mesh vertices need to be positioned between the [inner and outer cages](../art/accessories/caging-best-practices.md). Whenever a mesh vertex passes through the cage mesh it causes rendering issues in the area making the accessory look like it is intersecting the body.
    The meshId reference for cage `%s` is invalid or doesn't exist. Please, verify you are using a valid mesh asset and try again.
    Outer cage of `%s` has mesh edits on regions that don't correspond to its current asset type `%s` (i.e. edits on the lower leg cages when asset type is set to 'Head'). You need to check the asset type for the layered accessory `%s`.Your outer cage was deformed in regions that don't envelop any part of your accessory. For example, the outer cage for a hat accessory is expected to deform on the head region and not the left foot. Make sure your outer cage is [properly setup](../art/accessories/caging-best-practices.md) and deforms only where is needed.
    Outer cage of `%s` has mesh edits that place vertices too far away from the model mesh. You need to edit the cage and enforce vertices are at most `%s` away from the model.Ideally the outer cage of an accessory completely envelops its model mesh. There are cases in which you may [intentionally not want to do that](../art/accessories/caging-best-practices.md#caging-protrusions). For example, if the accessory is a wing, you would want the outer cage to envelop only the base of the wing that connects it to the back of the avatar. If the entire wing is enveloped, it'll cause extreme deformations to any additional layered assets equipped.

    This validation checks that the outer cage is enveloping a large enough region of the accessory. You need to edit the outer cage to contain more vertices of the accessory mode mesh.
    Cage `%s` is not watertight (i.e. detected holes in the mesh). You need to edit the mesh and close the holes (may leave eyes and mouth areas open when applicable).There are holes in your cage mesh. You need to fix them and make your cage mesh watertight. For example, if you were to pour water inside the mesh it wouldn't leak.
    Failed to execute cage non-manifold check for `%s`. Make sure cage mesh exists and try again.
    Cage `%s` is non-manifold (i.e. there are edges with 3 or more incident faces). Some vertices are likely too close and welded together as a single vertex causing edges to collapse into a non-manifold. You need to edit the cage mesh to have vertices distant by at least `%s` from each other.There are edges in your cage model mesh that are connected to more than two faces, possibly caused by stacked or very closely positioned vertices. You need to remodel your cage to fix these issues.
    Failed to execute cage detection for `%s`. Make sure the cage mesh exists and try again.
    Detected too many coplanar triangles intersecting in model mesh `%s`. The maximum is `%d` intersections in a `%d` triangle mesh. Edit your mesh to reduce the number of coplanar triangle intersections.Your cage model mesh has an excessive number of triangle faces that are coplanar and intersecting. This causes a visual artifact during gameplay that makes your accessory look like it is blinking in the area of the coplanar triangles. You need to edit the vertex positions of these triangles to untangle the intersections.
    Missing cage for `%s`. You need to provide a cage mesh for each of the 15 body parts making up the R15 body.
    WrapLayer `ImportOrigin.Position` is `%f` from the origin. The max is `%f`. You should move the Position closer to the origin.The import origin position adds an offset between the cage and its corresponding asset. If this offset is too large than the cage will no longer envelope the asset (may end up completely outside the asset).

    This breaks the layered clothing system and makes the asset behave unexpectedly. Ensure that your import origin is set at (`0`,`0`,`0`).
    Failed to execute cage relevancy detection for `%s`. Make sure the cage mesh exists and try again.
    Validation detected `%d` % of the outer cage edits do not cover the accessory. Make sure you are moving the outer cage only where needed.This validation has detected that you moved out many vertices of your outer cage that weren't in the same region as your model geometry.

    You need to verify your outer cage is modified only enough to envelop the accessory model mesh, and stays consistent with the inner cage everywhere else.
    WrapLayer `%s` found under `%s`.`%s` has a CageOrigin position greater than `%f`. You need to set `CageOrigin.Position` to `0`,`0`,`0`.Cage origin position needs to be set to (`0`,`0`,`0`). Otherwise your cage will be moved out and may no longer envelop the accessory being deformed.
    Cage mesh verts referenced in `%s`.`%s`.`CageMeshId` were found that are `%.2f` studs outside the %s render mesh. `%s` studs is the maximum. Please reduce the size of your cage mesh.
    Failed to execute testing render mesh inside bounding box of outer cage modified area. Make sure both cage meshes and render mesh exist and try again.
    Only `%d%%` of the render mesh verts are situated in the modified %s area of the WrapLayer CageMesh (outer mesh). `%d%%` is required. Move the render mesh to be within the modified `%s` area of the WrapLayer CageMesh (outer mesh).
    Missing HSR data for `%s`. Please, try again.The HSR (Hidden Surface Removal) data is calculated in the cloud server and may take a few minutes to be updated for your assets. Wait some time and try again.
    Failed to execute body max cage distance check. Make sure all render meshes and their WrapTarget cage meshes exist, and try again.
    A vertex was found on the `%s`'s cage mesh that is `%.2f` studs away from the closest render mesh. `%s` studs is the maximum. Make the cage mesh more closely match the shape and size of the render mesh.
    - -## Cage UV - -Cage UV errors relate to cage mesh UV issues for layered accessories and bodies. Roblox recommends never altering or manipulating the UVs of your cage objects, although this may occur accidentally when modeling or within Studio. - -See the following for more information and resources: - -- [Caging best practices and video](./accessories/caging-best-practices.md) -- [Clothing caging specifications](./accessories/clothing-specifications.md#cage-meshes) -- [Body outer cage specifications](./characters/specifications.md#outer-cages) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    Failed to load UVs for Inner cage of `%s`. Make sure the UV map exists and try again.
    There are `%d` UV values in `%s` cage that do not belong to the template. Please correct the cage UV.The cage has an invalid UV map, possibly from using an old or third-party cage. Use the UV map and model mesh templates provided in the [official documentation resources](../avatar/resources.md#project-files).
    Failed to load UVs for `%s`. Make sure the model has a valid UV map and try again.
    Detected zero-area triangle in UV map of `%s`. You need to edit the UV map to fix this issue.Your UV map has zero area triangles. You need to fix it and verify all triangles connecting UV points have non-zero area.
    Found invalid UV value outside [`0`, `1`] range for `%s`. You need to edit the UV map to fix this issue.All UV maps need to have values within the range [`0`, `1`].
    Failed to execute UV check for `%s`. Make sure the UV map exists and try again.
    `%s`.`%s` ( `%s` ) should have `%d` unique UVs, but has `%d`. Please make sure the mesh has the required number of unique UVs and try again.Your UV map has many repeated UV values. Use the UV map and model mesh templates provided in the documentation.
    Inner and Outer cage UV for `%s` are mismatched. The Roblox provided cage template should be used to create inner and outer cages with no modifications to the UV map.The UV maps for cages should not be edited. You need to restore the UV map to match that of the templates provided in the documentation.
    Detected modified UV values for mesh `%s`. The original UV map for this model can't be altered.
    Failed to execute excluded modified cage UV check. Make sure both cage meshes exists and try again.
    `%d%%` of modified cage UVs in WrapLayer CageMesh (outer mesh) are outside the expected region of the body. For a `%s` no more than `%d%%` of the modified UVs can be outside the `%s` area. Move your asset to the correct area of the body.
    The WrapLayer CageMesh (outer mesh) for a %s must modify %d%% of the cage UVs in the `%s` area. Currently only `%d%%` are modified. Move your asset to the correct area of the body.
    - -## Accessory - -Accessory errors relate to the rigid or layered accessory components of your asset. - -See the following for more information: - -- [Rigid accessory specifications](./accessories/specifications.md) -- [Clothing specifications](./accessories/clothing-specifications.md) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    Upload of model has too many children assets (Meshes, Textures, etc.) and cannot be processed as is. You need to rearrange the model.
    Asset type `%s` is not a rigid accessory category. It can only be used with layered clothing.
    Model meshId mismatch with rigid accessory SpecialMesh.MeshId for `%s`. You need to match the meshIds and try again.Verify `Class.Model` includes a `Class.MeshPart` or `Class.SpecialMesh` with the correct IDs.
    Accessory MeshPart `%s` must contain a valid meshId. Make sure the mesh referred to by the meshId exists and try again.
    Accessory name must match "Accessory (Name)" format style (i.e. "Accessory (MyAccessory)" if you want to name your accessory ).
    - -## Layered clothing - -Layered clothing errors refer to the layered accessory components of your asset. - -See the following for more information on layered accessories: - -- [Clothing overview](./accessories/layered-clothing.md) -- [Clothing specifications](./accessories/clothing-specifications.md) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    `%s` has `%d` % of vertices too close to each other. Please edit the vertices to have at most `%d` % coincident or close to one another.Your accessory cage has too many vertices close together. This may cause the system to treat them as repeated vertices, or zero area triangles. You need to [edit and move](../art/accessories/caging-best-practices.md) the vertices away from each other in the region(s) they are almost coincident.
    Failed to load layered clothing accessory `%s`. Make sure mesh exists and try again.

    Failed to load texture for layered clothing accessory `%s`. Make sure texture exists and try again.

    Failed to load children assets (Meshes, Textures, etc.) for `%s`. Make sure the assets exist and try again.
    Asset type `%s` is not a layered clothing category. It can only be used with rigid accessories.
    Missing meshId on layered clothing accessory `%s`. Make sure you are using a valid meshId and try again.
    Missing WrapLayer on layered clothing accessory `%s`. You need to create a child WrapLayer and try again.Make sure you converted your model into a layered accessory (you might have [converted to a rigid accessory](../art/accessories/accessory-fitting-tool.md#rigid-accessories) instead or selected the wrong asset type).
    The maximum vertex density has been exceeded. Reduce the number of vertices that are very close to each other.Your accessory cage has too many vertices close together. This may cause the system to treat them as repeated vertices, or zero area triangles. You need to [edit and move the vertices away](../art/accessories/caging-best-practices.md) from each other in the region(s) they are almost coincident.
    - -## Body - -Body errors refer to issues related to body-specific components of your asset. - -See the following for more information on various character body components: - -- [Body specifications](./characters/specifications.md) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    Detected rotation in Attachment `%s`. You must reset all rotation values for this attachment to zero.

    Detected invalid orientation for `%s`. Attachment orientation should be `%s`, but can be rotated up to `%d` degrees in total
    Body attachments, except grip attachments, [should not have an applied rotation](../art/characters/specifications.md#attachments). This would affect all accessories connected to these attachments and can make some accessories look "broken" when equipped to the body.
    Attachment `%s` in `%s` is placed at a position `%s` that is outside the valid range. You need to adjust the attachment position.

    Attachment `%s` in `%s` is placed at a position `%s` that is outside the valid range of (`%s` to `%s`). You need to adjust the attachment position.
    Body attachments need to be within reasonable distance from the body[should not have an applied rotation](../art/characters/specifications.md#attachments) to avoid introducing unrealistic gaps when equipping accessories to those attachments.
    Body part `%s` does not follow R15 schema. The specific issues are: `%s`
    Failed to load body part mesh `%s`. Make sure body part exists and try again.
    Expected `%s` CollisionFidelity to be `%s`.
    Unable to run full body validation due to previous errors detected while processing individual body parts.Too many validation errors already detected and reported. You need to fix the reported ones first to have visibility on the additional ones remaining.
    Full body check did not receive the correct set of body part Asset Types (i.e. Head, Torso, LeftArm, RightArm, LeftLeg, RightLeg). Make sure the body model is valid and try again.
    Unable to run full body validation due to previous errors detected while processing individual body parts.Too many validation errors already detected and reported. You need to fix the reported ones first to have visibility on the additional ones remaining.
    `%s` is at a `%d` degree angle from the X,Y plane, it must be within `%d` degrees. Make sure the character is in I pose, A pose, or T pose.Validation detects that the body is not one of the following supported poses:

    • T-pose (arms are parallel to the floor and perpendicular to the torso)
    • A-pose (arms are about 45 degrees with respect to the floor)
    • I-pose (arms are perpendicular to the floor and parallel to the torso)
    The `AvatarPartScaleType` value in `%s` is invalid. Verify the value you are using is either `Classic`, `ProportionsSlender`, or `ProportionsNormal`.
    Attribute `%s` has different values in different children folders. You need to use the same value in all folders.Verify extra attributes are initialized the same way on all children folders.
    All MeshParts must have the same value in their `AvatarPartScaleType` child. Please verify the values match.The `AvatarPartScaleType` property is used to scale the MeshPart. Possible values are: `Classic`, `ProportionsNormal`, `ProportionsSlender`.

    Combining MeshParts with different scales (equipping an accessory to an avatar body) results in a visual mismatch that makes them look too large or too small compared to each another.
    - -## Head - -Head errors relate to issues with the head geometry or FACS animation data associated with your head geometry. - -See the following for more information on various character head components: - -- [Head specifications](./characters/specifications.md#facial-animations) - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    Failed to load model for dynamic head `%s`. Make sure model exists and try again.
    Failed validation for dynamic head `%s` due to missing FACS information. You need to provide FACS controls for at least 17 poses (see documentation).The face controls for dynamic heads need to have [at least 17 poses](../art/characters/specifications.md#facial-animations) connected to the rig. This is necessary to enforce a minimum level of face expressions for avatars during gameplay. You need to setup additional face controls that are missing.
    `%s` is missing FACS controls: `%s`
    `%s` has inactive FACS controls: `%s`
    Face controls need to be connected to the face rig. You need to reconnect the inactive controls.
    Unable to capture snapshot of DynamicHead `%s`

    Failed to read data from snapshot of DynamicHead `%s`

    DynamicHead `%s` when emoting surpasses the expected bounding box
    An animation pose is invalid or may extend past the expected bounding box. You need to recalibrate the face controls connected to the face rig.
    - -## Data model / runtime - -Data model or runtime errors refer to issues with loading parts of the data model or running checks. - -These errors can occur from modeling issues, exporting issues, studio importing issues, accidental changes to data model, or generic issues loading and processing parts of the asset. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    Asset could not be loaded
    Failed to execute max total surface area check for `%s`. Make sure mesh exists and try again.
    Failed to execute similarity mesh vertex check for `%s`. Make sure mesh exists and try again.
    Failed to load `meshHandle.Name`'s render mesh data.
    Failed to load detailed information for model assets. Make sure all model assets exist and try again.
    Failed to read mesh. Make sure the body part exists and try again.
    Failed to execute cage intersection detection for `%s`. Make sure the cage mesh exists and try again.
    Failed to load model mesh `%s`. Make sure the mesh exists and try again.
    Failed to retrieve mesh data to validate skinned mesh.

    Failed to load mesh for `%s`. Make sure mesh exists and try again.
    Failed to load mesh for accessory `%s`. Make sure mesh exists and try again.
    Failed to load model mesh `%s`. Make sure mesh exists and try again.
    Failed to load model mesh `%s`. Make sure the mesh exists and try again.
    Failed to execute triangle count check for `%s`. Make sure mesh exists and try again.
    Failed to load vertex color map for model mesh `%s`. Make sure it exists and try again.
    Failed to execute overlapping mesh vertex check for `%s`. Make sure mesh exists and try again.
    Failed to execute texture size check for `%s`. Make sure the textureId is valid and try again.
    Failed to load texture for `%s`. Make sure the texture exists and try again.
    Failed to execute validateUVSpace check on `%s`. Make sure the UV maps exists and try again.
    Failed to load layered clothing accessory `%s`. Make sure mesh exists and try again.

    Failed to load texture for layered clothing accessory `%s`. Make sure texture exists and try again.

    Failed to load children assets (Meshes, Textures, etc.) for `%s`. Make sure the assets exist and try again.
    `%s` contains attributes in its properties that are not allowed. You need to remove the following attributes: `%s`
    Failed to get triangle face information from model mesh `%s`. Make sure model exists and try again.
    Detected the following error(s): `%s`
    `%s` has an invalid name
    `%s` is of type `%s` which is not allowed
    Deprecated R6 folder for body part `%s` should be empty. You need to clear that folder and try again.
    Incorrect hierarchy for `%s` with the following missing folders: `%s`
    Failed to parse package data for model `%s`. Make sure the packageId is valid and try again.
    Property `%s` does not exist on type `%s`. Delete the property and try again.
    Trying to access property `%s`.`%s` using the incorrect type for it. Expected `%s` to be `%s`.
    Failed to execute render mesh inside outer mesh check for `%s` and `%s`. Make sure the meshes exists and try again.
    Selected more than one instance of type `%s`. Please, select a single instance of this type and try again.
    Failed to find an instance of the asset type `%s`. Make sure one exists and try again.
    Found the following instance tags which are not allowed: `%s`
    Invalid target asset for thumbnail generation. Expected it to be `%s`.
    Asset `%s` is positioned outside the thumbnail's camera view. You need to reposition the asset at the center of the camera view and try again.You need to move your asset to the origin of the coordinate system.
    Failed to execute vertex density check for `%s`. Make sure mesh exists and try again.
    Failed to execute body part max cage distance check. Make sure `meshHandle.Name`'s render mesh and its WrapTarget's cage mesh exist, and try again.
    - -## Permission / moderation - -Permission and moderation errors relate to issues with the asset's ownership or moderation review. Many moderation issues resolve after a period of time. - -Ensure that you or your group has permission to use all parts of your asset, including the model and texture assets. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Error MessageAdditional notes
    Asset `%s` is not owned by the current user. You can only validate assets that you or a group you belong to owns.You need to own the assets being validated.
    `%s`.`%s` ( `%s` ) being used is not owned by the experience creator or player. You can only publish assets that you own.You need to own the assets being validated.
    Asset `%s` is not owned by the current user. You can only validate assets that you or a group you belong to owns.You need to own the assets being validated.
    Failed to load asset `%s` that is still going through the review process. Please, wait for a notification of completion from the review process and try again.Your asset is currently in moderation queue. Roblox can only validate assets that have already passed moderation.
    Failed to parse feedback from model review for `%s`. Make sure the review process is complete and try again.
    Asset(s) failed to pass moderation: `%s`.
    Failed to fetch moderation results for `%s`. Make sure all assets are owned by the current user.
    Failed to parse moderation results for `%s`. Make sure moderation process is completed and try again.
    Failed to validate current user during moderation. Make sure you own the assets being validated and try again.You need to own the assets being validated.
    diff --git a/.cursor/rules/roblox/en-us/assets.md b/.cursor/rules/roblox/en-us/assets.md deleted file mode 100644 index 55cb844c..00000000 --- a/.cursor/rules/roblox/en-us/assets.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: Create and access millions of assets -description: Learn how to create and sell assets on Roblox. -hideInPageNavigation: true ---- - -export const sections = [ - { - description: "Assets are anything you publish to the Roblox cloud, like 3D models with scripts, textures, multimedia files, Studio plugins, and much more. You can reuse assets across all of your creations and share them with the community.", - buttons: [ - { text: "Learn more about assets", href: "./projects/assets" }, - ], - content: [ - { - title: "Create in Studio, other third-party tools, or in experiences", - description: "Roblox Studio provides drag-and-drop tools and programmatic access to building and modeling with engine primitives such as parts and constraints. You can also import industry standard asset types for 3D modeling, audio, and more directly into Studio. Lastly, you can allow users to create assets directly in your experiences and save them to their own accounts.", - image: "/assets/getting-started/platform-overview/Everything-You-Need.jpg", - links: [ - { text: "Roblox Studio", href: "./art/overview-studio" }, - { text: "Third-party", href: "./art/overview-dcc" }, - { text: "In-experience", href: "./projects/assets/in-experience-asset-creation" } - ] - }, - { - title: "Reuse and update with packages", - description: "Packages are reusable sets of assets that can contain models, scripts, multimedia files, and more. They let you bundle, share, maintain, and update them across everywhere they're used in your projects, automatically.", - video: "https://www.youtube-nocookie.com/embed/AzKZy2BqIh8?si=psaB0UlA8UvaT8qv", - links: [ - { text: "Learn more", href: "./projects/assets/packages" }, - ] - }, - { - title: "Publish with privacy and moderation included ", - description: "You can create assets for exclusive use in your projects or share them with the community. Our moderation policies protect your creations from unapproved usage and our users from assets that violate Roblox policies.", - image: "./assets/landing/assets.png", - links: [ - { text: "Privacy", href: "./projects/assets/privacy" }, - { text: "Moderation", href: "./projects/assets#asset-moderation" }, - { text: "Manage and publish", href: "/projects/assets/manager" }, - ] - } - ] - } -]; - -{sections.map((section, index) => ( - - {section.title && ( - {section.title} - )} -
    - {section.description && ( -

    {section.description}

    - )} - {section.buttons && section.buttons.map((button, btnIndex) => ( - - ))} -
    - {section.stats && ( - - - {section.stats.map((stat, index) => ( - - - - {stat.header} - {stat.description} - - - - ))} - - - )} - {section.content.map((section, index) => ( - - -
    -

    {section.title}

    -

    {section.description}

    -
    - {section.links && section.links.map((link, linkIndex) => ( - - {link.text}
    -
    - ))} - {section.buttons && section.buttons.map((button, btnIndex) => ( - - ))} -
    -
    -
    - - {section.image && ( - {section.title} - )} - {section.video && ( - - )} - -
    - ))} -
    -))} diff --git a/.cursor/rules/roblox/en-us/assets/accessories/1_lc-blender-unhide-cages.mp4 b/.cursor/rules/roblox/en-us/assets/accessories/1_lc-blender-unhide-cages.mp4 deleted file mode 100644 index 16681a31..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/1_lc-blender-unhide-cages.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff55ad48aced7aef49bc5eebea44056a61bfa0ae688cd1531e2464cf22b91369 -size 2569657 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/2_lc-blender-import-tshirt.mp4 b/.cursor/rules/roblox/en-us/assets/accessories/2_lc-blender-import-tshirt.mp4 deleted file mode 100644 index a094e404..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/2_lc-blender-import-tshirt.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ebe30fd4e29b318fe2965583cdbfbcbe7a9cfc478981bf7d733fc603c4f476c -size 3692581 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/3_lc-blender-parenting-a-mesh.mp4 b/.cursor/rules/roblox/en-us/assets/accessories/3_lc-blender-parenting-a-mesh.mp4 deleted file mode 100644 index 3641c646..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/3_lc-blender-parenting-a-mesh.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e87b009411d827f3784069097aaae1bc101bfae8a53e5b15c1512cb80aecaa31 -size 5705496 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/4_lc-blender-outliner-cleanup.mp4 b/.cursor/rules/roblox/en-us/assets/accessories/4_lc-blender-outliner-cleanup.mp4 deleted file mode 100644 index 76b76db9..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/4_lc-blender-outliner-cleanup.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5422eea096c1226499fab02fb06d5835ec468672a43a00d93b88fbb74e81143 -size 1926773 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/5_lc-blender-adjusting-viewport-settings.mp4 b/.cursor/rules/roblox/en-us/assets/accessories/5_lc-blender-adjusting-viewport-settings.mp4 deleted file mode 100644 index 65984ac0..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/5_lc-blender-adjusting-viewport-settings.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71462b58bfc451de84dc961b95b10ef4f9ea4bec4649fb6c0875526bb2920399 -size 16930443 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/6_lc-blender-adjusting-outer-cage-vertices.mp4 b/.cursor/rules/roblox/en-us/assets/accessories/6_lc-blender-adjusting-outer-cage-vertices.mp4 deleted file mode 100644 index e5a0a8e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/6_lc-blender-adjusting-outer-cage-vertices.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:952b2e00ed2f72f6fd37ec0c9f375b495ff9076ed42862f0cf4f8b5765af216c -size 26730143 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/7_lc-adjusting-multiple-vertices.mp4 b/.cursor/rules/roblox/en-us/assets/accessories/7_lc-adjusting-multiple-vertices.mp4 deleted file mode 100644 index ab31c1e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/7_lc-adjusting-multiple-vertices.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7aea49a2a8e7595ff3e1580c958b0543a3f11545244a58c0541471562bbd9932 -size 49747941 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/8_lc-blender-finished-outer-cage.mp4 b/.cursor/rules/roblox/en-us/assets/accessories/8_lc-blender-finished-outer-cage.mp4 deleted file mode 100644 index 3eda1c83..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/8_lc-blender-finished-outer-cage.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db1881b5b649c843b7c99d1f2b525185b2bbdca9ace86fc819fef0fe8f249c38 -size 23352338 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/Avatar-Item-Creation.png b/.cursor/rules/roblox/en-us/assets/accessories/Avatar-Item-Creation.png deleted file mode 100644 index b178a4d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/Avatar-Item-Creation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77029f8a205a8cc9200d38dce464b0919d863116b0d19921dd27bb08ba045fcd -size 77146 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/Layered-Clothing-Banner.jpg b/.cursor/rules/roblox/en-us/assets/accessories/Layered-Clothing-Banner.jpg deleted file mode 100644 index c323b3e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/Layered-Clothing-Banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8b6bf7c38e585dea5378f9eb6c337f6d0f4bf7e17e3334a037de16f99210b54 -size 272219 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/Layered-Clothing-Banner2.png b/.cursor/rules/roblox/en-us/assets/accessories/Layered-Clothing-Banner2.png deleted file mode 100644 index e9d86e13..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/Layered-Clothing-Banner2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22014e2a4db3a5104113106ecf725c3add322f874855075472cd86abf10334ed -size 904779 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Accessory-Setup-Menu.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Accessory-Setup-Menu.png deleted file mode 100644 index 26abdb16..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Accessory-Setup-Menu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9399452dcf0b860c866570efa7271b24e6547d7fb806f8406a09311189a5b09 -size 14511 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Animation-Example-1.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Animation-Example-1.png deleted file mode 100644 index 36636a69..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Animation-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9c6306b0915bc373ef52b9a1ac1c8663b6b59340ddb5bde9b933424ab568129 -size 236481 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Animation-Example-2.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Animation-Example-2.png deleted file mode 100644 index 6b4828a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Animation-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a07b8d01ed1dafb2b3ef0e1511daf529b9cd97f3a0c78bfcfdba5df864767a5 -size 244919 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Asset-Type-Dropdown.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Asset-Type-Dropdown.png deleted file mode 100644 index edde8948..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Asset-Type-Dropdown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d8a98facbcee0c1213d51fa8ee0660d70ddb39989ddaf8e9bfc1791c0487fc8 -size 19268 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Autoskin-Icon.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Autoskin-Icon.png deleted file mode 100644 index 5324eac2..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Autoskin-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57c6616f2576655d130e7f33ce3e79e8c4b8355d1f9a910a1a0b9e4822e69823 -size 1586 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Body-Example-1.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Body-Example-1.png deleted file mode 100644 index 6b6e1ae7..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Body-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34b3e89bb319b0dd07d919373758e51f2425953601e78bbbc2c3c29503edb563 -size 239649 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Body-Example-2.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Body-Example-2.png deleted file mode 100644 index ef003200..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Body-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2f5173b6cb8e56f7e175c7b1cf87b13da0e2028952c4051f793331684fbfb07 -size 244741 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Bounding-Box-Example-1.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Bounding-Box-Example-1.png deleted file mode 100644 index 37f1f6d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Bounding-Box-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f446187b429b7641e2d4c6fe5869fe1db5f8f02acff81676d213c248d6e2319b -size 654133 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Bounding-Box-Example-2.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Bounding-Box-Example-2.png deleted file mode 100644 index 82c13f2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Bounding-Box-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ec8f1e499b88f03d6f5216f2d861dfd34b8a3f38dffd5d11164c8b30df3fec9 -size 662255 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Cage-Editing-Example.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Cage-Editing-Example.png deleted file mode 100644 index 77f9df64..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Cage-Editing-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a73584f6c922071fef2506475b8d3db1e8ae4594f34ad832f4b58c62f264d16b -size 947544 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Cage-Editing-Icon.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Cage-Editing-Icon.png deleted file mode 100644 index ea62fc8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Cage-Editing-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2224941a7aa490aee2c0342a691f4693c38fc898f3b253cd261a906fcd0edac5 -size 1113 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Center-Mannequin.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Center-Mannequin.png deleted file mode 100644 index a40a7eab..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Center-Mannequin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8da703307576916defa9ee231d796465c5a42839887bd8124caa270d06f4b7f3 -size 1291 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Clothing-Example-1.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Clothing-Example-1.png deleted file mode 100644 index 4c5fe79f..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Clothing-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:070769e083328c65be9fd423ca870cf762c2bd9a5b12c5a742fb77a4f47a471f -size 335320 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Clothing-Example-2.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Clothing-Example-2.png deleted file mode 100644 index ed7033a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Clothing-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9226992d05749a2c531bb93ed2fd38b836589813a009e3f50dcb275c6d0b37b6 -size 419838 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Custom-Asset-Icon.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Custom-Asset-Icon.png deleted file mode 100644 index e08c49ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Custom-Asset-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d47983c5728c9ba8d66fbb8cbfcd7c03c0da1d01142e180a6092104e88501e9e -size 3698 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Custom-Asset.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Custom-Asset.png deleted file mode 100644 index 76b01a30..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Custom-Asset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89f34e2e0b0991f94160328cd325f48617ff4bebdcd36d7514b596b5ba49d474 -size 53141 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Edit-Vertex-Example.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Edit-Vertex-Example.png deleted file mode 100644 index eb5e04f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Edit-Vertex-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b2d026f4f0f289fa2177d99f16c8dce77d91ad2c2ae44dba0745797a288854b -size 954009 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Expand-Button.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Expand-Button.png deleted file mode 100644 index f6d68c98..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Expand-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0152138a3843c3ce19a4aad81e9208edd7198716526a5231b96053bd70355970 -size 1092 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Generate-Legacy-Accessory.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Generate-Legacy-Accessory.png deleted file mode 100644 index ce40a7e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Generate-Legacy-Accessory.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7619f29644837644208eb3e1cc3c244aff04a654b610877576bb36416b88c75c -size 7457 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/LC-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/LC-Hierarchy.png deleted file mode 100644 index b224d882..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/LC-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e07b4daadd7d9af8277249e4b4916c2cce8beb45f3f4738d39fed39340ef7b1 -size 11481 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Layered-Example.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Layered-Example.png deleted file mode 100644 index 34fad3b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Layered-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f235a78b57f10c1a9e54564c21861d430a919d0a83475a1cfb19540da9c1e89 -size 601246 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/MeshPart-Selected.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/MeshPart-Selected.png deleted file mode 100644 index b29a585f..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/MeshPart-Selected.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0a8995ab8dfd4148b9b8ada9ade7e8bc4076aff4dbacbedea3ae240ff73c86d -size 896165 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Preview-Display.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Preview-Display.png deleted file mode 100644 index c46ad72c..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Preview-Display.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4b4c13ceb1a3240c35bdcb1b3fc66a0fcc297ae8ebfcf8f8268a33b0fb03b27 -size 942053 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Rigid-Example.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Rigid-Example.png deleted file mode 100644 index 45cb2fcb..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Rigid-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de2e2e33585bf95cf9eb951f9bf5b91428a10d90306c0f46ab1747f0ab592416 -size 380366 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Rigid-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Rigid-Hierarchy.png deleted file mode 100644 index 31238c15..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/accessory-fitting-tool/Rigid-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b559cd4830df199d8a7283246424a3b3c336d85f81d6ea0349f7b45694468f9e -size 12424 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/1-Uneven-Cage-A.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/1-Uneven-Cage-A.png deleted file mode 100644 index 7bb6ea52..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/1-Uneven-Cage-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:463a175ab5fd74d3894cd81db2e16049fb347d2daff39c425da04c8ab036eed6 -size 62899 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/1-Uneven-Cage-B.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/1-Uneven-Cage-B.png deleted file mode 100644 index a8253214..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/1-Uneven-Cage-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51923028f6203743e29deec6b213c77e56cf4b6d76fcf387aee2c582dd4f2671 -size 165611 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/10-Even-Spacing-A.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/10-Even-Spacing-A.png deleted file mode 100644 index 570f6788..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/10-Even-Spacing-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:165a1f3147f50ddbd7db9b2cfa56eac00d82357e321f10da3f00322d81cd00e8 -size 181890 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/10-Even-Spacing-B.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/10-Even-Spacing-B.png deleted file mode 100644 index d396adc3..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/10-Even-Spacing-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0c637b7b00a6be854312d69c3c40b289a34f18daf120ccbaf852f9564441531 -size 176327 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/11-Positioning-Along-Joints.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/11-Positioning-Along-Joints.png deleted file mode 100644 index 7b7af3b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/11-Positioning-Along-Joints.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:212c9572a09af6a24f9e07481d121d9c70457973ca9f7e8a912315c8d10c3e65 -size 189710 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-A.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-A.png deleted file mode 100644 index c8339289..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa6a2d935d9b11e045144d5667a207146fbaeea2b7a51de75768bea07b0a6174 -size 94730 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-B.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-B.png deleted file mode 100644 index e67c52c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97a2e9ed8944096c0c6fcaba1f4d0c84335161603e586bc5c158c04c32b42078 -size 95818 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-C.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-C.png deleted file mode 100644 index fe9de877..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/12-Protusions-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70bb1c1bc7cbb4e4a4f893b2887815859a44e7ebb0ec318624b817f4013becff -size 90144 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/13-Cage-Missing-Parts.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/13-Cage-Missing-Parts.png deleted file mode 100644 index cb8c2c0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/13-Cage-Missing-Parts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6827a23d5db5acc8da950db693b93db66dadcf44c482e4fa05dac8f958cf86b3 -size 147497 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/14-Outer-Inside-Inner.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/14-Outer-Inside-Inner.png deleted file mode 100644 index 335772d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/14-Outer-Inside-Inner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abcf6bc0973d62fb1ecd877b1bc3fd8f991c4a9b65b14f558af0901d6178762a -size 251708 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/15-Orbitting-Accessory-A.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/15-Orbitting-Accessory-A.png deleted file mode 100644 index a8743442..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/15-Orbitting-Accessory-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21a56bd4c8cf1b15b6f657e5ce047f85d2910ebd2acaecc446b27bf8bef9978f -size 20598 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/15-Orbitting-Accessory-B.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/15-Orbitting-Accessory-B.png deleted file mode 100644 index 8694aa5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/15-Orbitting-Accessory-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:091678061abe7ce6b7471dd579d9b4395615ef549045694194ba8f9dcc232a61 -size 141536 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical-A.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical-A.png deleted file mode 100644 index a24a625d..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f3ef4d14373c968763f2393f19b1d69574d4bcdbc553b37523ebd5992320413 -size 63077 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical-B.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical-B.png deleted file mode 100644 index 3d8cb782..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cee59318d9e4988ad5ecb718e5cae82bad6ee53f9fb0f05e8d615f0dba87efac -size 156355 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical.png deleted file mode 100644 index 7392983c..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/2-Inner-Outer-Identical.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d29a588ba81a3a3b800c805d38741699f5424497cf4ebc7428a6228f1780faa9 -size 388729 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/3-Clothing-Under-Inner-A.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/3-Clothing-Under-Inner-A.png deleted file mode 100644 index 7277b5c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/3-Clothing-Under-Inner-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83a75b68a7d0b7a059503c16836239248045937cfcc209450eff2d4c4cf3de19 -size 66274 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/3-Clothing-Under-Inner-B.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/3-Clothing-Under-Inner-B.png deleted file mode 100644 index 1a57b909..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/3-Clothing-Under-Inner-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e2da78ad0c77514546b8f1c1d27d90eadda8a60ea2a0834136cbd354ef485d8 -size 138518 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/4-Outer-Not-Fully-Covering-A.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/4-Outer-Not-Fully-Covering-A.png deleted file mode 100644 index b1bbdc4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/4-Outer-Not-Fully-Covering-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7a7583c7ff81087db192da327eced53a18692ff15820af09455a2564837e90b -size 75089 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/4-Outer-Not-Fully-Covering-B.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/4-Outer-Not-Fully-Covering-B.png deleted file mode 100644 index 0e810c9f..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/4-Outer-Not-Fully-Covering-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60e2b1245259a334dc8a2c2619f6fe4a61278be08adbba7f7ab4d8502c0be7e5 -size 202616 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/6-Oversized-Cage.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/6-Oversized-Cage.png deleted file mode 100644 index 09d61c39..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/6-Oversized-Cage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d7bab2e8d6d1f3dce49d13a5b0facf71aec2176fec9050da7f4fec91037472e -size 329226 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-A.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-A.png deleted file mode 100644 index 653afd4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49764f8386fef0baf854aa58811000d797b3808a04a52ec9ee79da9c480a3410 -size 144176 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-B.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-B.png deleted file mode 100644 index 6a7bd01e..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0015b15cac728168fc5ec681e9a6b1b0e13cbcb05b9312bc66c2b8c5f39b5640 -size 151207 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-C.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-C.png deleted file mode 100644 index 05165614..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2c8dd011250e38480e92d211cac7e6fcd4b7f2ab36af638832987c65437c466 -size 177920 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-D.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-D.png deleted file mode 100644 index 90e94e8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/7-Typical-Caging-Example-D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:886fa70a78a7c759bcf6568e0d769b29cd2ae352511eb1631abe3583c41b74f2 -size 59731 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/8-Symmetry.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/8-Symmetry.png deleted file mode 100644 index 6431c673..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/8-Symmetry.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4254320daef65639187992f6118cf5c9eb13254a4539f8df5ac0100d6ac1d37a -size 265488 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/9-Stacking-Vertices.png b/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/9-Stacking-Vertices.png deleted file mode 100644 index 20e2aba1..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/caging-best-practices/9-Stacking-Vertices.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3007440c50100067d003e6ecf0315192bd3da26bf4daf46fcf5f44d08a03c5aa -size 107844 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Block-Avatar-Default.jpg b/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Block-Avatar-Default.jpg deleted file mode 100644 index f188bd8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Block-Avatar-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d809a83ac269448dae2991a52f32c8d18ecf0b2c96cfd6e3c158fe7b6a74ff1c -size 223116 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Block-Avatar-Dressed.jpg b/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Block-Avatar-Dressed.jpg deleted file mode 100644 index 7c4ff08c..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Block-Avatar-Dressed.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af800150d78275f4675a82510a13a4d58c608ded08f9b91f2e7975c20671ca4f -size 239371 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Classic-Clothing-Templates.zip b/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Classic-Clothing-Templates.zip deleted file mode 100644 index dd90fa86..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Classic-Clothing-Templates.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:678ddad004667f74dce223c7d1259e9dd437153c763639d7e668f3b532487c5d -size 124778 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Pants-Template-Bad.jpg b/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Pants-Template-Bad.jpg deleted file mode 100644 index e9524ea0..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Pants-Template-Bad.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d128afe518743c8f4b005b6d4f31048e1b234a38d0b511bdae3858781a238782 -size 108442 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Pants-Template-Good.jpg b/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Pants-Template-Good.jpg deleted file mode 100644 index 53e34e8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Pants-Template-Good.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccb82b89643045f3670252b5c4f2f013610193c23afe9bc1d3c470190e34dab3 -size 121975 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Template-Pants-R15.png b/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Template-Pants-R15.png deleted file mode 100644 index 964029dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Template-Pants-R15.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c57244d5bb9605f1e3b7de245c201666741b0fb147905703f3371c0aef17c73b -size 64099 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Template-Shirts-R15.png b/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Template-Shirts-R15.png deleted file mode 100644 index e16420d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Template-Shirts-R15.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c87e4dfbc6cbee15e7f7283a74983f3762b715b1b366c0514754316474697d8c -size 66301 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Types-of-classic-clothing.png b/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Types-of-classic-clothing.png deleted file mode 100644 index fe9f213c..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/classic-clothing/Types-of-classic-clothing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4de3cd026dcb7b21beb45d7c4572ac0f62cbe1497fb364fdd949f9d230ffdbf -size 655401 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-append-cages.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-append-cages.png deleted file mode 100644 index 14f1eb9b..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-append-cages.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c376f417f89db946ae6f0915b90a1561c189f57b2f958219bb859687f70bde6d -size 26022 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-append.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-append.png deleted file mode 100644 index db6adb66..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-append.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78715041e537c2ac51ef4bebc2f14b91a4f368596d95daa9bd35a64a46027397 -size 115448 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-hide-symbol.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-hide-symbol.png deleted file mode 100644 index 611d2829..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-hide-symbol.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a423e7b7730e64d0668a40bc505a979de5a06dbc8a8ba43e694f8fcb75013320 -size 873 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-selecting-cage-in-outlier.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-selecting-cage-in-outlier.png deleted file mode 100644 index 4467079a..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-selecting-cage-in-outlier.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1ebc801e14d7a955d9892ed041859483ebc2ddaa18597105df46992fddcf966 -size 19305 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-template-opened.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-template-opened.png deleted file mode 100644 index c6c1c605..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-template-opened.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b63057d19d8be1813933b8a24741a657b052466f7bb35679e90358e279b4971 -size 1055892 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-workspace-cages.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-workspace-cages.png deleted file mode 100644 index 428444ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-blender-workspace-cages.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89bf87d2cb20885d5a5495981d35692d1588624cac470ce7bdeff25ca9942bb4 -size 998859 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-innercage-outliner.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-innercage-outliner.png deleted file mode 100644 index fc80562e..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-innercage-outliner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4ee1699830b57ac0c4af777bd69f3b72703b2157c8e26d5eebf3b21fb453e8b -size 61739 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-innercage.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-innercage.png deleted file mode 100644 index 2a11c328..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-innercage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5029be33b47f197f2f3c91b4e6db45f41670d81895616b3ad51d361f5b838e98 -size 292575 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-maya-settings-with-animation.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-maya-settings-with-animation.png deleted file mode 100644 index 453845c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-maya-settings-with-animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:280ff3b4434114977511ea3110a808b3c3aeff376f0bc4cc3f16111fc183cacc -size 88284 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-maya-settings.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-maya-settings.png deleted file mode 100644 index 2cbcd17b..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-maya-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37624b57af8ab6d6f32e60c08e2d742cc6763b427a9b9dddecf6b2cbeaeec56a -size 90041 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-outercage-outliner.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-outercage-outliner.png deleted file mode 100644 index 85b3a2d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-outercage-outliner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:473e570d85cbc35c0a7a4fc1a6598bdd315236c3f038f0a0787302ebb84f1568 -size 66013 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-outercage.png b/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-outercage.png deleted file mode 100644 index 8268ce7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/lc-requirements-outercage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a3bd6b23bcd4035e8136c504c290d42f0c3993c7a17406529e5877222f0c449 -size 253440 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Additional-FBX-assets.zip b/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Additional-FBX-assets.zip deleted file mode 100644 index a3ac0cba..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Additional-FBX-assets.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:caa8e1d1f4b0f0acab9f07d2d12413f52f2765f9380b568505c48aac4607fc1e -size 24712270 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Bow-rigid.rbxm b/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Bow-rigid.rbxm deleted file mode 100644 index f035503c..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Bow-rigid.rbxm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd82c3708fcb031d5a4d0d218b5921c64e43fd559b818aa38e3b54d055cb94e4 -size 3459 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Caging-examples.zip b/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Caging-examples.zip deleted file mode 100644 index 2509def9..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Caging-examples.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b86a711fb0a91a3c41264fc8027812fd6c0dd3720bf3bd577db9d1f0c8064f37 -size 8937314 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Tshirt-caged.fbx b/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Tshirt-caged.fbx deleted file mode 100644 index 71a32f49..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Tshirt-caged.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc57301b402c10c067bf85daa15d201caa3d306d73b2091d12941166e7aa6a99 -size 534940 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Tshirt-model.fbx b/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Tshirt-model.fbx deleted file mode 100644 index 129bd3bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/reference-files/Tshirt-model.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79343852f6ead85411a6e6b69212c50dc8d75065cb9365c66101f97970a35748 -size 337708 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Add-On-Preferences.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Add-On-Preferences.png deleted file mode 100644 index ae81ab2d..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Add-On-Preferences.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:558d5cc63e335f69694e63449b2852dfd8591d99beb0565ce85455665b31f8e6 -size 168195 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Enable-Add-On.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Enable-Add-On.png deleted file mode 100644 index 6ed5773b..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Enable-Add-On.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a8bacd0d75175319a454bee79a2c60b6d9458cfef344d9363a97887c087b20e -size 141292 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Failed-Check-Example.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Failed-Check-Example.png deleted file mode 100644 index 07d629db..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Failed-Check-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e73d3c09f93ef162cd422b2a905c9dd71e3f58dbb2111d9b0d7e9688d8927a4 -size 62059 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Failed-Check-Viewport.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Failed-Check-Viewport.png deleted file mode 100644 index be5e18f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Failed-Check-Viewport.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66f8ff54d32f24d4f8dd03da56cf4888cf3431219eee2ed63dbc93c5a2c8653d -size 403154 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Sidebar-Indicator.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Sidebar-Indicator.png deleted file mode 100644 index 0931f8a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Sidebar-Indicator.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1df60c5cd854c2337e31b285e59a2ef20ca6b8d1ba197868da07c5ec6d8d79cd -size 202558 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Validation-Tool-Opened.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Validation-Tool-Opened.png deleted file mode 100644 index 6801da6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Validation-Tool-Opened.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82d848b4285bc455d409b4edadd9d07b2329a447832e0a33867c1ee46483a111 -size 35974 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Validation-Tool.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Validation-Tool.png deleted file mode 100644 index 62baa5ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Blender-Validation-Tool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bbf63ef440acd34aabc6ca067ef3e44d4a7cff126be3adcb5d0149f3f64dd61 -size 36344 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Mac-Right-Click-Install.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Mac-Right-Click-Install.png deleted file mode 100644 index 01692a56..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Mac-Right-Click-Install.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c98142dfcd5e42571c17958435cc8183a47c9bac7a9da2237aa073f1c7f2480 -size 46641 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Command-Prompt-Success.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Command-Prompt-Success.png deleted file mode 100644 index 7824fef1..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Command-Prompt-Success.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14637761058426f422f1e3e1aee38e31e8e7a037854bb5411fa3f853e43cebc3 -size 3833 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Install-Prompt-1.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Install-Prompt-1.png deleted file mode 100644 index d5e50d95..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Install-Prompt-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24ddf22f0f0a6ad5cffea4b1945f34c6dbf9b29463c7a2cd2a3d23dcf23a2a52 -size 2782 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Install-Python-Settings.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Install-Python-Settings.png deleted file mode 100644 index 3b3b3197..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Install-Python-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15ffba468ed51cca0f88c03071690a08e7f5570c3155d265c6e791da10a77731 -size 315784 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Script-Editor-Menu.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Script-Editor-Menu.png deleted file mode 100644 index 9d344a5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Script-Editor-Menu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20279e92bca718cb35a8c47b0d25e82c44d0e966495a45d10d332afc96128c12 -size 80518 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Script-Editor.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Script-Editor.png deleted file mode 100644 index 15f99062..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Script-Editor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:354e207be9577fcc61b92d7252465226d23921843f5fadb0dd2de232b9b2c68b -size 4914 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Shortcut.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Shortcut.png deleted file mode 100644 index ab64fd8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Shortcut.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cad5ecce531b112b4cff0c79d66dbedb84365d859d028a22e5e5b04fd2b94df -size 27023 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Validation-Tool-Opened.png b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Validation-Tool-Opened.png deleted file mode 100644 index f70af509..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/Maya-Validation-Tool-Opened.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3b49b173c71d5f057624f5915e13076de7e2409ccb43f48dbb6f9b84286e523 -size 77784 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/ValidationTool_Blender.zip b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/ValidationTool_Blender.zip deleted file mode 100644 index 93a18ff0..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/ValidationTool_Blender.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78404cb269cefa2fc3abda7724148ccc9d7681ddc7324460b5a0456c68e08828 -size 8025 diff --git a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/ValidationTool_Maya.zip b/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/ValidationTool_Maya.zip deleted file mode 100644 index cbd639b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/accessories/validation-tool/ValidationTool_Maya.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63da746b46f498d9f06e5565977f55a7ce0435ce4b5d1b5caad1deb3e40529eb -size 20908 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/New-Users-Funnel.png b/.cursor/rules/roblox/en-us/assets/analytics/acquisition/New-Users-Funnel.png deleted file mode 100644 index e9b44f35..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/New-Users-Funnel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:017d674b8b818d1fbee24a802be0961b214755ae01437c365384b6f1d6bb65e3 -size 220551 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/Qualified-Play-Through-Rate.png b/.cursor/rules/roblox/en-us/assets/analytics/acquisition/Qualified-Play-Through-Rate.png deleted file mode 100644 index 83ad399b..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/Qualified-Play-Through-Rate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7677ad0b1d94be809787121e118b5967c64d6cf4596c23ab83a1a5107b0a6ede -size 200468 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/Share-Link-Acquisition-Dashboard.png b/.cursor/rules/roblox/en-us/assets/analytics/acquisition/Share-Link-Acquisition-Dashboard.png deleted file mode 100644 index bbe24bb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/Share-Link-Acquisition-Dashboard.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a0523e823b11d4aee27830fb5fe0cffe8cd0b10ee88d8416ba3377869a45b2f -size 225311 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/Unique-Users-by-Source.png b/.cursor/rules/roblox/en-us/assets/analytics/acquisition/Unique-Users-by-Source.png deleted file mode 100644 index c668e722..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/Unique-Users-by-Source.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b59b451844ec2e05e7fdc3088eaea5e545412608d66e824c2f1a147b487951c -size 332133 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/conversion.png b/.cursor/rules/roblox/en-us/assets/analytics/acquisition/conversion.png deleted file mode 100644 index 642ba57b..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/conversion.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3ac0fe7ebabdb5ae16caa1b78f792a78cc355b05f27dcc8dd261b55251912f4 -size 221856 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/qualified-playthrough-rate.png b/.cursor/rules/roblox/en-us/assets/analytics/acquisition/qualified-playthrough-rate.png deleted file mode 100644 index 2e0a06d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/qualified-playthrough-rate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58cb3e65a502142cecd58463701499907cecfc67313f095c3b59c6795dc431af -size 119687 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/traffic-sources.png b/.cursor/rules/roblox/en-us/assets/analytics/acquisition/traffic-sources.png deleted file mode 100644 index 35ecd5b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/acquisition/traffic-sources.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ea68155a21173f77d318ccfca9560b49291b60f222f18dfffd8d50ca6ed14f9 -size 172754 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Explore-Mode-Preview.png b/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Explore-Mode-Preview.png deleted file mode 100644 index 8f7fbeb3..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Explore-Mode-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d5a35f027aa5770160829c4fdf8f5fadf6cc3aa18893d2156b9a49bdf67bb51 -size 86583 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Explore-Mode.png b/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Explore-Mode.png deleted file mode 100644 index 5ec2de46..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Explore-Mode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5224642ac37fed5305f7a0f3f2324b7e52917cf70a3ee301c2b680a705a4af5 -size 40712 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Metrics-Unavailable.png b/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Metrics-Unavailable.png deleted file mode 100644 index 59820b5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/Metrics-Unavailable.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35e20ad1c01c61c104d72da398df3eae4cdd55691c3d35ddae3d22f41bc3a675 -size 17289 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/benchmark-similar-exp.png b/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/benchmark-similar-exp.png deleted file mode 100644 index f3e63395..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/benchmark-similar-exp.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2472642cb23a65e2207b4d4380dfa3a5adf582a53cd8632d1e0487008782fb3f -size 91588 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/benchmark-transition.png b/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/benchmark-transition.png deleted file mode 100644 index b16185fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/analytics-dashboard/benchmark-transition.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9bac5133c2b068fd0139c0a0e4a846c0182f8b7d15b763edd66b9d95406183fe -size 198083 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/bans/bans-overview.png b/.cursor/rules/roblox/en-us/assets/analytics/bans/bans-overview.png deleted file mode 100644 index 69caacd5..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/bans/bans-overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c3aa0074dfaa6b92051b5a0f85c42e827672b2037fff22e7a7bba54f6f9fd8f -size 89903 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-history.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-history.png deleted file mode 100644 index 67d2fd0b..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-history.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e724db3c26e7b6a26c4944369a93faf67e0f5e3eb9b6b2c882538020f2ce57a1 -size 100907 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-overview.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-overview.png deleted file mode 100644 index 49974e64..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eff9b6df469c149972abc966b3b51f1d5c8cebef7cfd8ffc033868bd8ecf0ea0 -size 64242 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-publish.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-publish.png deleted file mode 100644 index a88b7e43..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-publish.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8599d56faf80f4adb05c86bf41a8ae09cbbd0d8effb8374ce2245a08310cf9c -size 51453 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-studio.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-studio.png deleted file mode 100644 index bf8d2838..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/configs-studio.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c374a2917affdede7a9d9406cf01b0e4d941e1cc9e4a374ef48bfec686b097e -size 65464 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-confidence.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-confidence.png deleted file mode 100644 index e8ffcd38..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-confidence.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8620d21904bbb5f1cf8d501ccfbbe0945240e7ca70408cf0aad30912e7b41e52 -size 69127 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-details.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-details.png deleted file mode 100644 index df865ec9..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-details.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f01ead2b8e1c91ceb3b1da767d6f15ddcf7c7ee4a1e9a8d173443bf7da580ee -size 90969 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-mde.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-mde.png deleted file mode 100644 index 71c338e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-mde.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62aef5fc64e9da4ceb5b4fd153e747ceca5e6ec86a476357fef79b53dbe9f504 -size 13986 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-overview.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-overview.png deleted file mode 100644 index f3b1ca00..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:709a4cc4be6b02939d35ed3f6c235ce80b0c6e29dd9ee14cc8c8f8fb8f72f757 -size 49425 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-results.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-results.png deleted file mode 100644 index bc64bc6b..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-results.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b262b45c63825a75525e7c41afc103bf6e2582e16c5f7a05e3b18b33c0eaf3a6 -size 265830 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-variant-place.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-variant-place.png deleted file mode 100644 index f81742c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-variant-place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c972c2ab64e8f2b8a0af06b738c3add69bf062f5ce19afee60feff7ac9d7597 -size 81655 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-variant.png b/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-variant.png deleted file mode 100644 index 6184d06f..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/configs/experiment-variant.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae7c21d37a490e3580b1c392d7be4d2513e3287f445bbc52ab9df3f3f4131ff1 -size 66887 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/demographics/analytics-demographics.png b/.cursor/rules/roblox/en-us/assets/analytics/demographics/analytics-demographics.png deleted file mode 100644 index 0f0c6314..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/demographics/analytics-demographics.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a95348c37b8cc63a80bef1e5f4cb2161df79ddd3e0d2004105ebf19b6684642 -size 433952 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/developer-stats/Chart-Visits.png b/.cursor/rules/roblox/en-us/assets/analytics/developer-stats/Chart-Visits.png deleted file mode 100644 index 15bd643f..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/developer-stats/Chart-Visits.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7af5671f04ddbbd180aa209082558d1c02754816107299cf7be15d194b698b2 -size 143135 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/developer-stats/Live-Stats.png b/.cursor/rules/roblox/en-us/assets/analytics/developer-stats/Live-Stats.png deleted file mode 100644 index 56197817..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/developer-stats/Live-Stats.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60e410619cabe0f55e76aa80454657691b0086382e32126aa5685d518124b196 -size 89265 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Below-Benchmark-Charts.png b/.cursor/rules/roblox/en-us/assets/analytics/discovery/Below-Benchmark-Charts.png deleted file mode 100644 index 394e1393..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Below-Benchmark-Charts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:daef21cfd58ffb03530fda1a8c95c9eaa32f4a4ccff9740b69b4fb4314463faf -size 184440 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Daily-Benchmark-Graphs.png b/.cursor/rules/roblox/en-us/assets/analytics/discovery/Daily-Benchmark-Graphs.png deleted file mode 100644 index 740f66a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Daily-Benchmark-Graphs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74fb3622140d63fb73f437d093c89a1edf4a35d3c2f3b8b9bd5a601c3f17bad6 -size 140263 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Experience-Overview-Graph.png b/.cursor/rules/roblox/en-us/assets/analytics/discovery/Experience-Overview-Graph.png deleted file mode 100644 index 1293a6fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Experience-Overview-Graph.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fa62476e37711e053e660a5ba8db6065ac06ac27675cc7028945411e2b8acae -size 38961 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Explore-And-Expand-Graph.png b/.cursor/rules/roblox/en-us/assets/analytics/discovery/Explore-And-Expand-Graph.png deleted file mode 100644 index f7c29544..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Explore-And-Expand-Graph.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1d75e4d657bce0a41d6a38e90413ae057ce74a7d2bde147e3a4c135eae9abe4 -size 85055 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Home-Recommendation-Impressions.png b/.cursor/rules/roblox/en-us/assets/analytics/discovery/Home-Recommendation-Impressions.png deleted file mode 100644 index 447b035f..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Home-Recommendation-Impressions.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebe36fbe8fc9ec4404ab12894c30e5767211897f7fb16892f9b884e74f6a4b65 -size 260965 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Qualified-Play-Through-Impressions.png b/.cursor/rules/roblox/en-us/assets/analytics/discovery/Qualified-Play-Through-Impressions.png deleted file mode 100644 index fd19a74e..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Qualified-Play-Through-Impressions.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2c30bff24e7b3963690ec7e7aa65873f987ac0ff1f340d4052cd20dfc0ddb86 -size 274405 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Qualified-Play-Through-Rate.png b/.cursor/rules/roblox/en-us/assets/analytics/discovery/Qualified-Play-Through-Rate.png deleted file mode 100644 index 49f896e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Qualified-Play-Through-Rate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1797d6d751b2b4d8530a9c15f59c599dc140288e2cbd019c75d71850bc1ddae7 -size 48082 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Retrieval-And-Ranking-Diagram.png b/.cursor/rules/roblox/en-us/assets/analytics/discovery/Retrieval-And-Ranking-Diagram.png deleted file mode 100644 index 2456df5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Retrieval-And-Ranking-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:741660cb3437de4ef628b6b0775863e997177b08c4dad1ec4a1c4c5d75d0b15b -size 258092 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Similar-Experiences.png b/.cursor/rules/roblox/en-us/assets/analytics/discovery/Similar-Experiences.png deleted file mode 100644 index 448c0379..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/discovery/Similar-Experiences.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:231887c966f2a958d65ff83687e87d9aa77a83814d5aee54bf0ebadb6ad81ad1 -size 128477 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/error-report/error-report-graph.png b/.cursor/rules/roblox/en-us/assets/analytics/error-report/error-report-graph.png deleted file mode 100644 index 7270ab93..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/error-report/error-report-graph.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c3efa4d30154471b654eef9bbd5a856c213dd5eb1d7e2cf2cbf7baf77a83dc9 -size 82807 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/error-report/error-report-table.png b/.cursor/rules/roblox/en-us/assets/analytics/error-report/error-report-table.png deleted file mode 100644 index 34ce7e05..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/error-report/error-report-table.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c89afeeb07d96382da46bfa7590e71c11b79b49347302db22a4b10f459643483 -size 155944 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/All-Sources-Sinks.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/All-Sources-Sinks.png deleted file mode 100644 index 53271c57..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/All-Sources-Sinks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28a74d5f46ef6ffa548131edc575208f39a52acd41525a20e5cfc865534cff41 -size 76596 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Average-Wallet.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Average-Wallet.png deleted file mode 100644 index 5ca45cef..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Average-Wallet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2fd41853eeb921624331017aeceb0f819c72fe2c7b6bada3a50af6fed610454 -size 54541 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Aggregations.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Aggregations.png deleted file mode 100644 index 2a5d3f05..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Aggregations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a60135af0a396db770bbf648068e06cc9a1801f3d0fe4716c33c938bf465043d -size 48856 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Breakdown.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Breakdown.png deleted file mode 100644 index 88716d68..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Breakdown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48acd32882ddc8d8c9dac6927636c56c76e2c97d308d00ac87d9636b5e48f08f -size 61963 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Graph.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Graph.png deleted file mode 100644 index 961395e0..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Custom-Event-Graph.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72037b9a6d95dab395c46c970ebeb14c7d7fa726b0cb4a1949ac1186d9f6af14 -size 203657 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Event-Tracking.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Event-Tracking.png deleted file mode 100644 index bc05f0a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Event-Tracking.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:577a44966aba72525c124873a635814119a18f8cf07a4cd3f56b07de18caa3bd -size 217881 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Overview-Economy-Funnels.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Overview-Economy-Funnels.png deleted file mode 100644 index 1e505065..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Overview-Economy-Funnels.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9eaf4b460da1aec0e482a4881f5260a90828f00a6d2b6060ae3f13364d3d8bcf -size 295952 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Funnel.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Funnel.png deleted file mode 100644 index 6ea2c392..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Funnel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d12e0a2fe053df9fb6df0f5aa380db7cba9b724d06f94fa2ba9332de2928cff2 -size 117939 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Prompts.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Prompts.png deleted file mode 100644 index d14f5d8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Prompts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9dfd934c14f1203812afb765086d24e99493b8aef996c3154c186882a60f5af7 -size 1335935 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Warning.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Warning.png deleted file mode 100644 index 263f1145..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Plant-Game-Warning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fcb5c4c653d52230b249c2db874f01a00ac6dc365e36aebe67f859c959e3646 -size 13885 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Top-Sources-Sinks.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Top-Sources-Sinks.png deleted file mode 100644 index 91a00eeb..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Top-Sources-Sinks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e369a32efc46062f1eb0c2139005aca68454afa558b328a2f8423daca18154bc -size 56977 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Total-Sources-Sinks.png b/.cursor/rules/roblox/en-us/assets/analytics/event-types/Total-Sources-Sinks.png deleted file mode 100644 index 421e454c..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/event-types/Total-Sources-Sinks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:667296e8339dad6afb4961f68f13c45b0457811087b4931ff2a093192a31048f -size 78056 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/AnalyticsAssistantFeedbackReport.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/AnalyticsAssistantFeedbackReport.png deleted file mode 100644 index 2452cc08..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/AnalyticsAssistantFeedbackReport.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42ef9ce8d3044806d8f96999b36b6c0b2cef229f4794755191524232af85f035 -size 139308 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/AnalyticsFeedbackAssistant.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/AnalyticsFeedbackAssistant.png deleted file mode 100644 index ca23b56a..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/AnalyticsFeedbackAssistant.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e0cbdf4135a8c9f894848424fbef11a4cbb5e205780251120d15b4467c8737d -size 138742 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Date-Range-Selector.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/Date-Range-Selector.png deleted file mode 100644 index 1d8acd2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Date-Range-Selector.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a17e680c494f78e759115cc664de124143fc05be69958c9e92c7e35089f801e -size 203314 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Detailed-View.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/Detailed-View.png deleted file mode 100644 index e5efd1c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Detailed-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3d771ecc3a8280dc7e51507d4fc93fd034c92afb718da95953068fb02786454 -size 73647 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Export-Chart-Data.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/Export-Chart-Data.png deleted file mode 100644 index 3e0f644e..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Export-Chart-Data.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68cd6de16a94dc8d983081361ca04db5ac8d14dea210fd1f2b9122581e3b1fa0 -size 144773 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Export-Detailed-Data.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/Export-Detailed-Data.png deleted file mode 100644 index a0d149fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Export-Detailed-Data.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64c263b8a53eb4fe46efe8464fc44515d1e69e382a8adc1932f9cc0ecbd82447 -size 58898 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Breakdown.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Breakdown.png deleted file mode 100644 index c3a61cb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Breakdown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e58eca14fd101d5ffabc117840397cb2755f5b28bfb0735da3f30509af1140a3 -size 53706 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Options-Button.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Options-Button.png deleted file mode 100644 index 1ab656f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Options-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fec2248ddcc68ae56190b98e66f196ae8eb6b557bf6ba8cc020b6d46993ea29 -size 33397 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Widget.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Widget.png deleted file mode 100644 index be732e67..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Feedback-Widget.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0a905381758ebf8b779501b344c7af67f2caff7fe329713e39b6551e95cc618 -size 162179 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Relative-Percentage.png b/.cursor/rules/roblox/en-us/assets/analytics/feedback/Relative-Percentage.png deleted file mode 100644 index eb9a8539..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/feedback/Relative-Percentage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:546ae05ab8e145f20c9f1903c38ccd6bee49babb58116b45b39e22083746683c -size 56386 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/monetization/monetization-overview.png b/.cursor/rules/roblox/en-us/assets/analytics/monetization/monetization-overview.png deleted file mode 100644 index 9ef9d5e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/monetization/monetization-overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e2ef0f2f4a6aa7b379f7ab29774207ca18c591190191058754772c7437a2298 -size 23728 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/Achievements.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/Achievements.png deleted file mode 100644 index a0465ec9..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/Achievements.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ec71c5bd4f05cc2022838385fb53f77fe7de7c7a8ac65e6a879c8b1c372f678 -size 31496 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsAssistantInsights.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsAssistantInsights.png deleted file mode 100644 index 4102e95d..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsAssistantInsights.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9fc3c54a5c8eba9d0096f16bbfe8f15ee32bc3f694f555b66c23b021d777cdb -size 59109 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsAssistantReport.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsAssistantReport.png deleted file mode 100644 index ed61d40f..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsAssistantReport.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c276d896113c6e8af38cc2da419313ba261f517896b2751d7c29cd412f4d929b -size 396453 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsInsights.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsInsights.png deleted file mode 100644 index 732d24eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/AnalyticsInsights.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b43b7c61007b6f07f1320b964e1c3b5dd922d57486b2ebd7cb0244066a1e19f -size 102945 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/Benchmarks-Similar.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/Benchmarks-Similar.png deleted file mode 100644 index c75ac0e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/Benchmarks-Similar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d42153dc149808364aa78eeeebae80d653a5054c49c294e49156b35957b748c -size 172474 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/Insights.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/Insights.png deleted file mode 100644 index 28981a2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/Insights.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75ff01241738a0c1a244fbcb2093311a9099cdd43aaa438f4b6aa9f517d43d74 -size 138513 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/Roblox_Analytics_Insights.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/Roblox_Analytics_Insights.png deleted file mode 100644 index da26c7ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/Roblox_Analytics_Insights.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:060bb46d5ddcc96ddc40fd2bb322c18d219623f1948924bcc48571a0cefcb79a -size 171459 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/avatar-sales-and-revenue.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/avatar-sales-and-revenue.png deleted file mode 100644 index 216a70c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/avatar-sales-and-revenue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:754566464f10ace898494140a6674c9f07c86522c300f1770547811b81a01281 -size 232737 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/step1.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/step1.png deleted file mode 100644 index 6d5d6e0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/step1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b013f989eddf421bd873d9a33b1d05c5663f1c0380ac0928d1b15b0eeffec057 -size 86679 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/step2.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/step2.png deleted file mode 100644 index 2e0a06d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/step2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58cb3e65a502142cecd58463701499907cecfc67313f095c3b59c6795dc431af -size 119687 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/step3.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/step3.png deleted file mode 100644 index 4c07b758..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/step3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ca2b70954981dae2c31e52661149332c525ab906269f407e161bfffdb27ff54 -size 394506 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/overview/watchlist.png b/.cursor/rules/roblox/en-us/assets/analytics/overview/watchlist.png deleted file mode 100644 index 3c20ce18..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/overview/watchlist.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74c0c6bba7efc3b1a543843dd6e7033b864cbdeac4c379174870644a80ab1fe0 -size 1423102 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/client-api-calls.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/client-api-calls.png deleted file mode 100644 index b2c46b4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/client-api-calls.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c1bee7560e7777f645d6f286e79617551de93d19e8af22eb5f60fdbc90b6ded -size 105980 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/client-performance.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/client-performance.png deleted file mode 100644 index 6c7082a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/client-performance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:620df7c65048f636fa884616d1810d12e2214ea2f190d8718c2ce481f58f17f5 -size 145318 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-client-crashes.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-client-crashes.png deleted file mode 100644 index c8e55aae..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-client-crashes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5875740c05a5284f76732c574aa1123e270dff9462256020b4a6c156e761e225 -size 72913 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-dev.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-dev.png deleted file mode 100644 index 05daac1b..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-dev.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc3b491437355b195fd9704d7df434fa1b75f6c0081c480b727459979c45a75b -size 463553 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-drilldown.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-drilldown.png deleted file mode 100644 index 8d936463..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-drilldown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aed96affad40783e669abfac3a66f5bb518e84f537946f5581ada385c761d479 -size 304687 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-filter.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-filter.png deleted file mode 100644 index 6716b44a..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-filter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fee71232aaeceeed7d2c03266f55f3273757659b42ae94a1b092a2c026d00fb -size 42584 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-micro.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-micro.png deleted file mode 100644 index 22589756..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-micro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c698a13127a73f80b1eccbacf7b21c4644cfe0bf3f70575191b2d130878f828d -size 214604 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-overview.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-overview.png deleted file mode 100644 index 5a656848..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea98f5fcbc831f08264bb2d18f169cbd53a2508e2d570041e155fc716a07311e -size 203982 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-ui.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-ui.png deleted file mode 100644 index 00be316e..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-dash-ui.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5f304fa337de428b19211fdc6a694930a5b932f3b8d0dfe12c82a8c46155a51 -size 171169 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-place-version-filter.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-place-version-filter.png deleted file mode 100644 index 391c0f17..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/perf-place-version-filter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec0f1a0ddb142c55d2d02e6e07cc95eab222b7c99a080f412032f38cb1cdec5d -size 108588 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/performance/server-stats.png b/.cursor/rules/roblox/en-us/assets/analytics/performance/server-stats.png deleted file mode 100644 index e869d4fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/performance/server-stats.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e77d028d2c3d7ea193c876416ed6e058023ad708f2550649b41b667d18e21a7 -size 49593 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/retention/AnalyticsRetentionChart.png b/.cursor/rules/roblox/en-us/assets/analytics/retention/AnalyticsRetentionChart.png deleted file mode 100644 index 9f55e6a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/retention/AnalyticsRetentionChart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34db120c8fcb2191e7429cf3cd30939d0b4753828b904cd7e1328d74eb80af61 -size 243850 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/retention/CohortAnalysis.png b/.cursor/rules/roblox/en-us/assets/analytics/retention/CohortAnalysis.png deleted file mode 100644 index 9e510a7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/retention/CohortAnalysis.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5050b79b839acb39598ec1205060214d78d11a6204bcd5b7cff1636487f386af -size 89529 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/retention/CohortAnalysis2.png b/.cursor/rules/roblox/en-us/assets/analytics/retention/CohortAnalysis2.png deleted file mode 100644 index e59d7d00..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/retention/CohortAnalysis2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:830e324ba24a0241f94a652c7dc9fb870b6406d920421008c1533797acfacb70 -size 143972 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/sales-data-calendar.png b/.cursor/rules/roblox/en-us/assets/analytics/sales-data-calendar.png deleted file mode 100644 index cc81a2ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/sales-data-calendar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acbd96406aee64a1381eebe0844f8250b44f55715e7ee3ba93a8cfb9e7667988 -size 99924 diff --git a/.cursor/rules/roblox/en-us/assets/analytics/sales-of-good.png b/.cursor/rules/roblox/en-us/assets/analytics/sales-of-good.png deleted file mode 100644 index 59da72ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/analytics/sales-of-good.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:091728451ee28f4a1d142a1cd8f2567137786bf65a9ace0d61a746c62b27b850 -size 15170 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Add-Multiple-Keyframes.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Add-Multiple-Keyframes.png deleted file mode 100644 index 6f19a9b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Add-Multiple-Keyframes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e16c56b84ab24755acbae1fc7ecab60a0edcb0f3df595726001f365c53020291 -size 29436 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Add-Event.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Add-Event.png deleted file mode 100644 index f95d7d52..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Add-Event.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46374cfb402ed00f0c5c2a401f9af6563ab62df356e8bd09f76598490f65313b -size 13005 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Bar.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Bar.png deleted file mode 100644 index ad7e8615..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Bar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8d919a6e14d1c293770ada538cec95ce373822c670afe8494d171b9b37b9155 -size 31177 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Edit-Button.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Edit-Button.png deleted file mode 100644 index 12dccb94..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Edit-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae05208573e7e90a2fc3fd46fb3a7b0ffd242f50c1b1a7e0b9c7ebfb5f59b152 -size 29791 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-In-Timeline.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-In-Timeline.png deleted file mode 100644 index 968c4841..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-In-Timeline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74bd137a72973c09348b2c573de216e6da164535b29283f7fd1a2233a6605c84 -size 31898 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-Pasted.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-Pasted.png deleted file mode 100644 index 3939c235..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-Pasted.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b83ec82f991290c5e576defd814940a5ca78254bfe6e2a515174f73023d69aad -size 32774 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-Selected.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-Selected.png deleted file mode 100644 index 77eae5ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Events-Marker-Selected.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3eb1aa90f0abbffb3daba90fc5fc6e71b9b1bc942598c0666a24c7d939da33f1 -size 32312 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Poses.mp4 b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Poses.mp4 deleted file mode 100644 index ec7dae3c..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Animation-Poses.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb4f90d27a0fb045e7accead3cf75e6f067a3178c704c97faff868a2c11a6669 -size 2260572 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Animation-Name.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Animation-Name.png deleted file mode 100644 index 73af236d..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Animation-Name.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2c73c1cc85685cb46caea6ab0e01844ff9500f04651d1fce8022f02dbf88851 -size 11728 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-File-Menu.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-File-Menu.png deleted file mode 100644 index 644aad6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-File-Menu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7842e462100d31ab7a7380d6049bc04ff707e29486f7d6bb53c451fab527ca59 -size 14784 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-First-Key.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-First-Key.png deleted file mode 100644 index 4afcd065..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-First-Key.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cb41f693c1e463f378628b4ca4791a60c711f81a23ae87a42740df37773412b -size 14853 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Last-Key.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Last-Key.png deleted file mode 100644 index 54920b4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Last-Key.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7acbe51702505396addfa3ba405f3188cf318f8fdc3024ada63c1192b2aeef24 -size 14786 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Looping.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Looping.png deleted file mode 100644 index 51dcf4a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Looping.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d50a280d0fa21bbe384433078e4df60bcf50a7f419d85a14cb4c26a2932052b -size 14797 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Next-Key.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Next-Key.png deleted file mode 100644 index fb9364c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Next-Key.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a75d30ba06822c4c277561090c440a8c3ca509c1a12f8e4a3448af44c70f632a -size 14913 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Pause.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Pause.png deleted file mode 100644 index 12abc8d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Pause.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58883d0c04cb7165f9530969c8f55b245f6c85e03a2e7cc07953f952f71163d7 -size 14918 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Position-Indicator.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Position-Indicator.png deleted file mode 100644 index 78c48fef..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Position-Indicator.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:995aef17762e1fc9adce6b72e913eded6e5d2b95285d680bb3ca6ace84b396c7 -size 11443 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Preview-Reverse.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Preview-Reverse.png deleted file mode 100644 index fd731c5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Preview-Reverse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e93973eb98336c58e9c3cf3d81c7db823ae4c9127702179a2cc716e52bb37756 -size 14785 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Preview.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Preview.png deleted file mode 100644 index ac6590d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4683fb92e64c2b19a7c4b30281b31dad23bab4b3a6744dc860f6a8fd7aa12695 -size 14895 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Previous-Key.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Previous-Key.png deleted file mode 100644 index 3b3ff310..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Controls-Previous-Key.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e0e2cbdb3a59ff943c57a89ca7846a7ce0f73e180aca3c368fccdb5a56c2353 -size 14841 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Create-Animation-Dialog.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Create-Animation-Dialog.png deleted file mode 100644 index 3cfdc604..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Create-Animation-Dialog.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e1b73bb201df27169ff8f2a871f8f5dbff5898539f84f393aa065be72d674a3 -size 15174 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Easing-Cubic.mp4 b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Easing-Cubic.mp4 deleted file mode 100644 index bc63ddaa..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Easing-Cubic.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:342c1036d85a40cf3bd744bffa5efc53ebaf6e3c62ac74832afc9ffe4f56519f -size 2166347 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Easing-Linear.mp4 b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Easing-Linear.mp4 deleted file mode 100644 index 4f84bb2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Easing-Linear.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d371315160b465eb4065e67606f51d16be594732995b6fa115b6502656ad0c20 -size 2263480 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Editor-Sections-Labeled.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Editor-Sections-Labeled.png deleted file mode 100644 index 6e6157ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Editor-Sections-Labeled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e34c6c094413cdd5bae29eb947bef2bea0b46db8dbfaf6f5fdbfbd994a614a80 -size 39908 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Migrate-Animations.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Migrate-Animations.png deleted file mode 100644 index 30828683..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Migrate-Animations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a9eeba64125165951cb885e3cd93a8d4522ca2ccbb760b67bf940bc174692bf -size 29432 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimization-Preview.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimization-Preview.png deleted file mode 100644 index 8433528d..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimization-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bd2ca268a718dd6ee492672a79a9ec6dcf40e8fcc7e2a82fe90c34bd94bf483 -size 701018 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimization-Slider.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimization-Slider.png deleted file mode 100644 index 19f5a9c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimization-Slider.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75084223fc22d5b4925033ad674e09036260c3bf18c4ea03b89966216685c9f1 -size 9317 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimize-Keyframes.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimize-Keyframes.png deleted file mode 100644 index c35af1bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Optimize-Keyframes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9573036e996e03b7849fa15430e84402e7f355acdbc77f34bc14e169d609467d -size 6763 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Saved-Animation.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Saved-Animation.png deleted file mode 100644 index 76dc3f9d..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Saved-Animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6069dcfb7e63ae1a2071cb316f98f7ba55d7b9e2dc6cf3c6d9e8fe9f43086ff5 -size 31219 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Scrubber-0-15.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Scrubber-0-15.png deleted file mode 100644 index 4f8779bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Scrubber-0-15.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80a908a622a38a74960838083b5340f290e561ac44586330d3f538e3ed1a4282 -size 15667 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Final-Keyframe.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Final-Keyframe.png deleted file mode 100644 index d684c046..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Final-Keyframe.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27e0759fdab5c45653ecd29f7e571531684605d924d57dc531dd0d7b10aeeec0 -size 21921 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Multiple-Keyframes.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Multiple-Keyframes.png deleted file mode 100644 index d57a32e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Multiple-Keyframes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6fb1e0eafbb1eb7007234c415d92b5aef89ccc9f305df9b941f230524425c83 -size 37404 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Single-Keyframe.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Single-Keyframe.png deleted file mode 100644 index ee027389..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Select-Single-Keyframe.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd3640fad28c46a386d091dfb0676df617ff7ef0bb89ee6e93773cd9b1f040c0 -size 27199 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Expand-Contract.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Expand-Contract.png deleted file mode 100644 index 72c7705b..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Expand-Contract.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae50d8d8bb0f499cca2795a1fa669be8cfb2e545328c83b0c922b0b12fc1eda6 -size 12805 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Keyframe.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Keyframe.png deleted file mode 100644 index 37cfe83c..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Keyframe.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a81a959d21f63a44e0c0fd56b66040050a12f40d26fce918288cded3c2fdbcf4 -size 17688 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Options-Menu.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Options-Menu.png deleted file mode 100644 index 9880bd2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Options-Menu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30487cb779f371528d17a1479f8ab6693d655dd92ca62c7ed46b979f4525525d -size 17527 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Scrubber-Bar.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Scrubber-Bar.png deleted file mode 100644 index 215b9233..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Scrubber-Bar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff308d88427124da0b2f7d3dbbd93dd19bab151a36b316952f499b7be9b9ad81 -size 12399 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Time-Units.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Time-Units.png deleted file mode 100644 index 70441fad..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Timeline-Time-Units.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17bb7439255b817535d48e37fc77c2d5ca3a3f5f68451813a0ef85c36da1b877 -size 12313 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-Keyframe-Added.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-Keyframe-Added.png deleted file mode 100644 index 947477d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-Keyframe-Added.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80aeed8c8dc75aabd690e744a3f3221dd1f41fba9a30606e3ee112ad2e437e8b -size 23182 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Add-Tracks.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Add-Tracks.png deleted file mode 100644 index fc13e8b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Add-Tracks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc79293dd0ca6535532c2a8430c347110e969b71e8734f7f92d60331a02cc348 -size 67803 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-IK-Button.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-IK-Button.png deleted file mode 100644 index 934bbde9..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-IK-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:481877bf8e0ee500a2b5e8c9f5270ee6ff152530e18c2e42f5ff0184686dfac0 -size 12570 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Rig-Name.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Rig-Name.png deleted file mode 100644 index ebfd5656..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Rig-Name.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0a74a4d77c4327c320aca8557ad5bbac18304e66aba9c3651dbbc86dc10287a -size 12558 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Track-Name.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Track-Name.png deleted file mode 100644 index cf0e1df6..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Track-Name.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb5e52ed42a38daf75c6b0cdd147e0a54acc1eeddac05f3e59c50dd11a3aeabc -size 12134 diff --git a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Track-Options.png b/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Track-Options.png deleted file mode 100644 index b6d90a2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/animation-editor/Track-List-Track-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b05dd0f83cf30db7aa3fcdc4ec125b0cda213719db009464d32bedc2c1e93015 -size 68436 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Convert-Euler-Angles.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Convert-Euler-Angles.png deleted file mode 100644 index 59d127bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Convert-Euler-Angles.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3af29d7cca38ffbce135c7f318fd2e2e023a966f948b4e84c45cf2d5205afea0 -size 34141 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Convert-Quaternion-Angles.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Convert-Quaternion-Angles.png deleted file mode 100644 index 470695c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Convert-Quaternion-Angles.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b0d62e3eb8494b36349a7c944d3613b44803cde68a11cb643a4f2f6755f1c5d -size 33498 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Curve-Editor-Example.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Curve-Editor-Example.png deleted file mode 100644 index 8418ac4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Curve-Editor-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:687f5a39ee4ce65319ed81eef6d159d1be5732ee6bf8d923506c0d5a3e355707 -size 15351 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Dope-Sheet-Editor.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Dope-Sheet-Editor.png deleted file mode 100644 index 59c7d280..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Dope-Sheet-Editor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8c3ae881a73375bbc6a0be1c3b1ffdeefb04f768448ff73eb0c6dbf8efc4d60 -size 16374 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Euler-Angle-Curve-Tangents.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Euler-Angle-Curve-Tangents.png deleted file mode 100644 index ebfc37e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Euler-Angle-Curve-Tangents.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:463175e80c894512149cc8930a33aca09147c5eb5a7f3fcfe6a2e6cde2874230 -size 11471 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Euler-Angle-Curve.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Euler-Angle-Curve.png deleted file mode 100644 index cdf64b2e..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Euler-Angle-Curve.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:264b17c66d137964b37f7581e146ebe72305216549817deee7ca5d9d5fc92ec2 -size 22385 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Gear-Icon.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Gear-Icon.png deleted file mode 100644 index 8fa49222..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Gear-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ee31eb8029e363e60ffab004169931b55eae068edd6babfbc2a5c39788eedc7 -size 64278 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Interpolation-Mode.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Interpolation-Mode.png deleted file mode 100644 index 6013f9bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Interpolation-Mode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:baf55e2c89dacef565982546c787852b23297daefa9d4880b95b413e9c8fdb3a -size 103726 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Opening-Curve-Editor.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Opening-Curve-Editor.png deleted file mode 100644 index 2b0e9cef..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Opening-Curve-Editor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7611c5deb0a3587501b88fc2e2149a3c6126299c488f416d890ee484b04519bd -size 23419 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Quaternion-Curve-Interpolation.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Quaternion-Curve-Interpolation.png deleted file mode 100644 index 6e9739bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Quaternion-Curve-Interpolation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bd06d1f92ff2be8b1c608d5e857d3dc0f656ce96e99ecee9bc2e3effdb4f7cc -size 19076 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Quaternion-Curve-Tangents.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Quaternion-Curve-Tangents.png deleted file mode 100644 index 2a585bf7..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Quaternion-Curve-Tangents.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30926fa2136200c97db1c5f552fa722b17d99820742f2dbb6e5fa00674adefa8 -size 10345 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Tangent.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Tangent.png deleted file mode 100644 index 124cea72..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/Tangent.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e9150dbc61a45091230d13e27a0ffba91ca174e7427730e4025d4a4bf645988 -size 2375 diff --git a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/UI-Overview.png b/.cursor/rules/roblox/en-us/assets/animation/curve-editor/UI-Overview.png deleted file mode 100644 index cfbebcdb..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/curve-editor/UI-Overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a19a67c4abdca228c6dccb20a2cc94eb3c23093db8373e6519b86903bcf27bba -size 70459 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Bake-Animation.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Bake-Animation.jpg deleted file mode 100644 index a51c7e98..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Bake-Animation.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b25966a3f4792eb5dd21eed3fd30a7ad787a46e88318d6cf7f1ee02f937da02c -size 46121 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Export-All.png b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Export-All.png deleted file mode 100644 index f307f581..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Export-All.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db04a2ed39942d550b86c5268eeb0627f6aba3114cf5d582ab275b173ae22a4c -size 54938 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/FBX-File-Format.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/FBX-File-Format.jpg deleted file mode 100644 index cc524e20..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/FBX-File-Format.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54df0a67754fb3c35c8a1afd51f0c440fe8fbb62b38a96caf759d1e9e12aa8a2 -size 49672 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Importing-From-FBX-Animation.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Importing-From-FBX-Animation.jpg deleted file mode 100644 index bb9b1552..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Importing-From-FBX-Animation.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6da2de800de693aa598dd6df521a68cdfb700bce8ca1b209f0434304d4c1e08d -size 47323 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Loaded-and-AutoLoad-Radio-Buttons.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Loaded-and-AutoLoad-Radio-Buttons.jpg deleted file mode 100644 index ee193115..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Loaded-and-AutoLoad-Radio-Buttons.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acc8f67dcd3df5e2cc4fb58223657b9e7c6c65846e1d34fb7df93960ce4d5abf -size 63387 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Moving-Rig.mp4 b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Moving-Rig.mp4 deleted file mode 100644 index cd9a0bd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Moving-Rig.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f34e9f502117f436ddb3b610527b3dcfb13ff2a4282b3564a0d1f4b8ca3750ed -size 123217 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Mute-Selected.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Mute-Selected.jpg deleted file mode 100644 index 5ba007f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Mute-Selected.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a319b3625997dc6c7e7bcf809ded4545b1b7a2f5f40c2a883e567169d6b06c74 -size 49623 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Muted-TranslateZ.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Muted-TranslateZ.jpg deleted file mode 100644 index e05d51ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Muted-TranslateZ.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1731ca32511f0d7e0e7d58f8996d36bffa8ba3e14b4e123e291eb821f68b8ffb -size 25018 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Opening-GraphEditor-and-TimeSlider.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Opening-GraphEditor-and-TimeSlider.jpg deleted file mode 100644 index 2839aed8..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Opening-GraphEditor-and-TimeSlider.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d476c282d7533a9a13b559e74c9de91929cfb28ee4a8f8fe6b29c9c481724b4 -size 143141 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Overview-Mannequin.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Overview-Mannequin.jpg deleted file mode 100644 index adb1de48..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Overview-Mannequin.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e39c2893568fa50700c6b8e15e9b314fb6ec47bac92fcdec3787ddec7e0e4b17 -size 50609 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Plugin-Manager.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Plugin-Manager.jpg deleted file mode 100644 index a38a29e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Plugin-Manager.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db7b32a3a8380f9608269c04c73bdd1b0b3ce13ccd5c63aab564112b7a1e00a5 -size 149133 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/R15-Mannequin-Rig.ma b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/R15-Mannequin-Rig.ma deleted file mode 100644 index 50f51965..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/R15-Mannequin-Rig.ma +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4549d371d54604f685c7223f72ca6d1322ac8ed327881735becd3912fa2c1b96 -size 2581483 diff --git a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Time-Marker.jpg b/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Time-Marker.jpg deleted file mode 100644 index d0bc3768..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/exporting-avatar-animations-from-maya/Time-Marker.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a428aef50cd5a42a6c42910923230f735779194baaac298e44b6cd50150d2d7d -size 52688 diff --git a/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Countdown-Button.jpg b/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Countdown-Button.jpg deleted file mode 100644 index 56c00670..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Countdown-Button.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8519e15d807c387e07748e781b9039ba9f0e9888681e2908e513cbe473f43bb -size 3599 diff --git a/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Face-Recorder-Button.jpg b/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Face-Recorder-Button.jpg deleted file mode 100644 index 3a8fe003..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Face-Recorder-Button.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:689e5263564daab447eb482e203dc674951f317e7340b43b2945479d9d8a77d6 -size 17550 diff --git a/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Face-Recorder.mp4 b/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Face-Recorder.mp4 deleted file mode 100644 index 1e6c3431..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Face-Recorder.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3797cc3197c7381349a40e2c158dace8e7d8781bf784f1193b91fd11c0049b63 -size 5851736 diff --git a/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Ready-Button.jpg b/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Ready-Button.jpg deleted file mode 100644 index f0b6b4ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/face-recorder/Ready-Button.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a27caec678920683b5ed71b8c96263f74998c2e7e8ed54dc0c3d31c3d9823d5c -size 3540 diff --git a/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Birdcaller-Imported.jpeg b/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Birdcaller-Imported.jpeg deleted file mode 100644 index a5a0974b..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Birdcaller-Imported.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed70fd430ee4b5a31b197a102d4ec4e2c5de146786150a8e04b9a8e35aca97b0 -size 82853 diff --git a/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Custom-Puffer-Blender.png b/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Custom-Puffer-Blender.png deleted file mode 100644 index 808d4d90..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Custom-Puffer-Blender.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:249d25774bd8a692e662d2de41062f588d23a9694749c4c812ff736356b53b37 -size 127012 diff --git a/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Hierarchy-Birdcaller-Blender-Bones.png b/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Hierarchy-Birdcaller-Blender-Bones.png deleted file mode 100644 index 4c5fd77b..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Hierarchy-Birdcaller-Blender-Bones.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d0d56294bf6ba7ca3759009074668a4de568f1664515474866b88ff8d3dd386 -size 56175 diff --git a/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Hierarchy-Custom-Blender-Bones.png b/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Hierarchy-Custom-Blender-Bones.png deleted file mode 100644 index 7b080d31..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/importing-custom-3d-rigs/Rig-Hierarchy-Custom-Blender-Bones.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1e7e186e3324747dcecf8d42c423effb46969459993e8056e4d747fba2f6972 -size 59427 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Add-Attachment.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Add-Attachment.png deleted file mode 100644 index 3a394bd6..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Add-Attachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebd697464b1fe194a64bf1e28ce3ec06ed860252029c9070987370b098e1a2b5 -size 26885 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Body-Part.mp4 b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Body-Part.mp4 deleted file mode 100644 index da65d991..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Body-Part.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22f75f9674db338fd1d3ad79aa79199fe13f17a2bae7eeaf03f1775d47bae7df -size 1352682 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Drag-Accessory.mp4 b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Drag-Accessory.mp4 deleted file mode 100644 index 44d2b492..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Drag-Accessory.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29ed674a30ef424ddd67d045b518ea7db2af61d628fc149b021af2bab9585217 -size 448963 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Drag-Hand.mp4 b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Drag-Hand.mp4 deleted file mode 100644 index 0f10b028..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Drag-Hand.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60e2e378d4866902b1cdfee83be875e75eb819bc672484654bc7ca7b76d228f4 -size 370270 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Explorer-Humanoid.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Explorer-Humanoid.png deleted file mode 100644 index 39906a9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Explorer-Humanoid.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a369b5fe38413d395168bcae16423383f3b5cb27ec160df41808600720106d7 -size 34012 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Humanoid-Add.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Humanoid-Add.png deleted file mode 100644 index fe94cacd..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Humanoid-Add.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f888daea0e5427f79f6820707aa392f29a09f02bc3773023c7f3dacfe91f4f8 -size 18103 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-IKControl-Property.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-IKControl-Property.png deleted file mode 100644 index 43c3d600..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-IKControl-Property.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ead2a84894db0f31cd4290dd960f625aefebc204bac39dc5b3e957963c646e53 -size 27261 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Move-Attachment.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Move-Attachment.png deleted file mode 100644 index bcb9c9b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Move-Attachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23a45c803d560b47eb6895767e1589c62150f5ef109e013e292a7efbf28f0858 -size 439534 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Place-Hand.mp4 b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Place-Hand.mp4 deleted file mode 100644 index 3029b97a..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Place-Hand.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87adc67c1f231cce156d8be6836642ef9b22aaf6bbe90b0694e3adb93e8a9caf -size 277882 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Uneven-Surfaces.mp4 b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Uneven-Surfaces.mp4 deleted file mode 100644 index 0ba412ec..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/IK-Uneven-Surfaces.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf3443b47e0762beacb8fc2fa2a091aafc0e73b5dfe1095154ebbc11d6dedc0b -size 544176 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/ball-socket-constraint.mp4 b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/ball-socket-constraint.mp4 deleted file mode 100644 index 9e441865..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/ball-socket-constraint.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80fbc20fa4567863ae91eba84590e2697e06766a45e318eab82e27e4194f84c7 -size 12074867 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-natural-pose.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-natural-pose.png deleted file mode 100644 index 51e71641..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-natural-pose.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f7151449c4196768f6b8d52372c60490d99442d638d14e8d97ae56ddb902998 -size 575724 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-primary-axis.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-primary-axis.png deleted file mode 100644 index bf71ad19..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-primary-axis.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8d896c6b6011cc7b6fcba33af37fd953913edb506741b48129cfb80352e476b -size 547162 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-unnatural-pose.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-unnatural-pose.png deleted file mode 100644 index e4f932d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/elbow-unnatural-pose.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24eb60c080a72089c420f8da8d05f05cdbbf97847ae11e8feb32227248173ca2 -size 596404 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/hinge-constraint.mp4 b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/hinge-constraint.mp4 deleted file mode 100644 index ec76067f..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/hinge-constraint.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:760dc3e226f7e71d833779ca93488d0046dcb6d6c7efbc9674e3624a2c5ddf2d -size 21489696 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-cone.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-cone.png deleted file mode 100644 index fe830cd7..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-cone.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6d5bd01be3cf6a2521280082688613b0d83e5fa8c2bb7e9fa2af28c4b5d7793 -size 353021 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-primary-axis.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-primary-axis.png deleted file mode 100644 index c754ef4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-primary-axis.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9f94058c765ac248fa9e4551b8ff61245d55c3093ab06ba5637f64a38bf766f -size 375167 diff --git a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-unnatural-pose.png b/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-unnatural-pose.png deleted file mode 100644 index 2849d997..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/inverse-kinematics/wrist-unnatural-pose.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b952b31051f0b1d910d8998de3412f2e32751057d38d85b015398972959fc41 -size 536472 diff --git a/.cursor/rules/roblox/en-us/assets/animation/live-animation-creator/Live-Animation-Creator.mp4 b/.cursor/rules/roblox/en-us/assets/animation/live-animation-creator/Live-Animation-Creator.mp4 deleted file mode 100644 index 6f022fad..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/live-animation-creator/Live-Animation-Creator.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9ae963e81f3f90817ea1bc5b6315160ae94a5cf5609670aca7b0d8c3c805ec4 -size 14940872 diff --git a/.cursor/rules/roblox/en-us/assets/animation/live-animation-creator/Media-Playback-Controls.jpg b/.cursor/rules/roblox/en-us/assets/animation/live-animation-creator/Media-Playback-Controls.jpg deleted file mode 100644 index 79a03a37..00000000 --- a/.cursor/rules/roblox/en-us/assets/animation/live-animation-creator/Media-Playback-Controls.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:550288fc61a9b807ab6ee440655c7525fb12bde972c3b22f54e8e0b483c3bf73 -size 9579 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/After-Unwrap.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/After-Unwrap.png deleted file mode 100644 index 14272371..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/After-Unwrap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6a11c44af588865669a8e4da6623971698335f18ed272d21c4a1148d2fe9715 -size 648714 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Before-Unwrap.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Before-Unwrap.png deleted file mode 100644 index e8b8b062..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Before-Unwrap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa0c6906c47d0eb064ebb6d48f20eb71e78bc7a2361aa39da5b1ca748e1109fe -size 829835 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/BlenderFileView-Export.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/BlenderFileView-Export.png deleted file mode 100644 index 9c3759b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/BlenderFileView-Export.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ba7ffccd2acbdd79682ed30fa1b01247017062a07ad18483d9b651c1f66c376 -size 71373 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/BlenderFileView-Import.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/BlenderFileView-Import.png deleted file mode 100644 index 0a827309..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/BlenderFileView-Import.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8419572a6a7d071a1b46e34c3ba3d67c0c61e1fd15d831823739029293a7938e -size 167667 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/ColorAttribute.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/ColorAttribute.png deleted file mode 100644 index caa4c87a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/ColorAttribute.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:394f7e18a602107257bb6b6d3d0507876e28ff970243590abeb02ff64ce29efb -size 93504 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/CubeMap.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/CubeMap.png deleted file mode 100644 index 4252476d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/CubeMap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0e412aa285d166f80eb8cf60a9ddf82677d09eef9c46f32f263389ec4b881ac -size 520336 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/CubeProjection.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/CubeProjection.png deleted file mode 100644 index 3e5dedc8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/CubeProjection.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be60c3cf445b8bb48e3b38fd189fa7fde6b26642d031452420626c756755f88c -size 775841 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Edge.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Edge.png deleted file mode 100644 index 2dc7badc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Edge.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7a120aa348968e032a349f7f5c7bb76103d87911483af73dfe48d8e38670d26 -size 100924 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/ExampleTexture.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/ExampleTexture.png deleted file mode 100644 index f02074b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/ExampleTexture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d02823f445199eb7979d564102bbbe12fe5a7151e50daaf61c26402e743967a2 -size 13892 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Face.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Face.png deleted file mode 100644 index eebc5da4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Face.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aed89f4487dd32d500be1c387f77697533f4bbc9ea1536f91830f4b741ef08e1 -size 115645 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/FollowActiveQuads.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/FollowActiveQuads.mp4 deleted file mode 100644 index 6acb4306..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/FollowActiveQuads.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:852ddeef0ca5460150f4ff71b90db06f1805c26392655bd5f97c57f8aa4b416e -size 646590 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Layout_Workspace.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Layout_Workspace.png deleted file mode 100644 index c4b6034f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Layout_Workspace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:075f8a56f91f2595e6ce9c48f262306de06824c159a381768e4232c99678f8ec -size 35168 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/MM-Tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/MM-Tool.mp4 deleted file mode 100644 index a67aa225..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/MM-Tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b74e630a25f1a36edbe185bf21156badc51133363fa901544343987a1319e7c4 -size 250068 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/MS-Seams-Gun.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/MS-Seams-Gun.png deleted file mode 100644 index 8e37fad2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/MS-Seams-Gun.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e168218523eff6e64c9f55808fec0c6855ffb63f628b9a0b7b77d4ac672ea1d9 -size 267713 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/MS-UVMap-Gun.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/MS-UVMap-Gun.png deleted file mode 100644 index ca96cdbe..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/MS-UVMap-Gun.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29c19edc33f949a5785d1da7a62ba5c35f9451cac341dbeb77590566bc4ab0ea -size 484121 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Modeling_Workspace.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Modeling_Workspace.png deleted file mode 100644 index 54836c77..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Modeling_Workspace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55225e3ba88bebe856e57bd3f096f6fca32b63ac49ab1c98bbb97609accea8c8 -size 34918 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/NavigationGizmo.jpg b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/NavigationGizmo.jpg deleted file mode 100644 index a3b771b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/NavigationGizmo.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5be225b11ad5aa9ff5c215af66d77b2417d18213c6b43e9880739631b237d2c8 -size 6228 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/NoTexture.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/NoTexture.png deleted file mode 100644 index 73b4b184..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/NoTexture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e3fccba4903cb83dfefd6765d62ef95cd847036427c4120b13afbde0b3d1702 -size 774230 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Sculpting_Workspace.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Sculpting_Workspace.png deleted file mode 100644 index ed05dd0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Sculpting_Workspace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:820287dcc3325259b3c777ea56cd19f209a82a5c57277c4679173cad94218ee0 -size 35177 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/SmartUVProject.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/SmartUVProject.png deleted file mode 100644 index dde6d9ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/SmartUVProject.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fc6a593e22c8baf3014e559047811fd0cd8272c676c429a009238bcf98ace5e -size 659368 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Snapping.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Snapping.png deleted file mode 100644 index e52b1e73..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Snapping.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85806de8cc8a8f6cbfc10d4aec8e7bef7e2014e47b4147eae70a057b347f14e9 -size 35704 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Studio-Import.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Studio-Import.png deleted file mode 100644 index 4dc64b97..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Studio-Import.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e6c1298de48062529fc7819d7d1ed230d7cf74d19d3f0a2a57f3796144b09fc -size 324219 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Subdivide-Panel.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Subdivide-Panel.png deleted file mode 100644 index 95f8a0b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Subdivide-Panel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b601912adb31ad71a2ebad7039ebab8e95c71b44eba7cd5a0d5a9f5283e36a36 -size 94705 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/TexturePaint_Workspace.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/TexturePaint_Workspace.png deleted file mode 100644 index 9440901f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/TexturePaint_Workspace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3af4aa04d4a907d5043e98f2049a7bf368e08addf506b28c18d576a99b851721 -size 34984 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/UV-Cube.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/UV-Cube.png deleted file mode 100644 index e59210f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/UV-Cube.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab4f494c4dccaeee62b0e2e9865e241a55a9ed58858dfc5a6033b7c4ccf0661c -size 556139 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/UVEditing_Workspace.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/UVEditing_Workspace.png deleted file mode 100644 index 8abde789..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/UVEditing_Workspace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5ac80ee6038f408f7edb1a0875036a25044b430e7db9bf036a9b43c1d20a144 -size 34014 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-NoColor.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-NoColor.png deleted file mode 100644 index 16fd1bbb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-NoColor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82ec26d7b3903ffd7e4866b30987b6d866eb1c0ea501f678452a369103f72f1c -size 1044798 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-WithColor.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-WithColor.png deleted file mode 100644 index 415f49b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-WithColor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62ff9d43e48c2cd7fdbd34b8cf0b13cc52003d3d83f8bc5397f63e0346cf93e5 -size 1021718 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-WithTexture.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-WithTexture.png deleted file mode 100644 index 87cc0139..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/VP-WithTexture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e763c4a2e14e37e27817751895ec5afbd41868b69dbc8bae645c2c686d26ee08 -size 1075453 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Vertex.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Vertex.png deleted file mode 100644 index e7ab7faf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/Vertex.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b404aafbc55e503d25cc82493f2288ae4a18f03f2066d0c23a0dc6f61445248 -size 111019 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/ViewSelector.jpg b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/ViewSelector.jpg deleted file mode 100644 index c1fa0a75..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/ViewSelector.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0e672251947bb71a48813556590085b86c03bc28ebc803daf3dca8576203d84 -size 2881 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/WithTexture.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/WithTexture.png deleted file mode 100644 index 8afa18a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/WithTexture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08c325211c4384d6dab78ac7493e82de3271c268317f45ec3f40012e3d2e5099 -size 842907 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/bel-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/bel-tool.mp4 deleted file mode 100644 index 387b4e0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/bel-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5e089614dd1703ab5fd3ac95473b0430389b5587a73ada98e4f2305c8470192 -size 415393 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/delete-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/delete-tool.mp4 deleted file mode 100644 index a1ec6dc0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/delete-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bb0d9212223045271f2bba01befc1b5e471a89c0b52274b41474427f9974a17 -size 296980 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/dissolve-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/dissolve-tool.mp4 deleted file mode 100644 index fe219e4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/dissolve-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe47e0928b6e7bfb273bce3eeab06d7de5f31a2378c8beb676f357c763af0066 -size 45469 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/extrude-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/extrude-tool.mp4 deleted file mode 100644 index 3a91e9fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/extrude-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1640feab634562875f973ac1cdc2f5af176b3c7fc44c13239e21c106da66bf9d -size 484956 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/fill-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/fill-tool.mp4 deleted file mode 100644 index dfef57a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/fill-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cae9f615fd79f6eee5c7cd2692e98ecc23d5050fc0348e18da5470d6c1d4d0c1 -size 46386 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/grab-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/grab-tool.mp4 deleted file mode 100644 index af83c8c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/grab-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c49aa1438c11a007878da7af3fd70c32af977ff24fa4c4c76df6f2867f936bb -size 403905 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/inset-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/inset-tool.mp4 deleted file mode 100644 index 47d0dd65..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/inset-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0abf633d59ed9065c24b2a56c33defecfd29ad306ad4a139bc095a4d898c0894 -size 65659 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/nffe-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/nffe-tool.mp4 deleted file mode 100644 index 2ce22a6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/nffe-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:183fc6bac524e3d94e5bb47a2f986a7325878dcea25ed793c1fd25b53a9a2408 -size 47801 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/snap-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/snap-tool.mp4 deleted file mode 100644 index 8d8507c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/snap-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55fd1c69e329677ce853ce90f77e01826880f15637d23d4ea589c85f465963dc -size 171663 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/subdivide-tool.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/subdivide-tool.mp4 deleted file mode 100644 index 44c9c3bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/blender/subdivide-tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20c477874009cd8d1c99f0ce03798ebb43d8f2159d8ed05b23ae45d67366469f -size 112831 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/ArrangeArea.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/ArrangeArea.png deleted file mode 100644 index eadf1af6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/ArrangeArea.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c2f8e1217337efd4291cda2fd5af6b169ea9bb88acd51c1fdf027779e53b9cb -size 119599 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-CompressionBar.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-CompressionBar.png deleted file mode 100644 index f6b378a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-CompressionBar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c467227b8010a3739dfd90540fb412a5daa221b1377f650a8037bee4a9b7ac8 -size 79956 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-ReaComp.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-ReaComp.png deleted file mode 100644 index 7f511eaf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-ReaComp.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18c70eabc8590ac651f44cda1c06f6a8c272c2998ca7066614dbb559c2855f45 -size 144821 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-Threshold.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-Threshold.png deleted file mode 100644 index 0ce74e00..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compress-Threshold.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:151c10ec406cf7d5a3dc6dd140317c977309be2df394d8908c1efe6533d831f5 -size 78554 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compression.mp3 b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compression.mp3 deleted file mode 100644 index 5fd56df6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Compression.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49c564a7624ea03b89ca9a64bb24432274e8c7aa51ba8370b51a74730b2c99c0 -size 38400 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/EQ.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/EQ.ogg deleted file mode 100644 index 6f363bd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/EQ.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c223d1bf8e863309f6577993402f44d966e00d0a01e7217f578b652a55703017 -size 444754 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Equalize-ReaEQ.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Equalize-ReaEQ.png deleted file mode 100644 index db0ed796..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Equalize-ReaEQ.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e9c427006d64de4a63356940db4a9abc0c83920b5feb568f76aeeddfd17f637 -size 136748 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Equalize-Type.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Equalize-Type.png deleted file mode 100644 index 881135e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Equalize-Type.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8df51f9fa7ae2d598c69cbcbe32acaa9d859a2de431d10cf5117066d1b98ca64 -size 70122 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/FXPlugins.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/FXPlugins.png deleted file mode 100644 index e52cb07b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/FXPlugins.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:618d9adbe115672b7a70102626e57237da234c91aa7a2cd3ac4d94e3e5215c2e -size 196794 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-Crop.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-Crop.mp4 deleted file mode 100644 index 3d792b8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-Crop.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f535d7e317fb03ab3833bd827e744bc685dd711cd1615fa7eedf2786932400c -size 1176107 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-CurveType.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-CurveType.mp4 deleted file mode 100644 index af79ddce..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-CurveType.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be6a0838f369425558dce197e6505190d9a65ded77d3bc7fa4760bb115e284c6 -size 370769 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-Transition.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-Transition.mp4 deleted file mode 100644 index 8fc22e7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Fades-Transition.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fff0c5e4fa1d78a00b7195295a12f5e1c94c391ea2d652a513d77a7fae6a62f4 -size 851405 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/FileRender.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/FileRender.png deleted file mode 100644 index 605f046c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/FileRender.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e49009af41081824e1909a156533f613b9b97668ef52cc6aa5fcb14fad6595d -size 111481 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-LoopPoint.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-LoopPoint.png deleted file mode 100644 index 90629f56..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-LoopPoint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:502c03ab2b73c0b952e96b81209a1e0d8841f601cd7532d38582cfe4014ea09c -size 151723 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-MoveClips.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-MoveClips.mp4 deleted file mode 100644 index 76e60781..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-MoveClips.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:504c74306fb1e5d6199b4636f12c5d9e567b7cba77fed4947fd0f14898ca6df9 -size 2589396 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-Play.mp4 b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-Play.mp4 deleted file mode 100644 index 89fe9602..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-Play.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eaaabcf6427816ec32b50323c2e509765a324f09f0176d00534d666ea01d76fc -size 2240252 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-Split.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-Split.png deleted file mode 100644 index ae329207..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loop-Split.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e524615050f428137796d1c681a8f3f1c6c8d4042cc4850f00ac720bcbaf212 -size 155940 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loops.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loops.ogg deleted file mode 100644 index 260442d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Loops.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa00e3d257a4f398deb705dfd0b7c0164ab709fb8a7271492f52156feedb3c0c -size 905974 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/MixerControlPanel.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/MixerControlPanel.png deleted file mode 100644 index 23a67f98..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/MixerControlPanel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0b598836f3b4aaac41ecb2f100a233e47500f1c6a7d4b13a0bf66611cac5b61 -size 120095 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoCompression.mp3 b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoCompression.mp3 deleted file mode 100644 index de45db48..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoCompression.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f8cc53bcb0042ed8bd84c597541e9b2226ee6b65a17a1f5ed8633f46bb88326 -size 38400 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoEQ.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoEQ.ogg deleted file mode 100644 index 28be7848..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoEQ.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c45297e4d9a3396f52486ca56d26c14811d5943033598df32e2a40a00fc3dce -size 592248 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoLoops.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoLoops.ogg deleted file mode 100644 index ed3e06da..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoLoops.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43421454a35d96e8002cec28d6eda9440cf0aa700e84e3eb40ddbef8f27fc71b -size 1104462 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoNoiseReduction.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoNoiseReduction.ogg deleted file mode 100644 index f1fd194d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoNoiseReduction.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ed528cd6c6030ece0b0e5083000f104f33cad6a8c18c277e6d83ad4f1523a19 -size 78122 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoTransitions.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoTransitions.ogg deleted file mode 100644 index 79848628..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoTransitions.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd1281fe3011e3595db383f9427f4a9a0e7323078aec9f081c38a408f336432e -size 172266 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoVariations.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoVariations.ogg deleted file mode 100644 index 65234c32..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoVariations.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9a0412d6d115b83794f9ba97a41ac8d37e63eff872752d24b4499f61fe99883 -size 35508 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Noise-ReaFir.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Noise-ReaFir.png deleted file mode 100644 index bd2786f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Noise-ReaFir.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8eb03d6ee5cebf190d373cba78e98f137e833083a79c0bcdd71cdcb6f9e22618 -size 153290 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Noise-Subtract.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Noise-Subtract.png deleted file mode 100644 index 755b60ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Noise-Subtract.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec0fb32079e28dfc6576a65009409fcb1f41306675364baf132d211ecc47bbca -size 75066 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoiseReduction.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoiseReduction.ogg deleted file mode 100644 index 25e8b95d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/NoiseReduction.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edf15ca93e18834ed75e855549308a800eb9416aaed8630a72d91a8f70c91f40 -size 28571 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/RenderToFileSettings.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/RenderToFileSettings.png deleted file mode 100644 index 4ea23eb0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/RenderToFileSettings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:154fe7e8ede75db31ad917093a21dda93a74de163b595cc90048fc83091a15f0 -size 330123 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Timeline.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Timeline.png deleted file mode 100644 index 8a700200..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Timeline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:991c49cdc9a85b6bd390e4eea5eeb28c9a13ec05c95c6f8912c3690cce034d4d -size 118050 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Toolbar.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Toolbar.png deleted file mode 100644 index a43f9691..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Toolbar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60e94d47eabb6f3c742a8daaa935b8070f315f3246c4da8b652f987c0d9f6788 -size 118536 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/TrackControlPanel.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/TrackControlPanel.png deleted file mode 100644 index 1092146b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/TrackControlPanel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18c6b005774b8bd95400d9c1ed485bb269dbeb94119554adedf511c8cd23cb8d -size 117466 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Transitions.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Transitions.ogg deleted file mode 100644 index 983f78ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Transitions.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c41241592de7b6474f7ccd1483495284fc808cd429f334d3f619bc63b484a90d -size 167517 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/TransportBar.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/TransportBar.png deleted file mode 100644 index e43d90af..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/TransportBar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70013c015ecc0110fd5276f0fedcb762e782bddceb53de7e944ee0141d5e838c -size 120971 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations-Copies.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations-Copies.png deleted file mode 100644 index f357e442..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations-Copies.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49de93ce592e2e0dd792fe94a07b02e010183dbc8338b15a1a2d1e5e89767f80 -size 25709 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations-ItemProperties.png b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations-ItemProperties.png deleted file mode 100644 index 4654ce50..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations-ItemProperties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:890d9f90395692b9b155416a35f9081e766fe94db27e2724d3951ddd8d78f884 -size 52407 diff --git a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations.ogg b/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations.ogg deleted file mode 100644 index 6c6787b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/3p-software/reaper/Variations.ogg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80377e3ab1cc149954840665129d60f0639b5de1dc6a6224018367a8a03b5a8e -size 38788 diff --git a/.cursor/rules/roblox/en-us/assets/art/Additional-Caging-Examples.png b/.cursor/rules/roblox/en-us/assets/art/Additional-Caging-Examples.png deleted file mode 100644 index 6d56e8e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Additional-Caging-Examples.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8c7e04c7e7133dc1a070b90897cf6fc78d36e8ee5e480cc0963261a00fe6e29 -size 329005 diff --git a/.cursor/rules/roblox/en-us/assets/art/Basic-Mesh-Combined-Example.png b/.cursor/rules/roblox/en-us/assets/art/Basic-Mesh-Combined-Example.png deleted file mode 100644 index 20558cb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Basic-Mesh-Combined-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f9842bc9cdb8b6b71441ee919300d15707c5a1748f1762006e3ec63a9172a9b -size 737262 diff --git a/.cursor/rules/roblox/en-us/assets/art/Basic-Mesh-Example.png b/.cursor/rules/roblox/en-us/assets/art/Basic-Mesh-Example.png deleted file mode 100644 index 4dbcb94a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Basic-Mesh-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad2fefc5aac0f27fccf5b4ab20cfe11ba2a6ef3c9ba322a2621505fa6dcb76c5 -size 390527 diff --git a/.cursor/rules/roblox/en-us/assets/art/Basic-Texture-Example.png b/.cursor/rules/roblox/en-us/assets/art/Basic-Texture-Example.png deleted file mode 100644 index a2568110..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Basic-Texture-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:427ac425f76ca5a2028e43831d9137b6e9052f95c2855ee9cc2abc9ac4fc55ef -size 499214 diff --git a/.cursor/rules/roblox/en-us/assets/art/Body-Scale-Diagram.png b/.cursor/rules/roblox/en-us/assets/art/Body-Scale-Diagram.png deleted file mode 100644 index 9f3ccb28..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Body-Scale-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d63de967780e73bf79422dd6406f0ccb7d00357dc3b129e5ea660bc4360538be -size 355485 diff --git a/.cursor/rules/roblox/en-us/assets/art/Cap-A.png b/.cursor/rules/roblox/en-us/assets/art/Cap-A.png deleted file mode 100644 index e73c66ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Cap-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8f62916db86baa59094b47e822403e089e32eaf8b1cda5b408c8d87a0dec9e7 -size 38830 diff --git a/.cursor/rules/roblox/en-us/assets/art/Cap-B.png b/.cursor/rules/roblox/en-us/assets/art/Cap-B.png deleted file mode 100644 index 84028f70..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Cap-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bfb06404580d9a3f020f628491ea729bc1c8df85e00b872c88cad88c25e0cf6 -size 30973 diff --git a/.cursor/rules/roblox/en-us/assets/art/Cap-C.png b/.cursor/rules/roblox/en-us/assets/art/Cap-C.png deleted file mode 100644 index 8a046ab6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Cap-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29181365ade412741004b2db023e20a16587977a5bdfebd48e79172eef087900 -size 41000 diff --git a/.cursor/rules/roblox/en-us/assets/art/Cap-D.png b/.cursor/rules/roblox/en-us/assets/art/Cap-D.png deleted file mode 100644 index 1e23eea9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Cap-D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca538cb29b36a3df6faa1a7d48b71f16626929ca42ec9dfce9613f5d03906048 -size 42658 diff --git a/.cursor/rules/roblox/en-us/assets/art/Generic-Icon.png b/.cursor/rules/roblox/en-us/assets/art/Generic-Icon.png deleted file mode 100644 index cb95ac6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Generic-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32ad381ebe78289c248b35ca147e7562b94afe46ec23228a858528801385c69a -size 7115 diff --git a/.cursor/rules/roblox/en-us/assets/art/Helmet-A.png b/.cursor/rules/roblox/en-us/assets/art/Helmet-A.png deleted file mode 100644 index 5203d0aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Helmet-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3483006d9aeecbb80b71ab385dd3f22eed2fb4643952eb978071f4c62a385d20 -size 643123 diff --git a/.cursor/rules/roblox/en-us/assets/art/Helmet-B.png b/.cursor/rules/roblox/en-us/assets/art/Helmet-B.png deleted file mode 100644 index b945fbdd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Helmet-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:493d9f30033203c707ec140a2112c728c871abe210d583b4b5a02a6c7f5bd26f -size 664916 diff --git a/.cursor/rules/roblox/en-us/assets/art/Helmet-C.png b/.cursor/rules/roblox/en-us/assets/art/Helmet-C.png deleted file mode 100644 index 93721e70..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Helmet-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3df0355a73b9b398934c9ae5c127e55fed9951d77c947aae279856aeb8448872 -size 660209 diff --git a/.cursor/rules/roblox/en-us/assets/art/Helmet-D.png b/.cursor/rules/roblox/en-us/assets/art/Helmet-D.png deleted file mode 100644 index 214387ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Helmet-D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e64f64c394696366c219b26e7e62bddd74f8b11b3a8887cf863a18499890382 -size 604127 diff --git a/.cursor/rules/roblox/en-us/assets/art/Helmet-E.png b/.cursor/rules/roblox/en-us/assets/art/Helmet-E.png deleted file mode 100644 index 847387b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Helmet-E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91f78601e21300d1dd0398af80756e03e0e8050debc132ebe639bf0f72301465 -size 174604 diff --git a/.cursor/rules/roblox/en-us/assets/art/RobloxBlenderPluginDemo.mp4 b/.cursor/rules/roblox/en-us/assets/art/RobloxBlenderPluginDemo.mp4 deleted file mode 100644 index 104a37ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/RobloxBlenderPluginDemo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f95838fa18d730cf303ebfcdad02be9daabc78b9a7a5f90e041212926255f23 -size 61727371 diff --git a/.cursor/rules/roblox/en-us/assets/art/Shrine-Detailed.jpg b/.cursor/rules/roblox/en-us/assets/art/Shrine-Detailed.jpg deleted file mode 100644 index 675ce3dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Shrine-Detailed.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62374eca806cec977d57b8d4f49b30af1f67f3976f7573f0da2fb6bdbf6fee99 -size 449663 diff --git a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Buttes.jpeg b/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Buttes.jpeg deleted file mode 100644 index 4b0d556d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Buttes.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30e34b22cb18b3032508c55a72db3057a141c29225cb7b14ed51b999d550ad89 -size 94473 diff --git a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Looping.png b/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Looping.png deleted file mode 100644 index 92d2a04a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Looping.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:625d4a587acc18c8a0a6fe05e15a0ea1df3d58a53032fd60ffedc4fa80ae1f3d -size 28316 diff --git a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Radial.png b/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Radial.png deleted file mode 100644 index 01d6188e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Radial.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3545757ceeeab7fa43d835a09babd0f4c1a306c078876704afbaf744a438b844 -size 46453 diff --git a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Shrine.png b/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Shrine.png deleted file mode 100644 index 8c7d3ec0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Shrine.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20a1f48c160c2f5139b041b9a810b321598c652d02b895fe88137c88b8adb138 -size 357896 diff --git a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Tinting.jpeg b/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Tinting.jpeg deleted file mode 100644 index 0c8cfd7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Thumbnail-Tinting.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f9ddfe3198acd3af72851147213e2e26eb2fb33d9d139bb8e51b572bc4d2d37 -size 111682 diff --git a/.cursor/rules/roblox/en-us/assets/art/Traffic-Cone.png b/.cursor/rules/roblox/en-us/assets/art/Traffic-Cone.png deleted file mode 100644 index 016c8b9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/Traffic-Cone.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b063092d5095967375504b0eab9e5563c0ce5e954ca536806a0571d122c3cd6b -size 19237 diff --git a/.cursor/rules/roblox/en-us/assets/art/ValidationTool_V2.zip b/.cursor/rules/roblox/en-us/assets/art/ValidationTool_V2.zip deleted file mode 100644 index f24446fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/ValidationTool_V2.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3bdf26b4903c074962dd967470952a96d7a057cad0669b2b3839c25b6addf1f -size 295094 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/AFT-Eyebrows-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/AFT-Eyebrows-Example.png deleted file mode 100644 index c94b86a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/AFT-Eyebrows-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8b6f74d9ae6821953fd7bcc4fb7130e5d83627749332dd61529f5af798fa72b -size 16765 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Anime-Girl-Eyebrows-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Anime-Girl-Eyebrows-Example.png deleted file mode 100644 index ce0c026a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Anime-Girl-Eyebrows-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cddb1ac29a7c526b1a71658e42da0d1a1dacf912123c0e2eed72a7c83333153b -size 125746 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Attachment-Data-Model-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Attachment-Data-Model-Example.png deleted file mode 100644 index ed9e1f69..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Attachment-Data-Model-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69c5e8cfafc57301b71c2cd4498896f9b503def45bdfbf04188a9832dc48a978 -size 11027 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Attachment-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Attachment-Example.png deleted file mode 100644 index 17f04429..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Attachment-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24edde36dc64dc2d50874d35139b86ce4e9615c29853a32fa733e9e1e737a565 -size 259205 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Eyebrows-Eyelashes-Only.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Eyebrows-Eyelashes-Only.png deleted file mode 100644 index b7e13f67..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Eyebrows-Eyelashes-Only.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29d4b3dbcf543a1236715ed7a06c2aa6a3265c68933630c541b5449d3df965d6 -size 717449 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Face-Accessory-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Face-Accessory-Hierarchy.png deleted file mode 100644 index 370f0be6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Face-Accessory-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56be60a55864dd53b7fb4693e698d9b61000da5bcaefc87b4bce4c0d96684714 -size 11524 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Inner-Cage-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Inner-Cage-Example.png deleted file mode 100644 index 3f4e57f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Inner-Cage-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:660fc60db12cfa514104f2b70df36fe25b4f531988f92f42651c8cc92c6128fb -size 944619 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Mesh-Bow-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Mesh-Bow-Example.png deleted file mode 100644 index 486a5a53..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Mesh-Bow-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d447465e6cc5e48e7a52585f6dfd85914ad2ff19fc65c3a41a31ffa9e1d3737e -size 103851 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Mesh-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Mesh-Example.png deleted file mode 100644 index 41a14c30..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Mesh-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f972eeec49251724a427a3796e4583ec6fa136badab2c7f68e701209b6f325e9 -size 195695 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Nature-Girl-No-Accessories.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Nature-Girl-No-Accessories.png deleted file mode 100644 index d84ddd7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Nature-Girl-No-Accessories.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc89b3c618ab5daafa842bd2fe03876d7a22826c81bedc5bb3a43bd3f5fcb70c -size 898471 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Nature-Girl-With-Face-Accessories.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Nature-Girl-With-Face-Accessories.png deleted file mode 100644 index 3d25b7d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Nature-Girl-With-Face-Accessories.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5044ca30c30e5ee123f7c870adf50c204a53036470941fa26b59f7140a63f24 -size 898992 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Outer-Cage-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Outer-Cage-Example.png deleted file mode 100644 index 8688c864..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Outer-Cage-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc01e270a034474e8b85a133968d4fc2a08ce6ce61daaf1d908fd11f37d79407 -size 978408 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Rigging-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Rigging-Example.png deleted file mode 100644 index f56493fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Rigging-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63307c5545f15023a799f2576823af59e73b21ccdcf2b406dffc2a273c6095df -size 356830 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Rigging-Pose-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Rigging-Pose-Example.png deleted file mode 100644 index 9c3634df..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Rigging-Pose-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30e0395ed7dfcd283493352ab8a8741211a0182e7c84660068105746c20be6eb -size 411752 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Texture-Applied-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Texture-Applied-Example.png deleted file mode 100644 index 8f1c1297..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Texture-Applied-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5459e652c8d40dbb57a84ca7a06daad4e0bfd888e493b8366a3e948621bab765 -size 1021145 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Texture-Example.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Texture-Example.png deleted file mode 100644 index dc34d8f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Texture-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5dc7c0989b79482921a674539164cd2cf481f81fbecea3bb2445b837f2290e19 -size 300174 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Workflow-Layered.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Workflow-Layered.png deleted file mode 100644 index 2753be49..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Workflow-Layered.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d733cdc23ec02c4fa3b51016fddd510a2f4d026758f597042b61cce610fde76d -size 51590 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/Workflow-Rigid.png b/.cursor/rules/roblox/en-us/assets/art/accessories/Workflow-Rigid.png deleted file mode 100644 index 0ac1b22e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/Workflow-Rigid.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0d72a013319bec5399db190a51d7e98cdf7091b76987169ca76cad0e4c20a22 -size 36996 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/3D-Importer.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/3D-Importer.png deleted file mode 100644 index b3fb222d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/3D-Importer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3ce468fdd15e099e93cee8aebaa98cb270e0af4aa028607b3cbac549a6fc7da -size 105734 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Add-Avatar-Panel.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Add-Avatar-Panel.png deleted file mode 100644 index 3252e799..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Add-Avatar-Panel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e320ab90ddd9bcae0e1b2bd4d4b1449d0fb83fb7b69583f4ff8dc3507bb7bf7 -size 74518 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Select-Mesh.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Select-Mesh.png deleted file mode 100644 index 728fc539..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Select-Mesh.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cefd1347bd4d23db3b3ce01ca3dba85678b8b16c14c79b912557db832c4c2f2 -size 10061 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Select-Type.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Select-Type.png deleted file mode 100644 index 1c2629bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/AFT-Select-Type.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:958f807c305dc6c588be2d69a8a68737aaeb3853854239141800ea24f3614310 -size 15894 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-New-Material.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-New-Material.mp4 deleted file mode 100644 index 6726f351..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-New-Material.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0768c1499ca136288d56c7453c29ad5a9b1518cc9d3c399f0e93e778e298e15d -size 7541118 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-PBR.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-PBR.mp4 deleted file mode 100644 index 7c896b48..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-PBR.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:145eef6b7824f70ce3c62852112805ea956100ae8e568142d3af53aee695b34b -size 19179061 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-Surface-Appearance.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-Surface-Appearance.png deleted file mode 100644 index 8aea6e2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Adding-Surface-Appearance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d72b4c259c033db417466914ba8f26bb5d53f494c1c8320aed69b9955af8c205 -size 14363 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Albedo-Node.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Albedo-Node.png deleted file mode 100644 index 9470d752..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Albedo-Node.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59b3ff1334df83ba577ba629a1dabb46ed74ce84a351b3230f30b0d3aa588987 -size 115868 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Apply-Transforms.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Apply-Transforms.png deleted file mode 100644 index 5cc2b932..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Apply-Transforms.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e6debfc5b31edf413a7f7ec0f007c632e09f59b9f1a20bfff79a05df106317e -size 54051 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Empty-Node.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Empty-Node.png deleted file mode 100644 index b55c57ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Empty-Node.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:310dd3774bb8ce400c9952e08a601e3b06cda97094d2871fa220f832740798fe -size 65980 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Mask-Preview.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Mask-Preview.png deleted file mode 100644 index 726a9ca5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Mask-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:790f7bf6971ad88e7b20145023444a46e81c402128c622424403938d615daf95 -size 203860 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-New-Material.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-New-Material.png deleted file mode 100644 index d249410f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-New-Material.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c1ebb43f87dcf7f681e8e3bdc437ebf9b13e3cb8855a7134568792caeb8d6f6 -size 9546 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Scale-1.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Scale-1.png deleted file mode 100644 index 640f07d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Blender-Scale-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8626623bda200e45edc6799f07ac12423402978025365c16efafe1b79dce92f6 -size 27292 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Blender.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Blender.png deleted file mode 100644 index fbf22fe8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Blender.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2073c6eb3da8c25be94271eec8b444e33443b53a285fe337e25bffbe542e4e58 -size 389650 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Modeling-Complete.blend b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Modeling-Complete.blend deleted file mode 100644 index c89f0849..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Modeling-Complete.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bcb2290ec1f6a20f86d2fcacdbe1ae5feb0846567f9efb9c8ab0b6077b5aa9ec -size 902024 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Studio.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Studio.png deleted file mode 100644 index 0ed61fba..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Studio.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe1dbf04ad18efcc9c2aa03140a008deb848d8f541ea45983d19a0956607f65d -size 474667 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Texturing-Complete.blend b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Texturing-Complete.blend deleted file mode 100644 index 672e61cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Texturing-Complete.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4e026a37fedb8fd1b863618b55d1f93737f9fc9d33147d9a8f3826485e43be0 -size 927388 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Texturing-Complete.fbx b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Texturing-Complete.fbx deleted file mode 100644 index 36dd4149..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Chest-Texturing-Complete.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb6f6115f42d81780e665254678086e2010fb0b26caf99d42de3784b579545d5 -size 69980 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Complete-Border.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Complete-Border.mp4 deleted file mode 100644 index 38660617..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Complete-Border.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ee8ac82bfddf54fa976fcef5bef052a5961ab4fa16155da6e7a68c9dae64881 -size 47004807 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Converting.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Converting.mp4 deleted file mode 100644 index 40e37afe..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Converting.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2374469ba7ac0d565305d1d60a72a8cc4dcaef4a4b5fc5bf3fd49af696cfee15 -size 41036628 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Copy-Marketplace-URL.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Copy-Marketplace-URL.png deleted file mode 100644 index b74d0b5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Copy-Marketplace-URL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:211155608e55fe787769c7fee6f440da9cff9bce944524216f73de41a40f5914 -size 42469 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Exporting.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Exporting.mp4 deleted file mode 100644 index ca3e3949..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Exporting.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e2ba94f714e6d0df19459ebf349e1996c1e22365af9b87e5b360d4903ac8e71 -size 8150644 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Fitting-Mask.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Fitting-Mask.mp4 deleted file mode 100644 index 3a6a821f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Fitting-Mask.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:503871e8446dee1fda402d5644d9f88a81fe49e324c3149f5e355777081ad0d2 -size 19584457 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/General-Shape.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/General-Shape.mp4 deleted file mode 100644 index e33c8d50..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/General-Shape.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a6da8404e5367e6b3b1e3f51db949be61a1ece4cf012f7158abf0ed4af663a1 -size 17368470 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Horizontal-Loop-Cuts.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Horizontal-Loop-Cuts.mp4 deleted file mode 100644 index 053c4ca5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Horizontal-Loop-Cuts.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b93e7d79132c992054b3af50d4b0ffcb46272484fc61dade243fe29978fbf73 -size 15458541 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Importing.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Importing.mp4 deleted file mode 100644 index 6f705491..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Importing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73fc1292927393686de1f0fe72b136cf0bcb164a28796b237a1bac84c47b38fb -size 19662790 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Marketplace-Listing.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Marketplace-Listing.png deleted file mode 100644 index 81c32169..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Marketplace-Listing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13ee4fca3c4f9a2be25b8cc0013755b45099a00c274cfbf3bac7614054c52a1e -size 125495 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Marking-3d-Object.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Marking-3d-Object.mp4 deleted file mode 100644 index 7a81ebf3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Marking-3d-Object.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f25820e82b5aca3d0945499e72aebc8e16e518947c8a55cdad74521f4c33d91b -size 33532059 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Metal-Node.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Metal-Node.png deleted file mode 100644 index 1729defe..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Metal-Node.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21612f76097a1ba6c059f5299b093242f5fd2a0d99089b31fb246799c4c6df96 -size 116862 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Modeling-Complete.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Modeling-Complete.png deleted file mode 100644 index a41e19eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Modeling-Complete.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c6ee27473f76ab72504a4102ed5b93a5a82034592519f433cfec190fc7b9470 -size 1554364 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Normal-Node.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Normal-Node.png deleted file mode 100644 index 087b22bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Normal-Node.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:351853f5c118a2f02a036e3531fb695f370797f48d4b95ad913fbbdc7dc565dd -size 142981 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Outliner-Save-To-Roblox.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Outliner-Save-To-Roblox.png deleted file mode 100644 index b184d97b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Outliner-Save-To-Roblox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77f265b0a73856cc3505bca6ce78af4e416a359d2092d5eefb90d6aca1e9d8e1 -size 11449 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Painting-2d-Map.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Painting-2d-Map.mp4 deleted file mode 100644 index 14ff9955..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Painting-2d-Map.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a60a745eb0f0f4eacd19545233254118999a779613aa5ee9d56ad04268d3db3 -size 28910332 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing-Moderation-Pending.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing-Moderation-Pending.png deleted file mode 100644 index e15a584a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing-Moderation-Pending.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aac57dcd6ad1fcb6af0e835c3b157aa67cb77e43d78876c3981c27e773a07711 -size 81115 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing-Ready-For-Sale.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing-Ready-For-Sale.png deleted file mode 100644 index 363e2495..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing-Ready-For-Sale.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44451f767848adb895d9ffc66ac35f914bd699aa899a80fada0543565e1e8d0c -size 90203 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing.mp4 deleted file mode 100644 index c5a5ab6c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Publishing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36ed5de3ba40fb4557b5c682d68939053653214fc44334fef4889df77ba5aaab -size 38538668 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Export.fbx b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Export.fbx deleted file mode 100644 index ef3f3783..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Export.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6840d925a66a784775e9c5dde951ec3376a1e8823db9653b2b8f085f5f6d7b67 -size 316332 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Model-Only.fbx b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Model-Only.fbx deleted file mode 100644 index c6ed0364..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Model-Only.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf2a3b94a3e38811dfe9965e8a5ab4515526195472b3b8788948d2e7e7735618 -size 45564 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Textures.zip b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Textures.zip deleted file mode 100644 index 8a551396..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Textures.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5602fc68dee42b289276e3706649ec4b25f60e7e23b197fdf876d50bae3abb31 -size 264533 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Texturing-Completed.blend b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Texturing-Completed.blend deleted file mode 100644 index 645aff45..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rigid_Mask_Texturing-Completed.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32fdf9ebe5a3f927166acc44abe5050f0c39f33384d19da932884ac2e87d0d00 -size 1258840 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rough-Node.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rough-Node.png deleted file mode 100644 index 9dd0cb7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rough-Node.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e676035b58b0c05778d7b4460d7f0b2c7ae1b2b8f5a272d345f799230029955 -size 117454 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rounded-Lid.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rounded-Lid.mp4 deleted file mode 100644 index b7f6e359..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Rounded-Lid.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:159f2c18d46f747250644bb7fd01f2cba874cb671e2a9af98ff7f399f1c73445 -size 24317361 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Scaling-FBX-Import.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Scaling-FBX-Import.mp4 deleted file mode 100644 index 418ebe61..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Scaling-FBX-Import.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f26103ea7379aa06d0aeecd6ed24be74bfdc228e34efb033783f7ef003e5e7b0 -size 6943708 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Side-Insets.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Side-Insets.mp4 deleted file mode 100644 index 1d92b7e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Side-Insets.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cc079c458a0b18b2dfb5a224279f9af69c499b4a465a38bd0f7e788aa851595 -size 21447871 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Studio-Mask-Preview-Cropped.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Studio-Mask-Preview-Cropped.png deleted file mode 100644 index e4cfe4e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Studio-Mask-Preview-Cropped.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d8c22ce992a5814d9ce9e701f660ccce6bf58d5e10de5710c316cd1c2ce39c0 -size 720770 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Studio-Mask-Preview.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Studio-Mask-Preview.png deleted file mode 100644 index 36655661..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Studio-Mask-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:220619316d239206a276e9992b227cb8ec6f8fac8012737edce2c5c3bb7ce01a -size 928355 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Surface-Appearance-Asset-Dropdown.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Surface-Appearance-Asset-Dropdown.png deleted file mode 100644 index c298d8a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Surface-Appearance-Asset-Dropdown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67f52409e4cdfa8b65e6641e04a7e3277dce69e2943e9ccb07f27fedcb8f47c7 -size 34609 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_ALB.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_ALB.png deleted file mode 100644 index e7b78907..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_ALB.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75a1a4cad283ff7d0b6888cc3a71b1caecf1ad797154bbb5ddaa3251d1c3cc40 -size 93947 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_MET.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_MET.png deleted file mode 100644 index 3928e478..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_MET.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50dc33039bbf63e2a84c6c27020f9e1687e9a6d751d37071a44ee8f5617f1749 -size 12108 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_NOR.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_NOR.png deleted file mode 100644 index 06bfce19..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_NOR.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95ca57867fd391464ae2ebabef2a224f9446772be945d43aada834b386d1b5ba -size 107292 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_RGH.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_RGH.png deleted file mode 100644 index dbeb35cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/TXT_Rigid_Mask_RGH.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7b699b9ecce47bf6f7d6c41cfa1bd4d86d25f04a67dba10116b85312446802a -size 50326 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Testing.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Testing.mp4 deleted file mode 100644 index 99ab5f98..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Testing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:274b4ccfe3bcf73d98b43e4fc79b90b60113e6577745a9a9dc506b5808d858f7 -size 33517143 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Texturing-Complete.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Texturing-Complete.png deleted file mode 100644 index 08916b45..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Texturing-Complete.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e42057000fecbb0fb6c9ad0998b7c18af90dbe0910f1ff4b0be10c09645ec4b1 -size 1568038 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/UV-Projecting.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/UV-Projecting.mp4 deleted file mode 100644 index 0f2b7144..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/UV-Projecting.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:958f52de730ce17c5de38a7164dc3d97ce2d5996cd8c37b964501f07e22914c1 -size 5309961 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Validation-Successful.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Validation-Successful.png deleted file mode 100644 index 89b35426..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Validation-Successful.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:516f54ec91a08b8e5ef70ab00a0c0fcd7b9e65daf1c3fd6ba989e653c4d56d56 -size 46098 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Vertical-Loop-Cuts.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Vertical-Loop-Cuts.mp4 deleted file mode 100644 index a2ab95e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating-rigid/Vertical-Loop-Cuts.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81210d3c80963e4525d6b32f469fda04b5aaf81298c687a80ac24a0fd1a5a8e3 -size 6828620 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Complete.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Complete.png deleted file mode 100644 index eab04aab..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Complete.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc8e20f6ff17c3ae32f38f1a8046abe10cba045f056cd7fd398e7e1f24a8a506 -size 161058 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Outer-Cage-Properties.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Outer-Cage-Properties.png deleted file mode 100644 index 89262868..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Outer-Cage-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bc0e8d55c0753d8aff009b5d235c498892c504880582e2dffce4920cfac0c05 -size 39516 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Outliner-Setup.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Outliner-Setup.png deleted file mode 100644 index ccf94e5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging-Outliner-Setup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4db346897574a56b3930b41da215dfef8484c8c4c39a050d1b8a65d92ad5e7ce -size 19805 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_01.mp4 deleted file mode 100644 index 8e0a9c45..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f8114c057dfb88d2244c16d7b50efa0d6fb8d1feef8299377dfa911514e9e2f -size 7675914 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_02.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_02.mp4 deleted file mode 100644 index a9dc75ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_02.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5486959a8bb2f64ce2b914d673cd53be8a0ae0ea4d0171c6facfb2afbc5c0ab8 -size 41379546 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_03.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_03.mp4 deleted file mode 100644 index 53e8bab2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Caging_03.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a8eb8a62d85347518882af7b51223596ea4b680307616d6319a2cb34c1b76a4 -size 74576591 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Example-Product.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Example-Product.png deleted file mode 100644 index 9cefc7de..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Example-Product.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b21059b35cba50c2a2701561f62fd453d81e1022194faaa9f49df89ba5cd7ff -size 309419 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Accessory-Explorer.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Accessory-Explorer.png deleted file mode 100644 index 73a4cf42..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Accessory-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:062defc915fce1ffd0d30883bd747d7873d7aea83c3d36ac6051ef387e475fef -size 33866 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Clothing-In-Studio.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Clothing-In-Studio.png deleted file mode 100644 index ebdfd982..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Clothing-In-Studio.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c37c914f56111e5c5f3657c6b5d2355b6b126d9395a2e403f992dc32b0045e11 -size 580789 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Clothing-in-Studio-Highlight.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Clothing-in-Studio-Highlight.png deleted file mode 100644 index aa0f6d68..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Exporting-Clothing-in-Studio-Highlight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee7c4a9a7b70289be4b5a6f510bad24a153216333337e3699995314bf9fd945f -size 809763 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Long_Sleeve_Export.fbx b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Long_Sleeve_Export.fbx deleted file mode 100644 index 1b309619..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Long_Sleeve_Export.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e3b54928a64b11375a1af5df3f32abe03797754b383551dffeee334ee1f0036 -size 395196 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Cage-Copied.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Cage-Copied.png deleted file mode 100644 index 607b4e58..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Cage-Copied.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6c1f41e63cca9dda716b87a65031c58e360d91c4c5aa35e465f09e7cf410bfa -size 14346 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Cages-Selected.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Cages-Selected.png deleted file mode 100644 index a4231604..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Cages-Selected.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e6e637830ac130df8d39353318513a663cb850585f40431aa89599520e4195d -size 133085 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Clear-Vertex-Colors.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Clear-Vertex-Colors.png deleted file mode 100644 index fa324df3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Clear-Vertex-Colors.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1168bc4fe0476e79148be87ab782da808c46c43d071ca85e94c66f0b7780da04 -size 37819 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Complete-2.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Complete-2.png deleted file mode 100644 index 8b49cad3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Complete-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b62d8251b7c46e057d44ac4fd12f351bac6e11f5354e1d6ad10db053ed8ca69 -size 243430 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Mannequin-Start.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Mannequin-Start.png deleted file mode 100644 index 95d9e2c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Mannequin-Start.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f87ad0ab8cdb725eda7cc115c3fdcbc43293d328aebdad249bd6a130238b5df1 -size 198161 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-No-Modifier.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-No-Modifier.png deleted file mode 100644 index f1115d5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-No-Modifier.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27011ac49e5f94eec3bc12d8c211bb02f48c96e73c87230b21b610444d22e65b -size 689312 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Positioning-and-Scaling.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Positioning-and-Scaling.png deleted file mode 100644 index 434227a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Positioning-and-Scaling.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2648601ee3520e139dc31cd0ffda3f6c7afa9f830b89f57c59ef3c46c184b1b4 -size 504928 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-SubDiv-Modifier.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-SubDiv-Modifier.png deleted file mode 100644 index 7392a022..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-SubDiv-Modifier.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca55ea0e20bc0b52c9b4624d10995ad9e78e296e9fe1387f93d0a368f21f2045 -size 667292 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Wireframe-View.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Wireframe-View.png deleted file mode 100644 index fd0ccfec..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling-Wireframe-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab8761f2b7c118a63fa59b342240672dcd53fe2a05380080f2feb197c0c69700 -size 246830 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_00.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_00.mp4 deleted file mode 100644 index 39415c37..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_00.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:deed55a4cfb00b9d94cfea9945725de36e9315bc1432cfbc98bc40a735f8ecac -size 16852473 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_01.mp4 deleted file mode 100644 index 4ced8665..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9092a1b951d06bff16fee97fc6b936eea62518cc3e9ccccdda90480621debae -size 3002734 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_02.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_02.mp4 deleted file mode 100644 index 17150dca..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_02.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81fe92a8dccf5c4f00ec46bcf3e56f2d084022470cc5353dc17d91b5c37b5094 -size 86085218 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_03.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_03.mp4 deleted file mode 100644 index 34d5030c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_03.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a535cb53f6702969b8b1a9296e165a631bf9f2df484381a9dd27e05847d71b4a -size 8600186 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_04.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_04.mp4 deleted file mode 100644 index 4e5bc263..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_04.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9853d1668a0ae14c93128629cde450dd4c6bbc5f9f726ccd34adc9ac76e4aaf -size 42676599 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_05.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_05.mp4 deleted file mode 100644 index 97ee6501..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_05.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2aa0ba1d47181c7b1b70294e75c3c113bfce33decd6d01527e10362376278d57 -size 37686757 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_06.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_06.mp4 deleted file mode 100644 index 6ab5efed..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_06.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34fab3ce0fefc4446cb382ee8d7ec3c444785fdaa27d5994bda28b46a946cf45 -size 37588086 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_07.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_07.mp4 deleted file mode 100644 index 7abf2833..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_07.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b604faf6910332d11ae3ecbd7ed98e62ebdb3f2058d3f27d3a154ce9f0421f4 -size 36420265 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_08.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_08.mp4 deleted file mode 100644 index 9bfa144f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Modeling_08.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4336d4708ef851e24de7e9a1d729fff9cb2b2b4f2ba73bdd2e7eac5c84f35cf -size 108067041 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Append-Browser.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Append-Browser.png deleted file mode 100644 index 5faba59f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Append-Browser.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2c2f6c0a7247136368e45856e7c746864ffb4b7f97a495707051ec1bbbde6bd -size 58496 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Armature-Appended.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Armature-Appended.png deleted file mode 100644 index 46a8ab3f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Armature-Appended.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4624d54ec4ea96cb3ee21a4a2a0a7164a4293833b7a53d40d42110a87635c19d -size 519770 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Auto-Weights.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Auto-Weights.png deleted file mode 100644 index e46bbb1f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Auto-Weights.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:674b46b59a36871dd713f9325d31f3dbfe6c3a1ce830300b1a505b4f7fb6bf17 -size 41858 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Bones-In-Front.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Bones-In-Front.png deleted file mode 100644 index dbba1eae..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Bones-In-Front.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3095b851656e0a25cbb087f116db7d44f4b55fd400239adfa97304eb2de22839 -size 26733 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Freeze-Transforms.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Freeze-Transforms.png deleted file mode 100644 index 684154f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Freeze-Transforms.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77ca1ffcee0855c181255176a62cdfd4143e59ba870a07d3bdccfdd4ec3aac54 -size 65448 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Pose-Tests.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Pose-Tests.png deleted file mode 100644 index 50474fd5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging-Pose-Tests.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14a3a4246cb2ffd264594c7d53c2e3edce40c07020e79c512095d324af8a949b -size 240659 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_01.mp4 deleted file mode 100644 index 5828fdc6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bff9196b564cfb913495cb0d2402940f0ac43b6dab88f9e761db4eda23efe98 -size 12953713 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_02.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_02.mp4 deleted file mode 100644 index fe54e5f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_02.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88364de8a21475ee0531fdf810b9293e532c10c386c7801ffe3cf3c4be8a4fb2 -size 3785662 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_03.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_03.mp4 deleted file mode 100644 index dbf60bc7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Rigging_03.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa92ce13370bfc6d76eff8bf68d4496e14994fe9516c68c4882c109a947ebe18 -size 22278201 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Add-Base.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Add-Base.png deleted file mode 100644 index 1a15be00..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Add-Base.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c3e894e848ba75397edbcf6b544bcf0186356210ba935ca30a4d2e500c15714 -size 156924 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Add-Image.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Add-Image.png deleted file mode 100644 index 6325c45c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Add-Image.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03f03b38889439479256c39e3d88842ca4f2cd2a98307f450eaebbe3bf15b3b7 -size 18563 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Complete-3.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Complete-3.png deleted file mode 100644 index 5266c75a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Complete-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd73699372797d3bcca341facb7589b81b02fadffa631067776e56d6dc7db421 -size 240749 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Complete.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Complete.png deleted file mode 100644 index 16fddcc8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Complete.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c59d39369045af5138bbbac991f1629a5c27a3b8ad9bfeee7efa304848a316a3 -size 204656 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Start.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Start.png deleted file mode 100644 index f5c9ece5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-Start.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bed64f275690dea6bc091576c339755a875014a3c39649f0fb6e74ea698c6e1 -size 165166 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-UV-Maps.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-UV-Maps.png deleted file mode 100644 index 61f968b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing-UV-Maps.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c0a4e551e81a0a66a7b4b8d167354c99801fd35fb201142cacca200e18594f6 -size 122695 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_01.mp4 deleted file mode 100644 index 00b58e1b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:568095b2fd577b7ef1e181bca04a96aadf81dac4e4256d8eac8ec1323a95d2e2 -size 35336519 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_02.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_02.mp4 deleted file mode 100644 index 79740fcb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_02.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0911f4230a3317299c2b28d9c239fcb923619b0735b55a6b23e6eaf4b169157 -size 4544377 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_03.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_03.mp4 deleted file mode 100644 index 497f4ae0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_03.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67f16a10f3fab5bacce7c5323197a06ba064a7344347e1d2489407d48ade3dfb -size 17255372 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_04.mp4 b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_04.mp4 deleted file mode 100644 index 0efd13b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Texturing_04.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:227f74be7cad2eb472409f866ebd8bd808b9f982c62f7f97deb436bef5223905 -size 22191193 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Watertight-Bottom.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Watertight-Bottom.png deleted file mode 100644 index 6b0406a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Watertight-Bottom.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:450cd8230ca5299e4f72591a4667fde3c88f7eb0e233e5d7897be2ffb15a4762 -size 516015 diff --git a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Watertight-Top.png b/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Watertight-Top.png deleted file mode 100644 index 165dbfcc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/accessories/creating/Watertight-Top.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ab2a1542291733659dbcc535c4beae8090d9ac81f78aedfeb946a44bdbc3fcd -size 484716 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antenna.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antenna.png deleted file mode 100644 index 708ff116..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antenna.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be5babc21db05ae1ce2846634539e63ce0189368218fff28c1ffaafc30497734 -size 46204 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antlers-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antlers-A.png deleted file mode 100644 index 0631a8b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antlers-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d8f9a7e73675f1f3864e31ad1d7a6a0e3fbcf98305edeb4dad5927a2a88dbba -size 49552 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antlers-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antlers-B.png deleted file mode 100644 index f1938945..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Antlers-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e1e9f9f41c7663876d74b0db22812f40ae225d89116c70ac1eb0adae75e5671 -size 60147 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Demon-Horns-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Demon-Horns-A.png deleted file mode 100644 index d63a16a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Demon-Horns-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef2bce459049ea99da7febbe641af1ca26f0e8be6d82add1c98ba55b50538cb7 -size 99340 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Demon-Horns-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Demon-Horns-B.png deleted file mode 100644 index 444a91ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Demon-Horns-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d020bfcdb37cc193ff710e261de4bd5c4fbabe1a65f4e32d7d1fb0fccfee8c07 -size 90856 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Feathers.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Feathers.png deleted file mode 100644 index 7e093262..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Feathers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95963512a34f1d21d1cd9a8ee92a48b5e3773ec6f6b4683760c78571a85f72fd -size 152329 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Glasses.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Glasses.png deleted file mode 100644 index db963547..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Glasses.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33d50627d385d87a3cc598ac21f194bdc17659154c580fa82114252257d5feeb -size 33807 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Horn-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Horn-A.png deleted file mode 100644 index 2f30ce03..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Horn-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49ed524a41a1e38c2896dc596ab07ed4975bea685a8ed83c689fcf3324aefc69 -size 87374 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Horn-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Horn-B.png deleted file mode 100644 index a3f2a96e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Horn-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f5505c54c649b1a91e4cbc11abe50171192c84fa172244e5bc180cec7936922 -size 54275 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Robot-Arms.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Robot-Arms.png deleted file mode 100644 index b925c821..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Robot-Arms.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8753590a1939109396ea0f6bbab48a820ddf62e15bed4d095780bc9cbbfdda48 -size 81976 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Skin-Example.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Skin-Example.png deleted file mode 100644 index 8e742418..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Skin-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ddedd7b06bbfabcef8ac43f6b984a6af88c3018bf8d5360bb8b51090605a576 -size 45557 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Sunglasses.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Sunglasses.png deleted file mode 100644 index 9960f0d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Sunglasses.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84d8ea7d397d293e94962f23c8111b2c72ac6efb1b407e263e4d1858bf795869 -size 36306 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tail-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tail-A.png deleted file mode 100644 index 5681f9bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tail-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f819dbc25582f5be8ea0fd5be4bdecc9429d3af3a7016cf560c0da5cb2538398 -size 92317 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tail-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tail-B.png deleted file mode 100644 index 34f2f265..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tail-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1026d600ee2b57da50781dd5b4df88d7bcd379e80714eda911a3a8d83b6c190 -size 54823 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tattoos.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tattoos.png deleted file mode 100644 index 2455c4c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Tattoos.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9334c3fbc784b6d15e837467128365050dbba26da14d7d309a3c96510fd6ecb9 -size 67229 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Whiskers.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Whiskers.png deleted file mode 100644 index 5fe1a43b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Whiskers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7963e0f5f841dffc2ba8de8cc0117d7513c7aca2f8c14ad5aeef3780bc284048 -size 18681 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Wings-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Wings-A.png deleted file mode 100644 index 4659371e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Wings-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf31bbc121c1d190cdeb154ad03ae489afab9f1ee184887bd06a623d4f47ff4a -size 41418 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Wings-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Wings-B.png deleted file mode 100644 index 27584898..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Acc-Wings-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3674860a0f0ea85c47b32823ad4ed1500ed4f2d5c2c030bf45c251c140ee095 -size 44972 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Attachments-Data-Model.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Attachments-Data-Model.png deleted file mode 100644 index 9a642af4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Attachments-Data-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1502e2a0717d4ee6dea5e034128de50ff690cb9dcde677c9612975b7a675307d -size 23250 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Attachments-Visual.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Attachments-Visual.png deleted file mode 100644 index 8a861dee..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Attachments-Visual.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a921e1b31b4987660bf8d234828de695e618b41b5e704e37aa213a5740596c1a -size 270722 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-3D-Importer.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-3D-Importer.png deleted file mode 100644 index ecf085d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-3D-Importer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c25088255a710eb7b91e378501e11953ff2ca50937970fb33eee04a416fd5069 -size 72424 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Data-Model.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Data-Model.png deleted file mode 100644 index fe78246a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Data-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1cc5651212025847f188e75db1d7704396d8c4ab9a8282d34b1ab84cb9a93f1 -size 31297 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Item-Creation.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Item-Creation.png deleted file mode 100644 index 55e92673..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Item-Creation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2f38cdcd0e873a05263bcdb6741cb8a061a4890b7bbfcdaf234072c2764c2db -size 65254 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Rig-Scale.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Rig-Scale.png deleted file mode 100644 index d2a66928..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Rig-Scale.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e06afb686265d16a54a775a7bfa51f12e5e201f0940aecb432a5b6a6269a5767 -size 16765 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Roughness-Map.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Roughness-Map.png deleted file mode 100644 index 61c056d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Roughness-Map.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0989a0c9bdfbb6f37e2953b4999d6584e2622a9e9ed81ba18d7343f8496aab9 -size 22687 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Studio-Example.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Studio-Example.png deleted file mode 100644 index 474929f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Studio-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30d0036357242145170f0c4a53165fc2834c6fcc20dbbcec04fb2c3fc29d26cd -size 505430 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Surface-Appearance.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Surface-Appearance.png deleted file mode 100644 index 80153e9d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Surface-Appearance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:136dac764b4dc7015974c1c0752c216bacd373aa90cbd720598f53d926cd603e -size 32878 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Thumbnail.png deleted file mode 100644 index 4ae3fe4b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Avatar-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9503093a873fd87234838dfc33117a6e52535b03edf42af00b82729d6925223 -size 354244 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Blender-Save-Image-Workaround.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Blender-Save-Image-Workaround.png deleted file mode 100644 index 2bc95309..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Blender-Save-Image-Workaround.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:794c957f274192d7a86de81b44078355cec2fa33c5f18a41dcbaf17f411d5d65 -size 1247607 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Blocky-All.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Blocky-All.png deleted file mode 100644 index 34826b89..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Blocky-All.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb022feeee06dcaabfd345fa0af209f8870928c0814b598509350645da0bea41 -size 464798 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Blocky-Cage.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Blocky-Cage.png deleted file mode 100644 index 8ced7d7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Blocky-Cage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8722390fd278acaf06425785e5fa05d569bcc76242569c27b74de541aa0529fa -size 375811 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Blocky-Head.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Blocky-Head.png deleted file mode 100644 index d66c44e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Blocky-Head.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87e5b874503766793ece7e6bfda827deb331a66e0bcca6a06a796758fbcc133e -size 315364 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Bodies-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Bodies-Thumbnail.png deleted file mode 100644 index adf98595..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Bodies-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc4563b6445672c462fa9ab5d3c020d65e4706880dc6f98cfdea52a4d1e2ce87 -size 80289 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Bodies-Tutorial.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Bodies-Tutorial.png deleted file mode 100644 index 95fd61a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Bodies-Tutorial.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df07211202456308e7013e7372d49f09aad47fac8942ff04925d105f390e6ccc -size 291531 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Body-Parts-Data-Model.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Body-Parts-Data-Model.png deleted file mode 100644 index 1e9c523c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Body-Parts-Data-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e8ee55c47fb567470df4f807b42979c21f40a9d7e71c701899b50f6134db073 -size 19301 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Body-Parts-Visual.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Body-Parts-Visual.png deleted file mode 100644 index a16f1ec9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Body-Parts-Visual.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17319da276562310b14582a0de72b063bbdfecc454a3e77467ea4c888fa0653b -size 170351 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Face-Offset.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Face-Offset.png deleted file mode 100644 index 796dd2a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Face-Offset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef74b51fecdd458218d8f6ec012e3bc1bdab6cd71df454ba1a62781cf0f1ec39 -size 162093 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-A.png deleted file mode 100644 index bb892b11..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aaaad91a4502703f26350bfc4a67f243ee2bb6dba74c257ea7029fe26f48ae1d -size 392411 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-B.png deleted file mode 100644 index 59a3a24d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60b17c1abe89caf8103bdff1b4b88a6f6f51d66f21a27992b08ed751fb01d10e -size 288286 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-C.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-C.png deleted file mode 100644 index ddf96e2f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmark-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:830dd6968cf3e65f8b9a7f1d49301b7df491b596f3896cec4fd625935d69df9d -size 191686 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmarks.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmarks.png deleted file mode 100644 index a7317a99..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Landmarks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a63f680331a7b20092f8f9ae7b5ce76d09e5d39b5c1e6bd6466bee5cf2b9532 -size 156644 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Mesh-Data-Model.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Mesh-Data-Model.png deleted file mode 100644 index fa2049b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Mesh-Data-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:413b70ecf916845919da3dd29cc550532b4cfb44080ecd5c473d9f8cd1b9089e -size 35354 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Mesh-Visual.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Mesh-Visual.png deleted file mode 100644 index bb91e203..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Mesh-Visual.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42ae41a2fa62c6c58d0d8fa57f7be373780e29ac23ec3f1adc63bf56bf564891 -size 803667 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Reference-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Reference-A.png deleted file mode 100644 index d5939c5b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Reference-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00a0091d934c1e53c9b836ec64ceafa08c47fb22d6091499b3ba66926955b430 -size 642539 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Reference-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Reference-B.png deleted file mode 100644 index a09c2810..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Reference-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:666a7ff0fd1c8d97ca0dfd7acbee4c814118064c9944ace14671891aba76204a -size 259622 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Template-Lineup.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Template-Lineup.png deleted file mode 100644 index 7b609c1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-Template-Lineup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4154ccc380b20b6565317ae4a9eb0995e7a2dd77a5bc73ae64704308583e03a -size 359258 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-With-Landmarks.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-With-Landmarks.png deleted file mode 100644 index 84ead376..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Cage-With-Landmarks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c34236bc359db35c9d13a686a2fbcd8d013ba20af1ce22a774b482f8fe756d1c -size 162596 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Cages.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Cages.png deleted file mode 100644 index dc897c4b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Cages.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dca002f428eff8d8fbd5f3b2b0be425d65855c44188f4d271cd1de3db1d76c1f -size 47477 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Collapsed.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Collapsed.png deleted file mode 100644 index b59d21c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Collapsed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc8fd2d134ec90da02eebe8d4da49163da13ca100af975a99604d1a7e27fd0fa -size 7619 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Joints.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Joints.png deleted file mode 100644 index 3a6aab10..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Character-Data-Model-Joints.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6f668c8c8bf77fc799327790b39353bcc1ce9a623f4ee5dc987672964574c40 -size 99248 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Classic-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Classic-Thumbnail.png deleted file mode 100644 index 0099e78e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Classic-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:292150c9739e5d774c8875a75a45126b1961a9a1abd7af2e4fa5813eed3eae5c -size 51961 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Thumbnail.png deleted file mode 100644 index a5929b70..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42c35e0a3141de538699d187e2db2dae638f1624298410eae386794ff4c80ea4 -size 118883 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Tutorial-Blender.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Tutorial-Blender.png deleted file mode 100644 index 33d1f998..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Tutorial-Blender.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:253eb7f6c8d92704e096b401584d4b8ff8e5979b45ad567cbcc7d43bb8c8de73 -size 244740 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Tutorial-Studio.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Tutorial-Studio.png deleted file mode 100644 index 509428c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Clothing-Tutorial-Studio.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea4a4b117b4b424b1d00f59cd7ac7dbe098aa9bdabac87dd27376051c1d3198d -size 346086 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Attachments.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Attachments.png deleted file mode 100644 index 3514215f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Attachments.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5152423020208928e1e4f992537b6419e1c3c1c8f2b58e0eef610bb0b8bc0548 -size 367844 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Body-Parts.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Body-Parts.png deleted file mode 100644 index 7fca9107..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Body-Parts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9bd60d30a84012e9e8ff8dbed061e118105e3327e8131a22b77b8b75d78f3061 -size 499813 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Cage-Mesh.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Cage-Mesh.png deleted file mode 100644 index 25f701ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Cage-Mesh.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e1d24b9af697f0c2e2b3ef95d7b530597c7a58c806ce3b12407de8d14c368f5 -size 1035877 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Facial-Animation-Data.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Facial-Animation-Data.png deleted file mode 100644 index d1b420b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Facial-Animation-Data.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99259b49a840a26ac862d44cff133a723cab7d08515ff5e2177a6f803c17abc2 -size 374928 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Rigging.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Rigging.png deleted file mode 100644 index 78a57264..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Rigging.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb751099bf9680b06b85ed5737cc561f45c4f69db94fa6676d2bae4be61aefb1 -size 191947 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Texture-Map.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Texture-Map.png deleted file mode 100644 index a2c1aeee..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Component-Texture-Map.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91bd5a3c44ad945a2dd7c6088864ed619eb6057de4e8a7dc30fbcbda0886d320 -size 1229494 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/DCC-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/art/avatar/DCC-Thumbnail.png deleted file mode 100644 index 3cbdb3b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/DCC-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:325f42f0f62240d55b9977298be158c06b5f132ca9fe40d1386171f650569233 -size 276546 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Delete-Vertex-Colors.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Delete-Vertex-Colors.png deleted file mode 100644 index 6bfcd9d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Delete-Vertex-Colors.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:808428d68b558ac1478fdc4c5bc58abd7e026879a547c307307c25bd0ac21251 -size 795629 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Eye-Closed-Success.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Eye-Closed-Success.png deleted file mode 100644 index 54e7917c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Eye-Closed-Success.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9e11f29a4e5ffadc64ea2ba623217f364b1b20f9f5034094e8b36fb1d9d5333 -size 193902 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Face-Default.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Face-Default.png deleted file mode 100644 index 6c333b87..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Face-Default.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97fffa11b42454c531c4ad8913b9e6d36bf804b3059395596822be1edcd098c6 -size 278004 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Face-Landmarks-Poor.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Face-Landmarks-Poor.png deleted file mode 100644 index 911ca16c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Face-Landmarks-Poor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17fe359fcd30a86aedd67e1043437b2692336a50d1833896af6852c16934db24 -size 280432 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Face-Landmarks.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Face-Landmarks.png deleted file mode 100644 index c0cd79b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Face-Landmarks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f50c7e2968792f3012bde4b00b882080c4201f6d0ff50808a26509ae1ea412c -size 280497 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Facial-Animation-Timeline.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Facial-Animation-Timeline.png deleted file mode 100644 index 10cf4746..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Facial-Animation-Timeline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90915a60958caf9b04e8019a7d86a17ca8da96df223db9a40a4b2d3245d1049c -size 18413 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Facial-Properties.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Facial-Properties.png deleted file mode 100644 index d2cae349..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Facial-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c72cab2878f50e36fcd60373a82c4c847a01f36c284d0a46455a2713e08bd90 -size 58421 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Facial-Rig-Visual.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Facial-Rig-Visual.png deleted file mode 100644 index 415a3c3f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Facial-Rig-Visual.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:851fe1903887539c5b3a40058090d56d070c7313b5856a164f5c62bcba115d30 -size 339696 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Horn-All.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Horn-All.png deleted file mode 100644 index 4bbf912c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Horn-All.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7856e7a72cc749a684ad8bdb76a9e4780b9aedb349f960341cf57ee05a1f7979 -size 140092 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Horn-Cage.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Horn-Cage.png deleted file mode 100644 index d2332142..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Horn-Cage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e49f90344a036c4f70b7e2b72b328d6e2e030654f5e66a15e096d481b21a8266 -size 110549 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Horn-Head.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Horn-Head.png deleted file mode 100644 index 2d07b2ec..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Horn-Head.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ecb5d242163ea58767bd08a3d37bc747e1435ab01f5c8860515344561806a3a2 -size 63702 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Invalid-Visibility.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Invalid-Visibility.png deleted file mode 100644 index c12b2e68..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Invalid-Visibility.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf870edd2661e65a1bc9c92820239d4c86e7ada319a4dfd5ee0d227516347fd7 -size 263085 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Landmarks-Fail-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Landmarks-Fail-A.png deleted file mode 100644 index a94b4fe4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Landmarks-Fail-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32b66a226ab23b8fd68b995039f63474042deda3c97ea86c7b5f3908cc12cb77 -size 282867 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Landmarks-Fail-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Landmarks-Fail-B.png deleted file mode 100644 index 52c6bc73..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Landmarks-Fail-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64aa7237f46563b60f7f613d3698a95c24fe4a11928913a51551cbc1491834e8 -size 201370 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-A.png deleted file mode 100644 index 57dc4bcf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b83d84921858259a7f5e5b16794a6023e0036c75a06edff7c84839334599bbfd -size 73091 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-B.png deleted file mode 100644 index bf54e415..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2e37e9e132f1cdc59a2bd434ad6fda7e6ef64033d90eb7d97bddcf4430936be -size 67814 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-C.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-C.png deleted file mode 100644 index 3a4ee3e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90b0a18a848013420239fab4cccf1fa0099e49ffa5667aeb83f8e38d5afc8b00 -size 93926 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-D.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-D.png deleted file mode 100644 index 8c825ed2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b10e55f1f2de04e658000bb0fff2801ae1d00f255e22bf6406ab52d68fbea09 -size 76102 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-E.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-E.png deleted file mode 100644 index d49d283d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d72e5cd166a75a3a04a1582fa5ba03506344a1be892ed7d972cb9b896b3ab474 -size 61019 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-F.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-F.png deleted file mode 100644 index d140c8f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Makeup-Example-F.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb9d11e5a68548f5bbe6e4cb8919d4526ce14159d06056ae3a22a221e1df593c -size 65934 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Missing-Landmarks-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Missing-Landmarks-A.png deleted file mode 100644 index 48b5af5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Missing-Landmarks-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43e87f3e48cdc1f1fdbad15c58b23aff2edb4ed7c3980812658d6218da1972a1 -size 219156 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Missing-Landmarks-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Missing-Landmarks-B.png deleted file mode 100644 index 4e1e0043..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Missing-Landmarks-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fee21615299541dabce94ecd36395a525d78bd21abf1c264e3633c1e53a5d5aa -size 241801 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-A.png deleted file mode 100644 index 6f8985df..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5277a586498e74162687aa387024a836cc81686d87e3d8d77caeaa4cadc1d512 -size 42626 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-B.png deleted file mode 100644 index 091152e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8079dd241c454c4c09e360c9db6e2cc29ee467ea019c278b81d57eeb75aac667 -size 109715 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-C-Cyber.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-C-Cyber.png deleted file mode 100644 index 58de4adb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-C-Cyber.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:986e3235592ec4bceeadf1645435c2f826d056cb33fa0177edb7aefb9bec730f -size 48345 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-C-Giga.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-C-Giga.png deleted file mode 100644 index e42d16e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-C-Giga.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43822e669c390b84b00efa4ad4066154bdf022207f0394dfed5c1d88ef89faf2 -size 51095 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Claire.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Claire.png deleted file mode 100644 index 34a76020..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Claire.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87b36ac3e38fe0fe5b147af4ca19d3c143a63e30cb49bd35a09f7d914f9da561 -size 71226 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Clawed-Companion.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Clawed-Companion.png deleted file mode 100644 index 6502fba2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Clawed-Companion.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f5421dbf4607216aaf7deca4f1ea22544eef23c80a92579d43b1e52f5a57fb4 -size 83823 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-D-Greaser.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-D-Greaser.png deleted file mode 100644 index 0463c976..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-D-Greaser.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a52809831036d3bcf47c68445a344a795c6626b9302d2a094124b2da6dfe5d1 -size 65610 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-D-Tela.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-D-Tela.png deleted file mode 100644 index 46e8633f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-D-Tela.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8da9d04bbd72bebeb5b08fd46e347178c9837df6840ddb85811372793356323c -size 63216 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-E-Great-Bear.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-E-Great-Bear.png deleted file mode 100644 index be66fa14..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-E-Great-Bear.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dafed0f685490d0bff77c2a2515cc523d4283fbc966be8b78f4dcfca07f38f46 -size 68749 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-E-Polar.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-E-Polar.png deleted file mode 100644 index c00e68d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-E-Polar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f526aaf1a294ad953e4f9d5f7afa0107a7d00aac9a0ae6b1b7ab72c11351d6d -size 73227 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-F-Scare.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-F-Scare.png deleted file mode 100644 index fa2e6d0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-F-Scare.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f902f5969bfa38c2ef68012b1d12c46d12b40626c95ab2451b9ca941fff7185a -size 64088 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-F-Scarlett.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-F-Scarlett.png deleted file mode 100644 index c8c74144..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-F-Scarlett.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:722d2596ec010e110515c449c123b8d227cba8fab53264f401eb12844fffead2 -size 48311 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-G-Dragon.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-G-Dragon.png deleted file mode 100644 index bca5440e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-G-Dragon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d02a0348f9e3af6537babc6f0434449772f117acd6f8be16efe4fb6829f53eb -size 76137 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-G-Teddy.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-G-Teddy.png deleted file mode 100644 index 9dd3269a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-G-Teddy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5ea2952cb24b6cfa446d1c0544d6b411b3ac177baa84c6d895207aacda12cba -size 51836 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Gang-O-Fries.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Gang-O-Fries.png deleted file mode 100644 index 2a0b0277..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Gang-O-Fries.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8910b99f78cff88670a581a94855877d57568357a13831e0597ec5543e03947b -size 77490 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-H-Bungling.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-H-Bungling.png deleted file mode 100644 index dd7a664d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-H-Bungling.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e93e3c7f3b793b2069075909ddf69059b7db1e308fd15e9c71dc558f7fb27a0f -size 57096 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-H-Pumpkin.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-H-Pumpkin.png deleted file mode 100644 index 5f6726e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-H-Pumpkin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40cc8e85866c32a3f45e6d428d0bc887a0ba711fc19340e7fc5fda23cb32acc3 -size 51450 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Ivory.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Ivory.png deleted file mode 100644 index af2c0efe..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Ivory.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:109e1a315dc160f7fde25752d00bee05ee4e16aeb572fb5a91fe1813667a8622 -size 59201 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Mr-Toilet.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Mr-Toilet.png deleted file mode 100644 index 1de99984..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Mr-Toilet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:062814f4e280288437c4fde0784b4e3f630ff25728dbc4b8fb17c2f23a54fbaf -size 49224 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Skeleton.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Skeleton.png deleted file mode 100644 index a096ee26..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Example-Skeleton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b88727b4eaba64f9378f01c9cd2fd27aae6370cd48d6c436f39cf8aaca7540b2 -size 71295 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Upper-Torso-Back.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Upper-Torso-Back.png deleted file mode 100644 index aab4ad3e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Upper-Torso-Back.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ef95505aa0d708e0dc0c606e083f55e2ac3c10c5e5538271208eef34be2bcad -size 579891 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Variations.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Variations.png deleted file mode 100644 index cf43e2af..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Modesty-Layer-Variations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1503b68e492411cbc4e0595ea1e02de634068863701fc007461414d61f0c4926 -size 2631415 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Mouth-Vertices-Warning.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Mouth-Vertices-Warning.png deleted file mode 100644 index 38abd5b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Mouth-Vertices-Warning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65dd75a3afe11df7eb126736bc4303d12c09c15aea05b28cb1d979a1ca884621 -size 102567 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Projection-Side.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Projection-Side.png deleted file mode 100644 index 449be945..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Projection-Side.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:017b78c42becdf1e094e4f2b264b6c9091e9c68602944d40b6b287a1ccb7c7da -size 173273 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Rigging-Data-Model.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Rigging-Data-Model.png deleted file mode 100644 index 5df012f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Rigging-Data-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:916d0a0f430641797af0d180fecf71b0f5c835155a3253cd65af5e534d269809 -size 28404 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Rigging-Visual.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Rigging-Visual.png deleted file mode 100644 index 935ea8b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Rigging-Visual.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8af3d8983d8fb303e0210fba532c57464bd80ae360720b5340167a2cff4e3319 -size 178379 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Rigid-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Rigid-Thumbnail.png deleted file mode 100644 index 265850c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Rigid-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ecc999081fc8b3145899c1d1840ad9f328cce6001a6792dadaf79ce41c6e3142 -size 114419 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Tattoo-Samy-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Tattoo-Samy-A.png deleted file mode 100644 index ce3259dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Tattoo-Samy-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09e7a72e63755bdc7a44ec83b4427969b7d8a41d6a20d835a5985575a228614d -size 74663 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Tattoo-Samy-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Tattoo-Samy-B.png deleted file mode 100644 index b90147ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Tattoo-Samy-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:643c5a78556955afd34be7671a5bdfae7c3dfe640f33d7843e0864875ddc5673 -size 70012 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Textures-Blue.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Textures-Blue.png deleted file mode 100644 index 6f0f34b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Textures-Blue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1640a2c4cbdbb79773953020e4d1d27b5e8eec3e5a9b57541cf61c30e30ce617 -size 537225 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Textures-Brown.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Textures-Brown.png deleted file mode 100644 index 07898295..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Textures-Brown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80f502fb88090a51a27ce85ebac440216ad3ececa72bdde7394b8f613ffd1db6 -size 537450 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Tutorial-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Tutorial-Thumbnail.png deleted file mode 100644 index c4827aa1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Tutorial-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:420136e0f62c332a69192d4c61026c14299162af070401a6faec8480567e34a8 -size 107700 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Valid-Visibility.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Valid-Visibility.png deleted file mode 100644 index 88280d1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Valid-Visibility.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e274f6d8e1c859ca37ff8e492fe1f80907b27ead7f8c71a7619a38e228c485f3 -size 406673 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool-Preview.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool-Preview.png deleted file mode 100644 index 4a62e642..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a09ef8d0b16591632863c2c00194c2f0de38e9d75ae37b74e89c7876fe7b327f -size 996688 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool-Test.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool-Test.mp4 deleted file mode 100644 index 956aaf1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool-Test.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afd14b34c9bacc550db83c4f2e19d44424eb374e71ca5d1216c4762ce9adc279 -size 4334191 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool.png deleted file mode 100644 index 42f86568..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Validation-Tool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01a9d850f9de3190d9aea8a11336c78b1cd6f1b15487f956d012494de008b04b -size 53518 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Workflow-Bodies-Templates.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Workflow-Bodies-Templates.png deleted file mode 100644 index 4fd38a15..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Workflow-Bodies-Templates.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:223a6bdbf15e24514834dae0c1903e959abaed7f904f066c1d7d750275df2ade -size 79787 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/Workflow-Bodies-Traditional.png b/.cursor/rules/roblox/en-us/assets/art/avatar/Workflow-Bodies-Traditional.png deleted file mode 100644 index 0d094f7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/Workflow-Bodies-Traditional.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7a216e8146baf5e2ffa3a7b04eea34ea3524c18c1511cc5cbea18517786eb63 -size 130714 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Blender-Animation-Start-End.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Blender-Animation-Start-End.png deleted file mode 100644 index 28db9a34..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Blender-Animation-Start-End.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fa38ff59d8ed3e34993b9667758d0f41d650e885ef23b1815cef87fe2755eaf -size 48615 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging-Outer-Cage-Objects.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging-Outer-Cage-Objects.png deleted file mode 100644 index 8dddf148..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging-Outer-Cage-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11bd9b5445a090e0e4698decc52c8f3a8d924b000b3da0a3ecfea3ad8aed5ae3 -size 40602 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging-Symmetry-Settings.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging-Symmetry-Settings.png deleted file mode 100644 index db59cd03..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging-Symmetry-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b711ae444a72bd9c01a1cba2c68b5f045f060fadc1c00791310e4988b5b9048 -size 69239 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_01.mp4 deleted file mode 100644 index bb7709dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52c0f2d20d7f094a1a374057fbc7966fefa473b77881b209a8645c540a903337 -size 4106019 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_02.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_02.mp4 deleted file mode 100644 index 82716b91..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_02.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4f9d29e274faafb7e6b3197d2e50015161fd63eafab4994516d09407308bbdf -size 45395018 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_03.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_03.mp4 deleted file mode 100644 index 00fa34ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_03.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce11e6f18f3f2ffa3e5532e19a7f978ef4ec157db7c793c4c49d14d0e7c9f166 -size 157863987 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_04.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_04.mp4 deleted file mode 100644 index 24d2c223..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Caging_04.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1407c76605b9fd74121ddd4e08be380be5128807a19b651ef9477d26c837aa5 -size 111251596 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Disconnect-Node.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Disconnect-Node.png deleted file mode 100644 index 27a6949a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Disconnect-Node.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dfd7137ae09a5d4f55c1fe14a39b53556fdd9a41be1c334f4cd7564469f9cac -size 60570 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Mix-Node.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Mix-Node.png deleted file mode 100644 index 1d3aad96..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Mix-Node.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57ccbf12c009016b48954077e61005b0c5ad3c1f6cf0515070e615757c851393 -size 64499 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Node-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Node-B.png deleted file mode 100644 index 1cf1f778..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Node-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a94949331e81dbc12da5d6e501384aa74c7e625a4c9904e94cfa60ea17d5e70 -size 146366 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Object-Select.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Object-Select.png deleted file mode 100644 index fe0f36a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup-Object-Select.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d73bcd2b7e82b981c427556c56653a67939a2e28e4bff306529b36b5a24e3745 -size 46396 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_01-1.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_01-1.mp4 deleted file mode 100644 index d0040a4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_01-1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9969e47ece0739cb2d77d037f9b1c2c5af0cfdd1c3a9557e8a7c2212fdc279e -size 2452676 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_01.mp4 deleted file mode 100644 index 368810ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac1d5e2f055406c69909d30061de558d66a2fc0d9fd197109a9254233010d55c -size 4480260 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_02.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_02.mp4 deleted file mode 100644 index 3611461e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Cleanup_02.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7d3adf52b1ef91c3cd7d91d8010b2af829c7d1337c8f3c324f33c08a73eefa6 -size 9131865 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Color_Picker_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Color_Picker_01.mp4 deleted file mode 100644 index 1e63b342..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Color_Picker_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a55afe7b9094d964922fc96d17ae23a8c48bf3ba3a319c4fcc65f81385c92b19 -size 6195838 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyebrow-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyebrow-A.png deleted file mode 100644 index 8d7818ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyebrow-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e25419fc08fda322810200c00266bef380588c4f43fc783c2dd6423de966d22 -size 425487 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyebrow-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyebrow-B.png deleted file mode 100644 index d0c61bf8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyebrow-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:869f0610d9d1c81ab34629fc9643e19cb294ffb71d023189d158a23349bb43ec -size 161454 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyes-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyes-A.png deleted file mode 100644 index 3f5897fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyes-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7dd792b65193ad3acb77e41343993cd2ed232ab44856a901adcdfe82d32c1fe -size 426503 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyes-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyes-B.png deleted file mode 100644 index a547c7f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Eyes-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a91860581367180bc8564a77a33c9cd0f0fc1f42f5375d1b921f9e2f675631c0 -size 165672 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Mouth-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Mouth-A.png deleted file mode 100644 index 211613bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Mouth-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:468203b62e1e040182fb8f94367d12af93639eca16bfeffe5bf7ccbadd829458 -size 423427 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Mouth-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Mouth-B.png deleted file mode 100644 index d806de40..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Mouth-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c77f45132ffe95dcdf19d525a657158392edc372973146986a4ea85a375f60c7 -size 164276 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Nasolabial-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Nasolabial-A.png deleted file mode 100644 index 5fdac616..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Nasolabial-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c16287f74a9824c5742a8bb486762dcde1c80b348a7e1f29a23facabe15affd9 -size 426387 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Nasolabial-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Nasolabial-B.png deleted file mode 100644 index fd159dac..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Edge-Flow-Nasolabial-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d91b0ba56b0de3827ebb496baef0423450258755b6fe0b606ead7e0bca411047 -size 163170 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Export-Settings.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Export-Settings.png deleted file mode 100644 index 3a730139..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Export-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9328e0dedeef7d1a2df276ef505d2d027dadd417ecc17a8b8170e1780289d726 -size 123214 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Exporting-Pack-Resources.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Exporting-Pack-Resources.png deleted file mode 100644 index 3c442c12..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Exporting-Pack-Resources.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8099bbd65dc06f959f2e598958f464c54d9adbf89336f6170121566f8d49dff -size 118499 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Exporting_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Exporting_01.mp4 deleted file mode 100644 index fdf70f59..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Exporting_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a91b4c41140e697a8a3b41d06549bbc6757a56b4f623d85f1d216f34c796dd14 -size 3389490 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Attachment.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Attachment.png deleted file mode 100644 index d71ebf4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Attachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a810d62913cdc5e685ef5db3a447fac1cfc9d07cf8fda0a8a722435cd3dce74 -size 252413 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Caging.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Caging.png deleted file mode 100644 index 9798f70e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Caging.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5233ed6b7688f5ec91ed4a897cb41757dd5848664ccd3932dca18203e580fe5e -size 390520 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Sculpting.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Sculpting.png deleted file mode 100644 index 95f436c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Sculpting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faf9c76d1436177e53fdad87763a59e5097fdd69fa43e27c9dffbac9ef82b2b5 -size 177308 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-A.png deleted file mode 100644 index 2b42df8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d413730e49f7ca7192c1d833ccf26889ce8a321946c1327911111636eac69180 -size 257925 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-B.png deleted file mode 100644 index fe954422..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:561f575bcc35c2b2f754862081d655bc98850dda5628519357273790ca330e29 -size 243832 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-C.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-C.png deleted file mode 100644 index 6dcdc1ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9aa2f4b9b7112c2babb956341bd6c3ab770089c99f406c4b0b1ed01eb2a279e -size 259346 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing.png deleted file mode 100644 index 45a9010e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Texturing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ffeb21bde2e927f697d4556ba9d22f397d38c3442c7c26a902d068be0f5c38a -size 327621 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Tutorial.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Tutorial.png deleted file mode 100644 index e6ef0827..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Post-Tutorial.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a716145f36b2cd89999bc9e6a6d2df6685e014ac9f76757d42496c615cfa271 -size 907183 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Attachment.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Attachment.png deleted file mode 100644 index 41fe9c92..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Attachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e145aa9b90d2b2099564fff8d5b66e57d8bf6c2bc6d7b9448e1693630c99b8d -size 255136 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Caging.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Caging.png deleted file mode 100644 index f07e2b5b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Caging.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94433d1e01bcde2f3efde8ccf24cacca9bc259390c9d07cb3e3431786a45c0c9 -size 459215 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Sculpting.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Sculpting.png deleted file mode 100644 index 4a83e1c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Sculpting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb80d94d15748d96c806d5a50beb211db9dfdd0d0812366d68415c6dc9f5508a -size 158460 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Texturing.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Texturing.png deleted file mode 100644 index cfe18ee1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Texturing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c74e01cb05aa64b28893f74891616462d9b1662a7e4ec4fca8076631248e7657 -size 323572 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Tutorial.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Tutorial.png deleted file mode 100644 index e9508ded..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Pre-Tutorial.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db6ed40df59cdc6527a28c60f505f7b6f70553835b478e587ca06d704efee145 -size 879333 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting-Crash-Example.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting-Crash-Example.png deleted file mode 100644 index 054e482e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting-Crash-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2953fbc8150276736305919a98b2ef1d8277f4cc77992e912173d6ace319fa3 -size 62048 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_01.mp4 deleted file mode 100644 index 491dbcb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fd3dd67c1adeff3a2870d71bf7b67625573280d9ee1a432c7fca213221b82a4 -size 2171268 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_02.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_02.mp4 deleted file mode 100644 index 88d15b54..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_02.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5d6e85032432799c7e64b39fa9cd176d57028665e1316658b6484e94e2ef6a0 -size 13903594 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_03.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_03.mp4 deleted file mode 100644 index 2097335d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_03.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da2c8590c291abe423985e95f76688dcfad735de67584a9cad60045760df5548 -size 14388099 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_04.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_04.mp4 deleted file mode 100644 index bfb1f450..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_04.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d0d729c63522abd608882a2a6decf95773ebbe987690e230b376e434fb5fbc7 -size 13719422 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_06.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_06.mp4 deleted file mode 100644 index 43fa4789..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_06.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc0f724203f5a0388abf474245fa241d47a0e53146139272bcc7635d6f4bee75 -size 13289148 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_07.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_07.mp4 deleted file mode 100644 index 29ad91ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Sculpting_07.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef91482838283ec5349c4d4e0e5ab70bb3c7b522e0a9beb43f1630efbe29758d -size 26253286 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Select-Bone-Objects.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Select-Bone-Objects.png deleted file mode 100644 index 020514e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Select-Bone-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d8ee4bfbff0744d0bdf18c4cfa91e39f37f78410aa851c09b509bc0bef441a2 -size 22979 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Select-Joint-Objects.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Select-Joint-Objects.png deleted file mode 100644 index cb2a196c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Select-Joint-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aab824d5c9b03c74949d66ff78aa13da6476b14bba12b3d2a7a55056629f9996 -size 12938 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Template-Face-Objects.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Template-Face-Objects.png deleted file mode 100644 index 078a0e51..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Template-Face-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cab4673c963a7b758d6c7fbdc7512a825f2611f8a98afc2d7efa76efb25e4b6 -size 17947 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-3d-Importer.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-3d-Importer.png deleted file mode 100644 index f5e4e140..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-3d-Importer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f41567a8c7ea356ee1343fc78a0a089356b4bce02096f959c0491164dc26359 -size 66219 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Animation-Timeline.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Animation-Timeline.png deleted file mode 100644 index 795d0267..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Animation-Timeline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d004c5ffdb7b0597b5fca15a695f024b81b2188a60ed67dd3c3bcdfff501897a -size 18583 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Asset-Upload.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Asset-Upload.png deleted file mode 100644 index 3027efc3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Asset-Upload.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:499137d8624dfba7c704e961f15392e09e439d81315f1c126cedc72f36bd0177 -size 13899 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Avatar-Test-Place.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Avatar-Test-Place.png deleted file mode 100644 index f5319248..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Avatar-Test-Place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79a1b946428e1bde6703b65f9298b4c72d7e3bdf99d94c3b31ca1aeee4e7333d -size 34595 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Clothing-Try-On.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Clothing-Try-On.png deleted file mode 100644 index 6b29afe8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Clothing-Try-On.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c546a395e9151e4eaf8a78e7308eb11209f53672a71226fbc09af984b3a30bf9 -size 297954 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Clothing.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Clothing.png deleted file mode 100644 index f55a50f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Clothing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c544e88c0a93cb731fa59f95c0ad01ba554b787071ceee778059d19fc2f2668 -size 363588 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Custom-Properties.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Custom-Properties.png deleted file mode 100644 index 4313610d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Custom-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1985bf7557ca3865dd3f351a0b8a88a4f82d5c3f71b16d0c26b0036aef3bc3e -size 120869 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Emotes.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Emotes.png deleted file mode 100644 index 7216da82..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Emotes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eb7ee2beedea4f04c9552e3b8909b80e35b675f72fda06415a9d9582130a6cd -size 322431 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Face-Animation.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Face-Animation.png deleted file mode 100644 index 1acd8466..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Face-Animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81ffa59e6cebde156ee6ffb53ae7de12b09cbc829aa5a6f6be7d9bf4c3893ef9 -size 297148 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Lighting.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Lighting.png deleted file mode 100644 index e1f57f24..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Lighting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fddbd27789e15a316428cec87cdfcd0d8c8685ae6d5b053dec5f87bbc80deea1 -size 237164 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Outdoor-Environment.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Outdoor-Environment.png deleted file mode 100644 index 2e66438b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Outdoor-Environment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f10ec4773edbe4ac97395c5f2331b182d5580d62374804a916530d235fde5612 -size 1014457 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Ramps.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Ramps.png deleted file mode 100644 index f5edfa37..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Ramps.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd7146fc2f76ed3ab6d0fd1f96f969f716970dbaa93042d4b3c3a92d03f037d1 -size 292770 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Rig-Type.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Rig-Type.png deleted file mode 100644 index 015cd5cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Rig-Type.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fca07f9b4c2b36e59e3659cc188e41fa8c7caeb42f644d515ff95ee5bbaa6567 -size 22322 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Skin-Tone.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Skin-Tone.png deleted file mode 100644 index d8084de4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Skin-Tone.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a741a63025c6464899a6c17f58edda0a766e2392eed7fd16f1492eb320e3169 -size 306376 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-StarterPlayer.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-StarterPlayer.png deleted file mode 100644 index cc0d5516..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-StarterPlayer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9bcc12025b231c5f96e62eead0e3ee0cf454352f189dec14f71ac0f82d64e53c -size 5825 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Studio.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Studio.png deleted file mode 100644 index 0f4652da..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Studio.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1eda3be7e4e721eceddfcd28f821765895d96d18b0815c5b49569bf511aa794 -size 856420 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Surface-Appearance-Applied.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Surface-Appearance-Applied.png deleted file mode 100644 index 3d07aba6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Surface-Appearance-Applied.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:883e1ff6ef1de83b123bc8525a9e050f51cac647efe6dc968e2013067f16dc1f -size 46048 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Surface-Appearance.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Surface-Appearance.png deleted file mode 100644 index 368fbde5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Surface-Appearance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98afed547ba7ae857c3cb23f74fd3614924ad30d4f90aac86b87ffcb155dd52e -size 54992 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Clothing.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Clothing.png deleted file mode 100644 index 2d811285..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Clothing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac6d790a33b20fb63249ff0df9c2d99450f4b28a93efed08fc81225c83af7e23 -size 4068 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Emote.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Emote.png deleted file mode 100644 index 3c795451..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Emote.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8dd4146ec7ee2b230eb79f7364d91808328696f67c27a6131b326e779777b7a8 -size 33202 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Face.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Face.png deleted file mode 100644 index 6a9d526e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Face.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fd3b8ed46d362fa4ad3012f88c68cb0d853635b4521c27bc55aabc96c1a90b3 -size 38037 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Lighting.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Lighting.png deleted file mode 100644 index ae373930..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Lighting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fba284eaaff41cb64cba6fd543949391d2676873e06e8d9ffc608dbdac5c9823 -size 3808 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Movement.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Movement.png deleted file mode 100644 index bdf33131..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Movement.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04a08bcf3039282b0ed7707ebc086931f89b5eb8cfa5880904d5ed7fbf38716c -size 7745 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Settings.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Settings.png deleted file mode 100644 index 67110e50..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a18a99a1e54259b5c8bb4cef0620562292533494712cfb5ce80fe31a3f5773de -size 4286 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Skin-Tone.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Skin-Tone.png deleted file mode 100644 index 6c39d2fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-UI-Skin-Tone.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:713da519178ca02483ec35512434b7dac37fe9fef21949e14ea6d580df05ef6a -size 55557 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Water.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Water.png deleted file mode 100644 index 23508160..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing-Water.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02c8dea99b85c6a346065687e11e13a4c42c964bb5b0a93e0b188308bb360dac -size 239770 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_01.mp4 deleted file mode 100644 index 2b615196..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fae7c2b2bb1ba4b1218f1f40ad1b2b7887697a54dd27469ac5b40bec7419e7ff -size 11943374 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_02.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_02.mp4 deleted file mode 100644 index 077bb1e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_02.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef2895e8ab1445a11a62662bf350e411c8c3bea4c8e0753d47c3e4d11d2476c0 -size 16372733 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_03.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_03.mp4 deleted file mode 100644 index 72916abb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Testing_03.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:283989b287bf9d7de5e49ddb15d5cca055fb7c210e2ed375dd6e21c5c9b96ea9 -size 8702823 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Resolution-A.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Resolution-A.png deleted file mode 100644 index 7c9f07ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Resolution-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa869016c202d6b3f5a37120a9ba9d1f17378ff4e62d158786db853b0150e594 -size 284426 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Resolution-B.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Resolution-B.png deleted file mode 100644 index 826cb55c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Resolution-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb3fceaaab7ad2dfc48f6d2d515477a4ff01ee389434a4e17f3e27b6d0f50ef9 -size 314022 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Symmetry-Tool-Setting.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Symmetry-Tool-Setting.png deleted file mode 100644 index 8aea0bcc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texture-Symmetry-Tool-Setting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98b105ea7f9350c55aa0d96efdcbe793edab5d85ab1b64d4f20414f85dc77b46 -size 53642 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Inner-Eye.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Inner-Eye.png deleted file mode 100644 index a1450ad4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Inner-Eye.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5982b313062be4669b4bf371e1e121cb689459d0ed519da3e03541dfeae2ac1 -size 23185 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Outer-Brush-Settings.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Outer-Brush-Settings.png deleted file mode 100644 index d2e5f27f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Outer-Brush-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb38135a26383924b397cd95fdb0982d427ed81e6e9fa592d44b6b2589aa8d1a -size 25894 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Pupil-Brush-Settings.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Pupil-Brush-Settings.png deleted file mode 100644 index a49af7ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Pupil-Brush-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80d46932a07c507c0e62290c7081aa745137ad7b496a178cc8a72cfd15d0541f -size 15897 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Shadow-Settings.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Shadow-Settings.png deleted file mode 100644 index 0057b2ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Shadow-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ffb19bb9c5125e9ced6800bae24b3b760fc0deb0c0d58f27cd0c2275220207c -size 18045 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Wireframe-Toggle.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Wireframe-Toggle.png deleted file mode 100644 index eff7eb13..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-Wireframe-Toggle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd41fec9d222ee691c989eab610d5a0b5f6be5a70f34f43350c457882947b5dc -size 54497 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-X-Symmetry.png b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-X-Symmetry.png deleted file mode 100644 index ed1111a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing-X-Symmetry.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d9ced5db5f220f14d7206da1aacaa92eec96adc9eaa3847255ba9d64841457a -size 21673 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_01.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_01.mp4 deleted file mode 100644 index 04730e84..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_01.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cddcb846b3a4adb5c867d1b0d1b0ef0aef930e10b5761a5b9f1cf44a4216c26e -size 3550997 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_02.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_02.mp4 deleted file mode 100644 index 4cc6bd8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_02.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b656325fe8fb6eee1a0114427cc3a32a1ca86313f77bbfb0991108357c989399 -size 1254686 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_03.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_03.mp4 deleted file mode 100644 index 1f555e9f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_03.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06f667ad9c44783c0bc136dc4c95982d9bb7145dc0ef0f364aed656f27ba08ae -size 6071350 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_04.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_04.mp4 deleted file mode 100644 index 4a2d9fde..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_04.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c5a3cb1b63a6d128de34dcc9726c407cb9fa7a835b51b0d893d22f9d3b00b63 -size 9967119 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_05.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_05.mp4 deleted file mode 100644 index fbb34d73..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_05.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6597158bf484bf5525c573ef2b0b5ccc0b6bb99d8ee1bf6e5ea22236019111a6 -size 3565942 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_06.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_06.mp4 deleted file mode 100644 index 197a9f82..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_06.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72e54f2d0883ae00a0f910643cac7404c31f48670c4ffdef5707c9aeffbbc390 -size 16376330 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_07.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_07.mp4 deleted file mode 100644 index 99da0175..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_07.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc901f547fa2ecb1c2fa2a8790ed41604eacc00eadf34318a275469374aadf8c -size 21615765 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_08.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_08.mp4 deleted file mode 100644 index b42bd7b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_08.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c296e93d7c32275c1d5eeb6aefda9584bf256c6d172140a51bcfe0e7fbddc3ad -size 9519958 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_09.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_09.mp4 deleted file mode 100644 index aaf53b37..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_09.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb3a8e5f1a94fa4dc36a27b4e31896aba3a0fb358b70226726ee3ac81ea9b663 -size 4911903 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_10.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_10.mp4 deleted file mode 100644 index 27496083..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_10.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bee0d82a3023f3198741418c999aa769f5fc5c7c7f5b19ab31d2f2bf08f45269 -size 12380092 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_11.mp4 b/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_11.mp4 deleted file mode 100644 index 161e8955..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/basic-creation/Texturing_11.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62373a8d22c50fd57034c56dfa2117a91ae0fd7ca28517de589cddb6d946cb13 -size 7052365 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/20_406000958.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/20_406000958.png deleted file mode 100644 index 5223f59b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/20_406000958.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a68c4f5faeada99662c2d3645eaf67a23509be909f507416f4b084a6c1094c6 -size 90224 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/8bitHeartFace_2568799765.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/8bitHeartFace_2568799765.png deleted file mode 100644 index b7b133ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/8bitHeartFace_2568799765.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e48247ddb1eb1713581aca7604ce6a671fd03de16b7ed9a2fff2d0998faac456 -size 101256 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AdorablePuppy_11389372.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AdorablePuppy_11389372.png deleted file mode 100644 index bdae424a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AdorablePuppy_11389372.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8f8fa749b7a43756c49752cbc18b113b6c9ba08386afffd00380f77d673b732 -size 103297 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Adoration_28878297.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Adoration_28878297.png deleted file mode 100644 index da6dbb54..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Adoration_28878297.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95b6556a8791cd9a1195379c9a9197498082d78248971093845b41a635d61fe2 -size 107308 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Aghast_9250633.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Aghast_9250633.png deleted file mode 100644 index 0c8c196d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Aghast_9250633.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:211078b4d7ff49ad01c3a91af147d12f3904d821cee8ffdd14762561476c5134 -size 105281 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AlexandraNinniflipFace_2553655919.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AlexandraNinniflipFace_2553655919.png deleted file mode 100644 index b82f6414..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AlexandraNinniflipFace_2553655919.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33573ebc5a49998cec9da74f916e87b4d5c90bb6503c4dc24ceda96669789c78 -size 93848 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AlienAmbassador_11913700.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AlienAmbassador_11913700.png deleted file mode 100644 index 401c9fca..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AlienAmbassador_11913700.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01963f70a9014b5995dedbe139988b9df113139d338569e623dc25b8ceccab9c -size 101408 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Alien_31317701.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Alien_31317701.png deleted file mode 100644 index cd9ce475..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Alien_31317701.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31920af1bc1f0829b73bba681e8db5c061258cd1bc61e48de8715b34d36632ba -size 97733 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Alright_7131541.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Alright_7131541.png deleted file mode 100644 index 302008c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Alright_7131541.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65fb795636715a40a2edd7392fcd049b410edc930cb292a13fd94e1342f752d9 -size 108409 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AmeliaFace_293302465.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AmeliaFace_293302465.png deleted file mode 100644 index 4fa5cf96..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AmeliaFace_293302465.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b53c7d2c91b2c3026dac7e2e70c16ee430488702f9fe120eb10b045213385f8 -size 106904 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AndThenWellTakeOverTheWorld_12732366.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AndThenWellTakeOverTheWorld_12732366.png deleted file mode 100644 index 1204c202..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AndThenWellTakeOverTheWorld_12732366.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96e1497e75cb417edfdef2f221fafcc7c3f8e9114c30240d1e4a7ef9d80dfb7a -size 101119 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Angelic_45084008.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Angelic_45084008.png deleted file mode 100644 index bd0c9269..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Angelic_45084008.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2d3d08ae7187e33163ca95b9c9355fad617c6615ca9d66d5c7ad6b92210a1e9 -size 105770 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AngryZombie_173789114.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AngryZombie_173789114.png deleted file mode 100644 index 86f46499..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AngryZombie_173789114.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbbe63dc0a53c0b9f5fca7c76f839aaa6012fc30e667dbbac111c1ff21c84ce3 -size 112513 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Anguished_8560975.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Anguished_8560975.png deleted file mode 100644 index d8149edd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Anguished_8560975.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12c45f8ebc6224121c96a12d6b4274f3226be479f741b1daf0021d7dfd2ba1fa -size 106841 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AnimeSurprise_416846300.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AnimeSurprise_416846300.png deleted file mode 100644 index b8092aa7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AnimeSurprise_416846300.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c2a5a901c1d6bb5769c86734bf6356c3369f61cd1d920a2aa381af62bde8657 -size 111138 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AstralIsleClanWindsorTheBlueFace_2627730985.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AstralIsleClanWindsorTheBlueFace_2627730985.png deleted file mode 100644 index c38865af..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AstralIsleClanWindsorTheBlueFace_2627730985.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a87f0072d9e113a960a0a81b3de623c34417179fe13c233379fcdc85d6e797f9 -size 119048 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AtlanteanWarriorFace_3241221587.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AtlanteanWarriorFace_3241221587.png deleted file mode 100644 index 1f1c891e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AtlanteanWarriorFace_3241221587.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a35bd6d8b546ca2c280bf3ca5a95be39a29e7248f56b5b9655d49f83629d573e -size 117858 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AuroraSparkFace_2979703241.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AuroraSparkFace_2979703241.png deleted file mode 100644 index b8a41afe..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AuroraSparkFace_2979703241.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6938a7bb069306d1b57bee1ff2104027443c4b095aab7732185f3f135e63879a -size 135952 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwesomeFace_30394850.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwesomeFace_30394850.png deleted file mode 100644 index cde1091b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwesomeFace_30394850.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3925f6539f74e4b3784d29f0bf7fd59dee7329846c0b2fbff89d43da91b64d28 -size 108022 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwkwardEyeroll_150182378.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwkwardEyeroll_150182378.png deleted file mode 100644 index 62ab252f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwkwardEyeroll_150182378.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea44c5787df800ff1d5fabf41dbb1be83083ca947854f86638a84f6a02b12545 -size 102519 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwkwardGrin_150182501.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwkwardGrin_150182501.png deleted file mode 100644 index 873929f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/AwkwardGrin_150182501.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5086f872830040fb500bee0db0166deff24945595e8153d1617cd8f0dc9a8be -size 107875 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BadDog_10678423.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BadDog_10678423.png deleted file mode 100644 index 91eae426..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BadDog_10678423.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:deb8be12d4282780dab64781e3d3684dd9661b925f071d47baa8f734d2771276 -size 108218 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BadNewsFace_268603331.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BadNewsFace_268603331.png deleted file mode 100644 index 58ee6611..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BadNewsFace_268603331.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5290cd3e652c0d06608f6e04103e9504eae7943d1b41151e57cca6e853105231 -size 104654 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bakonette_7243836687.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bakonette_7243836687.png deleted file mode 100644 index 4d83e846..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bakonette_7243836687.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53f7a4e93a7743db6720d020bd5e8809f34d68a21c14e2b22929a58db19e621c -size 113511 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BallerinaFace_2571850406.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BallerinaFace_2571850406.png deleted file mode 100644 index 58867adb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BallerinaFace_2571850406.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e6a014eb5380e94df54128e0dc6f1f8ef1d923e63d10dc41a62de0b3c86ab98 -size 121859 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bandage_20418682.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bandage_20418682.png deleted file mode 100644 index b471a033..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bandage_20418682.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a1e2ab70598eb7a0a9b07273864142b22138a2bcadf3d795993c7b623bf7d66 -size 111178 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BattleReadyKenjiFace_3116216863.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BattleReadyKenjiFace_3116216863.png deleted file mode 100644 index 03109d88..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BattleReadyKenjiFace_3116216863.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccaaa914bb43c087406c1abd89fd9a066bf423a7ff54bdbb297b7f4407366ba5 -size 120483 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BeastMode_128992838.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BeastMode_128992838.png deleted file mode 100644 index 07f05cae..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BeastMode_128992838.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1758f2251c96654d3e3e7b031e3e2d2aa0ab88c408f089ce133b1940421f1bde -size 114118 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BeekeeperFace_2553407112.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BeekeeperFace_2553407112.png deleted file mode 100644 index 072e807e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BeekeeperFace_2553407112.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33e693ef895dbf5111aec5083e4823f9999919f01f4f2230e16b0177e48f5056 -size 119148 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BigGrinTaiVerdes_7987180607.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BigGrinTaiVerdes_7987180607.png deleted file mode 100644 index 717f8480..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BigGrinTaiVerdes_7987180607.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:354eb9538301b399ea79a67831ae2aba461f790c5a41cf851701f7d68602eac1 -size 128067 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BigSadEyes_391496223.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BigSadEyes_391496223.png deleted file mode 100644 index a52a07ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BigSadEyes_391496223.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68f8b621a8cfe55a6e7873dc8156a9d136792cc4f46da6cd1e47d2d67d30318b -size 100222 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BiohazardFirstResponderFace_4927805902.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BiohazardFirstResponderFace_4927805902.png deleted file mode 100644 index b4e8b7a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BiohazardFirstResponderFace_4927805902.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:985443b07c7c533085ca4358aed74e1f72d8b3f396d1051a308085d158dba3ce -size 115004 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BirdOfPrey_10907547.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BirdOfPrey_10907547.png deleted file mode 100644 index 84a2cca2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BirdOfPrey_10907547.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa5eaf03460dea44c1d761f38e1ff29b40c83133512af1f418ff0c54cee07e22 -size 105782 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Biteymcface_743690770.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Biteymcface_743690770.png deleted file mode 100644 index 520e0ee9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Biteymcface_743690770.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d82fa342125feaa830b6dc538b0126b87f9fc342cddc1eb6e42b7d6f552511bb -size 104428 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Blerg_12777646.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Blerg_12777646.png deleted file mode 100644 index 19b3a70c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Blerg_12777646.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:804ca75f21ed6374c30b8556b4d943928f6847e1e1bc554df2548442a4eff3d2 -size 99284 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bling_25975243.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bling_25975243.png deleted file mode 100644 index d3b589ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bling_25975243.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc33faf19dc81e2c82a3bc04f457b4ddb5d227e34b6181d944331cf25490693f -size 113799 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Blinky_7506135.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Blinky_7506135.png deleted file mode 100644 index 464c6350..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Blinky_7506135.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:baf47478fefcd49b815fc9e9921f15dba2d8ef1d1b918edc31d03690b2e21829 -size 103246 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlizzardBeastMode_209995252.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlizzardBeastMode_209995252.png deleted file mode 100644 index 64ae00c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlizzardBeastMode_209995252.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adfe294d2bcfc71e1468e6418a15d539ad8c03c32b5f7b2ef354df7430ea3070 -size 113947 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueAmazeface_835095003.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueAmazeface_835095003.png deleted file mode 100644 index cb9d7f55..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueAmazeface_835095003.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d26bb6f26e80a72f9b9d062147ed6f4b1bf0eeabb246f6815a5ec81c1ba9ec04 -size 107140 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueBubbleTrouble_330296924.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueBubbleTrouble_330296924.png deleted file mode 100644 index a4dc7c5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueBubbleTrouble_330296924.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1110459445f87d00cb736ab868c3a4dea0f8fb273164ac35bf8e46fdcd2f805b -size 108068 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueEyeroll_323191979.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueEyeroll_323191979.png deleted file mode 100644 index c11ac322..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueEyeroll_323191979.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7da185547d7e6698362ef0e0c8939d0226447e7632d0d7d852743096ce7eabf -size 103154 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueGalaxyGaze_440739518.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueGalaxyGaze_440739518.png deleted file mode 100644 index 27a158f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueGalaxyGaze_440739518.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36cb2fdd92e98278309615c15a50725cf2b132fdfa72720f36319bab33611331 -size 107715 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueGoof_1191162013.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueGoof_1191162013.png deleted file mode 100644 index b463cbe0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueGoof_1191162013.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fc4751830a50762f7291e2ae3f4b7d27402568fb2fbaab49335ba8904d66fd0 -size 111989 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueMoonstruck_878941449.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueMoonstruck_878941449.png deleted file mode 100644 index 863b2c24..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueMoonstruck_878941449.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a609fa32efd46062b169f0df1076f49cbf06814cc567470c5694dac11d66dc90 -size 108305 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueRockStarSmile_1428409936.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueRockStarSmile_1428409936.png deleted file mode 100644 index b44bb41e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueRockStarSmile_1428409936.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3ccbe3484cf708b4f3d60537736d6022b2683f64a8de613ae514446c6457aa0 -size 108283 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueStarface_119812715.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueStarface_119812715.png deleted file mode 100644 index ac042f2f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueStarface_119812715.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0db44c8d303e127e7e2979d2f43415cfb178bb7b9934c9cb9d9aff4fbe81700 -size 111480 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueStarrySight_2222775067.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueStarrySight_2222775067.png deleted file mode 100644 index 9a61a446..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueStarrySight_2222775067.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe933b0b7eca3c5a68b3a912654efddc7233e32a6893a61258a6d0c75c7e2075 -size 109917 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueTrance_244160970.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueTrance_244160970.png deleted file mode 100644 index 810b3eee..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueTrance_244160970.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62b7cd375040e46ee923c0d628e6515e944ff36441f9b85fee0fb47956e964a9 -size 111708 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueUltimateDragonFace_1772529256.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueUltimateDragonFace_1772529256.png deleted file mode 100644 index d09b95da..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueUltimateDragonFace_1772529256.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8312147d1626123dfc6502463b536d18729197e53ed16d5e3327c7eb4cbef1b1 -size 120030 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueWistfulWink_583721561.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueWistfulWink_583721561.png deleted file mode 100644 index 49c6f9ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueWistfulWink_583721561.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11dbc70babd88653934c584c1b53c722bdce8c2e809282c855d77f856c83b81b -size 106853 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueeyedAwesomeFace_386188363.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueeyedAwesomeFace_386188363.png deleted file mode 100644 index 85864c05..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BlueeyedAwesomeFace_386188363.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a974c1b8be21ebdbe801f6e35f9f235b9fbe7b8be9b536b13cd1b2ec79d6f8e -size 108351 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bluffing_147144673.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bluffing_147144673.png deleted file mode 100644 index e6298ea1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bluffing_147144673.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:002e51a7debb49fe23044272d9227eac7717227288473ad6dc9468afcc433724 -size 99353 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bored_66330106.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bored_66330106.png deleted file mode 100644 index 787e35d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Bored_66330106.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e080d6499146cf34bc1d6d89305c1569e5c98e07d0c72f1e79850515d7678a4 -size 97346 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Braces_30394484.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Braces_30394484.png deleted file mode 100644 index 76629b95..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Braces_30394484.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:820e4c702c5712171cb99cefab0ec4380cc15fc7e796c8930dc40c1824eda1a9 -size 104710 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BubbleTrouble_19264845.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BubbleTrouble_19264845.png deleted file mode 100644 index 8b28661c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/BubbleTrouble_19264845.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1dc58ea66b04e18c84a5f9b09110d4c45d98e9c1d28f584b343a9efcbc03b9c -size 107936 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Butterfly_24727929.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Butterfly_24727929.png deleted file mode 100644 index e2a56eae..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Butterfly_24727929.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91951cc42eedb2907f0e3b88076d181a681881f9180f6d2cd0560105c9c244b3 -size 114778 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Camoface_24441888.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Camoface_24441888.png deleted file mode 100644 index 62ab9bce..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Camoface_24441888.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:582659d57cf35f4c138d6d087010260a55e48623a3b8a2b32da960bad6e0b88c -size 126803 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CaretUnderscoreCaret_15366173.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CaretUnderscoreCaret_15366173.png deleted file mode 100644 index 5104dc4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CaretUnderscoreCaret_15366173.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9bff412ed2f2219e47fe36b460d073ecb2b3f09375c1677983f6bad16c7a9022 -size 96328 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CaseysFace_301827157.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CaseysFace_301827157.png deleted file mode 100644 index ddc776dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CaseysFace_301827157.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d29d373d1b5f41d209a96633eec542897a29b768b818c64588bd8be61fbeb56 -size 99093 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CatEyeZaraLarsson_7893455671.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CatEyeZaraLarsson_7893455671.png deleted file mode 100644 index 9bc9815f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CatEyeZaraLarsson_7893455671.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c90e6b4ee60f0b2269935af81e31c96d649034fe6722a74039ea22f8b78a53d0 -size 139670 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CatchingSnowflakes_1213472762.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CatchingSnowflakes_1213472762.png deleted file mode 100644 index 4b220e98..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CatchingSnowflakes_1213472762.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18b2c3c9607238eb902c1ea836c20fef3ed04e951d07bcf948a411fbda188584 -size 106539 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChampionOfTheTideFace_3381167752.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChampionOfTheTideFace_3381167752.png deleted file mode 100644 index 320ea3cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChampionOfTheTideFace_3381167752.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a776f373a17a1fe0c39f6bdc53873863e6631d062978f5c5569adab97dbbb5ed -size 118786 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CheerfulGrin_33321848.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CheerfulGrin_33321848.png deleted file mode 100644 index 7dd6f270..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CheerfulGrin_33321848.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae5f95585fac1acb23583bb452f6efb3db78e72d7dfabc90398d5845ce9b1995 -size 102451 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CheerfulHello_362051644.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CheerfulHello_362051644.png deleted file mode 100644 index 651995be..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CheerfulHello_362051644.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d54790bcc2b3621615695b92b7cbc249c4febed1ea57556094a26a16f3b078ee -size 101535 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChesterFinkletonFace_2648884861.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChesterFinkletonFace_2648884861.png deleted file mode 100644 index c4ed9c0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChesterFinkletonFace_2648884861.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b713f835ca835e8c6bb7b422c03cd9f8e2027910a2c452a31e76e378ad580919 -size 132571 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChichiriTheWiseYoukaiFace_3210252812.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChichiriTheWiseYoukaiFace_3210252812.png deleted file mode 100644 index ef03fc68..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChichiriTheWiseYoukaiFace_3210252812.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:316649ff312b939cf3239ac87faa0d4add7a2f4208a0b775c765dc3f9111767b -size 111147 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChillMccool_376813144.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChillMccool_376813144.png deleted file mode 100644 index 77538dac..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChillMccool_376813144.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e9d86b092d7078737f5aa04bfd39681d062b54a6949a44ea732ed013dfc6726 -size 102443 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Chill_7074764.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Chill_7074764.png deleted file mode 100644 index 20d5192c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Chill_7074764.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1083c8efe68dd4917e8f61fa7185a18e3fd6c48acfd778f6f22efb059080cd44 -size 97002 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChippyMctooth_7317769.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChippyMctooth_7317769.png deleted file mode 100644 index 931dc052..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ChippyMctooth_7317769.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b620db4c551c257acbc06f09628104e3d6b97e57be081e7044a449e5e0c7926c -size 99773 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Chubs_7076110.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Chubs_7076110.png deleted file mode 100644 index b73db615..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Chubs_7076110.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:322fc9d6a9232f46ae6a14ad3836e1bb07a90efc39691ffff8b93b104463db06 -size 95523 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CityLifeManFace_2490662812.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CityLifeManFace_2490662812.png deleted file mode 100644 index 89e84b9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CityLifeManFace_2490662812.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1bdfdb4840be6afcad301f769edd5f3688bcfb780a544860c4fd35ec0c92a5c -size 119424 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CityLifeWomanFace_2492678267.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CityLifeWomanFace_2492678267.png deleted file mode 100644 index 2d229e19..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CityLifeWomanFace_2492678267.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b671754ae9daea49d38623e84b5ccd3793c7b82edb4266dcb2bbc239d565332 -size 130259 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClairesFace_301827089.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClairesFace_301827089.png deleted file mode 100644 index 542b0a14..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClairesFace_301827089.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b0afb6823623e376c1d9660ca04a93f3c26d0492695bccfe0e862ef499956de -size 101808 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicAlienFace_159199178.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicAlienFace_159199178.png deleted file mode 100644 index be25d734..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicAlienFace_159199178.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44722c648baa0465ba9e07ebcd99445841eaf30e8f209a20f4795ebaf7c146d8 -size 100422 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicFemaleFace_4018627046.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicFemaleFace_4018627046.png deleted file mode 100644 index 55b6bd5a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicFemaleFace_4018627046.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ea613bed16ad6d8aafc7be0d606f2e17e52ce1bfada0259083e0e402fce65cf -size 113619 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicFemaleV2Face_4637266368.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicFemaleV2Face_4637266368.png deleted file mode 100644 index 3369debf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicFemaleV2Face_4637266368.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a60c50484c9f6a841996f9dd78956020e7a078148482318bf030a2659ce2152e -size 107428 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicGoof_7074661.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicGoof_7074661.png deleted file mode 100644 index 87501487..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicGoof_7074661.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b6881d2856f8e1e239203b25cd0b3c8e9c4442707f1cb62a1753a5e55c6dbd0 -size 100459 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicMaleFace_4018617474.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicMaleFace_4018617474.png deleted file mode 100644 index 20d43404..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicMaleFace_4018617474.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8463f1b822859ca85a0f02033a0b2f5b222c8b9be13997796e40fae9cf62af1c -size 117076 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicVampire_7074836.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicVampire_7074836.png deleted file mode 100644 index 94609316..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClassicVampire_7074836.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32b42c211fb82dc8d3779a42440b2c08f2eda35e0696a13997fb4783317c227a -size 100222 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClownFace_23644960.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClownFace_23644960.png deleted file mode 100644 index 3771e290..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClownFace_23644960.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a7cc35e70a5ae520da84ebb88ba624218eae94093736ec097485d651621eac9 -size 101226 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClownSchoolDropout_21392863.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClownSchoolDropout_21392863.png deleted file mode 100644 index 46324b34..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ClownSchoolDropout_21392863.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4032952da08b9f9a262d0ec2cd3b568ac961eefefa4c06a8ccb064adad0c0c56 -size 98378 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonApostropheCloseParenthesis_15133453.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonApostropheCloseParenthesis_15133453.png deleted file mode 100644 index c3680dbe..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonApostropheCloseParenthesis_15133453.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e55bb1d572bc6267fae9e1fac2c905cbf250d7331d8fb3c41021e3e174178fe -size 101686 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashBackslash_15471035.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashBackslash_15471035.png deleted file mode 100644 index f5e356b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashBackslash_15471035.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc21f63ff0243cb06e1b1e70d705a49f4c65c4eeebf81b796ef081828896044f -size 99495 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashO_7317773.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashO_7317773.png deleted file mode 100644 index 66820719..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashO_7317773.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:896236cea31fdc9399a70a6d55b56b3c34ee5df7f302500919f3c3ced51c01c8 -size 99135 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashQuestionMark_15858152.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashQuestionMark_15858152.png deleted file mode 100644 index 52301261..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashQuestionMark_15858152.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c324da981db5ab9efb55b5dc95f9f2fdda7e3c976150942a7d046104c15a30f5 -size 96531 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashSlash_7075469.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashSlash_7075469.png deleted file mode 100644 index 9f606a3c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonDashSlash_7075469.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4285a822d668702a9a6238870892437e39a9f7574c90192a2bf4bfc432042dfc -size 100707 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonOpenBracket_15470193.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonOpenBracket_15470193.png deleted file mode 100644 index 298021b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ColonOpenBracket_15470193.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88c95a7fa12863f84f9d31a8ba0cecc468a204530e11820c3900a730611ec183 -size 92167 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Commando_10527010.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Commando_10527010.png deleted file mode 100644 index 31c9e577..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Commando_10527010.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:535d44975b1f593f29164c142b8359710acb9b7f3978e09aa44773fb8365f036 -size 108104 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Concerned_9250660.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Concerned_9250660.png deleted file mode 100644 index 562759f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Concerned_9250660.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:589c190185455f8d1d06c63c63be170c142fbfc0e132eba7b5b7174ea0aa3ee2 -size 99358 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CountryMorning_51241522.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CountryMorning_51241522.png deleted file mode 100644 index 7362faa0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CountryMorning_51241522.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0507b7138965b14cfa7e523cd9806d698cf9386e7b477d92b0dcc8d61c6f0390 -size 107732 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrankAndZapMechFace_5885801791.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrankAndZapMechFace_5885801791.png deleted file mode 100644 index 01b8ff64..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrankAndZapMechFace_5885801791.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d8fbeac1b913dff746e8804ca8d50a3a0764d387de84d03bdb61f724cec9785 -size 111420 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrazyAbstractArtist_10907546.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrazyAbstractArtist_10907546.png deleted file mode 100644 index 546a32a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrazyAbstractArtist_10907546.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4fba2185cb431d366789092c7e6f18c2f38a970c059b8122f59cd176dc88870 -size 104783 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrazyHappy_45515121.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrazyHappy_45515121.png deleted file mode 100644 index 87ad9095..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrazyHappy_45515121.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9826866975e40bfdb269dd2f60600a191c48b09543a2c6c33650d42ed232a570 -size 112636 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Crazybot10000_554650579.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Crazybot10000_554650579.png deleted file mode 100644 index ecad6d30..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Crazybot10000_554650579.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f7c7f481e086ea73ef84e04a8b8ecc2027c64158bc2f1d914125dd4a0590829 -size 102604 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonEvilEye_1016184756.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonEvilEye_1016184756.png deleted file mode 100644 index ce79c652..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonEvilEye_1016184756.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ebc5255120d415cbe93012b4affde4ecb8152e0b13d900f06dea700b67a00d0 -size 111672 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonLaserVision_45514606.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonLaserVision_45514606.png deleted file mode 100644 index 96908034..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonLaserVision_45514606.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38eba297e4c3b8632a31d75dd63a58de309a7b32a92b46e7a41826c0e1896f93 -size 97896 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonStarface_162200633.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonStarface_162200633.png deleted file mode 100644 index 249aee49..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CrimsonStarface_162200633.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ccfa3af1bbd5a7c74071f7d99fdb74214276752d57b4b9f3ba6685fc6752025 -size 112700 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Crybaby_2620506513.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Crybaby_2620506513.png deleted file mode 100644 index d98bc3c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Crybaby_2620506513.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd290eb0b1c6a9cf7ad39571aff3f6d2075cb21f42b0dbee0c731b585c9918a1 -size 105638 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cuckookrazybot10000_554663025.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cuckookrazybot10000_554663025.png deleted file mode 100644 index 0ddec394..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cuckookrazybot10000_554663025.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9963ef0b04924390e86ceebca42a24adb4ae1b558ba0fdc8bd4354eaeb2c381 -size 102178 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CuteKitty_11389441.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CuteKitty_11389441.png deleted file mode 100644 index fed58833..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CuteKitty_11389441.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:710d10a06ddfc188643895d74f14630ee6e66d18ba63b880f0d4ef880363c965 -size 107034 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cutiemouse_15885121.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cutiemouse_15885121.png deleted file mode 100644 index 56b83eee..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cutiemouse_15885121.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0fdbb9b4895e64dfad427b71bba5019f37ad16ecdc2bb04c68c25a89812c791 -size 99999 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cyanskeleface_2845815452.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cyanskeleface_2845815452.png deleted file mode 100644 index e50e2f34..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Cyanskeleface_2845815452.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:849c20490be861c358575a18e72e932d2ce8524a5e3435ea9f3a88e0c5033dae -size 142171 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CyndiFace_2535415411.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CyndiFace_2535415411.png deleted file mode 100644 index a8dd1d41..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/CyndiFace_2535415411.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51cda99a3c6af8db9c44c28db364693d87feee76a77ad888db467c649ee483c2 -size 107966 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/D1_16132514.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/D1_16132514.png deleted file mode 100644 index 716f5fcd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/D1_16132514.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a749caf3b1fe66811b5ca194e5b0ef19912e9538f8a75edce8baedecb61e7a4 -size 98674 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/D_14812981.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/D_14812981.png deleted file mode 100644 index 45b919f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/D_14812981.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bacc74bdbf888e5ece34259b824d8210fa94a586b32813df8935decd2efe12ed -size 99589 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DaringBeard_110288809.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DaringBeard_110288809.png deleted file mode 100644 index 534d9938..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DaringBeard_110288809.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19b0b13df5ab6eabe43790b64c892f9bda76a2be1f2a9c67c45f31e1ca90d4df -size 105339 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DaringBlondeBeardFace_323191430.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DaringBlondeBeardFace_323191430.png deleted file mode 100644 index ca30a01d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DaringBlondeBeardFace_323191430.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5babf7fb07e48d424cb632a35391768fe9945c62f8a6bcd3aa3294080160bfce -size 110679 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Daring_8329690.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Daring_8329690.png deleted file mode 100644 index 1d3e22a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Daring_8329690.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1b94693449da1054747988f6ec06f3e44bd39ec6e17c0cf3b07166d172e280d -size 105454 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DarkAgeApprenticeFace_2510119972.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DarkAgeApprenticeFace_2510119972.png deleted file mode 100644 index 70bc1ab8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DarkAgeApprenticeFace_2510119972.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b77c8f007cf5af1bf658f8ab6d3a645abbfb39a12e98dc20898fe514e12750b0 -size 139136 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DashUnderscoreDash_15637848.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DashUnderscoreDash_15637848.png deleted file mode 100644 index 870e5787..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DashUnderscoreDash_15637848.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13188728513f0251b28fb90e090fc4afb5afb6a38447d66421ea2b02c0e1c818 -size 89346 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Daydreaming_29296146.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Daydreaming_29296146.png deleted file mode 100644 index 94f5fe50..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Daydreaming_29296146.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:691ccb02258206581c10ea512441ea918a52048ce5d26fccc1586e9247f9c54d -size 114221 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DdottySmile_667681953.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DdottySmile_667681953.png deleted file mode 100644 index 5d66a6e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DdottySmile_667681953.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd27da649c14a339d8b0f5063c32139bd8dbb7cd6c09e0035cd82bfaf0903b54 -size 106816 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DeathsGrin_880471415.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DeathsGrin_880471415.png deleted file mode 100644 index 456840f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DeathsGrin_880471415.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17812ae4230c36c0f3bec41972cf8e02d3324ceb3c33b6ac12c704aef098b2a7 -size 107493 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DementedMouse_12188176.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DementedMouse_12188176.png deleted file mode 100644 index c8fedc00..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DementedMouse_12188176.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cb241eb3a3da6e36dad7191fc2048bf90d9106136dc7631a34e76d44e649f98 -size 105527 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dequal_17138027.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dequal_17138027.png deleted file mode 100644 index eafa1887..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dequal_17138027.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51c4bcc7742509d0e573df6c4bd83ac42694deacca3bf3d8e8e56861fcf0a382 -size 95328 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DesertCommando_323191683.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DesertCommando_323191683.png deleted file mode 100644 index 28845a38..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DesertCommando_323191683.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c3bbb82399fb16810a53f3162cd954606033f3760685cd031c4685565fbeef7 -size 108674 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DevilNasXLilNasXLNX_7657657626.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DevilNasXLilNasXLNX_7657657626.png deleted file mode 100644 index 85784ea4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DevilNasXLilNasXLNX_7657657626.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e912389ab565a0ec2fde88697b0ba1fb3fab51552f09fc0c1aa24c2edf6c7a1b -size 129020 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DevilishSmile24kGoldn_9156271739.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DevilishSmile24kGoldn_9156271739.png deleted file mode 100644 index 21955245..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DevilishSmile24kGoldn_9156271739.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a758f24a1c5436119dd6de0154d44a5987da5849425fed3e011e69e5cf7f00f -size 131968 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DexsFace_807335973.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DexsFace_807335973.png deleted file mode 100644 index ddc776dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DexsFace_807335973.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d29d373d1b5f41d209a96633eec542897a29b768b818c64588bd8be61fbeb56 -size 99093 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DiamondGrillLilNasXLNX_7657627637.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DiamondGrillLilNasXLNX_7657627637.png deleted file mode 100644 index 7bdae645..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DiamondGrillLilNasXLNX_7657627637.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4ed4e1f4c4359311c28ee6e100dda7b33f96cbf7f4ff021f194cbfe3025abea -size 127983 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DigitalArtistFace_2936946480.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DigitalArtistFace_2936946480.png deleted file mode 100644 index f4d1ce6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DigitalArtistFace_2936946480.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a171b379c97a40d9e151bd733db4d3f2e5b7c7465b488463dd25e0ea23c418d -size 117801 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DigitalShockArtistFace_2936946480.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DigitalShockArtistFace_2936946480.png deleted file mode 100644 index 768fbabc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DigitalShockArtistFace_2936946480.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e1806ad2dba72e3818ded9ee5d8e3ad5b3f204d3050025435137eb341784c5 -size 118515 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DisapprovingUnibrow_66330360.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DisapprovingUnibrow_66330360.png deleted file mode 100644 index a7406873..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DisapprovingUnibrow_66330360.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:264b1ba44d788629f39e624064224dc3e64cb1bac0ef3d5908febeea9f3dbf8f -size 97243 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DisbeliefFace_34186804.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DisbeliefFace_34186804.png deleted file mode 100644 index dad3daf9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DisbeliefFace_34186804.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a99081d9d62158a305a153c1efe0f8f998cca19d6e029da2d74d137f4379e3d4 -size 100570 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Disbelief_20337343.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Disbelief_20337343.png deleted file mode 100644 index 4eaa6f84..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Disbelief_20337343.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34487507e6eb71624fc94d9169c03fc9b91afa7373c8e64ba7250193711a0baa -size 101826 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DistaughtAlienInvader_11913668.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DistaughtAlienInvader_11913668.png deleted file mode 100644 index 4f763fb6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DistaughtAlienInvader_11913668.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd1099f278282f5a0cb10608eaa0078466d677b8ab69447eba6c808b76ceecdc -size 103807 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DiyCardboardKnightFace_2517411290.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DiyCardboardKnightFace_2517411290.png deleted file mode 100644 index 7e55ce80..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DiyCardboardKnightFace_2517411290.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11a29c0d9c9d4ccef35b1811f4e10732b74ec23c5de6df02e55aadd88bb32f2b -size 116963 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DizzyFace_10907551.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DizzyFace_10907551.png deleted file mode 100644 index 163748a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DizzyFace_10907551.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09888145e5f2142134323e03c7890ffc538c9a194d6a1242d9276ebcf35755d7 -size 98560 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DjDatabazeFace_3091071034.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DjDatabazeFace_3091071034.png deleted file mode 100644 index cfe13f3e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DjDatabazeFace_3091071034.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e83b337d7e1634dffcd4b492899d5263c990e8b437193d6f25a91a0aa72628c8 -size 129212 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DollarDotDollar_10831558.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DollarDotDollar_10831558.png deleted file mode 100644 index f8a6d8c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DollarDotDollar_10831558.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14445dfaf37f61b02e84ca75f194e0ea0f630c94070f64ada7307069b65fd4f7 -size 99411 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DominoDeckardFace_6653133806.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DominoDeckardFace_6653133806.png deleted file mode 100644 index b914385a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DominoDeckardFace_6653133806.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a13d9982bd789743f1a076c01bb1e530f585725d5825b94ae5c50317400b1eaf -size 127880 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DontWakeMeUp_343619993.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DontWakeMeUp_343619993.png deleted file mode 100644 index 625e09bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DontWakeMeUp_343619993.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65759166292b7e0325b33f2b5e60b0e598ac3d035eac8033490ae0b9063713c9 -size 107803 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Downcast_21352013.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Downcast_21352013.png deleted file mode 100644 index ed889648..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Downcast_21352013.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:def188cb28095eba26e501411de5f20494b62ea4fa69a59e6097d1264112ef91 -size 101364 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dr.FiaTyfoidFace_3410486318.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dr.FiaTyfoidFace_3410486318.png deleted file mode 100644 index 05ac7786..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dr.FiaTyfoidFace_3410486318.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:647b62863f198c2ae3fd6c25884ef4c4bf423ff247e886814d86ba6346321322 -size 182512 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrBuntonMadmindFace_2807218396.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrBuntonMadmindFace_2807218396.png deleted file mode 100644 index 4c5fcb94..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrBuntonMadmindFace_2807218396.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7bcb34f5d7d1b921fd05962fa89fe59f8b29d2b7b44236f9d47d6a140bb22dc -size 125092 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrLaurenArtifactExcavatorFace_2510140104.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrLaurenArtifactExcavatorFace_2510140104.png deleted file mode 100644 index ec06a6c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrLaurenArtifactExcavatorFace_2510140104.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82b6bd45dbb06adc44781853ef2af2c354a46ebc88e166306f07585931d9e003 -size 119309 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dragonface_12908359.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dragonface_12908359.png deleted file mode 100644 index 12c850e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Dragonface_12908359.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b24d4342d7f133412ce9b2682ffd596dddc0d346d92c1ba1d6e23f12aeb65fbb -size 107429 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrillSergeant_141728899.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrillSergeant_141728899.png deleted file mode 100644 index c3d547ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DrillSergeant_141728899.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd69fdf400713a32704209871b8558979bcc305d7ac7dc8e3692ed8a86c43690 -size 103137 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DroolingNoob_24067718.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DroolingNoob_24067718.png deleted file mode 100644 index 44ed08c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DroolingNoob_24067718.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0a6a5ec14f59a8be1f665a48fdd2525c828f58147047d32120c93966414d051 -size 100818 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DruidOfTheStagFace_3131093524.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DruidOfTheStagFace_3131093524.png deleted file mode 100644 index d6c058aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/DruidOfTheStagFace_3131093524.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e32c9b8e6d6c4f6b3380c82b5ad1b30ae193741767d356b4ae8115d67494d70f -size 126512 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EggCrazed_233616117.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EggCrazed_233616117.png deleted file mode 100644 index 053c03be..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EggCrazed_233616117.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01dcb07c83c3b6d1dbda444e65e7b6a9d157407e542b73b9aa6964fde6452c5f -size 111459 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EggOnYourFace_110207471.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EggOnYourFace_110207471.png deleted file mode 100644 index 66fb661c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EggOnYourFace_110207471.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c02edb8db0f277a94445e9bf5ec16d0343d0258218084abe6a2b265b5cefe33c -size 112773 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EitaTheEnviousYoukaiFace_3210252000.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EitaTheEnviousYoukaiFace_3210252000.png deleted file mode 100644 index 9b3c76c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EitaTheEnviousYoukaiFace_3210252000.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c194327305566213ff42461febba9f5155ae0e0ae798cb599718de66da1db21e -size 124023 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ElegantEveningDressFace_4916129740.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ElegantEveningDressFace_4916129740.png deleted file mode 100644 index 4de0d57b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ElegantEveningDressFace_4916129740.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:248107544e4f18c623110d2368dff9ae06899d6485ec44361451ba3391026e40 -size 123509 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ElfGuardianOfTheNorthernBorderFace_2510329394.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ElfGuardianOfTheNorthernBorderFace_2510329394.png deleted file mode 100644 index 85cb55b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ElfGuardianOfTheNorthernBorderFace_2510329394.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ae69d5ba02c8725fe782739885dd0d31d8105fab21fbb41379f7d3206bfb44f -size 99901 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Embarrassed_21272995.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Embarrassed_21272995.png deleted file mode 100644 index fdf43058..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Embarrassed_21272995.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1f74f7d93293a34457deceacc89ea26a57014d32f81ae59025dadf33ee2e8b3 -size 112805 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldAmbassador_66330060.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldAmbassador_66330060.png deleted file mode 100644 index 8b9ea032..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldAmbassador_66330060.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66ffa2e04f9c39572d68d5fa488a45ddf213c324fc01dbfd07dd0637eb2c26ba -size 101260 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldArchfeyVisage_2830499980.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldArchfeyVisage_2830499980.png deleted file mode 100644 index f75eba3e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldArchfeyVisage_2830499980.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69a2e553216b9dc7966e943598e6c2a19faf72392407a1592a21d0a9a460d0db -size 130413 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldEvilEye_1016185535.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldEvilEye_1016185535.png deleted file mode 100644 index 25ed4f41..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldEvilEye_1016185535.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7257a7cece83be4b84e5fac1112a53f6bf6336c52aeb9e75405b2d96296c8d9c -size 113604 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldLaserVision_66330165.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldLaserVision_66330165.png deleted file mode 100644 index 7fd7a27a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmeraldLaserVision_66330165.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6cac4eb65ffe995ab63299ba1017589072b62d11d0d13dc453a5a07b8447083 -size 98553 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmotionallyDistressedZombie_7506136.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmotionallyDistressedZombie_7506136.png deleted file mode 100644 index 5f6484e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EmotionallyDistressedZombie_7506136.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55294eec3355bf0704cfd112f33ed9324088c180aab7fb29d26f3f4f565718a6 -size 105170 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Emperor_25267538.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Emperor_25267538.png deleted file mode 100644 index 687424de..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Emperor_25267538.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62234947172ac23d021d7d636768862a29e1ba12159b181424ddb39c7098e9b9 -size 108905 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EpicFace_42070576.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EpicFace_42070576.png deleted file mode 100644 index 25d781a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EpicFace_42070576.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e08d4f701dd1f4b120f992da05102330dab6a6d573b2a452bb23a9859a69881 -size 112751 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EpicVampireFace_181651981.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EpicVampireFace_181651981.png deleted file mode 100644 index f69e672f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EpicVampireFace_181651981.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b46f09d53fda76abad1fc10c9d460686b9a22b29d455e9adebb128d2284741c8 -size 112789 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EqualCloseParenthesis_14817393.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EqualCloseParenthesis_14817393.png deleted file mode 100644 index 286a7df1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EqualCloseParenthesis_14817393.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39c24d949c71f98c61e50053a2d33ad7e481e3b4822ec4987a7765f219946ac9 -size 97473 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ErisyphiaFace_3141356565.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ErisyphiaFace_3141356565.png deleted file mode 100644 index 7d1dbc0b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ErisyphiaFace_3141356565.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:038ecaa6ea719dfb4f9384e1025ca608f5ed9e0eeb4c41194af74951698826be -size 122851 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Err_20418658.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Err_20418658.png deleted file mode 100644 index 843b5e12..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Err_20418658.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90b2868ae7c37897048c4f0be68553cef3c615dfdab85f2b20c84497e2b0e4f8 -size 97262 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EvilSkeptic_110336757.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EvilSkeptic_110336757.png deleted file mode 100644 index 773bec94..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EvilSkeptic_110336757.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:538f536519acca1a0b49fd02851227aa44fbe4572c5965b8e1055515b40dd9ff -size 101005 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ExclamationFace_35168581.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ExclamationFace_35168581.png deleted file mode 100644 index a70f97f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ExclamationFace_35168581.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d43fdadddee8984c674c0a43a8f80ea18ebc74ad5fe68f43b21619e158bb6063 -size 103849 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ExistentialAngst_7074814.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ExistentialAngst_7074814.png deleted file mode 100644 index a59b015f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ExistentialAngst_7074814.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5be8553e58ccd1d73d9aeafa8bdfab2d7fb283988d253ed7ff15aafdac7d314 -size 100810 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Extreme_10831454.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Extreme_10831454.png deleted file mode 100644 index d238c210..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Extreme_10831454.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b19503c399aec1806814847e19555802beb8ee557389fd593f14cf2b5ab2c856 -size 105840 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EyesOfEverflame_362051773.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EyesOfEverflame_362051773.png deleted file mode 100644 index 4f61d08a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EyesOfEverflame_362051773.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:428f1578077ae1d0aeb1d50f81e601f46085603c8e8cfef223a3c95d03d6cabe -size 110393 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EyesOfEverfrost_22972723.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EyesOfEverfrost_22972723.png deleted file mode 100644 index a1de6e7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EyesOfEverfrost_22972723.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1730ce5800adb4abee5b24f547b609eb3bf576d2e2ad0e23cd474ee32c44bdae -size 110483 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EzebelFace_293303927.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EzebelFace_293303927.png deleted file mode 100644 index d091b907..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/EzebelFace_293303927.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49f160b0cf82eacf0c8ee911641ec703abe41da5ad002e8e7fcc7dae9fb272a5 -size 111159 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Facepalm_30394594.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Facepalm_30394594.png deleted file mode 100644 index be048728..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Facepalm_30394594.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1428390b2f5968a0086154cb5e3924a38efac7c08517cd897253cdd209665bb -size 123135 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FancifulLeprechaunFace_2907641479.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FancifulLeprechaunFace_2907641479.png deleted file mode 100644 index c7f78123..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FancifulLeprechaunFace_2907641479.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:608447932c230dc4c6a121b95c0fe2ea6c5bd62caf06502822308b79529d5e88 -size 119644 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Fang_7075142.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Fang_7075142.png deleted file mode 100644 index 17b9e3a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Fang_7075142.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fb26be4989d14f9c6c41997b4736fff4edc14407a3ed260f594b61794f48b76 -size 102111 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FashionFace_2274764091.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FashionFace_2274764091.png deleted file mode 100644 index 277e86ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FashionFace_2274764091.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afc060497314f632895b7c1aeb1c8f513dade6fae1739192f92c4cf9529d9456 -size 115903 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FastCar_22587894.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FastCar_22587894.png deleted file mode 100644 index 12f0c04c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FastCar_22587894.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b1b92d7dbac9e8375fdd8da3556ff24e67615313612cb844d8dbc8698f7181d -size 110113 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FawkesFace_134522901.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FawkesFace_134522901.png deleted file mode 100644 index 933ef2ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FawkesFace_134522901.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69f0744b41b6b657a71909fb14faddea6e7538be4aaceabc7561dc033df08620 -size 116768 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FearlessOceanDiverFace_5238862364.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FearlessOceanDiverFace_5238862364.png deleted file mode 100644 index 3afde7d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FearlessOceanDiverFace_5238862364.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d98c28b98677cdee5789b186992d3440be89c136c1d13eeb93d87f04cf7d47d4 -size 120609 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Fearless_7074991.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Fearless_7074991.png deleted file mode 100644 index 24126201..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Fearless_7074991.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faebf468896a81b41ad61ac15f0860719c181d076c58145170e452775257b4d9 -size 106723 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FestiveBeekeeperFace_2553407112.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FestiveBeekeeperFace_2553407112.png deleted file mode 100644 index 60fbe7fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FestiveBeekeeperFace_2553407112.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77944f04d0150b5bf6eeaa2203e4cf4b07a0d1fbe8fb87794acc8931e4d27b0b -size 121549 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FinnMcCool_10907549.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FinnMcCool_10907549.png deleted file mode 100644 index 301c8227..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FinnMcCool_10907549.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3308b6654c7b455446542124500bd8ed2f2ced5556425390cd036a703943a847 -size 101240 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FootballPlayerFace_2773409880.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FootballPlayerFace_2773409880.png deleted file mode 100644 index b6c40f27..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FootballPlayerFace_2773409880.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1864dc32be169fe77c6971ecf1e6f8f07980518627252ab41e2832b8fd4e38b -size 123688 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FreckledCheeks_25556219.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FreckledCheeks_25556219.png deleted file mode 100644 index a02fdf85..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FreckledCheeks_25556219.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46082e7b43b93331399384f98d401ac2826ea5c24d1414761628b3e0fc716a2e -size 103600 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Freckles_12145366.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Freckles_12145366.png deleted file mode 100644 index a6a4aec4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Freckles_12145366.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fed052cfdca9bb8e09963ddca6f454c746dc6c0175d9d014593f83ae8637a23 -size 106229 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyCyclops_30394438.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyCyclops_30394438.png deleted file mode 100644 index dc6f273c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyCyclops_30394438.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6affe0dddcdbc78ddc6b78650e52f00e01587293cf04ebf9ff36c7dbc49d0558 -size 107085 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyGrin_25321961.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyGrin_25321961.png deleted file mode 100644 index 05f99a12..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyGrin_25321961.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a919aab12931b772692b72e3aefe1489b75acc339f256cac35ecd7a8a8ed2ecc -size 101218 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyPirate_19366445.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyPirate_19366445.png deleted file mode 100644 index cea1c65a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyPirate_19366445.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5778f2b721434a2ee6bed82dbd8ba2849f6f24b22cc5b0894925e2993cd73c39 -size 108661 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyPuppy_27725434.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyPuppy_27725434.png deleted file mode 100644 index 1371e0f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyPuppy_27725434.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a040d5cda5312b9c04dd5e108a1dd36ddf42126b7b2e97271b1daa10cf18f793 -size 110638 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlySmile_616381207.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlySmile_616381207.png deleted file mode 100644 index f3b3e57e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlySmile_616381207.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:782666ceefc18b983f3763a54994320fe874eeab2b4e8c71612fa5a18edc7b85 -size 110494 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyTrustingSmile_402304145.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyTrustingSmile_402304145.png deleted file mode 100644 index 23e7cbb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FriendlyTrustingSmile_402304145.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ec6e6ffc6743ece18bf1cad5283837efada55a9075a84660185e62d2da9c497 -size 103702 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FrighteningUnibrow_8560985.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FrighteningUnibrow_8560985.png deleted file mode 100644 index f52dc028..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FrighteningUnibrow_8560985.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c03dbafc18d134a74e907d3e5c9282b18443fa9fed4d6828ea98c321da74e7d3 -size 105708 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Frightful_7699193.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Frightful_7699193.png deleted file mode 100644 index 92f05210..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Frightful_7699193.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1b67d9bc2756c95c60e31a286c6f6a4ff1ff9dc7e89a8069d3e08acaf1b9629 -size 105778 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FuriousFinnFace_295492723.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FuriousFinnFace_295492723.png deleted file mode 100644 index e0dc5ed7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FuriousFinnFace_295492723.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a962bae5ae8354eefefc45ff6ec647274393644928fd58e13640f16c9a9c297c -size 115670 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FuriousGeorge_277950647.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FuriousGeorge_277950647.png deleted file mode 100644 index 08b3e34e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FuriousGeorge_277950647.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63e86670d6714488639b2af5f6d1e72b172847d7226f31dda16fb00db0cad933 -size 103664 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FutureglamBountyHunterFace_3013806177.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FutureglamBountyHunterFace_3013806177.png deleted file mode 100644 index 78a3a7c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/FutureglamBountyHunterFace_3013806177.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c6bae8935a683bf2ea01e6d233634dbdbf23939a17ed7a4c1eef2c8ae644ce2 -size 122076 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GenniTheSnailKnighterrantFace_2628039027.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GenniTheSnailKnighterrantFace_2628039027.png deleted file mode 100644 index 314da530..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GenniTheSnailKnighterrantFace_2628039027.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a2c843099d4012c2d6dc9a0e9e960f8c83694b14d2bdd5b0019d2e0cc6a6924 -size 120387 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ghostface_12467159.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ghostface_12467159.png deleted file mode 100644 index 607a160a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ghostface_12467159.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a78e44745e5b9573b46870207980e0492471a4a8f0675ee56ec48dd5f112e9c -size 100169 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Gigglypuff_35397243.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Gigglypuff_35397243.png deleted file mode 100644 index e2093354..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Gigglypuff_35397243.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55bf704e166f8e4cb60313e8c355b5e924e5d25e726226fc281b317f7d7e9608 -size 105073 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Glee_7074729.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Glee_7074729.png deleted file mode 100644 index 35810c74..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Glee_7074729.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df3b4c9b5c441bf3f37f9d38f4c66fd78ecd401c6cfc0db54815069c6b27d128 -size 104491 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GlidedDiverFace_5238862364.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GlidedDiverFace_5238862364.png deleted file mode 100644 index 47f209bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GlidedDiverFace_5238862364.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3a9a3f8a7a94bb4ecf35e9d31752e8df73a46850eaccec0152e23744aebf1f0 -size 120633 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GloryOnTheGridiron_21802396.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GloryOnTheGridiron_21802396.png deleted file mode 100644 index 4cc0fa7c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GloryOnTheGridiron_21802396.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c309a591cb58f6a0fed975385e1b1cf23187c61c3fe7201148d684f52fa9caa4 -size 106067 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenBlingBraces_1191136166.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenBlingBraces_1191136166.png deleted file mode 100644 index bc9f8e7c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenBlingBraces_1191136166.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8904ef1fe17795ce59749d964608d0f05cfd431808741224af10774bc0275bbc -size 102279 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenEvilEye_1016185809.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenEvilEye_1016185809.png deleted file mode 100644 index 609f7eac..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenEvilEye_1016185809.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abd056b3a3723fffc3267b81b8719c74dd8286e06b47616c0397098fb010f8bd -size 113975 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenEyes24kGoldn_9156275069.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenEyes24kGoldn_9156275069.png deleted file mode 100644 index ab029172..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenEyes24kGoldn_9156275069.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d384633cb2d21daf6b981e9d6e0ea2dbb14e8418cbb64fb03f60cb5e50295262 -size 154589 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenLightningSpeaker_66330231.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenLightningSpeaker_66330231.png deleted file mode 100644 index 19a38096..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenLightningSpeaker_66330231.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95f51daaf9277782d9ff9724beb9de9ed98e82059c3e789762e4379ad0ada859 -size 101750 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenShinyTeeth_66319941.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenShinyTeeth_66319941.png deleted file mode 100644 index e497f468..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoldenShinyTeeth_66319941.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe1b72e30bec48c4b74adc24d94c3dcfdca2bc1f750c0e704ff9c42fde8826c3 -size 106808 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoodIntentioned_7317793.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoodIntentioned_7317793.png deleted file mode 100644 index f22b1c39..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GoodIntentioned_7317793.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a7db8be8b54c75080af71398281109e9c46e5a03872ca116acaab1b14436108 -size 104912 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Goofball_27134344.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Goofball_27134344.png deleted file mode 100644 index 9d08ed43..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Goofball_27134344.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:457da6f44e5e82ab16a932739d65392022757f2963a06dacaabe8a12cdd5da92 -size 121781 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrandmasLipstick_51241480.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrandmasLipstick_51241480.png deleted file mode 100644 index cfd46e0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrandmasLipstick_51241480.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b693cc99d5d9897ea7c8235dee22ad73a85cdde2b515e9e28111c48e67d2bf94 -size 108183 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreaterThanUnderScoreLessThan_15324577.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreaterThanUnderScoreLessThan_15324577.png deleted file mode 100644 index a40ecc96..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreaterThanUnderScoreLessThan_15324577.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cfff70e0b080046e1b2bb3d900f8505c310869a6fc2301e02d66e5d191fad54 -size 96960 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreaterThanUnderscoreGreaterThan_16387711.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreaterThanUnderscoreGreaterThan_16387711.png deleted file mode 100644 index 30d8246c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreaterThanUnderscoreGreaterThan_16387711.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e0118fa0f14cad67a3e49f36f938b96beec31973f7e5b71d11dd1f24d3b8744 -size 97131 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenAmazeface_835094544.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenAmazeface_835094544.png deleted file mode 100644 index 496383a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenAmazeface_835094544.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a31a94f690abaf10fba762375353a6c12ee966d9b589bbdac566c3dc9844f9aa -size 108550 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenBubbleTrouble_380754227.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenBubbleTrouble_380754227.png deleted file mode 100644 index e5476676..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenBubbleTrouble_380754227.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a44601d2b0cbaa341c5f6ebca73977c4c2fe6ef21115b4b1e4e47ef6c8ca596 -size 109450 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenDroolAngryZombie_406001532.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenDroolAngryZombie_406001532.png deleted file mode 100644 index ac163796..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenDroolAngryZombie_406001532.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90b29b601f7a4e0f16dee33e8f55b638acd647c4bb6eb9b6231da86cf1f9298c -size 110648 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGalaxyGaze_440739783.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGalaxyGaze_440739783.png deleted file mode 100644 index 48e0bc1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGalaxyGaze_440739783.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1013792aef82255ad675b37cf37dd6674436a17f6551158806b4427563724a2 -size 107810 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGlowingEyes_398676450.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGlowingEyes_398676450.png deleted file mode 100644 index 1f55831e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGlowingEyes_398676450.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f37da1404184aec680d27b5984a2a048c5593604a768f431535282466389cb1 -size 103906 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGoof_1191162539.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGoof_1191162539.png deleted file mode 100644 index 0abcab48..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenGoof_1191162539.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:833504f53d956900e26bd235dfc2c3445ad6c06c381aeb8f6261c8edcf9e3a54 -size 112056 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenStarface_119812738.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenStarface_119812738.png deleted file mode 100644 index 2c9711fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenStarface_119812738.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a495d7f087370c9c7fba160bb92d63de4f5f8985f97f1e2aa6bbb06f0072b21 -size 111734 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenSuperHappyJoy_323191596.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenSuperHappyJoy_323191596.png deleted file mode 100644 index 57021e26..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenSuperHappyJoy_323191596.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4124532bc902968c0c6a8d1ddaf0f15bc66ce84f1158caf79970c7a16ca0e1b4 -size 115232 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenTrance_260303894.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenTrance_260303894.png deleted file mode 100644 index 60cf3b69..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenTrance_260303894.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0de6e1d8136c6d5fba6505b3700801b7261eb806f8aed3e98cbcdb228c089b1 -size 111089 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenUltimateDragonFace_1772531407.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenUltimateDragonFace_1772531407.png deleted file mode 100644 index e4a11514..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenUltimateDragonFace_1772531407.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e563479bd347318a501c99f4ef6eca590bf0236b182b9a1dabed91919aaf6f5b -size 120265 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenWhatchooTalkinBout_323191787.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenWhatchooTalkinBout_323191787.png deleted file mode 100644 index 4787aa6c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenWhatchooTalkinBout_323191787.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69b2101ba12ae4db4ea633f2a563ead991a0fa672d397601c3ec539b7e03639c -size 103045 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenWistfulWink_583722932.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenWistfulWink_583722932.png deleted file mode 100644 index 04011202..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreenWistfulWink_583722932.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0238fbbe8b77f36b7719743f8ea8db77b58b643e4bce1498d9ea5d32b8a9a35 -size 105596 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreeneyedAwesomeFace_66330144.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreeneyedAwesomeFace_66330144.png deleted file mode 100644 index 406c2b14..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GreeneyedAwesomeFace_66330144.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a271329581f615442b7766ed4c1de0dc16bd9d076cc6e945f51e431b5a448de0 -size 108229 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrittyBombo_406000562.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrittyBombo_406000562.png deleted file mode 100644 index ccc17332..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrittyBombo_406000562.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:731c270531b45dd5f9f88af016b8c519e9a10bf8e1574f5b99b9739575e8b4f7 -size 122974 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrumpyBlox_173789498.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrumpyBlox_173789498.png deleted file mode 100644 index 511163b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GrumpyBlox_173789498.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c919c6211cf9dca3c34d3b5a876702527c3ecff08cce5795499df85607963b8 -size 94463 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GwenAxeAngelRosewoodFace_2859557339.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GwenAxeAngelRosewoodFace_2859557339.png deleted file mode 100644 index 1a99f3cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/GwenAxeAngelRosewoodFace_2859557339.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:983f643c574e9394d03a0dba139c408966988010980b850af759962a5be70568 -size 119975 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HappyGirlFace_293226229.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HappyGirlFace_293226229.png deleted file mode 100644 index 542b0a14..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HappyGirlFace_293226229.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b0afb6823623e376c1d9660ca04a93f3c26d0492695bccfe0e862ef499956de -size 101808 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HappyWink_236399287.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HappyWink_236399287.png deleted file mode 100644 index bebce8d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HappyWink_236399287.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba5c9e88117ac2d2a16acb2fd2ee8ae2e77f040cc3b313f9dfca49798a18f007 -size 108937 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HeartGazeZaraLarsson_7893468574.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HeartGazeZaraLarsson_7893468574.png deleted file mode 100644 index 707f668a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HeartGazeZaraLarsson_7893468574.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c1f816d8f9b22d9abe837f5e4376d9153b605db6faa4b7252904b8767066f1a -size 139487 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Heeeeeey_21635565.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Heeeeeey_21635565.png deleted file mode 100644 index b99bbb00..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Heeeeeey_21635565.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9cb0e424f2ff5513124d027f26703f3a61866b85bd5ea761586f380d204d26b -size 100957 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hilarious_27861352.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hilarious_27861352.png deleted file mode 100644 index 9f9e9321..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hilarious_27861352.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01fc31abf993ab68b3309817889203618a31ee3150c25a78c33e1bf6e88357f9 -size 108422 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hmmm_7076076.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hmmm_7076076.png deleted file mode 100644 index 54567e54..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hmmm_7076076.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46684f15e9279d6e9fbfcad6f5bfc2bf785c17f02b9ac31b2082299e01858c62 -size 97838 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HockeyFace_142464206.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HockeyFace_142464206.png deleted file mode 100644 index 9d685c8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HockeyFace_142464206.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:002f9a63b7598e00cb67f8a073543590ea70a949e0b281608d285334e8f7cc01 -size 103889 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HoldItIn_2222771916.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HoldItIn_2222771916.png deleted file mode 100644 index 2d9c8bb0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HoldItIn_2222771916.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec9d7e5773342c6a6d7062fc426b6506b043c0463c6f0d1e6065bde6c7209532 -size 100717 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Huh_150182466.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Huh_150182466.png deleted file mode 100644 index f0e437c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Huh_150182466.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef695db1b9c44fcd78e841b8bf383aa52ed1c779655608b808d4b1addf0705f8 -size 108982 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HutHutHike_15470849.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HutHutHike_15470849.png deleted file mode 100644 index 00f14456..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/HutHutHike_15470849.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb88fce8fd382d614b9f4ead0d3833b2769d765128609b30a14c228af7a80181 -size 102339 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hypnoface_10770436.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hypnoface_10770436.png deleted file mode 100644 index 9ea250a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Hypnoface_10770436.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6328dcae07af31e47c779f89777bdded27ec88e90173e9227b25d74b12b4ffb2 -size 105074 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/I3NewSiteTheme_32723404.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/I3NewSiteTheme_32723404.png deleted file mode 100644 index 568192ff..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/I3NewSiteTheme_32723404.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19a6695fe933a9ab274ef3ce3a996e6b3c2705c84c0681dffe3cc8bc3e5943c4 -size 101464 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IAmNotAmused_7131886.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IAmNotAmused_7131886.png deleted file mode 100644 index 7e419b6b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IAmNotAmused_7131886.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8499deb359d3bf96379ea5872e1b98689349b0655f8e2237cd764c226f3c45a1 -size 107166 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IDidntEatThatCookie_116042990.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IDidntEatThatCookie_116042990.png deleted file mode 100644 index dcb70f20..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IDidntEatThatCookie_116042990.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a5fb2832089dd3558a2c8f822b74bc11861099f00610a445b5f85ec1f55cfd5 -size 108023 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IHateNoobs_14030577.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IHateNoobs_14030577.png deleted file mode 100644 index d220b77a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IHateNoobs_14030577.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e7c734096e18c66ecaa44b955491153055740d5fdd64da700792cd433eb3121 -size 92685 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ILackPersonalConfidence_7506144.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ILackPersonalConfidence_7506144.png deleted file mode 100644 index 0ec068d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ILackPersonalConfidence_7506144.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76cc47bc5267fedde4e7f1cd8da5d324e99422547ab9a649fa66c2aa0c79fbec -size 106005 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IWuvU_10907545.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IWuvU_10907545.png deleted file mode 100644 index 4fa9458e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/IWuvU_10907545.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a44c607c44d613b4363e5ae89f6f3d3ccb3577cd3233aeba88c6e9dcb2418b8 -size 106982 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Iface_100290429.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Iface_100290429.png deleted file mode 100644 index 6d3fe29c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Iface_100290429.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f716aae9024436ba986d62f467f904734053d7a4b1d15e29a9babf3b3337c066 -size 112278 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ilovefootboll_15470861.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ilovefootboll_15470861.png deleted file mode 100644 index fb44ac38..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ilovefootboll_15470861.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85eb2d00e765bcfd66dbb0ca2ea9db5620052a68a46ea2efeaf4d99b21319ca0 -size 96773 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Imagine_30394316.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Imagine_30394316.png deleted file mode 100644 index 9c8e3ccf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Imagine_30394316.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a4489130dfc455ea3723b7555648905e49ac791a6f459dd6ef55334c6de680d -size 108011 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Isabella_7243933492.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Isabella_7243933492.png deleted file mode 100644 index 4111c9bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Isabella_7243933492.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9c888d921fe61b4268f5ac30282b758ccefc2f18d9ceed203b824d8eb302b73 -size 136400 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ItsGoTime_7506141.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ItsGoTime_7506141.png deleted file mode 100644 index 3ec149b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ItsGoTime_7506141.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b8810a4e1008e8264535c2e15306da2ee11074a0b63b05c7a72991d4479eba0 -size 107350 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ItsSoBeautiful_26674400.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ItsSoBeautiful_26674400.png deleted file mode 100644 index 31a2b219..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ItsSoBeautiful_26674400.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2169076149e7f79d0debe3c50e3741be1fd35f182a3c8fc24e84021ca049b264 -size 110095 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JackFrostFace_19396123.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JackFrostFace_19396123.png deleted file mode 100644 index 667626a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JackFrostFace_19396123.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:657083db9dd68bab30159e74b17c6fe74301f2dca7cf8892dde4ff7c723566d0 -size 105461 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JacobTheStormBreakerFace_599913343.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JacobTheStormBreakerFace_599913343.png deleted file mode 100644 index acacb793..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JacobTheStormBreakerFace_599913343.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f18ad478f04ac1d1e38216904b705e7897d6cde9c2563557b0dd953f1535b07 -size 98999 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JesterEquinoxFace_2962660233.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JesterEquinoxFace_2962660233.png deleted file mode 100644 index ac9d8237..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JesterEquinoxFace_2962660233.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa5f3c3fa13b7ce54eb056c0d7632513420f5a47f0fcd9b2d2e50e145a0c790a -size 110659 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JohnsFace_301827199.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JohnsFace_301827199.png deleted file mode 100644 index ddc776dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JohnsFace_301827199.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d29d373d1b5f41d209a96633eec542897a29b768b818c64588bd8be61fbeb56 -size 99093 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JoyfulSmile_209995366.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JoyfulSmile_209995366.png deleted file mode 100644 index e4e92d4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JoyfulSmile_209995366.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e4c8058d9ab4949a765304d78d0eccad9851971f6c0bd4abee5c8fffcdcceb7 -size 104714 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JoyousSurprise_28999228.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JoyousSurprise_28999228.png deleted file mode 100644 index 9003682e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JoyousSurprise_28999228.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:678dfcd2a9b1ada78535719dbfc2a898823f008b5da89b64ed41fee87c6d6dc8 -size 106430 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JungleCommando_16678138.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JungleCommando_16678138.png deleted file mode 100644 index 08e5a6a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JungleCommando_16678138.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f1f8cc1bb14ec496e590cac05fdf52d25560596944aca75a0c9f23ba3c7e38d -size 107768 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JustTrouble_244160766.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JustTrouble_244160766.png deleted file mode 100644 index 747e690d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/JustTrouble_244160766.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4236c207431e10a356cd72678235bf9d82b392b147282e0eebff186e07e3a7e6 -size 104604 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KandisSprinkleFace_8666865667.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KandisSprinkleFace_8666865667.png deleted file mode 100644 index b1690b53..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KandisSprinkleFace_8666865667.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3120701708406cccf9fc0a60746de3d249d5ac11c5883d2760c4de74e5886af -size 139303 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightOfChivalryFace_2510299324.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightOfChivalryFace_2510299324.png deleted file mode 100644 index aa1fda40..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightOfChivalryFace_2510299324.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cd8464981e12313c69a2965f3266275019c15bfaa9ab7b83ffc474d712febe4 -size 93338 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightOfSplinteredSkiesAscendantFace_2506721000.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightOfSplinteredSkiesAscendantFace_2506721000.png deleted file mode 100644 index 21ed90ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightOfSplinteredSkiesAscendantFace_2506721000.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:760b4288bacf2c47540964c7cfb1d86d7c508df8e35caefb0c89bdb3ccac682a -size 157656 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightofCourageFace_2535711033.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightofCourageFace_2535711033.png deleted file mode 100644 index 1f1a1716..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnightofCourageFace_2535711033.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d50701655ae775b3ee6ce9ccf7b543ce5a4831b414f293534fac375a3b78465 -size 108060 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnowitallGrin_26424808.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnowitallGrin_26424808.png deleted file mode 100644 index 0db3eba5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KnowitallGrin_26424808.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:959b57e170aa6a47df87b8bac866cb9864b385ac8465de272895c6a5f5a361a6 -size 113592 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KrezakFace_293309580.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KrezakFace_293309580.png deleted file mode 100644 index ddc776dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KrezakFace_293309580.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d29d373d1b5f41d209a96633eec542897a29b768b818c64588bd8be61fbeb56 -size 99093 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KromaBlitzFace_2979689790.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KromaBlitzFace_2979689790.png deleted file mode 100644 index 0350ab52..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/KromaBlitzFace_2979689790.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ce3c3e653f6023ded7002184205aef80f79e6d93805fbf989d2d45bd417e064 -size 145810 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LadyDarkshadeFace_2807183388.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LadyDarkshadeFace_2807183388.png deleted file mode 100644 index a83ab54b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LadyDarkshadeFace_2807183388.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2a4838c1372bd1dad9c62b6e189b52ae2f6c488f8f5e7e8d42a318e3b60dae9 -size 125127 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LadyLashes_29348122.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LadyLashes_29348122.png deleted file mode 100644 index 42a78aed..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LadyLashes_29348122.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e855e886c499e699b3f24f59d6e1dc9d8d434fc7d28d7578a514a4182a5ef5a9 -size 118390 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LaughingFun_226217449.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LaughingFun_226217449.png deleted file mode 100644 index b01788ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LaughingFun_226217449.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45ca18dbe4b147f7ae262167264373fb4ec80dc4361b12a5afae48269e996168 -size 104858 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LavenderAmazeface_835095306.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LavenderAmazeface_835095306.png deleted file mode 100644 index 46366e6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LavenderAmazeface_835095306.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e6a17d3f4676dcc546fd64bfe3138735169485411f253d4cb8bdfe57fff8c82 -size 106356 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LazyEye_7075502.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LazyEye_7075502.png deleted file mode 100644 index f88adc25..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LazyEye_7075502.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d46cafed5af96db426c7998f183883b7f295095e48918875d15d2f5ef872f52d -size 97684 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LightningSpeaker_22588801.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LightningSpeaker_22588801.png deleted file mode 100644 index 2c49c2d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LightningSpeaker_22588801.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6aaa62f59ef087bc7e1f76215ec6720653193620a23520bbac86804dc48cc7fe -size 101150 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LinsFace_301826803.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LinsFace_301826803.png deleted file mode 100644 index 4fa5cf96..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LinsFace_301826803.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b53c7d2c91b2c3026dac7e2e70c16ee430488702f9fe120eb10b045213385f8 -size 106904 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Lion_11956548.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Lion_11956548.png deleted file mode 100644 index 70aa5621..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Lion_11956548.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:928b4f666fe8ef026d8259a07523baffe0a0c0f6bf337a9e0bcdaa2cac9d4fcb -size 116717 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LookAtMyNose_23311761.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LookAtMyNose_23311761.png deleted file mode 100644 index 951f64d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LookAtMyNose_23311761.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55375ca5ef25ebab46274d61d247a446eb9abaca45e2c272567bc4b5689abf47 -size 110892 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LynnFace_2610492664.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LynnFace_2610492664.png deleted file mode 100644 index 59081812..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/LynnFace_2610492664.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97f5579f0f69e92a315545f5acf3e42bce3b3a53564669448ab369308c77b500 -size 104294 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Madbot10000_554658475.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Madbot10000_554658475.png deleted file mode 100644 index d1ebf214..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Madbot10000_554658475.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee4733ce0b9a1198b3ccfcdaa3363a614f57c484d94511394cc6311ba3de308d -size 101502 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MagicalDragon_34871168.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MagicalDragon_34871168.png deleted file mode 100644 index 2d1df42c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MagicalDragon_34871168.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee11486074bc622fb3eaeaa639df1696701e7a6ab4804ae4bf858b8177db99d3 -size 118329 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ManFace_86487700.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ManFace_86487700.png deleted file mode 100644 index 9b00cf02..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ManFace_86487700.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afac6adddbac65b4ba21b85e8154f1e476adbd5ca690fe00372b3a90bbbd7efb -size 114506 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Manicbot10000_554663566.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Manicbot10000_554663566.png deleted file mode 100644 index 8d5cf804..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Manicbot10000_554663566.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bacf09ca2b75c822aa2ff777e4956fc052ebf575c93e5e148668bab64292f556 -size 101773 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ManlierFace_76383151.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ManlierFace_76383151.png deleted file mode 100644 index e240b7ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ManlierFace_76383151.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05c7ce96873b0525980f8d0bf4a4d627259f20d8c244314edaaaa1e7e46bce1e -size 113943 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Masque_22432782.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Masque_22432782.png deleted file mode 100644 index dac7ba07..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Masque_22432782.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e6a24531db0d9333d820bc6b5f15d8e3af2559f48273d6229ab4b6fd156d064 -size 116826 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MclarenBigGrin_9062637857.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MclarenBigGrin_9062637857.png deleted file mode 100644 index c0ab23a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MclarenBigGrin_9062637857.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f9590d69b49e0309a8314c4bf31c44616f3af8d2c1e7cd055c95ea71d87ab67 -size 120638 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MclarenSmile_9062620353.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MclarenSmile_9062620353.png deleted file mode 100644 index 2f8fd6bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MclarenSmile_9062620353.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8ac67991257b4200898dca0bd73cd0719f7221172a66f07a447c448a9d661d8 -size 124846 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Meanie_9250643.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Meanie_9250643.png deleted file mode 100644 index 60a2f19f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Meanie_9250643.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b2314d9fb8aad07f473c4b6f727577dfb28bd3dc57c80ae3b639a9dc27da581 -size 99094 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Meow_10907529.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Meow_10907529.png deleted file mode 100644 index 4db586dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Meow_10907529.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84d7ce6c49cb6ecbbffab14e6c5ec0a376dd9b805b3bf932fa7ecc9cd88d3bec -size 117494 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MercilessNinjaFace_6652985701.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MercilessNinjaFace_6652985701.png deleted file mode 100644 index 5c555996..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MercilessNinjaFace_6652985701.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ceadd929bda1e391856221d92dbedbb4afbd06de05c976a0da581559899c803d -size 129163 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MermaidMystique_8664096393.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MermaidMystique_8664096393.png deleted file mode 100644 index 3cdb1415..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MermaidMystique_8664096393.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ee135b68fd5ee962fd011488155f38154eaa63c3165eca62eb08a59b26c89b9 -size 137540 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MickMccann_23264604.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MickMccann_23264604.png deleted file mode 100644 index 90f29841..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MickMccann_23264604.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b089bb13a463d53af7b5c90015754d314f02b2488ebb7060ba75d44a479b5ff0 -size 106763 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MildlyIrritatedFace_280988393.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MildlyIrritatedFace_280988393.png deleted file mode 100644 index c89d6e27..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MildlyIrritatedFace_280988393.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e96a404ee5f890c58ff5c6940a0e4e86901ecf4edf17d5c5ea90b5b9137c2fd -size 114386 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MinervaBrightFace_2608317303.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MinervaBrightFace_2608317303.png deleted file mode 100644 index 01fbdb70..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MinervaBrightFace_2608317303.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:142b4f9d688bf63c2a64893a7ab9cbd788bbe0f254150f6dac75fdb4f4a29025 -size 124634 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Mischievous_9250654.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Mischievous_9250654.png deleted file mode 100644 index c7a69f47..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Mischievous_9250654.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0137870ff88ddedc7665c19d08d072ca8a66729962805c8496344ee1b7399635 -size 106508 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MissScarlet_334656210.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MissScarlet_334656210.png deleted file mode 100644 index 997aa7e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MissScarlet_334656210.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:050c20c0a86271f91670ed2607d7f3c94d5ed8873567b33f9625cff3c16c674c -size 105146 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MixologistsSmile_4645966393.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MixologistsSmile_4645966393.png deleted file mode 100644 index b13a54e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MixologistsSmile_4645966393.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b4048dd273b66530e9fa1f0803ecd00c6151ccf64f192752d083957dd0bc3d5 -size 112941 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonCheriFace_7243931574.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonCheriFace_7243931574.png deleted file mode 100644 index 37e86c1f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonCheriFace_7243931574.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13062aae191c5062ef0240685c386f07d32388a51486ecb958821e6ecb4a39b2 -size 129255 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonarchButterflySmile_383607653.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonarchButterflySmile_383607653.png deleted file mode 100644 index 147106df..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonarchButterflySmile_383607653.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0873ef58ad255932d1be513106af2b953623904f5d688e3f443c56b5639aa2a4 -size 112580 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterFace_49045351.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterFace_49045351.png deleted file mode 100644 index 331c660e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterFace_49045351.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9d03cfa387b1bda937a324e2b5e734f1c0bd1695d68d26359a00f44b6e630e4 -size 102002 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterGrumpyFace_7243924005.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterGrumpyFace_7243924005.png deleted file mode 100644 index 46043f63..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterGrumpyFace_7243924005.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd329c074d0a0ed573f6f083148eb142239b94e7e543887c181f760b43f56a05 -size 115158 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterSmile_398675917.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterSmile_398675917.png deleted file mode 100644 index b7cdb2b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MonsterSmile_398675917.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5243f4096fbcd69403a8b6f82cf427b14609c13ea93a245e39597d826dfba1fc -size 114860 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrBubbles_31616411.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrBubbles_31616411.png deleted file mode 100644 index 695903fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrBubbles_31616411.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3db19779915d011db32e745ba5e50a16f7c8ed6319e73e4879f5351e06a7acb -size 106756 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrChuckles_10907541.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrChuckles_10907541.png deleted file mode 100644 index 1e804560..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrChuckles_10907541.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3bc900999ef9f2154b16c4d9ad2520a71bd75f63a7ccfc957430b1c390082a4 -size 98918 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrOinkers_11123827.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrOinkers_11123827.png deleted file mode 100644 index 58b25dc5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrOinkers_11123827.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09af256c80021e4c72fef58b7c2c9459293861ac916defd172a3894d907fbc97 -size 104117 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrToiletFace_4416933495.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrToiletFace_4416933495.png deleted file mode 100644 index 811e0606..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/MrToiletFace_4416933495.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb38260adb59cd58d5a580d34ed2e9a756062e90e1d6f6b238af29a06fd860ce -size 115377 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Muttdawg_11647324.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Muttdawg_11647324.png deleted file mode 100644 index a6800b2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Muttdawg_11647324.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:992b96eb2508a4cdd982faab3620b76ac23d0ba3ab1d1620c3cf1f35feb2245c -size 111466 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Mysterious_7132035.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Mysterious_7132035.png deleted file mode 100644 index c899f7be..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Mysterious_7132035.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56eca6b9dbecdb7cce17f9e999d56e2eba1b7fb0b053d371fd61cd53f61f5bc4 -size 98672 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NegationUnderscoreNegation_13038375.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NegationUnderscoreNegation_13038375.png deleted file mode 100644 index 2df34dc1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NegationUnderscoreNegation_13038375.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8aa022c6c01063f044a905770f0c9f9f35bfa319ed38ec9d812b4b0cdd6f025e -size 94698 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NeoclassicFemaleV2Face_4637166178.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NeoclassicFemaleV2Face_4637166178.png deleted file mode 100644 index 5da53736..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NeoclassicFemaleV2Face_4637166178.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c34aee4573ffea99a1281054adcd0a8bda4f4c01887fb25c6ef8ad7f8a27207 -size 112012 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Nervous_23219981.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Nervous_23219981.png deleted file mode 100644 index 5e3ad811..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Nervous_23219981.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49bb99b1a41eb06679a217ac6f96f7ff70b3a2464b35f607e1f4523b8204195d -size 99579 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NethackAddict_16357383.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NethackAddict_16357383.png deleted file mode 100644 index 21f3bc1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NethackAddict_16357383.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d859c413e904b04f45f7e78c22b278d6b3fdcaa71c81146beeb6535402a330ab -size 105349 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NibblesDevourerOfWorlds_11913734.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NibblesDevourerOfWorlds_11913734.png deleted file mode 100644 index 3c5b7208..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NibblesDevourerOfWorlds_11913734.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f7426dcf6da595d665cf35ec77221715f4401602facb34138bf2df4d95265b6 -size 102434 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ninja_11453609.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ninja_11453609.png deleted file mode 100644 index 3309c169..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Ninja_11453609.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a35000f3553377cd115d363c6eb664d6695a2efc418d88c3a0b2b582581b6d5 -size 104768 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NoZ_14405720.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NoZ_14405720.png deleted file mode 100644 index f6385b66..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NoZ_14405720.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3912a35eae0114838648da2f9e8d8efca91fd0e542b71bd921affc16b465feee -size 106589 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NorikoTheGentleYoukaiFace_3210253450.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NorikoTheGentleYoukaiFace_3210253450.png deleted file mode 100644 index 4bdb78d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NorikoTheGentleYoukaiFace_3210253450.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b24b6654509ec51028e3067d57abb13c5e1c2b5d84cfb03d093332ba04244a4a -size 118663 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NotAgain_28119051.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NotAgain_28119051.png deleted file mode 100644 index e3b62352..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NotAgain_28119051.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0d058448135400bb40ad5413073b2f9768b3e0cc11a9bc608a9f25dd5a3ff91 -size 113740 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NotSoFriendlyEviscerator_66330204.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NotSoFriendlyEviscerator_66330204.png deleted file mode 100644 index 27b4a2a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/NotSoFriendlyEviscerator_66330204.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b6ddf19b09562e58d94e5cfd57528387dfa6c805de1e50aeea4d62bfa1cd1ef -size 110633 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Notsureif_173789324.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Notsureif_173789324.png deleted file mode 100644 index 96a6fa64..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Notsureif_173789324.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8df335d919693652c44b3ea15c3b8f4abfa6eecd553fe10bfd58c5f59b2fc3b0 -size 95533 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Nowai_51241862.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Nowai_51241862.png deleted file mode 100644 index f4ec3719..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Nowai_51241862.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e9a547d01bd90499a85072f3a4934aaad2175798c21bc71fa1f83d40570e367 -size 115932 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OakleysFace_301827237.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OakleysFace_301827237.png deleted file mode 100644 index ddc776dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OakleysFace_301827237.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d29d373d1b5f41d209a96633eec542897a29b768b818c64588bd8be61fbeb56 -size 99093 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Obvious_Wink_51241537.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Obvious_Wink_51241537.png deleted file mode 100644 index 687a5e02..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Obvious_Wink_51241537.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d31dca901ac6b5d02f9bacdd3844e24494ea145ef5d98cba61a72952454097d5 -size 105231 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OchreOgre_16723499.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OchreOgre_16723499.png deleted file mode 100644 index f497c487..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OchreOgre_16723499.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5227d8d5a5c2a42aae926fac35a1d9e369c97f4493a9ee73cc3c43508f131873 -size 100875 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OctaviaTheIvorySpiderGirlFace_2986536321.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OctaviaTheIvorySpiderGirlFace_2986536321.png deleted file mode 100644 index d5b0d6fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OctaviaTheIvorySpiderGirlFace_2986536321.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cb402cea0f39742b4ad80673cf46835e447a4fe4a3bda0ca5d385679b752ea2 -size 126607 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OgreFace_391495894.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OgreFace_391495894.png deleted file mode 100644 index f280dfd0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OgreFace_391495894.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de5adac68d95e933d1e061dc3bb5ab0057513f3785f542c72df00faa7aa16672 -size 105276 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OhDeer_12145328.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OhDeer_12145328.png deleted file mode 100644 index 9492b9c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OhDeer_12145328.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee98b9223ab258da7d1c24ae7c5ffe60bed1676af52b628710265c8ef82f2e5f -size 113416 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OhNoesAnotherDog_13038397.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OhNoesAnotherDog_13038397.png deleted file mode 100644 index f1d21a1e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OhNoesAnotherDog_13038397.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:917ea0595315556af8b79aaeb9cfe6e67389f05260a2d0b5df1f85fd068330f1 -size 98916 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OldManJenkins_13335647.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OldManJenkins_13335647.png deleted file mode 100644 index dac533aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OldManJenkins_13335647.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3471595c961ce34b1d260f7387b67cc4645754aae8e9c9813cd2419b47f2359d -size 105130 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OldTimer_27003636.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OldTimer_27003636.png deleted file mode 100644 index 24f09fba..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OldTimer_27003636.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6afb6da2ee109746603f128a059432184ac8c90bb967c952c98bc5a553cb4b47 -size 115600 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OliZigzagFace_2979331491.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OliZigzagFace_2979331491.png deleted file mode 100644 index 18cabc88..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OliZigzagFace_2979331491.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce08eac87b12c297127a075492d5b9b829caf07aaedf2aa260f2be4e13feb17e -size 178445 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Oo1_7074595.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Oo1_7074595.png deleted file mode 100644 index 77d53a89..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Oo1_7074595.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7438097d897a056790bb3b2a9bd370229d1aeee32aba7e30f38d2356e53c21d4 -size 93306 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Oo_66330265.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Oo_66330265.png deleted file mode 100644 index ceb54b21..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Oo_66330265.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95859cb5aa6642b38c0987ef8f007f01387549cd6f9181111efc706f7898268a -size 103208 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Optimist_21024661.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Optimist_21024661.png deleted file mode 100644 index 3651203f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Optimist_21024661.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de44bde11134fbca66203a564213eaa39f24d8aed4ee4a3f4f8f1484a243ed83 -size 102854 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OrangeStarface_162200666.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OrangeStarface_162200666.png deleted file mode 100644 index 683d8348..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OrangeStarface_162200666.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e61581780dd9e16fd4747d0e590385f19e621a08d7f2f08fdcdae312a3fa48a -size 112187 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OrangeTrance_260303960.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OrangeTrance_260303960.png deleted file mode 100644 index 05df69bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OrangeTrance_260303960.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:135037a5bfd40ca744074e29e754d97df900d2bd6bbfb408509108235ddc8ac2 -size 111447 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Otakufaic_1665638148.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Otakufaic_1665638148.png deleted file mode 100644 index 8d872a03..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Otakufaic_1665638148.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:100b1a23cf4c5844fc9e636e298ec4558946a590d5ac2a82acdabaf30d1a6bc2 -size 101801 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverjoyedSmile_1428416217.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverjoyedSmile_1428416217.png deleted file mode 100644 index 3d4a27cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverjoyedSmile_1428416217.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3daba2110ee14b2696a4b049c2d2d508e7c96294d8da4c8f00b20de7b4ea6db9 -size 105370 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverseerAssassinFace_2761366151.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverseerAssassinFace_2761366151.png deleted file mode 100644 index f3c99b87..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverseerAssassinFace_2761366151.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14a27a8e782fd40f365c5679fe56129e216fc5ecd918105a4b40c04788e6ca41 -size 123585 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverseerProphetFace_3040321462.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverseerProphetFace_3040321462.png deleted file mode 100644 index 83d96747..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/OverseerProphetFace_3040321462.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69cab8fe1c600433fb102f45f5346cc2892d453bf6028f274c2548c4a6cf190e -size 125389 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Owl_11123805.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Owl_11123805.png deleted file mode 100644 index d9c7cbd2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Owl_11123805.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e36cbb15d85f7cbedfef0804dd541c899669937df588099740b7db481472c71 -size 107662 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/P_14861743.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/P_14861743.png deleted file mode 100644 index 845a4ad7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/P_14861743.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb4b61caaa8c472b729ea6cd5ea384621eca5b495cfe3fd875ed153f433657f1 -size 97615 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PaintballEnthusiast_23310997.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PaintballEnthusiast_23310997.png deleted file mode 100644 index 2f06c39b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PaintballEnthusiast_23310997.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81230857a6e22f6070548026b0ce3d5d739f1c4823251afc4723184d4b378ede -size 111589 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PerformingMime_5122343618.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PerformingMime_5122343618.png deleted file mode 100644 index 0a0003cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PerformingMime_5122343618.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd4bafcaec43626629d5233dec556f547ed39f68f78a21041fa9093949ac6a9d -size 121052 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PersephonesGirlGlam_7243865988.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PersephonesGirlGlam_7243865988.png deleted file mode 100644 index f5b34bea..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PersephonesGirlGlam_7243865988.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dc1601741e48f714eb66b42165d633eac54124e6ee5e611aba7d1fb075e106b -size 143522 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PiefaceJellyfreckles_19381787.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PiefaceJellyfreckles_19381787.png deleted file mode 100644 index fa2c9c21..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PiefaceJellyfreckles_19381787.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe469d664077a28d581be39074ab75f193cad07b6b5ca0ae118530253222b94d -size 119943 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkGalaxyGaze_440738448.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkGalaxyGaze_440738448.png deleted file mode 100644 index 8edbe771..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkGalaxyGaze_440738448.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:420f467b453786ef60843f4cce6005d3f4e6e599e4ff10afb7374759f444ae40 -size 108196 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkMermaidPrincess_1428418448.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkMermaidPrincess_1428418448.png deleted file mode 100644 index 809d4b06..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkMermaidPrincess_1428418448.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46d8cf753180886fc7655bdee30ea7cd5b6fcb400b1ae900853afe4d9e17a5d2 -size 127879 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkMoonstruck_878940145.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkMoonstruck_878940145.png deleted file mode 100644 index 53956f60..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkMoonstruck_878940145.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1571f0582f0b02a05f767430cc9b9e9dff0f83f5205a6ccc663047d696683b27 -size 108243 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkShadesMccool_323192138.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkShadesMccool_323192138.png deleted file mode 100644 index 737df785..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkShadesMccool_323192138.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d77adf1e47e13a0445f7f54ad591702acb256a7bfbe69a20c509eb6e56c42ab -size 106943 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkWistfulWink_583721990.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkWistfulWink_583721990.png deleted file mode 100644 index 61a05eb6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PinkWistfulWink_583721990.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:974e02b5ba6f41a8b1135d0291d0634199b87786dfeecd647a7e07ab576fa002 -size 106813 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PizzaFace_2845812591.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PizzaFace_2845812591.png deleted file mode 100644 index 82a8831e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PizzaFace_2845812591.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adacd499b0460583af4620cbf5a7ec358b709f6985056202ca123db92d58ca27 -size 129053 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PlayfulVampire_2409285794.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PlayfulVampire_2409285794.png deleted file mode 100644 index 7c125584..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PlayfulVampire_2409285794.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:162b88da25af6a7951d73b8252e03a4b572e591c07033c36376761bc13b83631 -size 109640 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoisonousBeastMode_2606177838.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoisonousBeastMode_2606177838.png deleted file mode 100644 index 98655aa7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoisonousBeastMode_2606177838.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9260e0bdb96d0cd34a8853e919eb7478d8aa47fb45040f57e96a445b5a2aadd5 -size 112104 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoliceOfficerNashFace_2506787960.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoliceOfficerNashFace_2506787960.png deleted file mode 100644 index dd2f4ad7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoliceOfficerNashFace_2506787960.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72a25fcde3223722c507929db5906f3ac1aeee2065d819aba0181b655b84eac4 -size 130137 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PonyFace_13656095.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PonyFace_13656095.png deleted file mode 100644 index 4ecb0f3f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PonyFace_13656095.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d652812eb165424550d1dd3c350f35c719c69dff21272bbced07e1ef9550ed9 -size 105171 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoorMan_7699183.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoorMan_7699183.png deleted file mode 100644 index c8c7121a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PoorMan_7699183.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:456960ed7910c7b5df4c5cdee753b1e35c8a3951a670753a858ec4b1e02f7662 -size 96029 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PopQueenSmilestarSpectacusmile_2274754557.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PopQueenSmilestarSpectacusmile_2274754557.png deleted file mode 100644 index 90dc57a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PopQueenSmilestarSpectacusmile_2274754557.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:389a3872dc8c1b8a82739cee59d5bb45edb62d3a914312a21b53c812595ab258 -size 115041 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Prankster_20052135.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Prankster_20052135.png deleted file mode 100644 index 61c49acf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Prankster_20052135.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bd3dcfad94b4591b48af84d6b1d1a6285ca7d8401e1f4c1f6b9c044be7eb457 -size 113276 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PridefulSmile_3267564334.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PridefulSmile_3267564334.png deleted file mode 100644 index 271fb09d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PridefulSmile_3267564334.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:382192d14cea593c0fe46d1f947e537f42918df1f94dfd50cc7b3b73f4f664cb -size 129480 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PrincessAlexis_6590375198.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PrincessAlexis_6590375198.png deleted file mode 100644 index 207a5604..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PrincessAlexis_6590375198.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:626caa134d82dd5d3122de16402481f3ec6c0afdf5b126e1a290bedc0f4f7b3f -size 131671 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Puck_20298988.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Puck_20298988.png deleted file mode 100644 index c1309a38..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Puck_20298988.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d294c9302905163d4120d7e4b2684aab9735d26b2aae8f34af71630b8bf0c020 -size 98686 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PunkFace_119812659.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PunkFace_119812659.png deleted file mode 100644 index bf07edcf..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PunkFace_119812659.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4936414145e765cd5c0df9e41344bdb9dd66752a3e8936780f5e1152ad5d42f1 -size 108625 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleAlien_323192193.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleAlien_323192193.png deleted file mode 100644 index 4f702d9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleAlien_323192193.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20fe9c26deab2dc26638fd888cc1b00cb11d6493d32cb65b066da39278f73ddc -size 98555 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleBubbleTrouble_362051999.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleBubbleTrouble_362051999.png deleted file mode 100644 index 5cf6c560..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleBubbleTrouble_362051999.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f605212096d54ab676cf56079698b151efaa7e2e2cc9d251c17649d0a288c831 -size 108062 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleButterflySmile_238983270.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleButterflySmile_238983270.png deleted file mode 100644 index 6953303d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleButterflySmile_238983270.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8c485a106fe6cd0a50d04474dd6fd200f5bb7571b2c8496826560f814f36108 -size 111793 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleGalaxyGaze_440739240.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleGalaxyGaze_440739240.png deleted file mode 100644 index eeb41de7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleGalaxyGaze_440739240.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d5a63f16f3a5ee3cde1d0f3e8c7749c65b44b8ef4289fe4ce7f183552779c8a -size 107946 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleMermaidPrincess_1428424821.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleMermaidPrincess_1428424821.png deleted file mode 100644 index c19a19f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleMermaidPrincess_1428424821.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80cfbea216332f0b2f8b3cee7eb67a9ce7580a62c32f8aaa2c02cc3b2ebe3aab -size 125952 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleMoonstruck_878942257.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleMoonstruck_878942257.png deleted file mode 100644 index 65f8b93c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleMoonstruck_878942257.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9617f3ba91155edb340207d891e759f64a88130dab54c9fd48351546666c8c65 -size 108708 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleStarface_119812765.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleStarface_119812765.png deleted file mode 100644 index 55c0850b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleStarface_119812765.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d6c1e1511cd3d37842eb886f72c08818b3ebc1f76fe362ac01b8ee634de8fd2 -size 111702 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleSuperHappyJoy_376812961.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleSuperHappyJoy_376812961.png deleted file mode 100644 index 27108807..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleSuperHappyJoy_376812961.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a49b58cfcfefd572320f30ca7fe98191291188be898e547c2fc500480d5d8901 -size 115579 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleTrance_260304187.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleTrance_260304187.png deleted file mode 100644 index 5b1350e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleTrance_260304187.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:151145a652d63532e057469073e93c55800ab26825e5202de45f9b071bd81277 -size 108703 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleWistfulWink_583722710.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleWistfulWink_583722710.png deleted file mode 100644 index 4cb42995..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PurpleWistfulWink_583722710.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26f9ef6cca75e842622f6566d041a662fb7b9fcbab5fd6a1646329fc710c8b58 -size 105536 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PwndaFace_28281786.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PwndaFace_28281786.png deleted file mode 100644 index 5bf54585..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/PwndaFace_28281786.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:909ddc54f04d71d88489e4d586ed6ea86ee587544cd1dc6bb6c353036fdd5af5 -size 115428 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/QuackfaceMcgraw_11647296.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/QuackfaceMcgraw_11647296.png deleted file mode 100644 index fd89933f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/QuackfaceMcgraw_11647296.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3693d8fa0604a31454bfceb7fadc3b754cb42ebb73bd1fc54b2485e659894c88 -size 109187 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Quijibo_10907532.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Quijibo_10907532.png deleted file mode 100644 index 4cc3e81b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Quijibo_10907532.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:767372a7ece74c67bfdc33a0c2c78bfd9c42660df3a9922c56c3159aa56db102 -size 111730 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ROAR_406001167.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ROAR_406001167.png deleted file mode 100644 index b8162da5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ROAR_406001167.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d72c4bf53ae101a71b339e391ddf2d19a58e7e1c111c65e7beca22b7a770010 -size 102400 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Raccoon_27052537.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Raccoon_27052537.png deleted file mode 100644 index 8bb68e9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Raccoon_27052537.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b1ca0d282662933a004a604346667ab52723710badc0ea3b487ea7938dfdbbf -size 119881 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RachFace_2608325060.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RachFace_2608325060.png deleted file mode 100644 index e4e3fc2d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RachFace_2608325060.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38903e657d80d92eec4fb2f93351f3e1ba3795a69480bbba3d9e758268ce2e3e -size 96837 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RadioactiveBeastMode_2225761296.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RadioactiveBeastMode_2225761296.png deleted file mode 100644 index 818d1bfd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RadioactiveBeastMode_2225761296.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30a4334dda75ff8cc45726bc94cbf80d71f76494eaf37f6482f5776cc1ad212c -size 112283 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RaigFace_209994783.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RaigFace_209994783.png deleted file mode 100644 index b093fbba..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RaigFace_209994783.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67bcec903d09c130235176bcafa9b1f6c1e5b7b727009911a2b66baa2b172d52 -size 107298 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RainbowBarfFace_1665629400.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RainbowBarfFace_1665629400.png deleted file mode 100644 index 9a4529a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RainbowBarfFace_1665629400.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af1f64243ed3f8be10a258d2ee86b26d7500335ab7324dbd955d00bcf5acb3af -size 103529 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RainbowSpiritFace_8666744565.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RainbowSpiritFace_8666744565.png deleted file mode 100644 index bb96523b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RainbowSpiritFace_8666744565.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26abf846f29a925d0bf5b0863f37b5ff7d43fb9407d067aec9528d4de5727e06 -size 134767 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Rawr_7076224.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Rawr_7076224.png deleted file mode 100644 index 1a56c9c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Rawr_7076224.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:458d5e505b672808bba70b151a473e263f8963b984d94da93d7041ca1cdad242 -size 103272 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ReallyEmbarrassed_376812736.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ReallyEmbarrassed_376812736.png deleted file mode 100644 index 5ba7375b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ReallyEmbarrassed_376812736.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd95da6d4e7527fe42246d834bd47cbd72a76cba27fb07d22ad3186f88891453 -size 114243 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedFang_16722419.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedFang_16722419.png deleted file mode 100644 index 81758cba..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedFang_16722419.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edb69b1f60d8760640d39968d551224dc430100195c172b48cb5fd1ed4f8a76b -size 107387 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedGlowingEyes_180660043.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedGlowingEyes_180660043.png deleted file mode 100644 index a793946f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedGlowingEyes_180660043.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8f400705c731bc5ae9cfdd7c7d6d4e40a23672c8210f510a72eb97df52a0c20 -size 103382 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedGoof_1191125008.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedGoof_1191125008.png deleted file mode 100644 index 8b754fbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedGoof_1191125008.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1cb105478380d160893413f07a852a7501c7b0eba04143919b026f645a09246f -size 111767 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedLipTateMcRae_9650713776.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedLipTateMcRae_9650713776.png deleted file mode 100644 index 540cedc8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedLipTateMcRae_9650713776.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9acbb9044a2c329a409002a0b29c8a360fc2e8d20c802e49a2785851e5de95a4 -size 127508 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedRawr_66330295.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedRawr_66330295.png deleted file mode 100644 index 3c2f6886..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedRawr_66330295.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73630fe08231437b450e79328a319945db58cf3a99ca282e19f4dcc02b92b3d8 -size 103188 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedRockStarSmile_376809691.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedRockStarSmile_376809691.png deleted file mode 100644 index 58694c4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedRockStarSmile_376809691.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:272ad274ff7dd7f81ab00d5f34e8b4db9ee6c68b7c402d4a482c52a189a4d5ba -size 107392 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedSeriousScarFace_406000421.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedSeriousScarFace_406000421.png deleted file mode 100644 index 29feab71..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedSeriousScarFace_406000421.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d3c85bae1f6a3a7c210ea5c10e366c666a86514c8b2a29ead3188780d1c2ec0 -size 101396 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedTango_16652251.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedTango_16652251.png deleted file mode 100644 index a69636c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedTango_16652251.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4e3e3b8da2e2bc3e1fbb6eae6478ffb30e4abd565efda7cdc53451b0bf1b0f4 -size 103829 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedUltimateDragonFace_1772530315.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedUltimateDragonFace_1772530315.png deleted file mode 100644 index 174dde75..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedUltimateDragonFace_1772530315.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:299ad8ae223f277df995eebca331bf34a5259b2604f6b5aae4561f12565c72f2 -size 120779 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedWhiteAndStarface_445117183.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedWhiteAndStarface_445117183.png deleted file mode 100644 index c71f22cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RedWhiteAndStarface_445117183.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:125cc007de6e884a1d942042523b004448e9dc763a4302a11e9b8eadb72282d7 -size 109282 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Redonkulous_10907534.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Redonkulous_10907534.png deleted file mode 100644 index d0dea5bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Redonkulous_10907534.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7786bb0df974b2e05ce4aa11687d8bb1d94adb1269e515a7b3570a7e1e8ea5b5 -size 118658 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RetroSmiley_10770432.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RetroSmiley_10770432.png deleted file mode 100644 index ba7966ff..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RetroSmiley_10770432.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3b36f2c1fb34f32ff8159b8efc47bde43f3a62445f3e86ccd45ea60bae7b263 -size 91341 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RobloxMadnessFace_130213380.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RobloxMadnessFace_130213380.png deleted file mode 100644 index f88c2ffd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RobloxMadnessFace_130213380.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afb0f2d3689e5fee5198a119ce04c0da5dbd18cf1b13f3951ea81e512fa26af6 -size 125699 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RockStarSingerFace_2517188619.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RockStarSingerFace_2517188619.png deleted file mode 100644 index b7e4b79b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RockStarSingerFace_2517188619.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46fee2ec1f127cb756384e8e38ab2c446831ef9ecf8ecac14060a4160a419bcc -size 98588 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RodeoVampireLilNasXlnx_5917448278.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RodeoVampireLilNasXlnx_5917448278.png deleted file mode 100644 index d4e2b3c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RodeoVampireLilNasXlnx_5917448278.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f8a180633aba5f48fa2df392843f5c2ead3addad1bbc8fbe13abbd30c980a54 -size 110429 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RogueEraMagusFace_2499710871.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RogueEraMagusFace_2499710871.png deleted file mode 100644 index 499c872b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RogueEraMagusFace_2499710871.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00a83c955ba9e5b24ab87bc007d5a84fb106e0358127ed2be8486158744eccc9 -size 138506 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RogueishGoodLooks_1665511048.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RogueishGoodLooks_1665511048.png deleted file mode 100644 index 66040dcc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RogueishGoodLooks_1665511048.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f87c7e20d9bdc786bab5dd777475b3337c80cf0bcb289046410c497e22950787 -size 101122 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoseAmazeface_835095880.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoseAmazeface_835095880.png deleted file mode 100644 index 06389a7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoseAmazeface_835095880.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a200d375a9b20b6cb60d55836292f84f72bf5428acd0355ae33f51414bcee946 -size 107298 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoseySmile_116043052.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoseySmile_116043052.png deleted file mode 100644 index 59a20333..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoseySmile_116043052.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4035016567a1889a4dbf633cf797284052565192b7ff1c564adc0ac16a9daff5 -size 107252 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoyalEyeOfHorusFace_2803774919.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoyalEyeOfHorusFace_2803774919.png deleted file mode 100644 index 15fafe8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RoyalEyeOfHorusFace_2803774919.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fa146e212a8fbd3fb0f2622c7b6a191339a4cf8d004a2f09bc679eba5dac2cd -size 118639 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RubyArchfeyVisage_2830505884.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RubyArchfeyVisage_2830505884.png deleted file mode 100644 index 36dc2ded..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/RubyArchfeyVisage_2830505884.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c768de886603115a5f67f7a8a1969da5563198dbf8fa6bf65037e479636d38a -size 129514 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Rudolph_19397594.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Rudolph_19397594.png deleted file mode 100644 index 869b4c2f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Rudolph_19397594.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8837e998718ebddce9bee1c1de77606cb17df45079aa6919c7885bd0c20c3a9 -size 112740 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SadClown_250654457.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SadClown_250654457.png deleted file mode 100644 index d016d391..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SadClown_250654457.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8636e67eadbfde2490553c653df11b8a5d4bf8773402f51a336ca4f9e8a1395 -size 104429 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SadZombie_7131361.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SadZombie_7131361.png deleted file mode 100644 index 9b292475..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SadZombie_7131361.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d705b394725ba6a63e2d79519d04d6f11b7d46f69bda878f4900526e726412a6 -size 103497 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sad_7699177.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sad_7699177.png deleted file mode 100644 index 5a757169..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sad_7699177.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5b522e6fdb2f4f457653ce2e251f71e25efc06edfcc0937281c87280700133c -size 102673 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sadfaic_117522793.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sadfaic_117522793.png deleted file mode 100644 index 396eef90..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sadfaic_117522793.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58923d644b2f0f5cd3db0f4c9f0f897ff33baffb11366a8db7745f74619cd42a -size 103853 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SaieyeTylerJosephTwentyOnePilots_7389910081.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SaieyeTylerJosephTwentyOnePilots_7389910081.png deleted file mode 100644 index 4188e63b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SaieyeTylerJosephTwentyOnePilots_7389910081.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b94b4ccc1d78c5c3190dcfb5d128faddb8eee51e4eede8c6bd658d6c3c28a6f -size 121360 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SamanthaFace_2535487974.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SamanthaFace_2535487974.png deleted file mode 100644 index 87ec5534..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SamanthaFace_2535487974.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e257bf9b55d50c0ae3b8383abf8b5f29386bb0189fca0298842d3f1ed681e2a -size 127375 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SammySlickWitterFace_2907754927.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SammySlickWitterFace_2907754927.png deleted file mode 100644 index fe1a340b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SammySlickWitterFace_2907754927.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fb578923a213e43a09c269f1af1a235b469d1677ef37dbe52e731a7c3f3f2ff -size 119296 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireArchfeyVisage_2830502330.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireArchfeyVisage_2830502330.png deleted file mode 100644 index 56b70dfa..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireArchfeyVisage_2830502330.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30dc3af7cb78b70a7918f08c835e0f781fb9a41f27da9a64fe1cd743cb5a6bae -size 130162 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireEvilEye_1016184964.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireEvilEye_1016184964.png deleted file mode 100644 index 1dd1e88d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireEvilEye_1016184964.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c5f7e9b372a49c75c078ad8550d406bd263fc43dfdac96e75aa1db052c1ba30 -size 113292 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireLaserVision_209994074.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireLaserVision_209994074.png deleted file mode 100644 index 11ad0025..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SapphireLaserVision_209994074.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c09333e37002e1d327b406a8f24ab2f73281a78d5da8fadd4b17400d4dfc7dc5 -size 97620 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ScarecrowFace_14721869.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ScarecrowFace_14721869.png deleted file mode 100644 index 3fc30e12..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ScarecrowFace_14721869.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89f4af6d837c02847d881acc4d0805d5f77ddf647d28a1f29e476212582ad8cc -size 103918 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Scarecrow_26260927.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Scarecrow_26260927.png deleted file mode 100644 index 6a8b908c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Scarecrow_26260927.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3281055f9aebe73cab41659edaaf10e0fd312f2ab05419032ad8bcdb241b304 -size 102051 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SecretService_20612949.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SecretService_20612949.png deleted file mode 100644 index 0e6e5310..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SecretService_20612949.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e60c7befc28729bb569e191fd2d2f860c7f54f9ccde28d8746aa33db7ff222d -size 101053 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeeingStars_27599954.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeeingStars_27599954.png deleted file mode 100644 index 65c1ee0b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeeingStars_27599954.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfe526e46d8a09f860c2515b03b174547a07ae841920910a5c4c6c89a9b7060b -size 116505 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SemiColonOpenParen_16179646.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SemiColonOpenParen_16179646.png deleted file mode 100644 index e7930cf6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SemiColonOpenParen_16179646.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e86316a25a1d716cc6e4f082da72198b98d947a37c36b1666d9c57fc16d6e4f0 -size 101404 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SerenasFace_301826957.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SerenasFace_301826957.png deleted file mode 100644 index 542b0a14..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SerenasFace_301826957.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b0afb6823623e376c1d9660ca04a93f3c26d0492695bccfe0e862ef499956de -size 101808 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousCat_10678414.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousCat_10678414.png deleted file mode 100644 index 98491818..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousCat_10678414.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91c605932603f116a219529e363d012dd15fa8d30ac8986bb50dd102106d0d84 -size 114489 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousDog_10678418.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousDog_10678418.png deleted file mode 100644 index c09c21b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousDog_10678418.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e856571879984e866fc3edb757d80fbda9025bdb86da9648e94326a36fe939ab -size 108148 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousRedEyeScar_494299198.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousRedEyeScar_494299198.png deleted file mode 100644 index 8a332849..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousRedEyeScar_494299198.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2fd7079421a284ddcceb0f9072aa55be9ae7f17ab24b8eabd97c818a8702b09 -size 98998 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousScarFace_255827175.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousScarFace_255827175.png deleted file mode 100644 index c30644ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SeriousScarFace_255827175.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c84d77183840e0ad5b21f120a588eb6dfb20a593320aeed7ccd4c4ccd10d0d1 -size 101864 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharkbaitFace_3258567315.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharkbaitFace_3258567315.png deleted file mode 100644 index 22901a97..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharkbaitFace_3258567315.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cf0ce4522bc505cc97c5fa4eb7f4c36f26a87c1939ce83f47fb7ca20760a306 -size 115940 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharpninesFaceOfDisappointment_209994270.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharpninesFaceOfDisappointment_209994270.png deleted file mode 100644 index 81fffe4b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharpninesFaceOfDisappointment_209994270.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ba089e32874d2dea5a99a028ee0beed49ba0d7d8a0cdb1ec52065d7cb415826 -size 102432 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharpninesFaceOfJoy_406002032.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharpninesFaceOfJoy_406002032.png deleted file mode 100644 index dca3e444..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SharpninesFaceOfJoy_406002032.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd2e28153b2739a33e81ba53975165e4907e4703e814ad4d725df9a88cc7c5d9 -size 103030 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SheriffBuffingtonFace_2761348544.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SheriffBuffingtonFace_2761348544.png deleted file mode 100644 index fc0ce762..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SheriffBuffingtonFace_2761348544.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe1657e9a2bcdb6f22c9b7bf46f214b34e0e62e39248be7a70266d7b896bef8f -size 117118 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Shhh_7076159.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Shhh_7076159.png deleted file mode 100644 index b9e7a21f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Shhh_7076159.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb9b68d0b237ec5d4019d8870e55220d9dd5d2bd4e200fded4c10123bb17c492 -size 102731 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShinyTeeth_20722130.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShinyTeeth_20722130.png deleted file mode 100644 index 038abb42..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShinyTeeth_20722130.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae10a01da973c301b6eac5f26817d0a739c2b332300652a42802de039cd28ac6 -size 106154 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Shocked_147144644.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Shocked_147144644.png deleted file mode 100644 index 676f464a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Shocked_147144644.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22c6dc873077d35b64eb7a44c682ae2a7400ba67f189f8ddc3d2706e064b5ca5 -size 104315 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShutterShadesTheFace_34673712.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShutterShadesTheFace_34673712.png deleted file mode 100644 index 1bd83b69..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShutterShadesTheFace_34673712.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c00b629bea14c476e5345a67011fab1ed5112f475eea0b6cd553d08fc0c50738 -size 108471 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShyLady_10831438.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShyLady_10831438.png deleted file mode 100644 index 3215a344..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ShyLady_10831438.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:685c72ed0cf6aec7993ea9e7dd78367bb460322cd50e03fa7f0481fde111c955 -size 103946 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SickDay_26619096.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SickDay_26619096.png deleted file mode 100644 index 1f448dd9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SickDay_26619096.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31077bfbe367aace29218e7370a3eda79edd9857c4d1f84b37fb27e01e0b5cbb -size 103632 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Silence_10860397.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Silence_10860397.png deleted file mode 100644 index 6f1fa427..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Silence_10860397.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ee03380a5bc5832ba9e484eb098af4607d16aac5f8c2cc1f975ccf72d009bf7 -size 98007 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SillyFun_7699174.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SillyFun_7699174.png deleted file mode 100644 index 65ea739e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SillyFun_7699174.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:deac794242c2e522c7a9455d7a03800efc62eeda2146652ce02efbe277a67c6b -size 100741 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SilverPunkFace_387256603.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SilverPunkFace_387256603.png deleted file mode 100644 index fc86dbf8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SilverPunkFace_387256603.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fae2a41bb1946e2a03ab9fb311e24dd3f3c77945dbc848f86704c0cc37967c3 -size 108341 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Singing_66330310.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Singing_66330310.png deleted file mode 100644 index cf061a04..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Singing_66330310.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f810e39a961fd77f2d3f1b86d9b01768ed244402b4b1545f0462cd3e4de78cd -size 98491 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SirRichMcmoneystonIII_10831390.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SirRichMcmoneystonIII_10831390.png deleted file mode 100644 index 805af4bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SirRichMcmoneystonIII_10831390.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5eea0b6ccf114e2905a62c442289515e1c0187d3a4a5fb8610f305feac08aac -size 108102 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SkaterBoiFace_2739812348.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SkaterBoiFace_2739812348.png deleted file mode 100644 index f9834090..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SkaterBoiFace_2739812348.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f39160e42ca1fc830d88fc4e8ace37bd5a5a35fde2a0385feba33b5be2cd5f3 -size 121888 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SkaterGurlFace_2739787309.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SkaterGurlFace_2739787309.png deleted file mode 100644 index 8945bd89..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SkaterGurlFace_2739787309.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06e546ef4ea73938652888263a2f867e819a7aadb914129efb1b4a39e60d9e50 -size 126536 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Skeletar_10770395.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Skeletar_10770395.png deleted file mode 100644 index d2740aba..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Skeletar_10770395.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c60882e4d7a7e3846136cfa716042d2e70dd63b28af3e3488eead36644389517 -size 107712 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Skeptic_31117267.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Skeptic_31117267.png deleted file mode 100644 index dadbc8b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Skeptic_31117267.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f62c7cebce2435fd5f021c6783b40cdd5d684812037cccc18e8837698479cad6 -size 99730 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Slickfang_7317765.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Slickfang_7317765.png deleted file mode 100644 index 4d1785b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Slickfang_7317765.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:caa9d8d8ef900dea368edf74e9a04ddce18aca2bb4218d6eebb32b54558f344b -size 105558 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Slithering_Smile_2830646491.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Slithering_Smile_2830646491.png deleted file mode 100644 index 1f3df53a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Slithering_Smile_2830646491.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad133519c2641a849dbd42d99afee6798a267ce1920ed70583a786410c40dbb1 -size 146925 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlobberyVillain_10907536.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlobberyVillain_10907536.png deleted file mode 100644 index 19fd4c9f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlobberyVillain_10907536.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56b70afc9ed882d60fad672a9813599fb5d73bf2f083b753d1403465299d1506 -size 109281 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlyCat_10678407.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlyCat_10678407.png deleted file mode 100644 index 744a97fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlyCat_10678407.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:880c1cb8c9abc28a429d76f7cd59180cdea75bfd6a50a1c1b15264a0b4a27983 -size 113413 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlyGuyFace_238983378.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlyGuyFace_238983378.png deleted file mode 100644 index d3f4058d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SlyGuyFace_238983378.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b8ec20501235bc15afdf5c36e3560c2d92a91cfb0d5281b44c54e514a519d45 -size 103625 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmilNasXLilNasXLNX_5917459717.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmilNasXLilNasXLNX_5917459717.png deleted file mode 100644 index c2d6afe0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmilNasXLilNasXLNX_5917459717.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e542c6d3688e9817554e973be8756dc975fc4d303cd9a3d2ce212418e2415f6a -size 117929 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Smile_144075659.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Smile_144075659.png deleted file mode 100644 index 1966c277..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Smile_144075659.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:029e00e3ccf15871d24a5ec3d8b5e1d02c85354349a95b89a6583015f2995d11 -size 102722 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmilingGirl_209994875.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmilingGirl_209994875.png deleted file mode 100644 index b573dd90..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmilingGirl_209994875.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5325e9806d8e114eb43e7e9d0a0604985dd9afe690b4ebdaa87bebe37aef3f81 -size 106789 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmithMccool_27412825.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmithMccool_27412825.png deleted file mode 100644 index bf369311..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SmithMccool_27412825.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1aba551f616989c2acc1912f4ec745dcd9b37faf3e7ce1401d8d220dcc12d629 -size 107474 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SneakyGreeneyedSnake_334656353.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SneakyGreeneyedSnake_334656353.png deleted file mode 100644 index 2b25deee..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SneakyGreeneyedSnake_334656353.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c54553ae15dcb744ef6460df5bdd1c53980b6f8727353cb8313ea288d79c06ce -size 99644 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SneakySteve_823012694.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SneakySteve_823012694.png deleted file mode 100644 index 3f0418a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SneakySteve_823012694.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b842f9634a99e021d30247b92aa759c299f46ba017c3e5de9249bc38c11f49f -size 103709 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sniffles_14516578.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sniffles_14516578.png deleted file mode 100644 index dc9a0367..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Sniffles_14516578.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82989c9425da51ad72bc1458db1c67bc40b6aaae53024dbb3df2d4ef1084a7c6 -size 99864 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowQueenSmile_2569005011.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowQueenSmile_2569005011.png deleted file mode 100644 index 21bc7059..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowQueenSmile_2569005011.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1904dde71961b9adea2350d6767261232f6a0e8e74cc96c29641efc24c1c7521 -size 112371 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowSamuraiFace_5762596362.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowSamuraiFace_5762596362.png deleted file mode 100644 index 4e184238..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowSamuraiFace_5762596362.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ecfc60676edc88e7b04ce6bb5a3c9ab414eb046ccc6f5bb9377c3f29cd73b90 -size 117014 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowflakeEyes_76233968067050.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowflakeEyes_76233968067050.png deleted file mode 100644 index ea3c0f7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowflakeEyes_76233968067050.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3118ce2a3a8e5d426f0fb9414c6d6b9a5e90c2e40f95a32b8ee823055a3f65c -size 109685 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowmanFace_19396550.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowmanFace_19396550.png deleted file mode 100644 index 1db77855..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SnowmanFace_19396550.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0dcd980859dec8e01a392725f504a547bc34d77bbea276d255aa0ef9b30fb547 -size 107715 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoFunny_32058239.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoFunny_32058239.png deleted file mode 100644 index 64024f15..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoFunny_32058239.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0601e977711ed1bef297d0ad4328ed8c207b4d6f5240cd16a72ebce913e70c3 -size 102986 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedBlue_2569001052.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedBlue_2569001052.png deleted file mode 100644 index db23c560..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedBlue_2569001052.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c50f281e4b1cd881347e7007f1ea4508bbfbda2ca9b66eb478558e57959a26a4 -size 107892 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedPink_2568801198.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedPink_2568801198.png deleted file mode 100644 index ca80667e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedPink_2568801198.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e62484cf4e5f3945c042ddca61009e1c3e3508340e0e62e9266f478996d743aa -size 106743 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedPurple_2568804274.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedPurple_2568804274.png deleted file mode 100644 index e2971115..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SoSuperExcitedPurple_2568804274.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:288a6c235f433e1417a39a50a520e97dacbf22d7c50d6ca25cb1f78d0a45cc01 -size 107773 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SophisticatedSpectacles_25930613.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SophisticatedSpectacles_25930613.png deleted file mode 100644 index 718921a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SophisticatedSpectacles_25930613.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cc69ad05c3d8023a12434cc192b1357b9ef3d7e640b0becf8cbd4082ea3f23a -size 111702 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SororityStarFace_3690515434.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SororityStarFace_3690515434.png deleted file mode 100644 index 2d632a68..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SororityStarFace_3690515434.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9604e51b0b68542e93ad87b48850bb107cfcb25665611d8e4e9821ae9a805c6 -size 134542 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SparkleTimeSparkleEyes_2620507161.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SparkleTimeSparkleEyes_2620507161.png deleted file mode 100644 index 0a98d45c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SparkleTimeSparkleEyes_2620507161.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52cc3e6d671adb9cf6f9a8bbf1a2f66e3ef50270ef75b1f0bf20ab2452a97e86 -size 108707 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SparklingsFriendlyWink_6532619915.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SparklingsFriendlyWink_6532619915.png deleted file mode 100644 index f08bdcda..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SparklingsFriendlyWink_6532619915.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c8518d602b6072c5c71c52c2c133e23c42a27759cc9514cf1231ee501389d48 -size 128746 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SpecterInformantFace_2608277633.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SpecterInformantFace_2608277633.png deleted file mode 100644 index d8a8b679..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SpecterInformantFace_2608277633.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0fdad0ef3fd718e1e4ace5362bebb197723360c5faefd4114978cfb67b7cde8 -size 119357 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SpringBunny_110207437.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SpringBunny_110207437.png deleted file mode 100644 index e15caab4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SpringBunny_110207437.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:387d263f0166bd278fe91447e751bd169cdc97fb12daec7d37fa612605a50219 -size 117625 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquadGhoulsZoeSaberhagenFace_2517100778.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquadGhoulsZoeSaberhagenFace_2517100778.png deleted file mode 100644 index 704d877b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquadGhoulsZoeSaberhagenFace_2517100778.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bf80a52d5292dbe036512a53fe5ad7e8759d734e6c2e67ef2e3b3fe78f1c265 -size 126320 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquareEyes_22119034.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquareEyes_22119034.png deleted file mode 100644 index 96e8e97a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquareEyes_22119034.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4cc65690ab7d021f558fb7ee5e7d79fc2b111c65494bd712d76f7d3f854bbce -size 106767 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquiggleMouth_25166274.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquiggleMouth_25166274.png deleted file mode 100644 index 24247831..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquiggleMouth_25166274.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11bac292766cdaf30978a0f5c6861389719dd6125e6e3d38b0f10d9d3466bbb4 -size 106864 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquintyAssassinFace_880474146.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquintyAssassinFace_880474146.png deleted file mode 100644 index 0f590956..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SquintyAssassinFace_880474146.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:014b3168d1f1c70ae6051249161ecb3c17927bc6dd57af2b521c3750a132e8bb -size 100039 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Stare_8560971.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Stare_8560971.png deleted file mode 100644 index 8683df7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Stare_8560971.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f06281aaf11a3c1c97b86595c410de5d74be9927111bffe4b4af5ba1813b0b0f -size 94361 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Starface_32873408.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Starface_32873408.png deleted file mode 100644 index c2cf1075..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Starface_32873408.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a6735fd7b06840d41beb71e48d1707a4ea26ec254387365e6b57859fc83a4c4 -size 112838 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StarryEyed_19959140.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StarryEyed_19959140.png deleted file mode 100644 index 78a51f5a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StarryEyed_19959140.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c4789e39da59ed3464ef6a440536dded0cd448b1bbb72978b618436d7cdf083 -size 112932 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StarryEyesSparkling_7243903012.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StarryEyesSparkling_7243903012.png deleted file mode 100644 index e8c1297c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StarryEyesSparkling_7243903012.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ffea3e238857c5396a8cb17d94f5c0bac95ee2c640a199e2c2c6fc04997ac8a -size 141731 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SteampunkInventorFace_5762596362.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SteampunkInventorFace_5762596362.png deleted file mode 100644 index 55832cd1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SteampunkInventorFace_5762596362.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d7006e28a47069100edee38bf71fbd9d21ec8490d6f2501d52a7cb31be68891 -size 121330 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StinkEye_416846143.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StinkEye_416846143.png deleted file mode 100644 index 295b6ee4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/StinkEye_416846143.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62ef572f997189880ed6bdf9d12c3c1c4e210d693c70f7ad7ab096e3dc5b46bd -size 100508 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Stitchface_8329679.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Stitchface_8329679.png deleted file mode 100644 index 868c94ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Stitchface_8329679.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:278848f18eac1bdb8602e02e12c8385c0378a50caf0b5b865b3360d4edf45f73 -size 107431 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunnyFun_51241171.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunnyFun_51241171.png deleted file mode 100644 index 7a8ab3a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunnyFun_51241171.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4de90b318bcbeaedf5d38e14cf9c1e94376c6d82ba2fe659a99c65a4ed9a1811 -size 112598 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunriseEyesTaiVerdes_7987201392.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunriseEyesTaiVerdes_7987201392.png deleted file mode 100644 index 127c1469..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunriseEyesTaiVerdes_7987201392.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f223e2d459a3ddea9514fbed2ca5758e903c2e5e7a7c0f9cd648eb32add13cdd -size 146787 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunstarFace_2506403983.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunstarFace_2506403983.png deleted file mode 100644 index 1f6968db..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SunstarFace_2506403983.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fdac5173c604b97959b74fa2f743f38fd251eb877630d6fc7469b6939d98f27 -size 133077 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperHappyJoy_280988698.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperHappyJoy_280988698.png deleted file mode 100644 index 812b1350..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperHappyJoy_280988698.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a91018f35e08d69258f828de38b4077100bd411c9a757c1eab6cc9ab51c85906 -size 115015 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperPinkHeartMakeup_6590371677.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperPinkHeartMakeup_6590371677.png deleted file mode 100644 index e47964e0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperPinkHeartMakeup_6590371677.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2326aefc36b8bfa71878eee8c87dd90d5b25079484e91799a5d6ddc509be8a9 -size 136325 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperSuperHappyFace_494291269.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperSuperHappyFace_494291269.png deleted file mode 100644 index 2e42bb97..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SuperSuperHappyFace_494291269.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:573c5179556eef41fe7ab593d6358f24f9f51bed1ad2fff3555b8d1749408193 -size 111375 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Surprise_23261769.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Surprise_23261769.png deleted file mode 100644 index 96754d2f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Surprise_23261769.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b477c00c3c5fddb0d3e449b988a10724271484c6b4e6dabcee965372547e331 -size 105883 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Suspicious_209994929.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Suspicious_209994929.png deleted file mode 100644 index 042fd763..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Suspicious_209994929.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:191450c76c5d88562317db7067f4d472a023ed77be3886c469cb1f2b61ceda36 -size 102722 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SweatItOut_20909103.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SweatItOut_20909103.png deleted file mode 100644 index e1a1a1d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/SweatItOut_20909103.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d978e7b1f323daf9222ca3754d064b744baec81f346da4f944dfdd62e0bac63b -size 101935 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Tango_16101765.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Tango_16101765.png deleted file mode 100644 index a18a9d16..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Tango_16101765.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66bba5b80ab794d9f79b236617c62e2b4222df11bdf9c33b28b6ef60b6034ae6 -size 102393 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Tattletale_26343188.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Tattletale_26343188.png deleted file mode 100644 index fd0324a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Tattletale_26343188.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:372d26a97f8d6f2d7ba9b2f837ae4f3d133ed7e78f66228e14f5000a310f89db -size 103982 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TealMermaidQueen_1428417334.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TealMermaidQueen_1428417334.png deleted file mode 100644 index 4008d5e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TealMermaidQueen_1428417334.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3db14e7e57a86af00cd94bbba47b2f953fc85648448eac6005b4cc9b7482c808 -size 127680 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TealRockStarSmile_334656546.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TealRockStarSmile_334656546.png deleted file mode 100644 index d5186491..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TealRockStarSmile_334656546.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9c5f0df7ab7d83d09189f41e051b9b7e59341c33e8368071fdf3ee750254bbd -size 110286 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TearsOfSorrow_5122309127.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TearsOfSorrow_5122309127.png deleted file mode 100644 index 4ff73b99..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TearsOfSorrow_5122309127.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de7475e13f67a28df9ff20941aef844d4a6404028db77f1c49252430bb2ddf11 -size 128565 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TerrainAssaultSpecialistFace_2573925976.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TerrainAssaultSpecialistFace_2573925976.png deleted file mode 100644 index ffcf5a90..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TerrainAssaultSpecialistFace_2573925976.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8ec3717a4b9ab4f8edada290e0163b8457b0a22240681dc393e7f0aea2e0506 -size 120853 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheBigDog_10860384.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheBigDog_10860384.png deleted file mode 100644 index 16921ada..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheBigDog_10860384.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c820cdb649ef15e55b3a707c9f7784be09a9ba291213e983f1e4eb228b6e2c37 -size 114695 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheBirdcallerFace_2884418268.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheBirdcallerFace_2884418268.png deleted file mode 100644 index 0a2a5224..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheBirdcallerFace_2884418268.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:557625a7d29024c3a8608e10c472bb481a902bfbde319c2e7a654f533aafab5f -size 119494 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheDogWhisperer_34764447.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheDogWhisperer_34764447.png deleted file mode 100644 index 8c551a6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheDogWhisperer_34764447.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ab3d090b2e529a0cbc16b580ed9f32614e048a6898a8e4a48d271771f0112b3 -size 109472 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheFirstTimeIEverPlayedRoblox_22070623.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheFirstTimeIEverPlayedRoblox_22070623.png deleted file mode 100644 index 3826d728..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheFirstTimeIEverPlayedRoblox_22070623.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6302d09133edbb7bc6954379ebd26a468b89fe21ebec807b4feeba54f98f349 -size 104310 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheFriendlyEviscerator_22500129.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheFriendlyEviscerator_22500129.png deleted file mode 100644 index c1306d33..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheFriendlyEviscerator_22500129.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25aa13c28738636818f54bbe74a0ad2c410f0165eff84ac32b4f5acc459140b4 -size 109773 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ThePhantomPhalanxCygnus34Face_2628025496.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ThePhantomPhalanxCygnus34Face_2628025496.png deleted file mode 100644 index 69882b95..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ThePhantomPhalanxCygnus34Face_2628025496.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:240603ded53a34722f5850eb58f14adba40026bf60a6719add2654f487310c3d -size 126391 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheSoupIsDry_2845990750.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheSoupIsDry_2845990750.png deleted file mode 100644 index 79733cb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheSoupIsDry_2845990750.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e95a204c8da86f7d70e5e7ae65eafba617f388d71f8fd13cfb9807ae56584b9 -size 117719 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheWinningSmile_616380929.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheWinningSmile_616380929.png deleted file mode 100644 index c5873209..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TheWinningSmile_616380929.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a03cc96014aff73ce51f60aa0c46f8acd0fc47e4b1318bc76a456979f4a8a292 -size 112060 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TigerChaseFearFace_258198928.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TigerChaseFearFace_258198928.png deleted file mode 100644 index bcb0c796..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TigerChaseFearFace_258198928.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1727fbd31dea5fab1cdc9f32784af820a07826a0d2830e3f724a145eb70cfb0 -size 106687 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TimmyMcpwnage_22023062.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TimmyMcpwnage_22023062.png deleted file mode 100644 index 5261e4d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TimmyMcpwnage_22023062.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1453655a3eb96bd7df58045a0e9125751ae76de43044bc8580014c5c6cf19de7 -size 108320 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TiredFace_141728790.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TiredFace_141728790.png deleted file mode 100644 index 63310b9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TiredFace_141728790.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9297f79617a23c8827c3ad26057fb28f39ab438e221b384779dca96d08b73e1a -size 99250 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TixVision_385889916.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TixVision_385889916.png deleted file mode 100644 index 3366d484..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TixVision_385889916.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d26b0ba858cbdf657c539434579d7a037756b51be902b3927e5f27d194774ca -size 105859 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TooMuchCandy_295763789.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TooMuchCandy_295763789.png deleted file mode 100644 index 81710d65..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TooMuchCandy_295763789.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17fb378b58799bb1e16955c04207a635d4bd972c624a9f5a0a98217fccb1977a -size 108725 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Toothless_19399752.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Toothless_19399752.png deleted file mode 100644 index 88a5d0d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Toothless_19399752.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8542ff8b145782bcda19b65b9230d0963ffcc4bb5dea977c2aa24cff768c0f96 -size 109574 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ToothyDrool_8560980.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ToothyDrool_8560980.png deleted file mode 100644 index a98d8500..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ToothyDrool_8560980.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5caf291c30943111f70cbdfab31f9183971a70788eebcc78275345194eceffcd -size 103286 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ToothyGrin_7075434.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ToothyGrin_7075434.png deleted file mode 100644 index b58ae052..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ToothyGrin_7075434.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2091b42f823d11e8e5c33d08f11f21ace319fbde566395681d8853145cd2a322 -size 100392 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheBlueOrc_2830496106.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheBlueOrc_2830496106.png deleted file mode 100644 index dc2b3c24..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheBlueOrc_2830496106.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c33f6005e0ff45c6a5c6c78ba4f8585b3f303a1d6b1a420f2596fccb1dbe18fd -size 134081 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheGreenOrc_2830497827.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheGreenOrc_2830497827.png deleted file mode 100644 index 5683ab19..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheGreenOrc_2830497827.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14b1d885b6d40c2b13339d7c3c3e55e52b509c0f50dae4619f75a56efdaf4276 -size 137183 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheRedOrc_2830493868.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheRedOrc_2830493868.png deleted file mode 100644 index a1d82ad0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TorqueTheRedOrc_2830493868.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3aba99ef2cd102c85da766dc10861a5aeee2171562dfcdf3ec0705fef51a9905 -size 138836 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Trance_29109681.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Trance_29109681.png deleted file mode 100644 index c1875d63..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Trance_29109681.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33f132beb4445430b1201dcd44496c8e992809be495757530dc869b08f51132c -size 111810 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Troublemaker_22920501.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Troublemaker_22920501.png deleted file mode 100644 index b0a59917..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Troublemaker_22920501.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60ab8e6bd394c34d688438a2ae8db672d0f4af93f57c13d35bd86c0a3505cbbb -size 114197 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TrueLoveSmile_362051405.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TrueLoveSmile_362051405.png deleted file mode 100644 index d764cdac..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TrueLoveSmile_362051405.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fa84102c52b8e8448eb7acfd0524eadfd2cc1f92eebe4c4e14a0984a87bc17a -size 103423 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TsundereExpression_4645952767.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TsundereExpression_4645952767.png deleted file mode 100644 index 6b92bd82..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TsundereExpression_4645952767.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f2fa56dad7453fbcf680fee4d808de04a49609a46a46c05788e0d1a76a8d4e4 -size 124670 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TwoGuysOnABoat_14127171.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TwoGuysOnABoat_14127171.png deleted file mode 100644 index 045d4e19..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/TwoGuysOnABoat_14127171.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50d9aaaa6f3a19c70eb6e67d54708b13f220cf0c987c3627ba9dbd4c39883e0b -size 108243 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UhOh_7074944.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UhOh_7074944.png deleted file mode 100644 index 92785fb7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UhOh_7074944.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:959aa06ecb4962b5ca2d815cd57fcfaecc1f2a16f14601f6c629cfdd7bfb9208 -size 100533 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UpToSomething_1016186364.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UpToSomething_1016186364.png deleted file mode 100644 index 52972192..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UpToSomething_1016186364.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e36a35c80ea3b5550cd251f44791ff510660ba42337cba1870140c7ba10e9157 -size 102192 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UpsideDownFace_1772578399.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UpsideDownFace_1772578399.png deleted file mode 100644 index 86937c34..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/UpsideDownFace_1772578399.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f40124589775b43399694206379d4154fe5c3ed4d90a299ad0cd3367c5ab8f3 -size 99239 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ValkyrieOfTheSplinteredSkiesFace_2907632781.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ValkyrieOfTheSplinteredSkiesFace_2907632781.png deleted file mode 100644 index 16f6037f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ValkyrieOfTheSplinteredSkiesFace_2907632781.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7fc4e1633c5679fc88fda47d24699c5e731ca378381b6d8325e3cdea0c2e29bd -size 121910 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ValorousKnightFace_3258576172.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ValorousKnightFace_3258576172.png deleted file mode 100644 index 23171cff..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ValorousKnightFace_3258576172.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53c6c3a6daa952688818ec614c734ee7d2f60246d3ed22acab0cb678bfee1db5 -size 119816 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Vampire_29532363.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Vampire_29532363.png deleted file mode 100644 index 4e46cc84..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Vampire_29532363.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc83dd452924a95bf0c70a238829746237377fa8718b35485d0dcf94ec007ac3 -size 110241 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VansCheckerboardBlueEyes_8247356154.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VansCheckerboardBlueEyes_8247356154.png deleted file mode 100644 index d5ed5523..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VansCheckerboardBlueEyes_8247356154.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e14912a5d279e8baf5ecee4cb6391b9d6574a4fcba98f4d383e5e6a63d0f7831 -size 136327 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VioletFang_362051899.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VioletFang_362051899.png deleted file mode 100644 index 55c49643..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VioletFang_362051899.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1582768f97ea632db5a15b428b159cc32edb01de190769fe34e7d221e83e3a22 -size 106057 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VioletStarrySight_2222775930.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VioletStarrySight_2222775930.png deleted file mode 100644 index 3b64b948..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VioletStarrySight_2222775930.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b64b92aa86c661147885211470c71e49bdb5a084f908bcafa57853276f6ee3fe -size 110591 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VisualStudioSeizedUpFor45SecondsAgain_14083380.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VisualStudioSeizedUpFor45SecondsAgain_14083380.png deleted file mode 100644 index 45f0944b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/VisualStudioSeizedUpFor45SecondsAgain_14083380.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f3486a31d3e23f9b479f043b358d60aaab00fd4be756defe71f96e413618f5f -size 101093 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WalkThePlankYouScurvyDogs_13478124.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WalkThePlankYouScurvyDogs_13478124.png deleted file mode 100644 index 9ecb650e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WalkThePlankYouScurvyDogs_13478124.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd8d3b2cec439199e841887fc6926b427e9c7153a4e56a82bfc7bec3c3825350 -size 108564 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WarpaintJoshDunTwentyOnePilots_7389923463.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WarpaintJoshDunTwentyOnePilots_7389923463.png deleted file mode 100644 index 58ad78ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WarpaintJoshDunTwentyOnePilots_7389923463.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cb6e3140823922d86d3d65b11039cb53edb3f0294cb2150e7f816122a84dfd1 -size 118353 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whaaaaaa_14127194.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whaaaaaa_14127194.png deleted file mode 100644 index 2a2b4491..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whaaaaaa_14127194.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3676539691f07508ddafcab0d8d35b2b5edd57b4906b153db123169d6ff1a0b -size 109342 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WhatchooTalkinBout_7075089.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WhatchooTalkinBout_7075089.png deleted file mode 100644 index dcebd88c..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WhatchooTalkinBout_7075089.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54b40d62fda03070c21d1581097bda88398fc8bbc45828e613bbd3483b19039b -size 102640 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WhereAreTheEggs_24975496.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WhereAreTheEggs_24975496.png deleted file mode 100644 index 41edf25a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WhereAreTheEggs_24975496.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de1c707cede3891224ab18604d6c9e7a11976f299475e32a766d7e40b754f660 -size 104910 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whistle_22877700.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whistle_22877700.png deleted file mode 100644 index a82cdea7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whistle_22877700.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a21b8d216fcc3f74ba3e86495416ab03184c7eeab32e19714a4db6e49ea7729 -size 99082 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whuut_274338458.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whuut_274338458.png deleted file mode 100644 index 39722cb0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Whuut_274338458.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5831f01558fe99251d2381ef4e9b83bc8d7511e207ff76af05e9cb249bb44bc6 -size 103319 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WickedWebbedBerserkerFace_3993282075.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WickedWebbedBerserkerFace_3993282075.png deleted file mode 100644 index e0de5277..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WickedWebbedBerserkerFace_3993282075.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65f2404f2abd9f2459c8bc3ff91b2ae180860b2c3293ec9b0154a456f42b6586 -size 127929 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WilliamBigBillConnerFace_2833509821.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WilliamBigBillConnerFace_2833509821.png deleted file mode 100644 index 98e92f3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WilliamBigBillConnerFace_2833509821.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f08bd7cba177c78d249420d8c7ebc400ff3032e9fe33be21fc23189d1cce76e5 -size 118301 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Winkblink_22828351.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Winkblink_22828351.png deleted file mode 100644 index b06bff4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Winkblink_22828351.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17b9ac5d47d97db63bb2a2c3d10249084821bdb69f17f475f4ae9089656dbf16 -size 103087 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WinningSmile_880469676.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WinningSmile_880469676.png deleted file mode 100644 index b31ef6a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WinningSmile_880469676.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec67a24e22dfaa21cda6549de299112b51abc3799c096f819819c8a235420b8b -size 106652 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Winter_22587828.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Winter_22587828.png deleted file mode 100644 index 48d96273..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Winter_22587828.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f93d11560dab6f06b3098e7a74f8a6efd0716f4274ba908ebab0647eea14219 -size 129687 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Woebegone_21755022.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Woebegone_21755022.png deleted file mode 100644 index 9899f688..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Woebegone_21755022.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b58a1d1ea8a8b9c10f34865107b37d476225ecedbaf8c709143ecf0eaf221a3f -size 107994 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WomanFace_86487766.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WomanFace_86487766.png deleted file mode 100644 index 3577d48b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WomanFace_86487766.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e81408ec8170e39d9e3d2937f8e12b75fabed5b4b9e223dce7659ad7cea88996 -size 121814 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Wonder_Womans_Golden_Armor_Face_6029816756.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Wonder_Womans_Golden_Armor_Face_6029816756.png deleted file mode 100644 index 1dd070e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Wonder_Womans_Golden_Armor_Face_6029816756.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8e565e5e18aca58267193e495f04fd95d5e6b8b5c4df6f124e48b4cdad5bfd8 -size 106129 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WweSethRollinsFace_3016138770.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WweSethRollinsFace_3016138770.png deleted file mode 100644 index b4c4178b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WweSethRollinsFace_3016138770.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a43f70d8172effae4a8a905f49c076ad40ef10421f2feb85136ecd15a8567cb4 -size 109381 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WyldfireFairyFace_2517242922.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WyldfireFairyFace_2517242922.png deleted file mode 100644 index bfc1d976..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/WyldfireFairyFace_2517242922.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c51f783e72c322439299abbe0b66ef45f975c063f95d224c1e7b80afe1f24c5f -size 105768 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xd20_406001052.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xd20_406001052.png deleted file mode 100644 index c14793d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xd20_406001052.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4df0ac881350a1a5957ce79729f3b5a60ef0e9fb933817e75da98420468d4e32 -size 105462 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xd_15054426.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xd_15054426.png deleted file mode 100644 index 79a3ab6a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xd_15054426.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf81b80442a5bd86d91d4a32f57b546078b3c1fccc31bd1a73398c0b65ac6707 -size 105038 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/XtremeHappy_20644021.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/XtremeHappy_20644021.png deleted file mode 100644 index 401e0875..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/XtremeHappy_20644021.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccb389c2bb0070531235b00c26db8ce97832b1459b4021f99fa3ff74b3af90c6 -size 120702 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xx_15395327.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xx_15395327.png deleted file mode 100644 index b553d84d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Xx_15395327.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d8f2cfccb719d226472054098bc24d68e8125f8ed32c33865501de0928bbafb -size 99298 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yaaawwn_162068415.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yaaawwn_162068415.png deleted file mode 100644 index abb550d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yaaawwn_162068415.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f001f095b0b91b8f962c6d07520b40b35995a9dd4fae2dd0d3cfc30108a8303 -size 102118 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yawn_20010377.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yawn_20010377.png deleted file mode 100644 index bcc36569..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yawn_20010377.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2dc1d122a6b7d265b8f474b1ccd6cd3aa5370a277b639822c7671a64a6887e7 -size 103084 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YellowGlowingEyes_416846000.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YellowGlowingEyes_416846000.png deleted file mode 100644 index eda8a7a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YellowGlowingEyes_416846000.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b82e3ac05db699f49c35460278de4f88b689867dd1cf39c15282ef3fb6726ca3 -size 103259 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YellowStarface_162200696.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YellowStarface_162200696.png deleted file mode 100644 index bb4c6361..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YellowStarface_162200696.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4613af3e121de02834965eed9e0d24978006c15004fa0d5d0263fcef855356e9 -size 112059 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YouAtedMyCaik_21635583.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YouAtedMyCaik_21635583.png deleted file mode 100644 index 608b4aa7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/YouAtedMyCaik_21635583.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9059dede1c938e7107d0907f3bd2a29f0e0ad23a15e3b431ebf7d2563c24355 -size 102822 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yuck_10907531.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yuck_10907531.png deleted file mode 100644 index 30eb80d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Yuck_10907531.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c0891c387a6a56c7867441d186c5ef3a99edb4a77b6ca3cb055d5a819f714b1 -size 100557 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZedFace_5122355742.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZedFace_5122355742.png deleted file mode 100644 index b516c15e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZedFace_5122355742.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b6e0e096bf7cbd9c4292b9db6b8127358e5934a4b7b947a0c37b309402777fa -size 137777 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZipIt_24126147.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZipIt_24126147.png deleted file mode 100644 index 0f112311..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZipIt_24126147.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9573699a7e1e7213f914cfa986f99803a71cbcd5a23d73c2149ace8fc6667937 -size 101389 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZoeyFace_807339121.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZoeyFace_807339121.png deleted file mode 100644 index 542b0a14..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZoeyFace_807339121.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b0afb6823623e376c1d9660ca04a93f3c26d0492695bccfe0e862ef499956de -size 101808 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZombieFace_133360789.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZombieFace_133360789.png deleted file mode 100644 index 043029ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZombieFace_133360789.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fd4031c294692a50f7a45593159c48cfd529c249c6dc00c9857a62027424eec -size 152712 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZomgHatSelling_16413496.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZomgHatSelling_16413496.png deleted file mode 100644 index 22ba4204..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/ZomgHatSelling_16413496.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:756472b20fff3c2a722897ce5508558035d0a299c0e9156e9c7fd6e7925a6e6c -size 103164 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Zomg_8329682.png b/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Zomg_8329682.png deleted file mode 100644 index a1e75e34..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/classic-head/Zomg_8329682.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ff7fa0bb61697f0a78ce27be6cd4d091911608c1f9df43510564a1a6e0d8c2d -size 104536 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Anime-Templates.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Anime-Templates.png deleted file mode 100644 index dbe2d3e0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Anime-Templates.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1be3310f46d725c07a3fbce77905fbf18280954563a7185c9a565e9afc3dca9 -size 335696 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Caricature-Templates.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Caricature-Templates.png deleted file mode 100644 index 714d1418..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Caricature-Templates.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0088da0c5f594bd561253a6315fad31e57b69c9c9f804ced83b845baf42a84d5 -size 130099 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Custom-Skin-Tones.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Custom-Skin-Tones.png deleted file mode 100644 index de204b55..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Custom-Skin-Tones.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4556b0e5c1c2195d426d6f4803ea7e28178b8e5fbb49a9f339ac3870eaf310b -size 406583 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Concepts.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Concepts.png deleted file mode 100644 index 0769cee8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Concepts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4153be3d34ecc85c769cd7b0deca8eb100ac2683344640ca20bfa91a2b5f8a1f -size 310776 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Head-Templates.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Head-Templates.png deleted file mode 100644 index f080a3da..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Head-Templates.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:595db7a6cf667732fd1f97088d612a85dcd344d3c51f49a6bea841b4b921a93f -size 612369 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Prototype.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Prototype.png deleted file mode 100644 index 94a020e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Muzzle-Prototype.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b44e3eebf91d849aaee64426653c1b3ba20056a3f41317eb0a19a7bba8b77efd -size 121045 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Concepts.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Concepts.png deleted file mode 100644 index cd7d9e56..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Concepts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:175e80d7abf75a45ef13d08bf72be464fd2a2b0bba94212ebfce8382ca0b574d -size 239854 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Head-Templates.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Head-Templates.png deleted file mode 100644 index f1682c8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Head-Templates.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ef37a05e333fecf8ade67621dd4d3b042a60f43d5eb112f9f8f06405fff8e8b -size 597334 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Prototype.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Prototype.png deleted file mode 100644 index 1f75def1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Round-Prototype.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8c56af0232cdf056723b41f3882f9b0c0f827377c2e26fff266060dc0714404 -size 102867 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/SemiRealistic-Templates.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/SemiRealistic-Templates.png deleted file mode 100644 index 0dcb31d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/SemiRealistic-Templates.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03e7ef49c26db106b785b31f0f4eccffcdfd5c3236ccd9f6ec4faa0c0874ae72 -size 320818 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Square-Head-Templates.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Square-Head-Templates.png deleted file mode 100644 index 16831c46..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Square-Head-Templates.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5c55197cd41892e8122c9a851e59b43def0b9ae14209ca2c013c07f1af0efcd -size 620049 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Stylized-Templates.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Stylized-Templates.png deleted file mode 100644 index 0356c4c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Stylized-Templates.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f37c14f113cf8295cc07d97652f22e24f62e2be2e90bb0b7d8e529931d54d58 -size 148889 diff --git a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Texture-Map.png b/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Texture-Map.png deleted file mode 100644 index 5b27f2f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/avatar/templates/Texture-Map.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0e67800deb346cdf422846337e3c754e013a5913a65ed20d61c2625de917ada -size 734590 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/3DCursor.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/3DCursor.png deleted file mode 100644 index c4d42729..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/3DCursor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:322fa860993fec54ccaab419c0b830f60ce0493185003e1c46daf7e1467488e3 -size 592822 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/3DViewport.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/3DViewport.png deleted file mode 100644 index d3bf7304..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/3DViewport.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d4b3c2d564af5bc5d90790df281ccc056c87afd945d178c849cb3d8a9e5efe7 -size 614809 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/ActiveSwatch.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/ActiveSwatch.png deleted file mode 100644 index a6809503..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/ActiveSwatch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:796c7b89f4cd3200f402f8c0bc8da51aaa24465f87b2c5840349417d1292446e -size 35026 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Blender-Project-Objects.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Blender-Project-Objects.png deleted file mode 100644 index aa444d17..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Blender-Project-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4753f385c65f3957558b0bec88f305047aad60d91d9873fbe3b0d92ef78597e4 -size 28023 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Data-Tab.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Data-Tab.png deleted file mode 100644 index 0d6d836f..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Data-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df82ff90229d43597f87ca6b432da07692ebed4d64050f111ebeee591d8661d3 -size 231694 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Disabled-Icon.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Disabled-Icon.png deleted file mode 100644 index 448cdb99..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Disabled-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99c51255b2e70bd3ed91f60da8031f564f6ade0a61ba1f02b75ba4618baaee9d -size 3925 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Edit-Mode.jpg b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Edit-Mode.jpg deleted file mode 100644 index 9f85bbec..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Edit-Mode.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa219003c3ace7c2ae84d1ab63995170f9caac93cfcfd90c10db83cb1e08aeb5 -size 24224 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Face-Bones.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Face-Bones.png deleted file mode 100644 index 020514e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Face-Bones.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d8ee4bfbff0744d0bdf18c4cfa91e39f37f78410aa851c09b509bc0bef441a2 -size 22979 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Face-Objects.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Face-Objects.png deleted file mode 100644 index e470177b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Face-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6a6d62849f3411f486479dc436fbb4575c509255274a863f797b8e69af6124a -size 29612 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Modes.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Modes.png deleted file mode 100644 index 980c0f04..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Modes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c070e7fa72ae7d9ca4f1eeae51a0a77ae6518c629a90ef6597919d06d0040ebd -size 595055 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Modifiers-Tab.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Modifiers-Tab.png deleted file mode 100644 index 8636c4f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Modifiers-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:550def2dd2dc79e2124df8c2dd7cba620b53e945c487900f8e847e1c8628eabe -size 38829 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Object-Mode.jpg b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Object-Mode.jpg deleted file mode 100644 index 8d5f508a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Object-Mode.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03bcfb413b1ece8d061d501a7f855c0e6d1bde9e12bbaaa8f6a873a063e98f22 -size 24553 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Object-Select-Icon.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Object-Select-Icon.png deleted file mode 100644 index d9d3e917..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Object-Select-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ae39c598b8fdd8612118d36e79b455a1dc3a611a8816fdb258a37b5cd36902a -size 665 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Disabled-Enabled.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Disabled-Enabled.png deleted file mode 100644 index b43e7a2e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Disabled-Enabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ed2cac17ea22a7015266c82cac1afed5f177d04731be824346966f6f193719f -size 24871 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Filter.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Filter.png deleted file mode 100644 index 916a1247..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Filter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac23d945ba52466aa8dad05c8251fe6209ccaa9688c15e1fa091fe8017d2f43e -size 33490 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Menu.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Menu.png deleted file mode 100644 index 0aa45590..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Outliner-Menu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8981ad7cbf8b80e95b6c6c3fe3fec2e34fb91f481c35d6bd7bf337b55689ab6b -size 50559 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Scene-Options.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Scene-Options.png deleted file mode 100644 index 22d3f67e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Scene-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6dbb46bc5e2e0540d54782b64e2fb56a0fa58a0c2f7dbef8a68ff0cb3388da61 -size 41881 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Sculpt-Mode.jpg b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Sculpt-Mode.jpg deleted file mode 100644 index 0268704a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Sculpt-Mode.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3bd9e95ea914c0cea1ce96d73ff942b314f3ca46281de9629b3f69aa81e843 -size 24765 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/TexturePaint-Mode.jpg b/.cursor/rules/roblox/en-us/assets/art/blender-ui/TexturePaint-Mode.jpg deleted file mode 100644 index 8f41b7c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/TexturePaint-Mode.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c68f155a6b7f625b15b982ddc127255484e47eff91586a708aa06bd8c6ecd9c -size 24738 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Timeline-Frames.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Timeline-Frames.png deleted file mode 100644 index 1dcf6a34..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Timeline-Frames.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e17e2bcc17647b7889f328d0bd1564a95fa59371462daafa35bb9b30676406d -size 6900 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Toolbar.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Toolbar.png deleted file mode 100644 index e09bd31e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Toolbar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75ba1488f1c381da8f6dddb865142ec27c85d5c54371d5438624d5e61219a3c1 -size 593220 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/VertexPaint-Mode.jpg b/.cursor/rules/roblox/en-us/assets/art/blender-ui/VertexPaint-Mode.jpg deleted file mode 100644 index 59e3522e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/VertexPaint-Mode.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0df989afcc49da862b2cc88299e2466212eb346e75e5aa62c485807162c1dddb -size 24715 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Viewport-Shading-Setting.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Viewport-Shading-Setting.png deleted file mode 100644 index 76adf938..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Viewport-Shading-Setting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a55f7c858e7376f75fb16da66f938e88f190d44db4b163d65e8f4cf0a9841e7 -size 2867 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/ViewportShading-Solid.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/ViewportShading-Solid.png deleted file mode 100644 index bbdfcf4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/ViewportShading-Solid.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec7df34fadc609e80f54295a85e016fbefb2363fcec5530b03c5f3d55b4b2051 -size 43846 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Visibility-Icon.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Visibility-Icon.png deleted file mode 100644 index 9a267d51..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Visibility-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf23a1375bc2452c02853a293291ab7f751c431c60c402534f0135c044790b50 -size 1883 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/WeightPaint-Mode.jpg b/.cursor/rules/roblox/en-us/assets/art/blender-ui/WeightPaint-Mode.jpg deleted file mode 100644 index 12bd1253..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/WeightPaint-Mode.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3365e700557b947602a3525450543be6660f7725c48f49560afa11c04c92b8ef -size 24716 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Workspaces.png b/.cursor/rules/roblox/en-us/assets/art/blender-ui/Workspaces.png deleted file mode 100644 index caefcf68..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/Workspaces.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43873e10a2657448da6be6bb45ea4531e7f5d27e7182fdca7a103883e72aff1e -size 598309 diff --git a/.cursor/rules/roblox/en-us/assets/art/blender-ui/scene-tab.jpg b/.cursor/rules/roblox/en-us/assets/art/blender-ui/scene-tab.jpg deleted file mode 100644 index 80279096..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/blender-ui/scene-tab.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70adb447cbd80a8b3ecc4de0ecff20b3fdf3f4c48cdaedd81cfb249ca11bedb1 -size 37311 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/AnimeFemale-Studio-Ready.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/AnimeFemale-Studio-Ready.fbx deleted file mode 100644 index f856a1d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/AnimeFemale-Studio-Ready.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:542ce8dec4c11d3a3710a9cf4e9bb2da08a370babbfee20ebd25c0b5c34425ed -size 6371052 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/AnimeFemale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/AnimeFemale.zip deleted file mode 100644 index ddf95630..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/AnimeFemale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f95021c79f4c5a014d5482ff49b4d691983f080ebf5ac60d6c08d339703be0e8 -size 11439708 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/AnimeMale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/AnimeMale.zip deleted file mode 100644 index ddfc548b..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/AnimeMale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bce3d403800dec5b87d004d03ddd54e120ddf42169a544107e0a3c081f514acc -size 10537703 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/Caricature.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/Caricature.zip deleted file mode 100644 index 1e3e2511..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/Caricature.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4932dacc460223d2c829e8fda0f0d0217a7b58e16aa463d1dda851fff10a0ff2 -size 7126073 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/ClassicMannequin.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/ClassicMannequin.fbx deleted file mode 100644 index 69e70e1e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/ClassicMannequin.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:970edb3a94e2863655044bef3391557eb2971dc24f74aea3f35d877879154b08 -size 573324 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/ClassicMannequin_With-Cages.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/ClassicMannequin_With-Cages.fbx deleted file mode 100644 index 7140e3b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/ClassicMannequin_With-Cages.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72eb65745962a377d9e78500eb2961f4abe3f1b0f4be74ef20cd346435c76ef1 -size 557468 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/Eyebrows.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/Eyebrows.fbx deleted file mode 100644 index 3841c8a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/Eyebrows.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8430afded33cea8965c6693a77af872a0f47f9ad410acfc3898e346ff8839e0e -size 1928540 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/Eyelashes.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/Eyelashes.fbx deleted file mode 100644 index 2571221e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/Eyelashes.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad8471699463aca91c2a812325a5c6f33f1c3968360b75e20c46f36fc0112be5 -size 1939820 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/HeadCages.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/HeadCages.zip deleted file mode 100644 index b124b193..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/HeadCages.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e71b819b2129ede6551b74d9be7c7b93429b4f5473903035a98506da051dab9 -size 161150 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/MuzzleFemale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/MuzzleFemale.zip deleted file mode 100644 index 3496769e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/MuzzleFemale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1190a6637922e9b682a46251b15de0966dfe0898e3eff4d3174c8ac8946149f8 -size 7245881 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/MuzzleMale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/MuzzleMale.zip deleted file mode 100644 index 47d7ff80..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/MuzzleMale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:921624c31a65196d826f1b968d47184fd8c7228fed6be390d507b82b84fd4d78 -size 6635865 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/NatureArcherGirl-AutoSetup.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/NatureArcherGirl-AutoSetup.zip deleted file mode 100644 index 7f704656..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/NatureArcherGirl-AutoSetup.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7fbc5722c4948baa2085fa75efbf034bc25b5849f5dcc15b093127d0947efe30 -size 9299933 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/NatureArcherGirl.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/NatureArcherGirl.zip deleted file mode 100644 index d13af7d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/NatureArcherGirl.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:581c16738feda7baff0fce45aaadfc86feb004d1f38795d037471aa5cf2ba384 -size 259988601 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/RoundFemale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/RoundFemale.zip deleted file mode 100644 index 893e06d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/RoundFemale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e59ef5b5cdd698f8cece5952bfd353796de2986c5d397b57cfdb3a20d047eb1 -size 7002038 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/RoundMale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/RoundMale.zip deleted file mode 100644 index 4fcdbf79..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/RoundMale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8777d1b3183452940c9f04d3d7a4e9f75a245dccd65d883a03b38c7c0dd58560 -size 6359982 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroMannequin.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroMannequin.fbx deleted file mode 100644 index 5be5a6d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroMannequin.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6db9e67326b9f5adc8ac47cf62903217d82e4554d19a65eca4281c4f104d838 -size 544236 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroMannequin_With-Cages.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroMannequin_With-Cages.fbx deleted file mode 100644 index 3e482ec0..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroMannequin_With-Cages.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8519448131dde042830bce938cca86f211ef535ad80713b1938d3512320b249 -size 1160556 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroSlenderMannequin.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroSlenderMannequin.fbx deleted file mode 100644 index 61160854..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroSlenderMannequin.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:995a0a4af01e5299be8e77d96f75c11bd48b5d88ae65568e0f4bb523b6e28a1a -size 567484 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroSlenderMannequin_With-Cages.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroSlenderMannequin_With-Cages.fbx deleted file mode 100644 index eb931b54..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/RthroSlenderMannequin_With-Cages.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1f92f00e37e98095a0e14e4254a35d1f87c190c780c447f0c684eff9694b532 -size 1180124 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/SemiRealisticFemale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/SemiRealisticFemale.zip deleted file mode 100644 index 34f9d1d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/SemiRealisticFemale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b5d7137dae47cee2c78467df2f1e26ca556554348fa080f15e010e23ac773a3 -size 12750832 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/SemiRealisticMale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/SemiRealisticMale.zip deleted file mode 100644 index e519dc44..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/SemiRealisticMale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bcc469944905d5c393d45fafd33455cf229eed195b158661de08817de048bc3 -size 12348036 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/Snow.fbx b/.cursor/rules/roblox/en-us/assets/art/reference-files/Snow.fbx deleted file mode 100644 index a0a2cfc2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/Snow.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bcbdc354fc1539057d1a0f5c784afe53961c594692bcf32049b297e665a4d58 -size 2742960 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/SquareFemale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/SquareFemale.zip deleted file mode 100644 index 113070cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/SquareFemale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:948e438b136547ef7e753b888222b84c7b523bb2e386a752798e5646e97952ed -size 4137004 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/SquareMale.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/SquareMale.zip deleted file mode 100644 index e0862d1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/SquareMale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55e09e3585ad3e0a38ce8eb526183b5c4116cfecaa24e3721d996f952686f51f -size 5366921 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/StylizedHuman.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/StylizedHuman.zip deleted file mode 100644 index eeddc42e..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/StylizedHuman.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af9bd355b8c5c060c172420d3796548e562eb36223d00c0bed1b72b0f3665065 -size 7980049 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/StylizedMale-AutoSetup.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/StylizedMale-AutoSetup.zip deleted file mode 100644 index 7cc7ba79..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/StylizedMale-AutoSetup.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32757c0a592eba56a7e76167fcdea52f7d4b2cf009ce4cb948a6cb7c7ffd2063 -size 3749120 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/StylizedMaleWithClothing.zip b/.cursor/rules/roblox/en-us/assets/art/reference-files/StylizedMaleWithClothing.zip deleted file mode 100644 index 45762a97..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/StylizedMaleWithClothing.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:389286ea7045d74aab928e535fb74674c47a18033cd4d1a8a05a87c522bd1929 -size 189362776 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/1_Goblin-sculpted.blend b/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/1_Goblin-sculpted.blend deleted file mode 100644 index d90126fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/1_Goblin-sculpted.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a351ee9b6a999008212068c7674bf0e2281db04865f0c8ff49ab67d9ede2631 -size 29778228 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/1_LongSleeve-Modeling-Complete.blend b/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/1_LongSleeve-Modeling-Complete.blend deleted file mode 100644 index 7e5c002d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/1_LongSleeve-Modeling-Complete.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d38e4eebd324050a92e50cd6896704c49dd586ca99c624eced4fd043620ebe7 -size 1483700 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/2_Goblin-textured.blend b/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/2_Goblin-textured.blend deleted file mode 100644 index 18183c1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/2_Goblin-textured.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c276708d58c7b23548426e93fa85368f5fbb0194ec36fcb7065c9dcb429bc8ac -size 29268668 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/2_LongSleeve-Texturing-Complete.blend b/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/2_LongSleeve-Texturing-Complete.blend deleted file mode 100644 index d3e56203..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/2_LongSleeve-Texturing-Complete.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3a5448d3d3aad444a6f54eb1594f813ef0de9c0bce550feaf49297d4001363f -size 1619944 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/3_Goblin-caged.blend b/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/3_Goblin-caged.blend deleted file mode 100644 index c4d67fee..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/3_Goblin-caged.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a0aa2aa7fdec6b40f9fe0e1d02c15d083c417f4b1852fe37d30ab4777e2cdd1 -size 29287772 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/3_LongSleeve-Rigging-Complete.blend b/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/3_LongSleeve-Rigging-Complete.blend deleted file mode 100644 index 2616a7d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/3_LongSleeve-Rigging-Complete.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c61907717563cedd981d534704e18cdd5c122c614927a8612d5c3bc5391517bc -size 1664140 diff --git a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/4_LongSleeve-Caging-Complete.blend b/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/4_LongSleeve-Caging-Complete.blend deleted file mode 100644 index 1e21b88a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/reference-files/checkpoint/4_LongSleeve-Caging-Complete.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b8cd6bb20089129b90ba07cd16e7ee881a40524366481450932d355807cb16f -size 1661108 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Archer-Girl-Preview.png b/.cursor/rules/roblox/en-us/assets/art/resources/Archer-Girl-Preview.png deleted file mode 100644 index b6ef58b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Archer-Girl-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82efa4914cdd3a8da264655e6ac39a9ca0bd410f40d60295cf768f4312dcaddd -size 473951 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Blocky-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Blocky-Resource.png deleted file mode 100644 index 61ec5cb4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Blocky-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a486c6e861948c8889a1745ffc2973e81eb4e09c26fc8fd197c3721285eb408 -size 362651 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Body-Cages-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Body-Cages-Resource.png deleted file mode 100644 index 146b3b82..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Body-Cages-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a25fe3e243156eb960fb40a9336297bcf26740d36271e58c9690e33cb9dca84 -size 216279 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Classic.png b/.cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Classic.png deleted file mode 100644 index 47c354fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Classic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2abb2f126e20b5a40556f25029d6f7655c9a4157ecfd6ac1350b4a250a9f30ca -size 200258 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Rthro-Normal.png b/.cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Rthro-Normal.png deleted file mode 100644 index 3e2a8aa2..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Rthro-Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5519b9a56b6076f4dc33a33fb06cbf7fa9797c4b87aef929a45fe1f10aeaf954 -size 185724 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Rthro-Slender.png b/.cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Rthro-Slender.png deleted file mode 100644 index cdc721bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Body-Scale-Rthro-Slender.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd88bc94d812723f429a43ad7c0085c22966b4280674262c22b77a4297f63438 -size 156209 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Clothing-Cage-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Clothing-Cage-Resource.png deleted file mode 100644 index 72c1d270..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Clothing-Cage-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e07addf3180d4edfcd56914a0cf989b20a746675c9b1447ed1ccbaa6c89f260 -size 156970 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Creature-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Creature-Resource.png deleted file mode 100644 index 8bcf6aa6..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Creature-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f8ba540a84cc6e959b5c228d7693fdc3d3650afd7d220bee7fa0d985735ee69 -size 431153 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Fish-Person-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Fish-Person-Resource.png deleted file mode 100644 index 543243ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Fish-Person-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7de6d4430ecfff0184db0615cd071ab319fa902dfb5be5374951d81a495510df -size 292928 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Goblin-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Goblin-Resource.png deleted file mode 100644 index c8389689..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Goblin-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8dfd8df2a94de5631652d0dea9bad2a2569c7ea41958e6b11900fdba91019979 -size 454695 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Lola-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Lola-Resource.png deleted file mode 100644 index 3e32b5f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Lola-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4b6af836df72f171baa802048678f53a2bfafefe1a86186969840d0b769b6ef -size 254110 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Rig-And-Attachments-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Rig-And-Attachments-Resource.png deleted file mode 100644 index 15cd91b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Rig-And-Attachments-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c25402f23e333a58baa7ddc87b4a65848a0b4197c9a5b9f32bc272b519eee9c0 -size 99674 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Shoebot-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Shoebot-Resource.png deleted file mode 100644 index 63742c76..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Shoebot-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f78f3d48248c4595400d0f4df29a90c539847beb52ddee3f10a0c370d3d6b8e -size 196244 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/StylizedMale-Preview.png b/.cursor/rules/roblox/en-us/assets/art/resources/StylizedMale-Preview.png deleted file mode 100644 index 801b128a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/StylizedMale-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8efd96e4013a4c1be286adad258b5e148038a279c79d5efdc91874e0b4e70921 -size 464878 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Tree-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Tree-Resource.png deleted file mode 100644 index 3a1f67c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Tree-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f49a2d70f39ae05553ad9b381a7cd9fa955819512581b38135b883a2afe0324 -size 811397 diff --git a/.cursor/rules/roblox/en-us/assets/art/resources/Tshirt-Resource.png b/.cursor/rules/roblox/en-us/assets/art/resources/Tshirt-Resource.png deleted file mode 100644 index 6f8bad93..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/resources/Tshirt-Resource.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e90ff93674b862cbc087bed303b415ebcba42caeb6461d200485b39cce504ce -size 241379 diff --git a/.cursor/rules/roblox/en-us/assets/art/staff-articles/PBR-Textures-Substance-Painter.zip b/.cursor/rules/roblox/en-us/assets/art/staff-articles/PBR-Textures-Substance-Painter.zip deleted file mode 100644 index 0a108cef..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/staff-articles/PBR-Textures-Substance-Painter.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e14cc82bccd8d72a18672f1259652543ceb8b220b2ab90b39fab7283f8ec5354 -size 14836679 diff --git a/.cursor/rules/roblox/en-us/assets/art/staff-articles/PBR-Textures-Substance-Sampler.zip b/.cursor/rules/roblox/en-us/assets/art/staff-articles/PBR-Textures-Substance-Sampler.zip deleted file mode 100644 index f4d05920..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/staff-articles/PBR-Textures-Substance-Sampler.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c87137a3cb889be45e695b6d99a17c9ddfa31b359a281e4b70fc0558f6aab4e -size 44628112 diff --git a/.cursor/rules/roblox/en-us/assets/art/staff-articles/Rock-Sculpting-References.zip b/.cursor/rules/roblox/en-us/assets/art/staff-articles/Rock-Sculpting-References.zip deleted file mode 100644 index 7ba721f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/staff-articles/Rock-Sculpting-References.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9995cb0675f7b1959fad2e9b3da8b6784d057be7ff29d57d7a768b1884356905 -size 652655684 diff --git a/.cursor/rules/roblox/en-us/assets/art/staff-articles/Tileable_Textures_Photoshop_Sampler.zip b/.cursor/rules/roblox/en-us/assets/art/staff-articles/Tileable_Textures_Photoshop_Sampler.zip deleted file mode 100644 index c7755788..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/staff-articles/Tileable_Textures_Photoshop_Sampler.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48c8038f66885ba9ae98b8e0f1e680b7ff30ea525ad4addb1ed1f448432daae0 -size 42076245 diff --git a/.cursor/rules/roblox/en-us/assets/art/staff-articles/Transparency_Maps_Substance_Sampler.zip b/.cursor/rules/roblox/en-us/assets/art/staff-articles/Transparency_Maps_Substance_Sampler.zip deleted file mode 100644 index ee6c810a..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/staff-articles/Transparency_Maps_Substance_Sampler.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3105176fd4c3117b825fe9a6dcbbf589176fbe48d6945beb5dd6b66701783e18 -size 18212395 diff --git a/.cursor/rules/roblox/en-us/assets/art/staff-articles/ZBrushProject_Radial_Symmetry.zip b/.cursor/rules/roblox/en-us/assets/art/staff-articles/ZBrushProject_Radial_Symmetry.zip deleted file mode 100644 index 5aca8588..00000000 --- a/.cursor/rules/roblox/en-us/assets/art/staff-articles/ZBrushProject_Radial_Symmetry.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9571d6dbed24ff604a14c49f78a660c216127705794cf54ceaad3bb08229b02 -size 63486480 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/AssistantDocumentationSite.png b/.cursor/rules/roblox/en-us/assets/assistant/AssistantDocumentationSite.png deleted file mode 100644 index f61e9aca..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/AssistantDocumentationSite.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bee127cb2ac3b1643dce3ed9d37b70a41b541aa537fb6cb2df7e88a277dfd967 -size 67578 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/AssistantStudioExample.png b/.cursor/rules/roblox/en-us/assets/assistant/AssistantStudioExample.png deleted file mode 100644 index 13e14e12..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/AssistantStudioExample.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be8fac6a191c3993e4ee334df67ff6c5aea271121b6ba7c7eb3ccacd1b97343a -size 222631 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/BYOK.png b/.cursor/rules/roblox/en-us/assets/assistant/BYOK.png deleted file mode 100644 index d81b6f10..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/BYOK.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:133081b817a11a376c68a24f713cfed94944488e7a08a3e5ccdbb6f89df5b220 -size 45106 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/Documentation-Button.png b/.cursor/rules/roblox/en-us/assets/assistant/Documentation-Button.png deleted file mode 100644 index c6bc02af..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/Documentation-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8aaa62d56e975b9fb8e2cbbea381e24a9ed4de93fa4d13687538926699fa0644 -size 27990 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/Documentation-Options.png b/.cursor/rules/roblox/en-us/assets/assistant/Documentation-Options.png deleted file mode 100644 index af182324..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/Documentation-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68716941e6e81233ace5931dab17f3aee37e9e8fe30c5b275492c9da1c10a941 -size 16846 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/Documentation-Prompts.png b/.cursor/rules/roblox/en-us/assets/assistant/Documentation-Prompts.png deleted file mode 100644 index 15209600..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/Documentation-Prompts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3ed9bf3ede8cd6dc5581f390050fe9734299779992d069d4215ec8b83ae360d -size 68106 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Explain-Code.png b/.cursor/rules/roblox/en-us/assets/assistant/Studio-Explain-Code.png deleted file mode 100644 index 524ad2c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Explain-Code.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1e6f704fbcf6120c75ec57a15426dde4245ed6d32775fbce040599f5464ee9a -size 76433 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/Studio-General-UI.png b/.cursor/rules/roblox/en-us/assets/assistant/Studio-General-UI.png deleted file mode 100644 index 0672a478..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/Studio-General-UI.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f579f591a223b7ca48d100a3ada1af53cb4303fc87e41af7916d5816dbd883c3 -size 59435 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Generated-Green-Dragon.jpg b/.cursor/rules/roblox/en-us/assets/assistant/Studio-Generated-Green-Dragon.jpg deleted file mode 100644 index 4110759e..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Generated-Green-Dragon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f01c86a2ff5906ebd7c911a7ff9dd560176a5fe3ce76935da01c6db0460c1d9 -size 79080 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Object-Insert.png b/.cursor/rules/roblox/en-us/assets/assistant/Studio-Object-Insert.png deleted file mode 100644 index 585d2e74..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Object-Insert.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8afde417ac50751d819ce7d00d1bbd18eb9407b50d156e5de06599d2a162e1e3 -size 43137 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Quick-Styling-Material.png b/.cursor/rules/roblox/en-us/assets/assistant/Studio-Quick-Styling-Material.png deleted file mode 100644 index 74c84d07..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Quick-Styling-Material.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:282c2eb4318e2a76052e7facddd18d9a5fca5a6ac98309b0548ecba2897144ea -size 449968 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Script-Insert.png b/.cursor/rules/roblox/en-us/assets/assistant/Studio-Script-Insert.png deleted file mode 100644 index 4d3a2d08..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/Studio-Script-Insert.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f88cb8225d09aead9266a5739311318619e65ec59b1d8c7ce067d330b4f0a35 -size 106173 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt1.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt1.webm deleted file mode 100644 index b3634500..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt1.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:322ba009092bfe8c7472c7c651a261e033ae4a8de0f9a78580589c91c4f0f61d -size 248299 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt10.png b/.cursor/rules/roblox/en-us/assets/assistant/prompt10.png deleted file mode 100644 index 29e4a3c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt10.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cf04456b9e2db488548e6b0212b278de54c7dd6d4d41d1db61ee598a42fa06b -size 1094906 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt11.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt11.webm deleted file mode 100644 index 8833e84c..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt11.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d04a03627f33a54e84f949388b69b8e598b66f47cbb6214457b7857c40e26568 -size 238920 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt12.png b/.cursor/rules/roblox/en-us/assets/assistant/prompt12.png deleted file mode 100644 index e4da73ff..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt12.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:084c06c3f82a063f8f96651fb359e7cac9cb68fe97505a64dc04d893f12c7d57 -size 1249581 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt13.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt13.webm deleted file mode 100644 index 7ed57ff3..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt13.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7fabbb334cd45cbed247345f813588bc19f3359e659bf4528f89e15bedee6f3 -size 134915 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt14.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt14.webm deleted file mode 100644 index 014adcca..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt14.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa5672768c836f46bda6574d81a51f9ea2ca1dba5594e7d8387f6a5318583be0 -size 538210 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt15.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt15.webm deleted file mode 100644 index 6215af0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt15.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a83607f54a864e6bdc49a523ddd4050abd6d768fa63bf94470dbfb12d4cf463f -size 1144113 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt16.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt16.webm deleted file mode 100644 index 65e1fafc..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt16.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1684785644843d1b252d02d794f9f61bc9d9310ef622bc508198a0418473cf58 -size 1136379 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt17.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt17.webm deleted file mode 100644 index 3f03bccb..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt17.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d79ed8ad84cbd02105eaeaadaf2c281b89a62b05b7c5cf521c64aa0fb20d197 -size 714254 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt18.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt18.webm deleted file mode 100644 index 6cf514a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt18.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:365e802bb0c549fa982d14957e4c9db32c715905c71f2a6d268250f71deaa807 -size 745539 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt19.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt19.webm deleted file mode 100644 index d59daa36..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt19.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ee6d43394cd302b74f28df85d2f880cbb7ffdcdddae0e4c8faead9fb01a0855 -size 812117 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt2.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt2.webm deleted file mode 100644 index dd9f5bc2..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt2.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35f3b2cd3574946d5429bbf9881aafb24d1f552293c170016b734286a3d4b839 -size 252338 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt20.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt20.webm deleted file mode 100644 index cfd94c9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt20.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a139043f27ebc4283fd2fe98167ad366e60dc48e4f694b291ed2f13e68fe66b -size 863888 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt21.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt21.webm deleted file mode 100644 index 18184c81..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt21.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a84b6f207212f4e6cf03c88c6d364b7268d366e673dec33388d33225bcb2b703 -size 119984 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt3.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt3.webm deleted file mode 100644 index 6ea8cfcc..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt3.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc8fd6c2a8c6b8c339fc7f1804bf7554592b6e1f3da917842811f7af4bc9d554 -size 126842 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt4.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt4.webm deleted file mode 100644 index 3e976631..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt4.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21c7fb430ff1f3a889920db20feb0a18b5af6ec137c780e7dc6f2f5913893ee3 -size 475285 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt5.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt5.webm deleted file mode 100644 index 5d774e94..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt5.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00cfd10bc39f9900ce4f6dd4deba711240b5660a63d4145ab193ef5eb5219fd9 -size 391786 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt6.png b/.cursor/rules/roblox/en-us/assets/assistant/prompt6.png deleted file mode 100644 index 77597be4..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df5604bf9b7e18443104624eea4658ac54d7907a263ec816bff3c2cc6f9e8267 -size 1576822 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt7.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt7.webm deleted file mode 100644 index bbe8861f..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt7.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd2df0a0f538c9f388b03d181c085ee964b11ceb015b1c7e7e7c1878ff20739d -size 163491 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt8.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt8.webm deleted file mode 100644 index 6911b1e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt8.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8350f989719e08f16450bb0588e4cce5d67886cfeb2f42f7eae698eafa3d83f6 -size 424473 diff --git a/.cursor/rules/roblox/en-us/assets/assistant/prompt9.webm b/.cursor/rules/roblox/en-us/assets/assistant/prompt9.webm deleted file mode 100644 index 24e493da..00000000 --- a/.cursor/rules/roblox/en-us/assets/assistant/prompt9.webm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d831ea75a7e0792d4b30278ba13ba82abe3227222b1901b6af071a82da87c6ec -size 2423870 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/2D-Audio-Diagram.png b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/2D-Audio-Diagram.png deleted file mode 100644 index 129398b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/2D-Audio-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:370094d2c9ee08c4c5504e86967d0ab6d84f13abdaabd8f53ae7b338a3ae0fbb -size 84414 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/3D-Audio-Diagram.png b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/3D-Audio-Diagram.png deleted file mode 100644 index 77f32ab6..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/3D-Audio-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85f066b5fdeae77446b5504d5bf081f9740be86c6f3c9376da746adf06076410 -size 235715 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Australian-Female-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Australian-Female-Voice.wav deleted file mode 100644 index c8ef12df..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Australian-Female-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b6c59898c7b7d9090f89108feece61b5c0f8a144d9f0c4b71683682e6cea7cc -size 265644 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Australian-Male-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Australian-Male-Voice.wav deleted file mode 100644 index 4791bb74..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Australian-Male-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ad7e5de1f1ae7c1418cb11b0028b7ffc50f310d740b47287604984f10412731 -size 265644 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/British-Female-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/British-Female-Voice.wav deleted file mode 100644 index b538a67a..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/British-Female-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ee76211162dfe310cea658c47c6b9d329a51b7c30b57659c8cd6cd7fce8eb4f -size 220844 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/British-Male-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/British-Male-Voice.wav deleted file mode 100644 index a01b9eca..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/British-Male-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bd337c03da99f603112a688269aab2482eea26b27321fba2efd834de5aef749 -size 220844 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/DistanceAttenuation.png b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/DistanceAttenuation.png deleted file mode 100644 index 0a8930c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/DistanceAttenuation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88df06814257c607dcb62a6d238335218821331d405d6be3c1f23cf5bd9f65b9 -size 60086 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/French-Female-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/French-Female-Voice.wav deleted file mode 100644 index c4507997..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/French-Female-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e0921ee71090a803beb7eabe18adca534ff0dc92b0ba2cb2568cc404a36800e -size 175148 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/French-Male-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/French-Male-Voice.wav deleted file mode 100644 index 75139d96..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/French-Male-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1b38f276f16df08f3422d976a76359e0cab2d78fa6483df161051c593cf21ea -size 175148 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/German-Female-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/German-Female-Voice.wav deleted file mode 100644 index c95fbb5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/German-Female-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ac6e95ad2327743f7637c2a4bc1cfbfb7a166084b6f9cd303342bba2fd54bf8 -size 144940 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/German-Male-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/German-Male-Voice.wav deleted file mode 100644 index c7482bb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/German-Male-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a0b87d69c69545a1a2ef7cd657429f4831a3e5a5d1cd86b881659856fce792e -size 121900 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Italian-Female-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Italian-Female-Voice.wav deleted file mode 100644 index cf2c0d07..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Italian-Female-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2ea8e0ffa988b70b9b61fa631dfd528794f83478c2691e1295ea4c042173db6 -size 118828 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Italian-Male-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Italian-Male-Voice.wav deleted file mode 100644 index 472dac1b..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Italian-Male-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa9a65c96fa51876e32adb2a87d2a209f4fd51929402fccd56cc531fc7180eca -size 94252 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Narrator-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Narrator-Voice.wav deleted file mode 100644 index 300c9e2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Narrator-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02205bdcf3da43616fec1ae4e4d584110f7671dbfac524336a878154ed391210 -size 182316 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Retro-Voice-1.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Retro-Voice-1.wav deleted file mode 100644 index cc5dbd79..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Retro-Voice-1.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5e0b12ed6d6ff80adb672898a34e4e008cb82cc062ee4332d8d9072590911a5 -size 140890 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Retro-Voice-2.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Retro-Voice-2.wav deleted file mode 100644 index c831b096..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Retro-Voice-2.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aebb39e3b1f2df8f14f26f879afc69c586330871c966ca24e943b82c0753b520 -size 141396 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/STT-Audio-Diagram.png b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/STT-Audio-Diagram.png deleted file mode 100644 index e9fe5196..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/STT-Audio-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cfe07ebce7e15772fe98cc675172233b09b9ada5b49374ef39218731f939bf2 -size 108188 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Spanish-Female-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Spanish-Female-Voice.wav deleted file mode 100644 index 64da9cf7..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Spanish-Female-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d56a65949dbb7dc2be7b10a945076ac64f47f9d645d42a5d62056251fe61910 -size 186412 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Spanish-Male-Voice.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Spanish-Male-Voice.wav deleted file mode 100644 index efcadcea..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/Spanish-Male-Voice.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fb305e6b4bd54763aecc43b79abf20b9679bbd02a485bc169e1c7174bdc8ebd -size 143404 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/TTS2D-Audio-Diagram.png b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/TTS2D-Audio-Diagram.png deleted file mode 100644 index c264e30a..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/TTS2D-Audio-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5863d30db1eb3446f75de0ede774e48a3ba7be9ad74c43656798cb57640d5d4a -size 480609 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/TTS3D-Audio-Diagram.png b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/TTS3D-Audio-Diagram.png deleted file mode 100644 index 297c26c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/TTS3D-Audio-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adca14ca02f4b091eafca552457a8e1e112f0bc720d7066d06359d759fcc2f13 -size 536767 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Female-Voice-1.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Female-Voice-1.wav deleted file mode 100644 index 1e4e5717..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Female-Voice-1.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56a76393c0b19351b0f8b688652b6095cb84b2213e5b8d90e125721b2a2bfb8d -size 201644 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Female-Voice-2.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Female-Voice-2.wav deleted file mode 100644 index b3e77e94..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Female-Voice-2.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6d434149dbceea91d5cce6864ce40554ce11c12ba18b33d033192de8b32d801 -size 264078 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Male-Voice-1.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Male-Voice-1.wav deleted file mode 100644 index 8a2b1029..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Male-Voice-1.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53db9049f1e4b860100f0b7821ce0abdc8bd50fac307dfbb7f609a227bcc9dcf -size 201644 diff --git a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Male-Voice-2.wav b/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Male-Voice-2.wav deleted file mode 100644 index 1cd8e986..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/audio-objects/US-Male-Voice-2.wav +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff70b05255636a00875a98dcf554dac6d4133fc142ec0b0e1a69d7fc9f30801e -size 262478 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/chorus.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/chorus.mp3 deleted file mode 100644 index c0addbe2..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/chorus.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:537b6e9663651a12b5a0f87586ffdf9f8407a359ca4d195df5090a1801394c0a -size 301886 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/compressor.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/compressor.mp3 deleted file mode 100644 index 0bdb68de..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/compressor.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:070cf1b1e2dff7df32ea0e875fb8c7d2acc3a78b1821b62ddd78d5dc6b60defa -size 342608 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/distortion.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/distortion.mp3 deleted file mode 100644 index c3b819a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/distortion.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f52fdbac80c9c2e9e05d0638b5a24b5594ee6eb94a7795086616b2513587807b -size 304934 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/echo.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/echo.mp3 deleted file mode 100644 index 77623437..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/echo.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea943d7fd1709bd07d109d6392c6cc66b3644e6e2b5d411bb2b9b1d6859e9607 -size 542240 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/equalizer.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/equalizer.mp3 deleted file mode 100644 index 71bbc867..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/equalizer.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f65b30da3406e6b6bc6c015098a57875b09506689a0f38a5a1ce7a97932248a -size 405386 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/flange.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/flange.mp3 deleted file mode 100644 index 2427784b..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/flange.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d11ec7bb3bf67fc7a3a568920cb659ff3fa4bcbb7ea429a35ee321be7187738a -size 283766 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/no-effect.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/no-effect.mp3 deleted file mode 100644 index 9013d921..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/no-effect.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1edd53eaeccca634f8e1062a090899ac6e3525e69b17f104860e14c75e7be908 -size 354140 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/pitch-shift.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/pitch-shift.mp3 deleted file mode 100644 index 4c2807a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/pitch-shift.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7738297ee826bd4deeface6f362dd84d7a19348ae6eb4ef3052af565d80dd2a3 -size 271418 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/reverb.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/reverb.mp3 deleted file mode 100644 index c52e04dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/reverb.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bade3076eb844e19f35eeb9913aa32cd4ad028650a074790ee6211fa0a74371 -size 1030826 diff --git a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/tremolo.mp3 b/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/tremolo.mp3 deleted file mode 100644 index f279602f..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/dynamic-effects/tremolo.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05f4001ab3b667e74ab64b04b436319a5351fb35956646fe4fdd90cfbeb3c626 -size 175376 diff --git a/.cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Layered.png b/.cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Layered.png deleted file mode 100644 index e72cd5b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Layered.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e060aa27e4735dd26403b8ba39c9dbb4d8368516371792de3e983f16d18ed32 -size 57401 diff --git a/.cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Multiple.png b/.cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Multiple.png deleted file mode 100644 index 2a82a7b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Multiple.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddfa13cf2f32af0549ef6ea850ee0f65e81890bae905c91fd5d505ab76eaf103 -size 109931 diff --git a/.cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Single.png b/.cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Single.png deleted file mode 100644 index d414bf6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/effects/AudioEffect-Single.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c129e1056904b8ff97859f73a1d6a9424b3c0ec3c700fe38e0c6bf46b2235567 -size 242835 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-groups/Dynamic-Effect-Properties.png b/.cursor/rules/roblox/en-us/assets/audio/sound-groups/Dynamic-Effect-Properties.png deleted file mode 100644 index f9fdd149..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-groups/Dynamic-Effect-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb401fa4673e09c9cdb110e2f137369ff64c4fb50e2c20c238164a14d7e43c4c -size 18749 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-groups/Mix-Tree.png b/.cursor/rules/roblox/en-us/assets/audio/sound-groups/Mix-Tree.png deleted file mode 100644 index a6285b25..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-groups/Mix-Tree.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8a7333bba461399caadd018b756c8ceb0f5cf82f88c040800c6aac8ae50334f -size 52715 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_DoubleSpeed.mp3 b/.cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_DoubleSpeed.mp3 deleted file mode 100644 index f90f5d19..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_DoubleSpeed.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5bf23ecdaa18a9acfa1fbbb763f01ecfe4b71ac526b17305c920c7e59590514c -size 30720 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_HalfSpeed.mp3 b/.cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_HalfSpeed.mp3 deleted file mode 100644 index 5a538675..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_HalfSpeed.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea0a7c78207eea4e0e8d05c35ab4c6f6c991802ecea1d6dd89c4f67360916abb -size 244800 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_NormalSpeed.mp3 b/.cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_NormalSpeed.mp3 deleted file mode 100644 index 0758fee5..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/CarHorn_NormalSpeed.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f03318975fa8f6014358dd638d303b189827ffa4d338b669610232dade3472e -size 61440 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/RollOffMode-Chart.png b/.cursor/rules/roblox/en-us/assets/audio/sound-objects/RollOffMode-Chart.png deleted file mode 100644 index 14d068e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/RollOffMode-Chart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0f9bd56d30a6f2a6b3f7caac67aff8d038f15074ce5291eb2fb4ac6ae2f0d4b -size 514106 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Point-RollOff.jpg b/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Point-RollOff.jpg deleted file mode 100644 index b42808d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Point-RollOff.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd752fbf3cad85320da79b054ebacda06345035502b9641d4adb0a629c923885 -size 146918 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Point-Source.mp4 b/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Point-Source.mp4 deleted file mode 100644 index b2cd3870..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Point-Source.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fdda5cd70f9c3ce536129dd8743b0fca8befbd27983103d883362ff5793c6cd -size 3054670 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Volumetric-RollOff.jpg b/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Volumetric-RollOff.jpg deleted file mode 100644 index 2b49f084..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Sound-Volumetric-RollOff.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47edfb4bdab0b6423029d1856622e0249f0c64d058cdc0531ce8c747f1328fac -size 162361 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Volumetric-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Volumetric-Demo.mp4 deleted file mode 100644 index af435103..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Volumetric-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbc95a61d60f989e3e2c331f65f0ca0eef5b3150ec7c55e49e7e128f1690bd52 -size 11941881 diff --git a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Volumetric-Sound-Diagram.jpg b/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Volumetric-Sound-Diagram.jpg deleted file mode 100644 index 9de44427..00000000 --- a/.cursor/rules/roblox/en-us/assets/audio/sound-objects/Volumetric-Sound-Diagram.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39b17fb53480d24c3b992530be57bd28c2f0b721738f010a2cf9fd6a7928cc7a -size 197255 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/2k-Texture-Renders.zip b/.cursor/rules/roblox/en-us/assets/avatar/2k-Texture-Renders.zip deleted file mode 100644 index d96df080..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/2k-Texture-Renders.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e744bcca5cdbd072dcd60d7ac7ea57f5120535b8e0dc6c61a340bc8a48dd5f4 -size 353059568 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/AvatarSample.png b/.cursor/rules/roblox/en-us/assets/avatar/AvatarSample.png deleted file mode 100644 index f6c1b260..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/AvatarSample.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e14fd75cb84bbdfbf68cb6bae9885cce16f975f304039150ba9bbfb855b7ef55 -size 472730 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Assign-Joints-A.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Assign-Joints-A.png deleted file mode 100644 index d53a9dbb..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Assign-Joints-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83f376b34539209f6dffadadbdd296a246bc3d351453c910bfb7cab0d0b8ad9b -size 589122 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Assign-Joints-B.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Assign-Joints-B.png deleted file mode 100644 index 3284004c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Assign-Joints-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3a6e53769ec990d673352ba47378e1e15ed5ddf7b0540b4d2736c19ff26ed56 -size 580159 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/HRD-Select.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/HRD-Select.png deleted file mode 100644 index 88cc9278..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/HRD-Select.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dac751ee5d4cf3cc1721b4bc3efb50c1a8aaac99e3e9ce0c1c14e9e52d270014 -size 525842 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Import-Custom-Humanoid.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Import-Custom-Humanoid.png deleted file mode 100644 index d314e8c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Import-Custom-Humanoid.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a901369e845d10a043d1e4e6bade10c27d6c2a37aa3af5fb0425569c194f7dae -size 161328 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Test-Animation.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Test-Animation.png deleted file mode 100644 index e9e55e29..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Test-Animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8b191eb90854f19327eb236a4b3843acb2998e98370241fe25bbd78d42394f2 -size 519822 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tool-Select.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tool-Select.png deleted file mode 100644 index 4c56f328..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tool-Select.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba5c59fb348a9eace8c8e9449aa26a1f2dc691e3db20578b71f8e4ad4881aedb -size 7414 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Toolbar.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Toolbar.png deleted file mode 100644 index 7e4fde86..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Toolbar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd38a2c3f720a7a3613d0c232a6673bd491ebc544e05a768cfce757680c9c965 -size 14675 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Display.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Display.png deleted file mode 100644 index 4c22c070..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Display.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a29b4f5dfbe2bdf42247e0684b752b36c9b98dc957099e922b15b4c221f05317 -size 594260 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Rotation-A.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Rotation-A.png deleted file mode 100644 index ca2d80af..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Rotation-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bee5e2401927ac33d77813ac107fcc5056c106d60073c0bcaf63c2a1227fdf5 -size 556564 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Rotation-B.png b/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Rotation-B.png deleted file mode 100644 index 50ed9f79..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/adaptive-animation/Tpose-Rotation-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1a83a4f1b9567c13516747663d952fd95c4e9c66e43e5814e78c37a71012efa -size 811665 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Access-Items.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Access-Items.png deleted file mode 100644 index 2f085fc6..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Access-Items.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fcbb2ab97a33f4f18de5209260b8d7406ba489953c220d1aa8c15d8db1c86272 -size 20720 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Equip-Items.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Equip-Items.png deleted file mode 100644 index 2f2122e0..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Equip-Items.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28ad500f0c86b506a952e67d2e101fff3e1198267953d8a84ce4894c27d7b577 -size 139797 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Example.jpg b/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Example.jpg deleted file mode 100644 index 4e5e6703..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:758e3d4b5d52c83968b2e2af01dd8b91fa3f4b36af7d5f301f8c445e5953c196 -size 185810 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Save-Outfit.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Save-Outfit.png deleted file mode 100644 index 73c47ac8..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-editor-service/Avatar-Editor-Save-Outfit.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6050cf2aa9efe9702feb6a12d6a56c67eedb200baaa543d580c98cd3aedb9df -size 197361 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Curve-Animation-Icon.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Curve-Animation-Icon.png deleted file mode 100644 index 162f300c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Curve-Animation-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da437fbd30382a1399171f010d477c0d548619e5cc0cd1b498a11af14af8282d -size 12414 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Curve-Prompt.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Curve-Prompt.png deleted file mode 100644 index be998a2f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Curve-Prompt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:651507b750fd4b4fc23b55cdc7e62258083f0085acbe57cc38853500a9e5c844 -size 10582 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Import-From-Roblox.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Import-From-Roblox.png deleted file mode 100644 index 552ee685..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Import-From-Roblox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1345982cb3cb0e709773942cd6f8d5ae63c885e4e18d195afba4054fbe0ab1f8 -size 29568 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Import.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Import.png deleted file mode 100644 index 69b0e8f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Import.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5218fc35a3e1ce423621e34fdf10832fef5373014e15d44722dc7fca40f28896 -size 23997 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Publish.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Publish.png deleted file mode 100644 index 59aa4829..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Editor-Publish.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74fc9e084a52cd9da15a84aea7fc4bbb574514feb8d28de2dcd502ecf77241af -size 42611 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Explorer.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Explorer.png deleted file mode 100644 index c119ceff..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c94812859da219b52b093daf40233d6d32829c3284d55b8a60e531863e87709 -size 13843 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Properties.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Properties.png deleted file mode 100644 index 5f3120f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Animation-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d28796f70b23670b5837a8d98184ebc5daf9f158c15f79ad5ee8ca1662f9d80c -size 15273 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Avatar-Emotes.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Avatar-Emotes.mp4 deleted file mode 100644 index bb5f7767..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Avatar-Emotes.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44302bd3166b9b21d22f2da44f21c2adc8d49279757365c02712489c60ac1856 -size 4945988 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Explorer-Upload.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Explorer-Upload.png deleted file mode 100644 index 39535ded..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Explorer-Upload.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c61d8c6a2f52f54d58df00072e1dbdb500a3dcfcbcd6ec4a8dc5f425ee7941d9 -size 41398 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Generate-Asset-ID-Success.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Generate-Asset-ID-Success.png deleted file mode 100644 index fd3adf88..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-emotes/Generate-Asset-ID-Success.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a762dd1ab328f157916493147c148509a4f887dc76622ba72dcaf972d920b4dc -size 12510 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Attribution.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Attribution.png deleted file mode 100644 index ce180441..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Attribution.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be6eae8ef7d5b4e92a394d85fe55d027519ea93cdcaac648e9178762bea83ee5 -size 50375 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Confirmation.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Confirmation.png deleted file mode 100644 index 995044e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Confirmation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:145e4a26407231cbd5696af86ddb4d1233e83f64c2aa1570c45ff0980b28c16f -size 32289 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Format.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Format.png deleted file mode 100644 index 207c922f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Format.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dc66936cb522effa02f4e92d40dc28821b01238a1eea84aea073a593982aced -size 63238 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Prompt.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Prompt.png deleted file mode 100644 index 8d2c3054..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Creation-Prompt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2adb4f7bc48a2e574a49d0850243dda63db1fd4ba2fdff15d597c370289e896 -size 203990 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Token-Creation.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Token-Creation.png deleted file mode 100644 index c033188c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Token-Creation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7956270e36ec45c742ba92ce6d2bffdfed3eca0883a282e7b729af6364df4a13 -size 29875 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Token-Id.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Token-Id.png deleted file mode 100644 index 232a4e7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-iec/Avatar-Token-Id.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a54c73b894615ac0dbd1a267cf089e652ed60966eb7f70f30f3055a351e1391 -size 38281 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Add-Object.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Add-Object.png deleted file mode 100644 index f9ba8ebd..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Add-Object.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ecfe5fdbe77fcd66b208506427ae588d75b1c86523e05b31bae234f52eda8537 -size 60908 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Assymetry.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Assymetry.png deleted file mode 100644 index 9e7182cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Assymetry.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c2c107eaea57f20e03546b9f2a192f8ae86bf8181ab8d6ffd6d3962d898b7a5 -size 61473 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Auto-Setup-Scaling.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Auto-Setup-Scaling.png deleted file mode 100644 index 20448d64..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Auto-Setup-Scaling.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:543269475d0fb6ea5e61f3363df6ceb33e7fbf2ba038cf8275cd3dac8a2b242e -size 219037 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Auto-Setup-Start.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Auto-Setup-Start.png deleted file mode 100644 index 0e810684..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Auto-Setup-Start.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64eb87e96bf1609187f1044894ed096a5596f3240c4ef00bdb23defae3e346bd -size 177270 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Avatar-Setup-Example-A.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Avatar-Setup-Example-A.png deleted file mode 100644 index 44a8a171..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Avatar-Setup-Example-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b83d82efca6b9faf2ec912c88a32c91537a4281ac3dd9bdc74e7ac6e4f9bea2 -size 25786 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Avatar-Setup-Example-B.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Avatar-Setup-Example-B.png deleted file mode 100644 index 0beab7f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Avatar-Setup-Example-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:257058de5e9d29fcaa4f19061744756793b9b97e37c878f67a7f2748e5c610d0 -size 200570 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Cage-Edit-Panel.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Cage-Edit-Panel.png deleted file mode 100644 index 3d616c6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Cage-Edit-Panel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfd2fa0907758b1c5d8bfccdbdbef4f7a38e6da18cb473c29a427f4cef4ba42e -size 4664 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Folder-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Folder-Hierarchy.png deleted file mode 100644 index 342875ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Folder-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:014556aa38ed8bf1865d59c89fa2ed761b5e0a8b44999e55cf3f504396e16162 -size 81870 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/I-pose.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/I-pose.png deleted file mode 100644 index 4797c016..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/I-pose.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:881a954e375abaebabd4b092cc61db73b080053581b0f01d71f423fd8a5e5c06 -size 51394 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Inorganic-Model.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Inorganic-Model.png deleted file mode 100644 index 85e72d1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Inorganic-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79f257b189736132f1da380e488f87fa356025e1186c3bb9651608ed13fa24ef -size 145396 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Long-Neck.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Long-Neck.png deleted file mode 100644 index 27d66193..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Long-Neck.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5faf247e699327e8f1ceff86ec77c880ab3035864dffe1ee94c0e6aa6f7712c8 -size 56684 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-1.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-1.png deleted file mode 100644 index 9bd07b03..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f731065dd8ff39d8788858c49b6801d98aa8de6950b3f33784834c0311c5a17 -size 1009182 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-2.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-2.png deleted file mode 100644 index 886a7480..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75be0289c22022c7b630cbc7b6aae666fa464b695928293681e30eeb3c3cbf57 -size 440162 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-3.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-3.png deleted file mode 100644 index 08f69094..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1dfd7e15672b1ff9c62c5bd82f9b57a5a67faf9662411c582d77557da32a057 -size 184414 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-4.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-4.png deleted file mode 100644 index 769f4716..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Mouthparts-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31ebc6b0e7ee740c56a6c020b4c962402b4f58299b1639cfb43c1a5293054644 -size 162912 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/No-Neck.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/No-Neck.png deleted file mode 100644 index 21144a3c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/No-Neck.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09ddf80637cdd276950aaba76485ac3fbc0331cec4c9d3fc0f36c8a5caa4cb55 -size 104719 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Contiguous.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Contiguous.png deleted file mode 100644 index 8fa280ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Contiguous.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c28ff5ab0a5b67fd8b24953bd8ecb9dcf36bb69d8988333fca8f474e0f614d96 -size 83300 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Humanoid-1.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Humanoid-1.png deleted file mode 100644 index 53ad9620..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Humanoid-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:981f0cd787ea9e8f357bbea24d786889463eb32772dcbb76f66d2a10d21d582a -size 65343 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Proportional-Limbs.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Proportional-Limbs.png deleted file mode 100644 index 5ce53cb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Non-Proportional-Limbs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:397031749d873a772d0ad7fb92dbe890a59ae4aad03664d646e4218317625a94 -size 73583 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-All-Rigged.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-All-Rigged.png deleted file mode 100644 index 16000397..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-All-Rigged.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa017ddceafb4a7022a8e59a2f9002b04d901f247de09bfbfed22c021196392c -size 172750 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-Body-Rigged.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-Body-Rigged.png deleted file mode 100644 index 15b12322..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-Body-Rigged.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7691ebe45daef54762db7be84d30417361b7e99f2d4d4be12a69e87498be4e64 -size 172029 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-Head-Rigged.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-Head-Rigged.png deleted file mode 100644 index a0ac0542..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-Head-Rigged.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42cb030aa015fca81f3d3a686d5d46a02ce1312d9b0ad4a0783e3da08981e5c7 -size 171685 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-None-Rigged.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-None-Rigged.png deleted file mode 100644 index a73feacc..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Partial-Inputs-None-Rigged.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b72279c8aad0aa633bbee6119ec3a0745f462926157190e8a34f69e91a622100 -size 63347 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Skin-Tone-Selector.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Skin-Tone-Selector.png deleted file mode 100644 index 752df5ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Skin-Tone-Selector.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee95ef84372b82ecf39a6a68c56a0d7f9e73312d5b01f2702799f2540a8fd761 -size 222802 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Supported-Model.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Supported-Model.png deleted file mode 100644 index b73bdd2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Supported-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7a3d0a6f25823c10d4b3bd7cc7676abfcb831cc7c3d50616e6dadf5222e4946 -size 65477 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Test-Face-1.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Test-Face-1.png deleted file mode 100644 index 73056ac2..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Test-Face-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0446eaa4a19e4da9304c3bac204e3fac60ca45df77f7e877263ecb763ca98ce8 -size 302932 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Test-Face-2.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Test-Face-2.png deleted file mode 100644 index 75703b8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Test-Face-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e304548cbbbca7fd89ed1ee105232d9adc4d349c01879561710570d483d056c -size 215910 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Testing-Interface.png b/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Testing-Interface.png deleted file mode 100644 index b4f6cf71..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/avatar-setup/Testing-Interface.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f42bfd8d79a0c481100693369a33daa8bac59d4792c6a526e546014acc677dac -size 28522 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-Banner.jpg b/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-Banner.jpg deleted file mode 100644 index cfdf2d08..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-Banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc8cd35d552591a5556fe705850a42e5b38a73bca5d165f3ec2be848a7c0baa7 -size 284423 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-Character-Model-Data.png b/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-Character-Model-Data.png deleted file mode 100644 index 9964ba6a..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-Character-Model-Data.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:793eba9605fbc709d2a83d0c1acb917591b89f2e8250487ef0d0c3cf5bb090dc -size 28595 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-In-Editor-Window.jpg b/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-In-Editor-Window.jpg deleted file mode 100644 index 11807ce0..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Avatar-In-Editor-Window.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:160cb3d7d1f48f14e83e78b71c57d7153e0d22185b42ee44d865640eeffbdde7 -size 110544 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Basic-Character-Model-Data.png b/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Basic-Character-Model-Data.png deleted file mode 100644 index 2b9133fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/Basic-Character-Model-Data.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0efd7e66f386822c17f0283d79894a452fe26920da07a14486f31314b5b59222 -size 11162 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/R15-Example.jpg b/.cursor/rules/roblox/en-us/assets/avatar/character-customization/R15-Example.jpg deleted file mode 100644 index b88af7aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/R15-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7e66dba7c25af44a563079a11dba0f4f75d965172558bdd3200064318d78187 -size 202677 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/R6-Example.jpg b/.cursor/rules/roblox/en-us/assets/avatar/character-customization/R6-Example.jpg deleted file mode 100644 index 5b9add21..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/character-customization/R6-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b19cebb0a2d33ffc81260043ad4c9d9107324b33ebd1656ad9882465cc2e477 -size 129330 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/context-menu/ACM-Sections-Labeled.png b/.cursor/rules/roblox/en-us/assets/avatar/context-menu/ACM-Sections-Labeled.png deleted file mode 100644 index 690a50e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/context-menu/ACM-Sections-Labeled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ce12284047919ca8869e626150f284f07a4b8d0a2eec83ded634345f3e3a991 -size 86379 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/context-menu/ACM-User-Selector.png b/.cursor/rules/roblox/en-us/assets/avatar/context-menu/ACM-User-Selector.png deleted file mode 100644 index 93bb1af5..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/context-menu/ACM-User-Selector.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6cdc69149242565e98abb873ce3a6a2d22bd37312609817d848ec2cd0ac170d -size 45577 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/context-menu/Custom-ACM.png b/.cursor/rules/roblox/en-us/assets/avatar/context-menu/Custom-ACM.png deleted file mode 100644 index a34cfe6a..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/context-menu/Custom-ACM.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8249cf8558081158a4f4578bd426092c886f6b2461c2a36d3b345ccc9598c2a9 -size 56155 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Blocky-Reference.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Blocky-Reference.jpg deleted file mode 100644 index 829ab7ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Blocky-Reference.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cb0e751daeee470567e4e69f5fc7468bc3a8e1f81241fd141d4bef48ed81347 -size 66400 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Blocky_And_Goblin_Dynamic_Heads.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Blocky_And_Goblin_Dynamic_Heads.mp4 deleted file mode 100644 index 5618d870..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Blocky_And_Goblin_Dynamic_Heads.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:297b25532fc75531fdd41869d08f9455081fef4f70c7a3ba44455174bd4dba6a -size 1293240 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Goblin-Reference.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Goblin-Reference.jpg deleted file mode 100644 index a17d1647..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/Goblin-Reference.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2be7a8bfb228904aefd20ffd988240282b06c83c5eb56d379f38c6ace63a5c8 -size 394839 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Animation-Track-Values-Input.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Animation-Track-Values-Input.jpg deleted file mode 100644 index a60ebdb6..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Animation-Track-Values-Input.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:241a3254bd0d60eda4f782b83767ba008cc66c4e644e78fbfdd72bd50966b56a -size 28870 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/FACS-Popup.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/FACS-Popup.jpg deleted file mode 100644 index 9cae086e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/FACS-Popup.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c495503a2f379cc9fe3aa6f99a06e58d6833530362723134e0134ea95702215e -size 175521 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Face-Button.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Face-Button.jpg deleted file mode 100644 index 9c8173cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Face-Button.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd5619d407ca2d0f422fede8b8463acb8f3df9b6eb9b3e26e93c7e4a40fe61bf -size 21952 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Overview.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Overview.png deleted file mode 100644 index d699a642..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/Overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64b3ebb11346c15d38ac2e00d0f1e3d6066a6be350f935a7a4ea3ac665398a2e -size 977469 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/videos/1-Face-Controls-Example.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/videos/1-Face-Controls-Example.mp4 deleted file mode 100644 index 3769c7b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/videos/1-Face-Controls-Example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:874aaee5ef561999a63e1e9b68b2cd8d2a1bd331ad7afb448e76e9c887ab3a60 -size 4657539 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/videos/2-Face-Controls-Example-Goblin.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/videos/2-Face-Controls-Example-Goblin.mp4 deleted file mode 100644 index 7d552b35..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/animating-dynamic-heads/videos/2-Face-Controls-Example-Goblin.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2771d47c258469f9151fead0d481855c581d25d436767cc9f6f42091d208be17 -size 3865625 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Frame-Range.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Frame-Range.png deleted file mode 100644 index e7e4b51e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Frame-Range.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c9732c4fce18bd72a93a5713ea2ee1449ce5897a75ba4f40f92a5245829920e -size 14245 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Offset-Importing.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Offset-Importing.png deleted file mode 100644 index 680188c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Offset-Importing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c7024f8ffda3879c21362351285cdc7ffbe8f48e950b9cc4e810a7bc692be14 -size 7890 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Timeline.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Timeline.png deleted file mode 100644 index 24894502..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Animation-Timeline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2938658a6004415b3500a252ce11962dd9239115de0c88d2be365d98dca8f10f -size 11503 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Custom-Properties-Example.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Custom-Properties-Example.png deleted file mode 100644 index 302e7383..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Custom-Properties-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:432010d9264059734c53c133543610333d7a8ee4ef1dc282f223445aca3afa23 -size 180244 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Eyelid-Naming.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Eyelid-Naming.png deleted file mode 100644 index 90e890be..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Eyelid-Naming.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dea31a6fdd41240ded84c33ddb2ef0fe58144a41fce33a2f3ba25899e5bf368d -size 30101 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Mapping-New-Button.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Mapping-New-Button.png deleted file mode 100644 index ef74317a..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Mapping-New-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:060097e931382cb656e702309d2bc324648db51561e297654160534bb889ff55 -size 97179 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Mapping-Popup.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Mapping-Popup.png deleted file mode 100644 index 4919ab71..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Mapping-Popup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07a9ca67744754a1691502420509f1ae5a7e5938d2bd71fa6b630916b85a6db3 -size 132488 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Open-Project.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Open-Project.png deleted file mode 100644 index c665e62d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/Open-Project.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:571b162502fc43ece006aae3cecbb86d5b297ab1841a95aaf181c28c8b5b9549 -size 160649 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx deleted file mode 100644 index 7c69d608..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38c310e3614b03c0b5478d061278fc9f76bc852f92d0d5293d40cdb9f0b55ae7 -size 1205116 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.ma b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.ma deleted file mode 100644 index 0f17d043..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Complete.ma +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f2c670e264d68891064802c7d6cd6cffc77698f71a93d2489081c9df48007d2 -size 3577063 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Bones-Skinned.blend b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Bones-Skinned.blend deleted file mode 100644 index 7e0a5397..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Bones-Skinned.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80c92d76f1204395c1e13c541bc13916953284fc17819fa05d51a942c1675c86 -size 20688324 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Poses-Mapped.blend b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Poses-Mapped.blend deleted file mode 100644 index f3ce0053..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Eye-Poses-Mapped.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48ff5b8d8700398afac64f48b89afb20d812b075d2046d931a99a3023faf028c -size 20830820 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Model-Only.blend b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Model-Only.blend deleted file mode 100644 index 6b8108cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie-Model-Only.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b03052e01c62c5771a96f76f8c84cb532e8ef1dd32c9cc71e859077426d1764e -size 20666404 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie_Head_ALB.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie_Head_ALB.png deleted file mode 100644 index ca7b4f22..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/reference-files/Cubie_Head_ALB.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e320111deb1ba541ee5d417295e368b1364279a9cc67a50a2b9ed3191980e8d1 -size 76261 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/10_Skinning_Eyelids.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/10_Skinning_Eyelids.mp4 deleted file mode 100644 index 2ff44b06..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/10_Skinning_Eyelids.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b9df46d8558313e0980a14903278698fefb4892cdad16160bf8bd8da83e8544 -size 9284258 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/11_Testing_Eyelids.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/11_Testing_Eyelids.mp4 deleted file mode 100644 index 2463e628..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/11_Testing_Eyelids.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9aae54feb19588850055ce2b4ac6fbacacb676ae6a26d841b5c53b771914413 -size 7202893 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/12_Creating_Controller_Bones.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/12_Creating_Controller_Bones.mp4 deleted file mode 100644 index 0fabf651..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/12_Creating_Controller_Bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3d63cd71e1b07759eed292e1d49f83d64b875ab14a66cd38c49288003f1d318 -size 11323408 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/13_Creating_Bone_Constraints.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/13_Creating_Bone_Constraints.mp4 deleted file mode 100644 index 855fee50..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/13_Creating_Bone_Constraints.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:463940ed6351dcb53fa4ae304b8b42afe7b7dff90f1b93ce7bbc4e84a32d7313 -size 7937026 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/14_Assigning_Custom_Shapes.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/14_Assigning_Custom_Shapes.mp4 deleted file mode 100644 index 03edb49d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/14_Assigning_Custom_Shapes.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a543a0e4aa6eba7c42202ec23a263daff7f8465ef752ab24f05ff01ec8e1aded -size 6279105 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/15_Coloring_Control_bones.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/15_Coloring_Control_bones.mp4 deleted file mode 100644 index 77af07f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/15_Coloring_Control_bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67abdeece1c84acaf65492115b8763c6efa764e90e32d01d7c7fe82169266c6c -size 13526640 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/16_Testing_Controllers.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/16_Testing_Controllers.mp4 deleted file mode 100644 index 760ca2d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/16_Testing_Controllers.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fa9e4ab14defaa71ade2e1e0c70aed2581aba52170cabf50320128b85ca6740 -size 7700689 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/17-Posing.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/17-Posing.mp4 deleted file mode 100644 index 49b684fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/17-Posing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8e7bfd7e8631ce18d2e8d9bca3e4816156568a61ebae3ba245605f4099ef8eb -size 14658931 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/18_Mapping.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/18_Mapping.mp4 deleted file mode 100644 index a7dc426d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/18_Mapping.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fc5a623a3f2a0a4be5a471abf7b3b3fa980566f289012acd5f8986551ef206d -size 25645931 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/1_Adding_RootFaceJoint.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/1_Adding_RootFaceJoint.mp4 deleted file mode 100644 index 96e72ee6..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/1_Adding_RootFaceJoint.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be8e55a02cbbcabbce58a0de2b7c470fe2367a69274d1bfe9589107079db5299 -size 3329033 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/2_Mapping_RootFaceJoint.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/2_Mapping_RootFaceJoint.mp4 deleted file mode 100644 index 9d1284f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/2_Mapping_RootFaceJoint.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e4a91e8601aa32638df0c825f10a7db35a3bea2a18508f7e65b159e427ada16 -size 4453185 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/3_Adding_Eye_Bones.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/3_Adding_Eye_Bones.mp4 deleted file mode 100644 index e48817d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/3_Adding_Eye_Bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95897e101bcba30d587281eec88dc101d7fdd80d53a4d170ea15bea1fa63d7a8 -size 3363689 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/4_Positioning_Eye_Bones.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/4_Positioning_Eye_Bones.mp4 deleted file mode 100644 index c795a9c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/4_Positioning_Eye_Bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cc69b4778bf639c979b6d1d32c1676f4d383de647c8b0c02a46f8525029c39c -size 10623616 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/5_Parenting_Eye_Bones.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/5_Parenting_Eye_Bones.mp4 deleted file mode 100644 index 49453a1f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/5_Parenting_Eye_Bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e58d4b501f23827f44202e430b678e92d0f3c1794186011a7e7251025c730809 -size 2171263 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/6_Adding_And_Positioning_Eyelids.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/6_Adding_And_Positioning_Eyelids.mp4 deleted file mode 100644 index bfe5a845..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/6_Adding_And_Positioning_Eyelids.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3939c7927b1399096219ca875eab1ef99c71490573f74d503a9c99f5aae21eea -size 6158542 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/7_Skinning_LeftEye.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/7_Skinning_LeftEye.mp4 deleted file mode 100644 index 11b84f6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/7_Skinning_LeftEye.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50c83f4e3262a71d54a325d135644025dece4f664fe0f8c135253db4225b3143 -size 8652240 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/8_Testing_LeftEye.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/8_Testing_LeftEye.mp4 deleted file mode 100644 index 674bc3b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/8_Testing_LeftEye.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb838edb8b48a085155ee20290032420ae8e9b22a40e8d3bccb65b6f59cdd19f -size 3622165 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/9_Skinning_and_Testing_RightEye.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/9_Skinning_and_Testing_RightEye.mp4 deleted file mode 100644 index d2bfed17..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/9_Skinning_and_Testing_RightEye.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15c3b917ab07e0ef99c35c507bf159b733ba6b77c47e8ecbd82abf4ad2b22c45 -size 11155369 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example1.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example1.mp4 deleted file mode 100644 index e579afa9..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8b55a1c72c9e9fc9e5f413b4a4fc9e9f46941b0b5b716da523d9474f1a0a4d7 -size 200611 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example2.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example2.mp4 deleted file mode 100644 index 0dd15aa7..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:608a077d625cae3dcf52132c3cc6b056c54e37a26d326f2efa2fcc7f30d9e0c0 -size 174226 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example3.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example3.mp4 deleted file mode 100644 index ba97af8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c859d7174c71860374bdf41dc369b5b7ff4521374292af8b974599809f7e8c09 -size 184539 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example4.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example4.mp4 deleted file mode 100644 index b7caa18a..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example4.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df221d8d9cdf6880440b37c70ac6892d27e98fc79558a06845180dd954bd6c8d -size 202459 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example5.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example5.mp4 deleted file mode 100644 index 0e1eea09..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example5.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ca96f85507ab114696bc2800c69ec9c61bb672ecbd1b540abb1296910a16391 -size 173523 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example6.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example6.mp4 deleted file mode 100644 index 16d8cd52..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-dynamic-heads/videos/Combination_Example6.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03dc981bcc80f4dd3c52c0eff64cd33260aedab2b1afdb68cce2f21671d8e997 -size 190059 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Automatic-Skinning-Transfer-Intro.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Automatic-Skinning-Transfer-Intro.jpg deleted file mode 100644 index 50551deb..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Automatic-Skinning-Transfer-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8086d215f7ef5dfa75448a92a6cbd1226ffcfec4c5a217fa449f92a376edfbae -size 689139 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Beard-Humanoid-Cage.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Beard-Humanoid-Cage.jpg deleted file mode 100644 index 56832333..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Beard-Humanoid-Cage.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89e8519af740c87c3f72432d82965a2f0311f6f00e78d27cd636de11c3a63e04 -size 2619424 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Eyebrows-Follower-Vertices.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Eyebrows-Follower-Vertices.png deleted file mode 100644 index dc71573b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Eyebrows-Follower-Vertices.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a45252769f6a0119786b506e6e79671e83488051fed85f0590b338593908ed9 -size 336165 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Eyebrows-Leader-Vertices.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Eyebrows-Leader-Vertices.png deleted file mode 100644 index 68d6f061..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Eyebrows-Leader-Vertices.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abb5f366e7f14451ad154ef6376964524e1ca11e4fe4df1efcf7e7cb91f259a1 -size 343641 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Full-Body-Cage.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Full-Body-Cage.png deleted file mode 100644 index 00116ecf..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Full-Body-Cage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2575e0ea4a32483ffe1f007eaf5ebc65b07da0136307c92b2290470c256b1c8 -size 337435 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Head-Cage-Only.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Head-Cage-Only.png deleted file mode 100644 index c3d3d6b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Head-Cage-Only.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98e9ee45a987eefb06d8f705b36d3c4987b58fa9f642b52e0ba1760679e8a0a2 -size 195816 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Cage.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Cage.png deleted file mode 100644 index ea091040..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Cage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:517c6a598fd3b0930bda1bbd95db9e39bdba45b99fa3eb5ceee53419100d16cb -size 665676 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Cubie.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Cubie.png deleted file mode 100644 index b62935c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Cubie.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29a46977f132bc6348888b6f35ade6018c61a125f7dcb44020afbe15cd296a98 -size 995613 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Eyebrows.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Eyebrows.png deleted file mode 100644 index e42887f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Importing-Eyebrows.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6432d0a879a1d6eb3b79b851dae4f288e0c3d51915c702a5b271e73929a3c292 -size 487683 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Jacket-Cage-Comparison.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Jacket-Cage-Comparison.jpg deleted file mode 100644 index e072315d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Jacket-Cage-Comparison.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e92d286554defe6071770259d1c32dffcc7b785fb3d25efb7768c65912c49f73 -size 1732146 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Assign.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Assign.png deleted file mode 100644 index 6d69a593..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Assign.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22de62205f01714818a0123a6d89c90b6ef8a7b3d6b0fe7bf7c82c4827d8c228 -size 30591 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Follower.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Follower.png deleted file mode 100644 index 147a0ada..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Follower.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d70078b6443519e85989150520e30a310dad1b3497e1544ca0d2861fa13eeb69 -size 85510 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Leader.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Leader.png deleted file mode 100644 index c41b2332..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Group-Leader.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6f59acdf21a7a7eeeb992845730d21c811fd0721c5e7635d7319712a14578e2 -size 70356 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Transfer-Off.mov b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Transfer-Off.mov deleted file mode 100644 index fe996b4b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Transfer-Off.mov +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc75d6fae0358d1dc89b586a7e0a8cfbd0d78ea6205799bb79da2911e74a1e13 -size 11998071 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Transfer-On.mov b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Transfer-On.mov deleted file mode 100644 index 446010fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/Vertices-Transfer-On.mov +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a73a24b4bc6ef54ac0a0174634a6bb6bb0be8f4d6e02f56f60c2ebe266e7fe12 -size 11528595 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Creating-Face-Accessories-Reference-Files.zip b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Creating-Face-Accessories-Reference-Files.zip deleted file mode 100644 index e7958f70..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Creating-Face-Accessories-Reference-Files.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e605f590964e5fb249a7b5dccf6fe0c133e70c3a0f4ac265368c6b940c809c7 -size 346081 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Cubie-Cage-Only.fbx b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Cubie-Cage-Only.fbx deleted file mode 100644 index 40fc28e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Cubie-Cage-Only.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1552e268d4b8d588856b9909af0368145432b27cb2efe6df7c1bd1b7325722b4 -size 172556 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Cubie-Eyebrow-Rigged-And-Caged.fbx b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Cubie-Eyebrow-Rigged-And-Caged.fbx deleted file mode 100644 index e45b0341..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/Cubie-Eyebrow-Rigged-And-Caged.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42b8825f8a1f5b9f8ec47bb2e597f73a40f6a8e744f0050e7622e40c5bb7a753 -size 274156 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieEyebrow_Geo.fbx b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieEyebrow_Geo.fbx deleted file mode 100644 index bb191b4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieEyebrow_Geo.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd523f9625b60457ad2dc2a93873dff5f1703fd3c153fe7446e49d957b287721 -size 15340 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieHawkHair_Geo.fbx b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieHawkHair_Geo.fbx deleted file mode 100644 index caa89858..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/reference-files/CubieHawkHair_Geo.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51692ec7cee83530d1d4278a6b5fa42aaaa92701ced6cbc164a05d22de91f73e -size 15996 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/AutoSkin-With-Full-Cage.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/AutoSkin-With-Full-Cage.mp4 deleted file mode 100644 index c5e75718..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/AutoSkin-With-Full-Cage.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53c3f2b2c10e9c2727a923e00434110c7ef17502b0a8c3576aae6dbb6176f5f8 -size 5867979 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/AutoSkin-With-Specific-Cage.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/AutoSkin-With-Specific-Cage.mp4 deleted file mode 100644 index 62bcae7e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/AutoSkin-With-Specific-Cage.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4cd89c2ac3ac38f7dbc3387e2c1dcb81d9059deb630e959a88ea727712d6ca9 -size 5920981 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Editing-Outer-Cage.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Editing-Outer-Cage.mp4 deleted file mode 100644 index 2fa75242..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Editing-Outer-Cage.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72e325443d034aa3d2992f9745ac025032dbf9ac887ba1b67b602908c698a899 -size 14531575 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Jacket-Collar-Issue.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Jacket-Collar-Issue.mp4 deleted file mode 100644 index 36b18326..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Jacket-Collar-Issue.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:505268188addc6920fe9648b144af12857c332df0290478c229dece7ecf4f3bf -size 8258301 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Parent-Armature.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Parent-Armature.mp4 deleted file mode 100644 index 30c14c78..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Parent-Armature.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f556cda9e9fbff08ea53f7ebf92133ebc9b3e6df1178f61dbb40894ce8f53569 -size 2202929 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Removing-Character-Cage.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Removing-Character-Cage.mp4 deleted file mode 100644 index a508d1f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Removing-Character-Cage.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d6c3a8aeb7ef701884826646446c0cd980b4acc63749cbda8148c153cb2ec9c -size 2295013 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Removing-Extra-Objects.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Removing-Extra-Objects.mp4 deleted file mode 100644 index e2cf7872..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/creating-face-accessories/videos/Removing-Extra-Objects.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6edcb566b84259f93e6ed604cbb76f69a79ae2a29f2067d2ef812f19df8bae4e -size 3519053 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserA.mp4 deleted file mode 100644 index dc09b7c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4954ace8b25ee765442d732815e6f2e0bd710bfda17e835a81dd992641d1e554 -size 47131 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserB.mp4 deleted file mode 100644 index 9979eca6..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:092d8fc7618f92c2c0434b2c5c197d8bf3f1048fb001916db9391320e15ff085 -size 21819 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserUpperLipA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserUpperLipA.mp4 deleted file mode 100644 index 63ecc5db..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserUpperLipA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3df6b3c2f66fc342237b25686f6ade3173320062666319bce1efa5fb8a93430 -size 47142 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserUpperLipB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserUpperLipB.mp4 deleted file mode 100644 index 8dbde403..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/ChinRaiserUpperLipB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cad277fe6a2466dabad3d97b4b81769155e3a4fc7cfd50f3b8c4b4f351dcafc -size 22568 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/CorrugatorA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/CorrugatorA.mp4 deleted file mode 100644 index ce4539c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/CorrugatorA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44ccb1d55c31ebef91eab31af79524a25615da6217996b93ec1269008a08e497 -size 49383 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/CorrugatorB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/CorrugatorB.mp4 deleted file mode 100644 index c481ad03..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/CorrugatorB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ab94a09acb32785324035a9f5a58325f138efe01dd6f0d46855eb3404d60f45 -size 22752 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookDownA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookDownA.mp4 deleted file mode 100644 index 47647ac9..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookDownA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e4b5afec3a9510684dd9aefcbb0c52de3dc3685fa44dced79a61ce39293eb1b -size 54549 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookDownB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookDownB.mp4 deleted file mode 100644 index 17571025..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookDownB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43439682cb2d31b8a764beb76eaad39612370c260a4b91c2fd081bbf94f23eca -size 22535 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookLeftA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookLeftA.mp4 deleted file mode 100644 index d101be47..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookLeftA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48d918adea0a8d7a5c9d5c3d7e344580badb0a3efb6c9356fd5f5029994e00f5 -size 52576 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookLeftB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookLeftB.mp4 deleted file mode 100644 index bf486424..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookLeftB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78a60ae9fadc31e1c900de3fcb4ac5d2a1f73ef9ab4202f0811e6e90c7fd2dd6 -size 22761 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookRightA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookRightA.mp4 deleted file mode 100644 index fb5f23e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookRightA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0da8302b5da12d57aee71662af08283a7d595af17d5b1bc665efa4c262c3d9c4 -size 53365 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookRightB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookRightB.mp4 deleted file mode 100644 index 09496cc4..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookRightB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c548b7ca407f8c5b19b1a348d25fe9bc052954e172397313b8dbf5c68d4eeb5 -size 23015 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookUpA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookUpA.mp4 deleted file mode 100644 index e2485f43..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookUpA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79da16ce323164c0da0bc5dca0cb092c4fa1d8ffd993a776384008047f196df3 -size 53279 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookUpB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookUpB.mp4 deleted file mode 100644 index e2bd1f08..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/EyesLookUpB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c2db24977522af5d73056fe3b84fe6445b5ecc5b57e584bf301ff9bf94d2146 -size 22053 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FlatPuckerA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FlatPuckerA.mp4 deleted file mode 100644 index 732547c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FlatPuckerA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51fc79b1d72decc000b979286cd6c7cb8fbd291c6e9edf729b9ca6deeaec04a6 -size 46876 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FlatPuckerB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FlatPuckerB.mp4 deleted file mode 100644 index ba02e0e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FlatPuckerB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fdea0bef893f8b481977be7084836a51ef7bcc1e52c3c489967d8404725efb3b -size 21076 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FunnelerA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FunnelerA.mp4 deleted file mode 100644 index 467f27ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FunnelerA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef02a8687b5edec831bf5c6691355bcc04a1864b58e3ca675ce2a4de8e91e061 -size 51365 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FunnelerB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FunnelerB.mp4 deleted file mode 100644 index d708bcf3..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/FunnelerB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:433f9f0ef99d16aeb0b7f6f9f11af37dba493ed5f38333e56fdbdf9d8d17016d -size 25461 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawDropA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawDropA.mp4 deleted file mode 100644 index 74e18453..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawDropA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bacdf5d231272488d253c3e03f76bfd4dd923ee088cd34367e8b80c3e4c06ae8 -size 53188 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawDropB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawDropB.mp4 deleted file mode 100644 index 97732cb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawDropB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fb934c73dd3c5060f628d6816c51c22bf0b1df5ade79f9b872d9a696ff17e57 -size 26487 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawLeftA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawLeftA.mp4 deleted file mode 100644 index 4e2f3505..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawLeftA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a56046f8efcc40488333db45394ddd6ae357a41da91dd881a6b316e2877f053e -size 47887 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawLeftB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawLeftB.mp4 deleted file mode 100644 index 4a21a431..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawLeftB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d3c1dc5b8b0b15a233077ac7731c1c6cae746a169b0695920c1030199be3131 -size 20796 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawRightA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawRightA.mp4 deleted file mode 100644 index b5068260..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawRightA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2d3711a3b397fd5a248f031fb6eadb74264cff7a14ce7152a3c099b5e8a6e62 -size 48098 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawRightB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawRightB.mp4 deleted file mode 100644 index 679d4554..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/JawRightB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b206fe28ab509bebe026ff81f968ab2fe2cc223254977f0f4e2875405927aa6 -size 20883 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftBrowLowererA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftBrowLowererA.mp4 deleted file mode 100644 index f76cc988..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftBrowLowererA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73c00a5ed41d223976ad1e0bf4b92c69904bd3865c2ec6b68e8f20e06d84d7ed -size 48111 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftBrowLowererB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftBrowLowererB.mp4 deleted file mode 100644 index b1c152c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftBrowLowererB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd731fbf912b3f2082ceedf29d8a9fc08d5b78c49669daf698e6392c678e83fe -size 23189 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekPuffA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekPuffA.mp4 deleted file mode 100644 index ce6b30d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekPuffA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8375348387eb1683b1af23c0d11ae1f9bed5f2414ae8f05e08f156a2deae181 -size 48287 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekPuffB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekPuffB.mp4 deleted file mode 100644 index 38e3d464..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekPuffB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef5b2b9c879bb83592af782d0633da91b958cc55d5f5e58cfc1081a7c5bd14bc -size 24040 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekRaiserA.mp4 deleted file mode 100644 index b9ff372f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70d0334c4c6be5891f23fe3322b192e457ecda5fdf86c13f0a256793df509460 -size 49871 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekRaiserB.mp4 deleted file mode 100644 index 0c66c052..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftCheekRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2131e87dd22a03e205193b50a9c0c2ca45459171328b8fefb2fc41b9c287ac59 -size 21399 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftDimplerA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftDimplerA.mp4 deleted file mode 100644 index 9c97dc99..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftDimplerA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a74f2d459fd61fc766f81227283ffabe814f453a9bba38d296ff991f776fd930 -size 47147 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftDimplerB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftDimplerB.mp4 deleted file mode 100644 index 1d5a1883..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftDimplerB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e63232d6f265297c5d663b0f8a327899b9473985f79ae9017aed871d2699070 -size 21985 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeClosedA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeClosedA.mp4 deleted file mode 100644 index 80bc17f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeClosedA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e1e38d5ceb4f33465295bdfeb2b23c010a052770ad0a9e940c21ee2676ecc5f -size 48647 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeClosedB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeClosedB.mp4 deleted file mode 100644 index d8dc05e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeClosedB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f9092f301ff4fa23a45501af538f6505ac9e4261916fef9cdf77cb04d9bdb76 -size 22168 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeUpperLidRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeUpperLidRaiserA.mp4 deleted file mode 100644 index ff701bfb..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeUpperLidRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15a61fa5003655e4c8a858c3f66aa34ff2d4eea6e2a4b23da5dc5605e5c85d53 -size 47265 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeUpperLidRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeUpperLidRaiserB.mp4 deleted file mode 100644 index cde58a03..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftEyeUpperLidRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6b0b04a23030f4478257ed3a6c233a366ffb4cf3b02c341ebd16252e3a5da78 -size 31015 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftInnerBrowRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftInnerBrowRaiserA.mp4 deleted file mode 100644 index 6f68d315..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftInnerBrowRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6d5022ffed7f0b23766b27adefa5822b6c32e1356c254e1c9c64e48c297529a -size 47843 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftInnerBrowRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftInnerBrowRaiserB.mp4 deleted file mode 100644 index 631dd7d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftInnerBrowRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8c4efb5f87e2021708d2e4685bf9d40b3eea7b79f99c33fc2929db70239ead7 -size 23222 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerDownA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerDownA.mp4 deleted file mode 100644 index 27dd6397..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerDownA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c60bc718990e77f1669a4713d7eb1033825fcca73658dba8b42dbf5294c24ad -size 46635 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerDownB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerDownB.mp4 deleted file mode 100644 index e9b94230..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerDownB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f10582132feb83f3b9f260d457004edb2d703fa0785811fcb97fd168695254a6 -size 21852 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerPullerA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerPullerA.mp4 deleted file mode 100644 index 81e0cdff..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerPullerA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd24ba70777fdebbc0ede9fcf6ee1946489c0d580d564d12cde2553b69fef87b -size 49598 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerPullerB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerPullerB.mp4 deleted file mode 100644 index 79778ccf..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipCornerPullerB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55af2f1cf364433a5f392f05e6169e732a09dc2da49c457357c63e73f54cf2d7 -size 24570 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipStretcherA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipStretcherA.mp4 deleted file mode 100644 index fcadf07c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipStretcherA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f74a2dd68c56088da6770aa58e8da682a608f2399b18092981c8c10622f4c96 -size 47952 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipStretcherB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipStretcherB.mp4 deleted file mode 100644 index c01637e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLipStretcherB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3aedf115a8bcd2d82319ae4ab5700e615c86c6342e38f28f87c7760ea0e25dc0 -size 21275 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLowerLipDepressorA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLowerLipDepressorA.mp4 deleted file mode 100644 index 511b137d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLowerLipDepressorA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7bc58857fdf8702fd4907a3dff9f77eb906ea2d0fcc431613c23595f64a7155c -size 47346 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLowerLipDepressorB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLowerLipDepressorB.mp4 deleted file mode 100644 index ab9cd5b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftLowerLipDepressorB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98963746f5c10e50a6adf908ac55f250261b0eca8100ebb71526de6249d1ef47 -size 22299 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftNoseWrinklerA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftNoseWrinklerA.mp4 deleted file mode 100644 index 6678c22a..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftNoseWrinklerA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec533b6089a19183a9ba6b06010290688e529c8200b0c083db75ab4a6a22343d -size 49067 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftNoseWrinklerB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftNoseWrinklerB.mp4 deleted file mode 100644 index b01f1d8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftNoseWrinklerB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f9a1b3ea9fe05bfd276f16292e03dcacaaa70fc20ef0cdb5a93295403440e3e -size 24886 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftOuterBrowRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftOuterBrowRaiserA.mp4 deleted file mode 100644 index 87460044..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftOuterBrowRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7895725c77c5d25ec8ae38243614c5796548aa2954f600049ae5290e47e58911 -size 48379 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftOuterBrowRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftOuterBrowRaiserB.mp4 deleted file mode 100644 index 2083b055..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftOuterBrowRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:541a8758fb641dd0ad44523635c9a3d37b5adb5fa87d1295a7d5bfabbef1c8da -size 23123 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftUpperLipRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftUpperLipRaiserA.mp4 deleted file mode 100644 index 52bb59a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftUpperLipRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fcfe9a95460c42069bb04bcf3f52e9dd14cb70b372aab52cd89c2f90ba63a2df -size 48153 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftUpperLipRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftUpperLipRaiserB.mp4 deleted file mode 100644 index aee0aa83..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LeftUpperLipRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49c8c0472889398d4fb3b6ed63fc52c25bd42199748a32da43aca889d77646c1 -size 23753 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipPresserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipPresserA.mp4 deleted file mode 100644 index 03c55eb4..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipPresserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee723707dedc2712a7dd608640bbefb7876e31efedb93a4237a1fa21d6c62a71 -size 47956 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipPresserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipPresserB.mp4 deleted file mode 100644 index 9b63da8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipPresserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f7095d7422cb6d98b4ec399b4652074cef93c19e613bf90fc4db74186e5da83 -size 22399 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-1.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-1.mp4 deleted file mode 100644 index 70f67d1b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fe5a458b94f18113b479a51dd96ab13e4a31834e9300a4a4dd97fbdcf4b8091 -size 49015 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-2.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-2.mp4 deleted file mode 100644 index e7203764..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb38528bb64a45d7fa302d71e013eacd8df35202c637d6a20f8c4ae1c340fdf1 -size 51022 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-3.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-3.mp4 deleted file mode 100644 index eb231dd4..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherA-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91d3b9bd537547401863ae253f8779f643a63dc3913e61faf9a791daa2ae94fb -size 49429 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-1.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-1.mp4 deleted file mode 100644 index ba409c29..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0db7bafe87c2d183864c9c782522483ab30198aac20156c4827a63a16ecd011e -size 23697 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-2.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-2.mp4 deleted file mode 100644 index 3dee7a68..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:476d3b96d44757ec3b87d30ccab349a7ee916d87272c1b514fd3d2e4baa73b41 -size 22913 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-3.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-3.mp4 deleted file mode 100644 index 46edda1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LipsTogetherB-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f2dd7ea7f9885b3bcebb779afcca9db3113b1987d9861b76b489a37acde7b25 -size 24856 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LowerLipSuckA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LowerLipSuckA.mp4 deleted file mode 100644 index 385df5d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LowerLipSuckA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb7e15126837d5deac909cb68fb2210beff80a78e64c0963ada9a72e434741ac -size 48386 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LowerLipSuckB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LowerLipSuckB.mp4 deleted file mode 100644 index 3ba7c30b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/LowerLipSuckB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:284e5e003f5c45292526ec5cc4893c183b52c6642562725cb482cbb4824fd81e -size 24032 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthLeftA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthLeftA.mp4 deleted file mode 100644 index e322b7cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthLeftA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d31c281437a4ad20933129808cbb738e85cd08daf64b4e5c57d9732f50365d34 -size 47815 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthLeftB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthLeftB.mp4 deleted file mode 100644 index d25bf170..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthLeftB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a08f473e055d2b8e8660eacbed4e876ffa5b992f2fb5e008a79b94c4307a8807 -size 22384 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthRightA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthRightA.mp4 deleted file mode 100644 index 95929be7..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthRightA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1da5a73dd2e1ac5ce2a05d051ffd070b937df36a85f50a1c3c8f201ccc067bc8 -size 48312 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthRightB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthRightB.mp4 deleted file mode 100644 index 599593ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/MouthRightB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01d08b7abd60ae287147a0bdae2f49894b4c13fc8ec97dfa64cd34c1a948b534 -size 21877 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/PuckerA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/PuckerA.mp4 deleted file mode 100644 index 7ba8fe9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/PuckerA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5aa6bfa7db2a630d1e04925e8ed8d98e2efb6b6f675f7309589f589c9ee010e -size 49343 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/PuckerB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/PuckerB.mp4 deleted file mode 100644 index 30cad905..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/PuckerB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22b664f0a60eaf65b2fe841eb7ccc61831d1f02fc2fe85af335ccb724557bfb9 -size 21607 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightBrowLowererA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightBrowLowererA.mp4 deleted file mode 100644 index eead1976..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightBrowLowererA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc611caa892ca6e2dc9b55a700dff3836a0f7bc78e6ca27d6aeaac5b0f8410c8 -size 47643 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightBrowLowererB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightBrowLowererB.mp4 deleted file mode 100644 index 9f466874..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightBrowLowererB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09477dfe08a8242153a331d35cf930de5f5b0093610f71347f3d0b44d63b246d -size 23144 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekPuffA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekPuffA.mp4 deleted file mode 100644 index ed4564c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekPuffA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c275d49ac76140ddc43ed0161d7b61c22047068509f53b6d91dc46d3fa61497a -size 48495 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekPuffB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekPuffB.mp4 deleted file mode 100644 index cf1240c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekPuffB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:834428ba7cf9878109468c6a58534462e855d0db199517c56aa4c50b23f7b1a3 -size 24672 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekRaiserA.mp4 deleted file mode 100644 index 256c4e97..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef6ebdb5921f8d4b425c323e88cd9427a7168ba5e6e2a24cc6fbe5bffd8d27a1 -size 49768 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekRaiserB.mp4 deleted file mode 100644 index 8ee2aeb5..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightCheekRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c75aff0b54146506c0b8affeec5b31108ce53766222be097712c0b3110fb081e -size 21805 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightDimplerA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightDimplerA.mp4 deleted file mode 100644 index 5d9039f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightDimplerA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:410f61180e16f9e6640cdf2f50b4ec2fa003ddb7bdb72dba0fa788def52c14f9 -size 47128 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightDimplerB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightDimplerB.mp4 deleted file mode 100644 index f3f9e1be..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightDimplerB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a774bf1cfd70c8e10ce80986253a6e4e7e0ac4f8da4cb437947ef1d4f8666ce -size 21760 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeClosedA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeClosedA.mp4 deleted file mode 100644 index e0923b51..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeClosedA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:395828e3458ecd4e7d0c01c7d0de18a028a06b1abbb3bd35c815037c5ebfbb44 -size 50670 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeClosedB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeClosedB.mp4 deleted file mode 100644 index 537135e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeClosedB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8f827109540802e8457124a9153c24d764d65546b35d584be28314a3ab50706 -size 22227 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeUpperLidRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeUpperLidRaiserA.mp4 deleted file mode 100644 index 097fd78c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeUpperLidRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34e151798eb90add9dae4f085930583e4e7374b235a0830e7282af13916b84cd -size 49084 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeUpperLidRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeUpperLidRaiserB.mp4 deleted file mode 100644 index 0e3d6c1f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightEyeUpperLidRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b4079efc1a0d3851de2132a71b45e7cef1abec5143323c239011db1dd28c3d4 -size 21321 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightInnerBrowRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightInnerBrowRaiserA.mp4 deleted file mode 100644 index 9d3c88c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightInnerBrowRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:148191a0e9c9e4de1fab9a0dbbcd62aeed184be1e71573fd3a7d0675a51b98f6 -size 48637 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightInnerBrowRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightInnerBrowRaiserB.mp4 deleted file mode 100644 index bdc0b74f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightInnerBrowRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb6b0cdcf8d0ab883f630d2422536c6c811c27477b7b952602103b4ecae5d206 -size 23239 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerDownA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerDownA.mp4 deleted file mode 100644 index da9275f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerDownA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edd5e07f009ed9cb50e10fb3da1f47ebc5bbeb75195170f88a3ab760c595be98 -size 46743 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerDownB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerDownB.mp4 deleted file mode 100644 index efe2e1ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerDownB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2093f703e694dcbf5f3091cf2203c2ea57cbeaa1eed52e7c646ad93e9e52a3ef -size 22083 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerPullerA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerPullerA.mp4 deleted file mode 100644 index f79a2c20..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerPullerA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a45f28b2a378e7a8d356b1122a4a27bacdcaa0955ea6691f5d742ccd94c7f44c -size 50517 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerPullerB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerPullerB.mp4 deleted file mode 100644 index 5b363e2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipCornerPullerB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ebd23de8a55c37a8689139241e84acc825770141021e99e8d08541f7584b8cd -size 24297 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipStretcherA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipStretcherA.mp4 deleted file mode 100644 index f4ee7c1e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipStretcherA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57721cd3a1bd35f82a6fd82badbd8185b2a5c861bf5449ae600f4ec8e2e936a3 -size 47745 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipStretcherB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipStretcherB.mp4 deleted file mode 100644 index 3dcecd1f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLipStretcherB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22f9150df72df3397f2b0f88696c88823aa0efb135458b83a79af7834b528cda -size 21247 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLowerLipDepressorA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLowerLipDepressorA.mp4 deleted file mode 100644 index 52ebbe21..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLowerLipDepressorA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75ffd1852a6a98fe243937d89c787b367724f10421c5954a6cd3e8747c94a39f -size 47196 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLowerLipDepressorB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLowerLipDepressorB.mp4 deleted file mode 100644 index 29f1ba7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightLowerLipDepressorB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11bd16e8c4835b45c84154b5b897e4d7e23108819d21d22d21129097df060ec3 -size 22476 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightNoseWrinklerA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightNoseWrinklerA.mp4 deleted file mode 100644 index 259487fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightNoseWrinklerA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aeb25efbe119d259d36b920d37de96cf18e6dcb2a5ba3f973384dd7a7042c2b4 -size 48860 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightNoseWrinklerB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightNoseWrinklerB.mp4 deleted file mode 100644 index e2ada43c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightNoseWrinklerB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44a4f27d0e29caa215224811630c4bfd889e77b1acf33c5c5147560a21534451 -size 24825 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightOuterBrowRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightOuterBrowRaiserA.mp4 deleted file mode 100644 index 0fd67d82..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightOuterBrowRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2824784749eafd37e71ce2e25fd8f6184adebb387fc7008c9515d9a56947b08f -size 46599 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightOuterBrowRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightOuterBrowRaiserB.mp4 deleted file mode 100644 index 6a3e5e92..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightOuterBrowRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d806c6c24a687083196b03ebd1ea6eb32b1857306045a0aa8591751be81a733 -size 23144 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightUpperLipRaiserA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightUpperLipRaiserA.mp4 deleted file mode 100644 index 2deb1bf5..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightUpperLipRaiserA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a84c40cbe60e3d18118b2154817ef36323d3e3ee3959b0b11b923878af5cac4 -size 47999 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightUpperLipRaiserB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightUpperLipRaiserB.mp4 deleted file mode 100644 index f97e5ebc..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/RightUpperLipRaiserB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81befb0b8a4b914dccdde03f904264764ea19f896ed286f98f1a24703dc88cc9 -size 23422 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueDown.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueDown.mp4 deleted file mode 100644 index 9e9a946d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueDown.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb61fe8d3a3a942a8a762037e9016f11419a156e8b9b84d7152d488f95607332 -size 21310 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueOut.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueOut.mp4 deleted file mode 100644 index d6f6b100..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueOut.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab98b2cea7f672cf7dc2132c7405f7c57a437ae918a4d0dd4c1dd891a472cc57 -size 26808 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueUp.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueUp.mp4 deleted file mode 100644 index c9a7f8a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/TongueUp.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a338c2b55c3b63e243b190ffeae8e531761ddb140f2d1a18df76172f278c1b11 -size 25038 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/UpperLipSuckA.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/UpperLipSuckA.mp4 deleted file mode 100644 index cfc7be0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/UpperLipSuckA.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e001ae96d8aa7ed1f1b86a956eef4dc77316d0e74d3b8182845c3874f13c6c -size 47168 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/UpperLipSuckB.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/UpperLipSuckB.mp4 deleted file mode 100644 index c349f88e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/facs-pose-reference/UpperLipSuckB.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39e2539287358d568814ae9f9e248699ad8b61c2a90cf99071ca6008ada00e84 -size 22164 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Animation-ID.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Animation-ID.png deleted file mode 100644 index 9a905bdc..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Animation-ID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88833aac529c3623951532c9d194e34bcd5758c827735633ee244f618f1d12f9 -size 20259 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/HappyMood.png b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/HappyMood.png deleted file mode 100644 index 4dcb8a83..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/HappyMood.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77986538a81b758a2a0e74e324641f5475cff37d0280e4cbd10e67eea5a218ae -size 6648 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Overview-Default-Mood.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Overview-Default-Mood.mp4 deleted file mode 100644 index 59a07e95..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Overview-Default-Mood.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008a5f7c353528d0ed45c1405cd92d39d7df0bcf7dfdfa9e7b3f8f316134979c -size 1532339 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Overview-Open-Mouth-Mood.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Overview-Open-Mouth-Mood.mp4 deleted file mode 100644 index bb8448c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/Overview-Open-Mouth-Mood.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db8d60a3ccf3085769ab8d731c002a1d9afdc4b44b630ac45f91e64b13eb1e2b -size 1600378 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/animate-localscript-hierarchy.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/animate-localscript-hierarchy.jpg deleted file mode 100644 index d4c02fdb..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/moods/animate-localscript-hierarchy.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03fac756bd674ffe8d0a9a27a0dc0f8ba865a5339d9be537571887dad8832f59 -size 59893 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Blocky-Face-Accessories.zip b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Blocky-Face-Accessories.zip deleted file mode 100644 index ea8c6a41..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Blocky-Face-Accessories.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:524b4fffc5127a32f4a8291fbff499ebf22a95c61a232e3a49bc7426cd68e687 -size 2242342 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/BlockyCharacter.fbx b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/BlockyCharacter.fbx deleted file mode 100644 index 68c53d1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/BlockyCharacter.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bce4f161bc9b3825d4580e756c0a2da3b737cfbff1c2d41f47405aabe32803a -size 2984140 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/BlockyCharacter.zip b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/BlockyCharacter.zip deleted file mode 100644 index 0d8d696b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/BlockyCharacter.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e637b2288027e52e2571fea90b4b9535e2c6616d661cb5773bf99731f7484b7a -size 536513 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Editor.rbxl b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Editor.rbxl deleted file mode 100644 index b556318b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Editor.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:840426faa4e2f9f965059a19049cdafa9310669689d4eae13141b57ea6ad4b3e -size 763995 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Schema.rbxl b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Schema.rbxl deleted file mode 100644 index d472a839..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Dynamic-Head-Schema.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea603578dedd2daa115cc3459019d8385735d4c2a150fd44f51de0d463687aa4 -size 337801 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Fish-Person.zip b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Fish-Person.zip deleted file mode 100644 index 2efd2fe0..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/Fish-Person.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee71219663b8c965b2c997fff8b54054bd318eaeab80ec7798c9a7302542dcf8 -size 6285844 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/GoblinCharacter.zip b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/GoblinCharacter.zip deleted file mode 100644 index 2f05b08c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/reference-files/GoblinCharacter.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65642c668b69a15bcab36af96f86f6513fa368bd78c83e7a67899415f5024a49 -size 6959426 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/FaceControls-In-Explorer.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/FaceControls-In-Explorer.jpg deleted file mode 100644 index b129d241..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/FaceControls-In-Explorer.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a47ad572ecd5725f801fe49b6b05d1ab76ea1727572f6c8d5b4020d16fe3ef07 -size 50367 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/FaceControls-In-Property-Panel.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/FaceControls-In-Property-Panel.jpg deleted file mode 100644 index ef0526c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/FaceControls-In-Property-Panel.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c16267316dbcf1447c444cdf50814ac7ef7202ef7d5430da3cf358cbb6b3b5d4 -size 44671 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Facial-Accessory-In-Property-Panel.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Facial-Accessory-In-Property-Panel.jpg deleted file mode 100644 index aea33ae1..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Facial-Accessory-In-Property-Panel.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d46c4b1ef681163c1e9db74ec2f4f082b1d2211954b25a584b5d74637a8205a9 -size 42909 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Facial-Accessory-In-Viewport.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Facial-Accessory-In-Viewport.jpg deleted file mode 100644 index bd4d145b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Facial-Accessory-In-Viewport.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2b28c5e768f9b10e4eade953e990da614e5f26ec028f8f1ef4ce5542170b3ac -size 623958 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Importing-Facial-Accessory-Final-Result.jpg b/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Importing-Facial-Accessory-Final-Result.jpg deleted file mode 100644 index 6a6e8f60..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/dynamic-heads/using-dynamic-heads-in-studio/Importing-Facial-Accessory-Final-Result.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2b4595239f7c27b12569561c3700d1ef48ab7f0829da3b3d850f1baf4cd0683 -size 822266 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/Customize-NPC.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/Customize-NPC.jpg deleted file mode 100644 index 3c7dd08d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/Customize-NPC.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7187943dcf44ff95308a4ce8c5ae8fa4f07bea8ea75e2732c77efcd73506fec -size 184859 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/Display-Indicated.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/Display-Indicated.jpg deleted file mode 100644 index eb379885..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/Display-Indicated.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:670bb875bbc605325cf7e95064e951064f6c1604d387f56b2abcfeec440e5d5c -size 229836 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-None.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-None.jpg deleted file mode 100644 index 16790d09..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-None.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c04487bdfee53cf8c37eff8c7c82c5bc2a84b307151e7ffe74851f469e6273bf -size 250807 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-Subject.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-Subject.jpg deleted file mode 100644 index 36030e54..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-Subject.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1003fa42f6b07265dc2a18c4222b440937d38bb0937b4f69a549e583d3f1254b -size 247233 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-Viewer.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-Viewer.jpg deleted file mode 100644 index bb399e8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/DisplayDistanceType-Viewer.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b353ad3b9fa57e9a7907a9524251c521aefc36d7731505bc63b30538283d6de -size 264245 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-AlwaysOff.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-AlwaysOff.jpg deleted file mode 100644 index 489942d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-AlwaysOff.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a43fa6fd746d326cf68c5e28f9b971813b3151354b6bc43c732ac893efa9ee7d -size 244915 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-AlwaysOn.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-AlwaysOn.jpg deleted file mode 100644 index 9e5429fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-AlwaysOn.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d77a101de09168fc6cdf51389fa00de5f6b4620e0e8a0f21393f21544d0872fe -size 248293 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-DisplayWhenDamaged.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-DisplayWhenDamaged.jpg deleted file mode 100644 index a2f147c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/HealthDisplayType-DisplayWhenDamaged.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba0714b992e7137c7123c061bd78159692eb3fbab93faddfa348fa324529ae0d -size 246991 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/Humanoid-Properties.png b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/Humanoid-Properties.png deleted file mode 100644 index 013cbfa5..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/Humanoid-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16236befad15abc74bf8d327ab22add5005597b09b9561b227a3779ddcaed83e -size 60052 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-EnemyOcclusion.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-EnemyOcclusion.jpg deleted file mode 100644 index 7127c22e..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-EnemyOcclusion.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a35f930d9db40eae2b168460941bc823e8c1d169d75e7e7da4ac7bb5d3ab71f -size 186070 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-NoOcclusion.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-NoOcclusion.jpg deleted file mode 100644 index c496a51b..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-NoOcclusion.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4df66be12183af815d0c87d5c72ba802e1af41e7c5c40ad3614f75b0959a3f4e -size 173717 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-OccludeAll.jpg b/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-OccludeAll.jpg deleted file mode 100644 index 144b5f0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/name-health-display/NameOcclusion-OccludeAll.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc7da1a5d89dc1b3d9362ef2511f6f9083b185c9fcd355a34c6ee081aa0bf94e -size 170035 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Boat-Path.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Boat-Path.mp4 deleted file mode 100644 index a12e0830..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Boat-Path.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c9f1e27b2690dcd2f0d38ee5fe10442624494cbe5f66d692c02b1fe6d62e954 -size 9995152 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Bridge-Path.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Bridge-Path.mp4 deleted file mode 100644 index 4bf71f07..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Bridge-Path.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5180a0f8c5ec99232136f5d9189496624efa99b5593302e1d05150e512148a38 -size 3587265 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/DoorPassThrough-Block.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/DoorPassThrough-Block.jpg deleted file mode 100644 index 69425dc1..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/DoorPassThrough-Block.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f44de7b981139b0e023e25aad67cb40e713ee9f9382872324eaa597c06252ed3 -size 172387 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/DoorPassThrough-PathfindingModifier-PassThrough.png b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/DoorPassThrough-PathfindingModifier-PassThrough.png deleted file mode 100644 index dc2d7c43..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/DoorPassThrough-PathfindingModifier-PassThrough.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a146ebaa45f894438718462b0aeadd01dcdd2e026a176728ebfbaf3aa6a480b -size 17073 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-Block.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-Block.jpg deleted file mode 100644 index 6c1c403f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-Block.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f48cd3916db72062428931fdf5de1a3463a106d2883c57cb837a043e3b75dede -size 179932 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-Path.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-Path.mp4 deleted file mode 100644 index 58062aba..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-Path.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79d3ac92c73c3e428f30a919a726ece516af081fe914ae9ddf7856709a5f1139 -size 5803143 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-PathfindingModifier-Label.png b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-PathfindingModifier-Label.png deleted file mode 100644 index 07c53824..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/GeyserBlocker-PathfindingModifier-Label.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9f26afb3d958a9aee37af9c0a5adcb2db6c1b4e6d24359d2626ad146ec61618 -size 18769 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Navigation-Labels.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Navigation-Labels.jpg deleted file mode 100644 index e100e456..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Navigation-Labels.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1a1df8e3f7e3ee0330a2a9e6a1378e58c76d945af55f1220fc624c6ba29cc4e -size 151982 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Navigation-Mesh.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Navigation-Mesh.jpg deleted file mode 100644 index eae04a5a..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Navigation-Mesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:557d2f395de7779fd2149da26663e66b5db28632f5f46d49231a8c4d2a1423a4 -size 111609 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Path-Start-End.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Path-Start-End.jpg deleted file mode 100644 index f1b29d46..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Path-Start-End.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7633cca817e49bbda4f93c28d995b277c9fd76b33cd20e267973dbc37d5ee85e -size 208070 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Path-TrussPart.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Path-TrussPart.jpg deleted file mode 100644 index ce5404ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Path-TrussPart.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c2554cc8701b1e0885ec16d9aa05cbcc547c3fb13c173a51068cc33f672abdc -size 178027 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Attachments-Properties.png b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Attachments-Properties.png deleted file mode 100644 index 6a786b3c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Attachments-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a554fad248b44f26fa66886890384a7546f0b2c1ab1c140c90c9f58a6e98408b -size 17899 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Attachments.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Attachments.jpg deleted file mode 100644 index d575259c..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Attachments.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e107975e0ead76e032c74c1218c360e42a4f30acc8f0055705ee34402a7afdb -size 207202 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-In-World.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-In-World.jpg deleted file mode 100644 index 98ea0ef9..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-In-World.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4e20585701d0d1443ef7d8f70cb3483d9529abe7d140bf7da6a5f6575ec5f89 -size 122334 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Label.png b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Label.png deleted file mode 100644 index ffa4febc..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Label.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73b8cc3600f9f6e2a97b57d423dcdf5cc19c138140ea4600b8532f6f1bc590ae -size 14044 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Path.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Path.jpg deleted file mode 100644 index f9a19f19..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/PathfindingLink-Path.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99403791cf609edcedfa85ff2c72827fdb6fe6257e28f43310d5dd32c66a436f -size 123633 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Paths-Shortest-Best.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Paths-Shortest-Best.jpg deleted file mode 100644 index a718210f..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Paths-Shortest-Best.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7e4ba8e83b2bf6ed4f28497ca9b2644b94369849d9f6b4c9fa4984f3e4ca6b7 -size 221581 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Showcase.mp4 deleted file mode 100644 index 08dc0fb5..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4568f83ad89afa87a71362efdbe260a3449cefc3a644b96027d32835f0b00c3a -size 10114969 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Simple-Path.mp4 b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Simple-Path.mp4 deleted file mode 100644 index 10e03fab..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Simple-Path.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0b3d9d2fa86c58d9f97ec342091f4179392e23daf2ac4db2300ae02ab252b79 -size 3966441 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Waypoints.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Waypoints.jpg deleted file mode 100644 index 6bdd15db..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Waypoints.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba23085a02825cc48e0506499a2915c245503ff12b388feb56431b83b680f952 -size 180512 diff --git a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Zombie-Full-Path.jpg b/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Zombie-Full-Path.jpg deleted file mode 100644 index 62a02cdb..00000000 --- a/.cursor/rules/roblox/en-us/assets/avatar/pathfinding/Zombie-Full-Path.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f5b5277ea9490a26060fdf12070d5ebc3ea225e0d90859b478c868c7810c5c9 -size 152084 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Add-Collaborators.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Add-Collaborators.png deleted file mode 100644 index ebac2c81..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Add-Collaborators.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:745215dce6e383b8719a33ac7fff21a9f2a1f856bc6f0df1b67fd220af604d5d -size 30978 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Add-Experiences.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Add-Experiences.png deleted file mode 100644 index e6d2fc63..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Add-Experiences.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f958daccf5bf0550e90e87a0e161aa39d029d0af4f1dc18a0251dc227b329524 -size 26879 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Avatar-Restricted.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Avatar-Restricted.png deleted file mode 100644 index cff5148b..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Avatar-Restricted.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d641fb58e49c8337194b63ee917ca83192b60a49bbf3cf735ab2a83728178fdd -size 45676 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Avatar-Success.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Avatar-Success.png deleted file mode 100644 index 8b5f9c6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Avatar-Success.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cf4fe6c7f1a2596ac3aa66f7c87988d796d4918cbbc114351a441b0d980565c -size 46718 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Decals-Warning.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Decals-Warning.png deleted file mode 100644 index 02572f0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Decals-Warning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d14b8a000568f6faf4d60fc29d0355a5aa8186889dfe7648b67e8feae9d0fc93 -size 104392 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Make-OpenUse.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Make-OpenUse.png deleted file mode 100644 index 3532f118..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Make-OpenUse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:279c3d99d57700a06792710c19aa4a1342b872c5c19aba8301f49266ad66efec -size 66144 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-OpenUse.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-OpenUse.png deleted file mode 100644 index 5bccaeee..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-OpenUse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23711d21effa1ba7fde4abb84aa0651884120e9c11f49abcb972993cc71a647a -size 59972 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Privacy-Beta.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Privacy-Beta.png deleted file mode 100644 index 1e8aa8bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Privacy-Beta.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:773aef5572bd54b0d09628d5f2dbec65ad2a2350aeabb49926a7e8f75bf74dfb -size 69578 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Toggle.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Toggle.png deleted file mode 100644 index 69d3319f..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Asset-Toggle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e114bc8dcbaa2d6f1e011a460c52500f3510b6d704d17a3cb66c3c4e93098e1b -size 82394 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Creations-Events-Example.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Creations-Events-Example.png deleted file mode 100644 index 3c4263fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Creations-Events-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d7cd4bcfbb5def469e4c8f58f6527da2492abb119b2adf7f0b5955d338b5b22 -size 297223 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Edit-Button-Experience.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Edit-Button-Experience.png deleted file mode 100644 index ea2bde96..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Edit-Button-Experience.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b27f0f20084d4f99199ca3fad335f6747da74dba7427c5b2e388df29dac4b7d -size 109080 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Event-Context-Menu-Copy-Event-Details-URL.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Event-Context-Menu-Copy-Event-Details-URL.png deleted file mode 100644 index f91e25b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Event-Context-Menu-Copy-Event-Details-URL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:546524a9762581c095b9c0517003b09bbb99baf7858a62badb3910ddd62ae28c -size 297323 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Event-Context-Menu-Delete-Event.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Event-Context-Menu-Delete-Event.png deleted file mode 100644 index d71c03c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Event-Context-Menu-Delete-Event.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18fe133358f82060df33f67dc78388239d9b97f95bd4042731de4404cd680370 -size 297293 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Experience-Change-Start-Place.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Experience-Change-Start-Place.png deleted file mode 100644 index 7c412337..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Experience-Change-Start-Place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4e744a5308b269094ac79f1d74d81e27853c4f632ec50656fe912ed0507c60d -size 312621 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Create-Group-Button.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Create-Group-Button.png deleted file mode 100644 index c8755671..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Create-Group-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acb8719333db64154643ffd0fafaef9b55099037d4c56fe6b00253c68eae5b74 -size 30577 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Assign-Role.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Assign-Role.png deleted file mode 100644 index 806d93ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Assign-Role.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:226b89be6ca73aeeb43ea884e06ad0e9eb180a67c052cf147e3f4c8dc56f671b -size 24314 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Invite-Button.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Invite-Button.png deleted file mode 100644 index 5e4436f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Invite-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9388f65dbcd95a8a6a7caff9d73f9d2be5d050edf06bd27934bb9c6077c4e567 -size 15609 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Remove-Member.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Remove-Member.png deleted file mode 100644 index e0922911..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Remove-Member.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc9884fd1d2101e84b8cab8250ffb0d66c577b2f70f3014144f07cbb18461bde -size 26243 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Unassign-Role.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Unassign-Role.png deleted file mode 100644 index e57da629..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Members-Unassign-Role.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e248f475929db298040bf0ae910a4f8efb3c8520b72cff580ac84ecdc0e4c2b -size 24902 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-One-Time.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-One-Time.png deleted file mode 100644 index 17a3125d..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-One-Time.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:972fd36374eb48a20f07b473f208ef7794098ede1156e557ef1d04b2ce20b05f -size 27536 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-Split-Options.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-Split-Options.png deleted file mode 100644 index 572c2599..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-Split-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:136041a6027e98695c66bf3af5ddce081ee9184f3b0fe215d7c7504636f9d372 -size 56336 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-Splits-Example.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-Splits-Example.png deleted file mode 100644 index f7ed3818..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Payouts-Splits-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9306a4d226e5f853d50e72e35c3805d3868d0689f50d9175c79d75dc24cedc8 -size 162704 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Add-Members.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Add-Members.png deleted file mode 100644 index 3681d2dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Add-Members.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c20ef0d5dc5bfd8678d47365604a8de8b7efa008b6266764dcd0200b10fa1e12 -size 16818 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Permissions-Tab.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Permissions-Tab.png deleted file mode 100644 index b8ae44da..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Permissions-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:431150b620cac0b1e4cb9204a1522fcf676363aec7ab9ea49658f1e1b5d8eb9a -size 29173 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Role-Color.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Role-Color.png deleted file mode 100644 index 10aa517c..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Role-Color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d0c8fe34d888db883230b10ab1005513eb97a7b749597363d465b9989560a20 -size 14796 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Settings-Tab.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Settings-Tab.png deleted file mode 100644 index f23bc0fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Group-Roles-Settings-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93707afb13ea90092c6162c86a290d255e1569848978e554274fa03a6acc5b98 -size 26487 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Manage-Thumbnails.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Manage-Thumbnails.png deleted file mode 100644 index 68229d77..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Manage-Thumbnails.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc9212355fd55f58ffe1ed53fdf9ee191e7278d9bfbe94d0dabb1c9803dc7f2c -size 224464 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Asset.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Asset.png deleted file mode 100644 index 13fd4683..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Asset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b6a49bfa5593861585ff4a8b07a17932ff13a428e7078c5adeaafa1658dc8da -size 64161 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Badge.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Badge.png deleted file mode 100644 index 80fc89c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Badge.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4feefe7ef393bb625192ad977b1ec6a6ab6b7dba7007b9e80689c37c6e33ee3 -size 88932 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Developer-Product.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Developer-Product.png deleted file mode 100644 index fda6e95f..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Developer-Product.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c693fb23703fd5a4f3c39114cfc2009f2e8ea4d9e49c6d0bd0336d5af0a26c50 -size 35988 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Experience-Private.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Experience-Private.png deleted file mode 100644 index ae527728..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Experience-Private.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c9177de1fc7d1cc76217fb4f3899e3498f93a246b89596bc2bc9022edce2396 -size 138444 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Experience-Public.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Experience-Public.png deleted file mode 100644 index 92a51dc5..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Experience-Public.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b10dd1d6eb888335e90c86cbbf705817f6ca002b0bacea84ca528ea6fc61667 -size 138091 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Pass.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Pass.png deleted file mode 100644 index d733b953..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Options-Button-Pass.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91ff5c873d26080bb9a923e74f2a1b72f92a59b975f4b27fa6757a70ea32cacc -size 84617 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Permissions-Collaborators.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Permissions-Collaborators.png deleted file mode 100644 index 41e93d3e..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Permissions-Collaborators.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cdc7adf4147b9083d28545aeb0d16ace7768fd7b62ef683f6b64952e0b7cf258 -size 32689 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Permissions-Experiences.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Permissions-Experiences.png deleted file mode 100644 index a851e0c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Permissions-Experiences.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1cda1dc0056f174bc3972d44ef6742956416c0fb89d065547d694c2a3143c858 -size 41849 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Places-Start-Place-Icon.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Places-Start-Place-Icon.png deleted file mode 100644 index 3f19e358..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Places-Start-Place-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac58d4530bc02b1024a7569a82bc9b71cde42c38f038f12312e66f34f9433aea -size 140722 diff --git a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Places-Start-Place-No-Icon.png b/.cursor/rules/roblox/en-us/assets/creator-dashboard/Places-Start-Place-No-Icon.png deleted file mode 100644 index 265a2086..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-dashboard/Places-Start-Place-No-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fdca7e2431c5c6e5f1005ec7f0e386eb05ee85bae23e0c62e6bb07e410ca820 -size 72006 diff --git a/.cursor/rules/roblox/en-us/assets/creator-programs/partner-program.png b/.cursor/rules/roblox/en-us/assets/creator-programs/partner-program.png deleted file mode 100644 index e4d1aa38..00000000 --- a/.cursor/rules/roblox/en-us/assets/creator-programs/partner-program.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5210e9c8ed2d14d05df592056691f55262e274290dd2afe2384a1a2ea768b0a -size 51134 diff --git a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-API-Status.png b/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-API-Status.png deleted file mode 100644 index 614fe9e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-API-Status.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17745af91a0724d277cac8542bec89fdfaff72ce57323ffb1034d1ab4145b58c -size 226328 diff --git a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-API.png b/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-API.png deleted file mode 100644 index e5c81427..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-API.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aacb0e624d587f87d854e5cdb5e64b8e3294e4012dc3dc92e7e472b34f1ac335 -size 197674 diff --git a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-Status.png b/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-Status.png deleted file mode 100644 index 5fa5fdfe..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Store-Status.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b050da19a3e5d1f7bc1b0c348efbd819176662ca61c3399cbb2336694582591f -size 128360 diff --git a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Compare-Versions.png b/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Compare-Versions.png deleted file mode 100644 index d2033975..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Compare-Versions.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fcfd871117fea127204f02b175810070bcf9dd259becc24ac806d0fdaea0f5f -size 86992 diff --git a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Key-Entry.png b/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Key-Entry.png deleted file mode 100644 index 6f8cd8df..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Key-Entry.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1de0d231c12fcc108f7f313849c450bab81c1552af7234cc4b6cf9ac2c950ea -size 108326 diff --git a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Page.png b/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Page.png deleted file mode 100644 index d1b73631..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/data-store/Data-Stores-Manager-Page.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa34721e0e4a21ed7f3c71e70381f00b91f8eb72f205d1ab705de72a91660809 -size 74063 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Memory-Usage-Critical.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Memory-Usage-Critical.png deleted file mode 100644 index a74cb7cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Memory-Usage-Critical.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b7355f296e8b0546f7a13784172e1cc41a464e4325cd2a343e589fdec0f2bad -size 85804 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Memory-Usage-Warning.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Memory-Usage-Warning.png deleted file mode 100644 index 09ce385e..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Memory-Usage-Warning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa15e213f764c6295ca3c80e95b5e531aa10855d87a065161d5c9d0d6fd4165e -size 85776 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-1.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-1.png deleted file mode 100644 index d9911254..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10edaf8780beac7469a81205bc69d466e8515ba5ccdb7fb74e10ae6efa9abac5 -size 129842 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-2.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-2.png deleted file mode 100644 index 036e3136..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d5484eba04147bba86636708d59a45a766f3d17c5dd31814ae3b574a221cf5f -size 82190 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-3.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-3.png deleted file mode 100644 index 238975e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de50531a2e41e275f0706c9f16f3bbd785b5d6f2fbd933205317e059d164381d -size 94901 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-4.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-4.png deleted file mode 100644 index 0ce31709..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Per-Partition-Limits-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:079c582d03872fdd7cde239174cdc2cc9213b087e960b74e55d67c72ecc7ec3b -size 248171 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Priority-Queue-Diagram.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Priority-Queue-Diagram.png deleted file mode 100644 index 0e1d8b4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Priority-Queue-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b61c21e3dd99bf010115a1fcd992f8a2d890610b41c728bd79442e85797e0283 -size 39967 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Regular-Queue-Diagram.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Regular-Queue-Diagram.png deleted file mode 100644 index 9d1b49dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Regular-Queue-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a7912df45ba29b5c9d68382c36e5a4ef5cb3cf2cb7e9d3795514eab6373671b -size 32506 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Request-Failure-Critical.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Request-Failure-Critical.png deleted file mode 100644 index 7387e29a..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Request-Failure-Critical.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffadc420748c3c1c02464fffa15f8e804a52b26071b99fb48bfdd45e4eb32f17 -size 139977 diff --git a/.cursor/rules/roblox/en-us/assets/data/memory-store/Request-Throttled-Critical.png b/.cursor/rules/roblox/en-us/assets/data/memory-store/Request-Throttled-Critical.png deleted file mode 100644 index 07cd5f63..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/memory-store/Request-Throttled-Critical.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55bb96a5f579351022026f4b74df87623165cc448f57c62f7f4bdaa193567a57 -size 103697 diff --git a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/Sample-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/Sample-Hierarchy.png deleted file mode 100644 index cee4dcdd..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/Sample-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:844e003b0805842b51a1be3a4a34dfd8b438c8406aede310418a17e5ca809263 -size 106123 diff --git a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-load-diagram.png b/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-load-diagram.png deleted file mode 100644 index 22e07be6..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-load-diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4084700b1df3c4b15b086406310ed61f13520ae32ce54e216f086e6cc4f3cf4b -size 17959 diff --git a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-save-diagram.png b/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-save-diagram.png deleted file mode 100644 index d791dddd..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-save-diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f3ab5d8e5107ba003c78d20f636ec5a8a00044b7354db4d82cbe1b3cab6bff0 -size 18782 diff --git a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-warning.png b/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-warning.png deleted file mode 100644 index ddbe883d..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/data-warning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c0d9fa7b765e6dfdccdbd4aeff705acd7b1a5a929d3b662f04663ef13dba9b3 -size 55946 diff --git a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/retry-diagram.png b/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/retry-diagram.png deleted file mode 100644 index db5bcbd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/retry-diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5399bf8fa97cf4f7db707ceecf5f503086a55d02962e31a5bc90fa696e806f54 -size 24572 diff --git a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/sample-architecture.png b/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/sample-architecture.png deleted file mode 100644 index 8736f085..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/sample-architecture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abb3a2d3c58047829e7ee60e8db293dd5bfcdda9aca79ffc358b0bdd9ac0b255 -size 22949 diff --git a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/session-lock-diagram.png b/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/session-lock-diagram.png deleted file mode 100644 index 7df9635b..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/player-data-purchasing/session-lock-diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3898ff19b0eb8209674a5a32708e86fe7b7917a7fda0c30a800b542da71dd80c -size 60534 diff --git a/.cursor/rules/roblox/en-us/assets/data/secrets-store/LocalSecrets.png b/.cursor/rules/roblox/en-us/assets/data/secrets-store/LocalSecrets.png deleted file mode 100644 index 387a72f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/secrets-store/LocalSecrets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f8648672085b0068d532086b37b316a049d69247fd10233c7706951110c9bfd -size 528789 diff --git a/.cursor/rules/roblox/en-us/assets/data/secrets-store/LocalSecrets_Edit.png b/.cursor/rules/roblox/en-us/assets/data/secrets-store/LocalSecrets_Edit.png deleted file mode 100644 index 63cba331..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/secrets-store/LocalSecrets_Edit.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ec5c7b1b73ee3bb089eaaea0c87f10b5502ec3fa9c5acaf623527bb68fc0d06 -size 412910 diff --git a/.cursor/rules/roblox/en-us/assets/data/secrets-store/local-secrets.png b/.cursor/rules/roblox/en-us/assets/data/secrets-store/local-secrets.png deleted file mode 100644 index 1b805419..00000000 --- a/.cursor/rules/roblox/en-us/assets/data/secrets-store/local-secrets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8679d4cb3e43ca0a4af0a1bd94cfb5db19dd2ce21b82122d6925912dd72e1e49 -size 186549 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image1.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image1.png deleted file mode 100644 index 05a8d6ec..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76c9082a4d6c2a018367281b9d334921db46ea941b169f13ac2bc11abf0dc797 -size 2750997 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image10.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image10.png deleted file mode 100644 index 9657a6d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image10.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70810ab723611ddfaa3e5eb4c083957305705fe0a3bccf0172e6ff74b4a61317 -size 145292 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image11.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image11.png deleted file mode 100644 index 693d151b..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image11.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad871abf054b942f18d6b9706a5809538379cc7cfe510644d1f68d3fe3425633 -size 129402 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image12.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image12.png deleted file mode 100644 index 560f9fab..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image12.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30cf0564de491feab8d562b24a16591965cfa97b59e3a132c113aa6b3eb7d319 -size 70941 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image13.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image13.png deleted file mode 100644 index 80b9854e..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image13.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a81ba2a1a2e2ae0fc885058c915e331893ceed912cac1254c4915826b436028f -size 46340 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image14.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image14.png deleted file mode 100644 index 8cf0fcdb..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image14.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7117ccf49dc072e89b0e69a90ef1e2d83ea22ace7d7ae65ae436bab6ee13a966 -size 1117027 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image15.jpg b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image15.jpg deleted file mode 100644 index f3c2e66e..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image15.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:918668cbcd41fbc173b2e35aaccd399ec033c00d30d074e8bf891a645d136376 -size 265039 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image16.jpg b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image16.jpg deleted file mode 100644 index 4284f9f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image16.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:955470e94499f57a24c36af154443329edcb2bf8f71f0c761866a4c21911b3dd -size 240939 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image17.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image17.png deleted file mode 100644 index 7835a223..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image17.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb8622fb891b867d642ba45e843a643e43653ebdd8cd2ea36b3402c98a048a51 -size 315796 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image18.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image18.png deleted file mode 100644 index 4c6545b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image18.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a3e9bc7a72e6e9a1cc62fbd4c1709b3af9360eb9688d7490638dc5d247019d5 -size 2013316 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image19.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image19.png deleted file mode 100644 index 0818cbf9..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image19.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bccbd83910720f1a5152a02b0d4441782df19453430a0345f71d1f658404de3d -size 187780 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image2.jpg b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image2.jpg deleted file mode 100644 index ea178b60..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41e4e5f7450f9e1be7500a2d7a8f14c6856fad50ef59d71e7ca572b58e135490 -size 1077476 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image20.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image20.png deleted file mode 100644 index cedd71b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image20.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98057fe1a1cc8175a7f052267a3638d48a3e0f42270ed98ddf8e836c73e0d744 -size 267557 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image21.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image21.png deleted file mode 100644 index 53fad468..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image21.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0786316db482ee25364af853eed51876bfb81ab4786db17323ef265af5d56eb -size 173660 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image22.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image22.png deleted file mode 100644 index 98e852c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image22.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c16bd7f4c9bc37a637ad009313c0c5a751f2fd29561408db9aba40845a7b57c5 -size 844696 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image23.gif b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image23.gif deleted file mode 100644 index ce44ae45..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image23.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85e1fd035de78a8ffc2bdc305c34b88bb3deebb4239f6c0f021d4d5750e92f60 -size 18031730 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image24.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image24.png deleted file mode 100644 index 224a706e..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image24.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aeb52ab29ae4c9a793a197451da5884dc2cb2a0baa9a31c971398c1b50b8ba38 -size 109093 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image25.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image25.png deleted file mode 100644 index 2c621c64..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image25.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5188fc9bcaedd345b0fbbe4e183c55f6bac3e72262a28d6b1ac14dbfb50f3c6c -size 216460 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image26.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image26.png deleted file mode 100644 index d47ba542..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image26.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f1198144379ee88204a500159dfb499b3ccee6a8e68f5cee5a9defa99286b20 -size 54884 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image27.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image27.png deleted file mode 100644 index 11b9a35e..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image27.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36d924b74162a2e6421db3cc0c4223da87a5a99a4f119e80cf18b97eb17d65d7 -size 1066242 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image28.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image28.png deleted file mode 100644 index 091fee32..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image28.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0b6f5c9d068ee3122a35c67c7628f0b1ab4493e23f6b68a0606150fc2b6c3cd -size 4925536 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image29.gif b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image29.gif deleted file mode 100644 index d568d2a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image29.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bf17a0b5e3ca1b7fa73def2a9bfd85df21708757cda49ce98c3ff860673f8d0 -size 40765240 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image3.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image3.png deleted file mode 100644 index 13fbbc7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e36b717e5562c5c9a66b2f00eaa9750b397e28959f7f505ec8324f96159a5e39 -size 178534 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image30.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image30.png deleted file mode 100644 index e2c5f84b..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image30.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7150cf017752c682801bfdef709bf5e6638cee34e859f4cb4b36c9628c64ac38 -size 236647 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image31.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image31.png deleted file mode 100644 index 50800665..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image31.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d52a00914cfdce2fc0442eba7a54ded193247f2626a46a6bee5230d2bfbe585b -size 69756 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image32.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image32.png deleted file mode 100644 index 481f2e91..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image32.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fefd29af09fa54e9209f0ae93f8797892b15ba9819fac43e337f8496076ce1de -size 53332 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image33.gif b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image33.gif deleted file mode 100644 index 6ed3dec6..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image33.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85374f4c89ae4ebfe67614c0f8c230db1cf8c372bd72ae4d7ed5ce4caee14f8e -size 18755456 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image34.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image34.png deleted file mode 100644 index 87b6a9dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image34.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd88fe5badff1d52f8028fe644b5f89176f4f67d0c375d0239835355c67a7ffb -size 262639 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image35.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image35.png deleted file mode 100644 index 9759b7bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image35.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5581bfe016052d6e52c601022394d7a10e80682a14e6b8dc7e5c51c826f4525 -size 44798 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image36.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image36.png deleted file mode 100644 index db2c4523..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image36.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98e6bc16697cc21c923c0b35e213482eed92f47f7cd6325d4b87921cf1d4ee63 -size 167126 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image37.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image37.png deleted file mode 100644 index 97bf1aa7..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image37.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e480949344eb622abf5ce522690c9628f2a580e1797d33a83a5be0415dc13bf9 -size 3029750 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image38.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image38.png deleted file mode 100644 index c2f6e0ec..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image38.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fa29deefd40bd2d9483815031f5538cf703fe2648aff8834bcd680de78d633b -size 126616 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image39.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image39.png deleted file mode 100644 index e92c7045..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image39.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b795366ded7792a4964e5c59645662031a48318954d63e2612e1fa0f964ef936 -size 450824 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image4.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image4.png deleted file mode 100644 index 42d824d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8c27305fada5e8a1aa1733246a5b87b8ea2acd866180f7dac34a1e61c3f0523 -size 165418 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image40.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image40.png deleted file mode 100644 index a480b072..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image40.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:765565deb33074ea5f93660873936db067a762630332e6d1bd392ea90be20b02 -size 109376 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image41.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image41.png deleted file mode 100644 index 526444ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image41.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a0ad3f6b427d71bab4256847590b2e692af1e035e332de9ae030254894262e0 -size 589826 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image42.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image42.png deleted file mode 100644 index d1eea7ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image42.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfd9f13a0f2ee429276c7455ce8d5dca41c328c1ca5b11fab9e2ee2243accb06 -size 3676154 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image43.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image43.png deleted file mode 100644 index f7f04660..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image43.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1b005bc03997530b3aceaeb3df017e8d0869bba7e697e67e5c5702feee9ab88 -size 57886 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image44.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image44.png deleted file mode 100644 index dda01af9..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image44.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af9f634df41ce54f01123fb11dd1af2b5e3e8093d4c7fb986255fbe5a0b99cd9 -size 5249243 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image45.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image45.png deleted file mode 100644 index 6369324a..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image45.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1309d258d20fd2dcad61a0b612be42a856c036ed54bd27d6b75c05fb3853bfe -size 187533 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image46.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image46.png deleted file mode 100644 index 4069dd7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image46.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:021edfda621770d17c7f861efbf5b4ad4ac1c51182dc3edc8b4a40c933c20420 -size 93610 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image47.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image47.png deleted file mode 100644 index 4e94fa64..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image47.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f9bb8633adb5593d6bd33111eb8ca7972b60b01851dac73e1ba82b6defa3f86 -size 1241629 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image48.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image48.png deleted file mode 100644 index 8e58b214..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image48.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3779cfcb818207d45783f5431026138fdfe2e5617bbf139e3a272ce460e2e9b -size 189270 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image49.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image49.png deleted file mode 100644 index cf6ed578..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image49.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff2210aa55c0f7ad127ba18efb26995eeed0376dadf08420a1c81e94f132adcf -size 3877158 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image5.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image5.png deleted file mode 100644 index 6ddd215b..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14c12a3464c1c970c31912f0444cf59b3a574d5ab97df815feee6ba60d06c9c7 -size 441294 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image50.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image50.png deleted file mode 100644 index 2e588682..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image50.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df4f13605002ceb2702ee7fa6dcc31412746866f7c521b2b8dab808e28780cac -size 1360643 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image51.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image51.png deleted file mode 100644 index b9548f3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image51.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:557c74590d011bf49a046f1061dc5155a2399766a02a21fcfd1b83632fddcb6a -size 89372 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image6.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image6.png deleted file mode 100644 index 8715330d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4d943dff04c4dce79616390951e8793ff2a857c00779b530be51b9684192b33 -size 390456 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image7.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image7.png deleted file mode 100644 index a2cbe149..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image7.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:961d4deca1a44e6a48a263f7b1618b676d9f0e3e9c2944063f428dcf5a7b08a0 -size 816454 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image8.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image8.png deleted file mode 100644 index d3ec2b35..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image8.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af0eddb5a616851447e16211881c8c184da7104cfd39a45b4d628d33afefbd51 -size 2293973 diff --git a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image9.png b/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image9.png deleted file mode 100644 index b812a434..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-jumpstart/image9.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d63ea8c9322f391075b3730c8989bde2dc9f835c26c06d6cacf9565034f433ff -size 163176 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Mega-Emote.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Mega-Emote.jpg deleted file mode 100644 index b2eb083e..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Mega-Emote.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6087edb97e8471a19e534b70904cce5557e0eaaa4be413ef6ed50c76d9f77533 -size 232337 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Script-ConfigureEmotes.png b/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Script-ConfigureEmotes.png deleted file mode 100644 index 4b22ab5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Script-ConfigureEmotes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9865f0e40a9b3dc75629e6021398eeb59005008bae56f432d23bc035913d1fa6 -size 19652 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Showcase-SM.mp4 deleted file mode 100644 index 0abd7d5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e3879ee309e5e9fa53eba8bd45e32f1b628ec3c5f285ad823ef0d27b056654e -size 3030964 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Showcase.mp4 deleted file mode 100644 index b08820e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3326da94b6f553d249063ce283d96f976183c223f9bd2a5cc09a7344dcf7ddb -size 8647481 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Toolbox-Icon.png deleted file mode 100644 index 7a4c155d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/emote-bar/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c2a01d370b5dd369201e586c9dfe038a3a1227f16ba0e372bdb988d7687af9c -size 39304 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/BlankScene-Folder.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/BlankScene-Folder.png deleted file mode 100644 index 8057ded9..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/BlankScene-Folder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b67ee310fb49e657bfab61dd68e2ed8d4e152f4b5419f0a6f842ee6acc14de34 -size 37253 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Edit-Concert-Template.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Edit-Concert-Template.png deleted file mode 100644 index eec8e950..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Edit-Concert-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb6c5b55b11cb29845259860a5f79941593d036e8fcfab6e5f8e2f69ae73e251 -size 92213 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Inline-BoolValue-Enabled.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Inline-BoolValue-Enabled.png deleted file mode 100644 index f1b9a535..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Inline-BoolValue-Enabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3375cfa80cac786d54a99bf53a96e434f7747b4ce0e3254a8935d977bb479993 -size 16506 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Inline-BoolValue.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Inline-BoolValue.png deleted file mode 100644 index 84747781..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Inline-BoolValue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23ca26fc8b2d9dd24385156e77b9c1df19dad53841ef798860faae6589f76672 -size 42562 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Lighting-Service-Instances.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Lighting-Service-Instances.png deleted file mode 100644 index b8800b4c..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Lighting-Service-Instances.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20dcef493f54af053823f6e6f474a6cee19ab4d285480dbd2c946a731825295c -size 30064 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/ReplicatedStorage-BlankScene-Folder.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/ReplicatedStorage-BlankScene-Folder.png deleted file mode 100644 index d91eea08..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/ReplicatedStorage-BlankScene-Folder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dae70d1a79f7ec4bba8a6a658f2694a07558c0e32391ac6326b0ab89384cf377 -size 20898 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Lighting-Attributes.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Lighting-Attributes.png deleted file mode 100644 index 5180e04f..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Lighting-Attributes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7ab8c547ee4c0e72868f04002c1803a5646986bede575f5bd1bd60bcd8af226 -size 58360 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Lighting-Instances.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Lighting-Instances.png deleted file mode 100644 index 15d91b39..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Lighting-Instances.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc0ed86fc9290d93b147c108c5c90b493c41f7f5831aa6549a30498979a4c34e -size 39521 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Terrain-TerrainRegion.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Terrain-TerrainRegion.png deleted file mode 100644 index 9b16afaf..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Saved-Terrain-TerrainRegion.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c7b63ce094105d676de48bff105ec2579d15996909ab03d4528a64601c0e9bb -size 27754 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Scene-Attribute-TimeLength.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Scene-Attribute-TimeLength.png deleted file mode 100644 index 45541df1..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Scene-Attribute-TimeLength.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30c8023df7620acc801c389c7e189d2fe2ff57dd97532ae7b156e68291419e81 -size 5320 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Seek-Bar-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Seek-Bar-SM.mp4 deleted file mode 100644 index 1171082f..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Seek-Bar-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e1d7930b93da1e5e5e9585277649b0b1feeb10ad9801597bf08d2d0bdf811bc -size 4616083 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Seek-Bar.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Seek-Bar.mp4 deleted file mode 100644 index 434f5d8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Seek-Bar.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4419902f749fda6c77eddc39777d8f186feb94e16a25429103b89f6b490a665 -size 10402454 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Terrain-Class.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Terrain-Class.png deleted file mode 100644 index b051b306..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Terrain-Class.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20c9d7b8121594370e070a51f33b73fab232d985003adca4cd30c2f653718bb9 -size 14937 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Toolbox-Icon.png deleted file mode 100644 index 321b59cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/event-sequencer/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9374daff28b4a6b2ab2c234f55a35f588b4f2d11107458c9000c22ac37de2f31 -size 36829 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Example.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Example.jpg deleted file mode 100644 index 0f07e134..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c77eb59017caa0369b0a668abc81c909db6fc53e0384081fa7e2e75567d0986 -size 164474 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Objects-In-Frame.png b/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Objects-In-Frame.png deleted file mode 100644 index 8e8ea5c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Objects-In-Frame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb89ce9c3908eb1cd03f63e1d8fbcc3f245c3f77cc686b18a66a291715481ac6 -size 18934 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Portrait-DisplayName.png b/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Portrait-DisplayName.png deleted file mode 100644 index 01913901..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-Portrait-DisplayName.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd332474e6ecd31ef067fac3bb48db784617d725fef513b663ac82253c4352ee -size 18561 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-ScreenGui-Disabled.png b/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-ScreenGui-Disabled.png deleted file mode 100644 index ac12b5b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Custom-UI-ScreenGui-Disabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f169bc59182f037a0e25599fa6de351a0d3e097d84c902821f6fac087840af54 -size 9028 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/LocalScript-ConfigureFriendsLocator.png b/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/LocalScript-ConfigureFriendsLocator.png deleted file mode 100644 index 0da8027e..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/LocalScript-ConfigureFriendsLocator.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:525f198f65932caeece306ebf3386691288fc27527f1ee96f084459f300fddfa -size 18114 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Showcase-SM.mp4 deleted file mode 100644 index f50671fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73fa027452ac72ea45b06bd3ddb363ee51f69dedc99d32ab0310d986a33db99a -size 5045609 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Showcase.mp4 deleted file mode 100644 index 731a1219..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6eb1cc9f70652b23600f88fe18e32ae6fd6097fc94efe57821041e3e2d723308 -size 11441739 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Testing-On-Client.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Testing-On-Client.jpg deleted file mode 100644 index e64bcd8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Testing-On-Client.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0af3f2c7eb4a56245925f414bac94d98c6941a4bfe6203e051bbd2bb15254bcf -size 130770 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Toolbox-Icon.png deleted file mode 100644 index 22d1020b..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/friends-locator/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:536739305fe1b74ab0bb3d5cbad3e9f330bbe7fb5f16ac1d69e4d646f20a4aed -size 37881 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Item-URL-Asset-ID.png b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Item-URL-Asset-ID.png deleted file mode 100644 index 63c3bcd1..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Item-URL-Asset-ID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cef0f5306aac29b79b812cda2692881ebd1fb4317947ac4a7bb5cca00c9e6d03 -size 25086 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/LocalScript-ConfigureMerchBooth.png b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/LocalScript-ConfigureMerchBooth.png deleted file mode 100644 index cf0a19e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/LocalScript-ConfigureMerchBooth.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46be9815411df94fb5244fef62e40753894d2027fb11324f9bb18b1af094453d -size 17455 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/LocalScript-In-StarterPlayerScripts.png b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/LocalScript-In-StarterPlayerScripts.png deleted file mode 100644 index 20bc8d8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/LocalScript-In-StarterPlayerScripts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b50c88b493a7e7c155cff8b0138c75e50b38682a84a1ebb142dd21f6eee50412 -size 20224 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Proximity-Prompts.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Proximity-Prompts.mp4 deleted file mode 100644 index 5cad5a5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Proximity-Prompts.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6be9ef41140e150eed36c2fd07c8e7a471b223c8342c9a1855759aa159c4f7cd -size 3959807 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Collision.png b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Collision.png deleted file mode 100644 index e9c6c7da..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Collision.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec21a9bb09d29e3dad7027a00fa7010231015476127e9bb5061a354fcd8c58e8 -size 14217 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Part.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Part.jpg deleted file mode 100644 index 51284396..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Part.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:428d782051255b52343a394e3cb2a1350df745e8a7be02e47ea929d9cad7ff60 -size 159589 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Transparency.png b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Transparency.png deleted file mode 100644 index 28412051..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Region-Transparency.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d21f01b10bbf34135cf3ee7dbe030d42fa845e081e229396206e073fbeb3ad5d -size 28597 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Regions.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Regions.mp4 deleted file mode 100644 index da20d3aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Shoppable-Regions.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abfb96db2f6c9458f77e67811a4fa8eee12c3f92a6eb60423295d462b41544e1 -size 6041417 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Showcase-SM.mp4 deleted file mode 100644 index cff7aae4..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16f40154b20ff38b9e1c01687cff5aa62fe9ce764a6b329fc61ef468b2e4e411 -size 5111928 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Showcase.mp4 deleted file mode 100644 index 333ecd15..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78ca588757298c7c97b196e0c07cdab7b9c82d7dc554aadf3953288e11070fc8 -size 11094020 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Toolbox-Icon.png deleted file mode 100644 index efa2051c..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19726f0d145c4817bbd5292e90a3c0f3284bd13422ed4583e00d84e2b030b1b9 -size 37229 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/UI-Catalog-Button.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/UI-Catalog-Button.jpg deleted file mode 100644 index c4414ff6..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/UI-Catalog-Button.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad3efb01e26063461b875b1831d0a764f1f073cb712b2ff78f0c82f69cc95051 -size 231391 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/UI-Visual-Customization.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/UI-Visual-Customization.jpg deleted file mode 100644 index 1524b14c..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/merch-booth/UI-Visual-Customization.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f801598788e874245780490956deb0e68ffc72df0d322e2fa12731efa19615e -size 195285 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Bundled-Mesh-Explorer.png b/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Bundled-Mesh-Explorer.png deleted file mode 100644 index 0c2d5815..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Bundled-Mesh-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc9aae3b156a05c586b5cae0418f6be4d6d34c6edecc726fd6ed4696d7ef2e26 -size 25634 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Bundled-Mesh-Workspace.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Bundled-Mesh-Workspace.jpg deleted file mode 100644 index e0832868..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Bundled-Mesh-Workspace.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40f4f495d537dc543033dd6ae4b45b7ad3748352f61c40e3e395133a9fb6537e -size 114789 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Changed-Message.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Changed-Message.jpg deleted file mode 100644 index 23392c38..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Changed-Message.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:735ff6773d67a138aab133186a966b597c20c7c0a4c111bf622440b123197091 -size 174252 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/LocalScript-ConfigurePhotoBooth.png b/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/LocalScript-ConfigurePhotoBooth.png deleted file mode 100644 index 10dd2c3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/LocalScript-ConfigurePhotoBooth.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a15f1e85f28c08e7559a7055309e126f8be047e2f2b9526bdeda6922315c8b3e -size 16761 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Showcase-SM.mp4 deleted file mode 100644 index f0d4a1ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:642e008d753c8403630e1ffaa9dc29253b7940fa5abc697979420ee51730a3bc -size 2577874 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Showcase.mp4 deleted file mode 100644 index 6a4ab4e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6067f58d97459c6cd64a81bb7626edc2bb22122ddaa117fdcebf45eff346aaad -size 6047197 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Toolbox-Icon.png deleted file mode 100644 index 1b24493c..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/photo-booth/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a29748dd2b0f5b6be134c805f7b8dba8390ecadab87a49bc8a86264531bf6a14 -size 39230 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Other-Card-Status-Empty.png b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Other-Card-Status-Empty.png deleted file mode 100644 index e7cccd9f..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Other-Card-Status-Empty.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3e93db4076f0537d1e286f59b083c56526bef49f59cf5a26b99d46eba55b20e -size 74543 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Other-Card-Status-Set.png b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Other-Card-Status-Set.png deleted file mode 100644 index 90640379..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Other-Card-Status-Set.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebe634340366c002313bb7dca06f50f684a00379396a35531dfd50f90f4f46d4 -size 87493 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Empty.png b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Empty.png deleted file mode 100644 index 2f64448b..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Empty.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82d8ee1ffb69875858e1f2e226bc465500e6d257bb8b088237cbacf4c13be732 -size 73220 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Entering.png b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Entering.png deleted file mode 100644 index d25d8db7..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Entering.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1c132c39a79f7ff69a6c61dfe0dde4504da6f34206293e7ffbc0f64136bb2d7 -size 78154 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Invalid.png b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Invalid.png deleted file mode 100644 index 9518ef7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Invalid.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4def4fa9390a0e9a7230a6f50f67bb0f05c53deff1c748de17cf1d646c9ba861 -size 94036 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Set.png b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Set.png deleted file mode 100644 index f966cf9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Card-Status-Set.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8dea4d07ff349ec2dca4140c497233c0d9b3c7e2306f320ce3bce4b375828303 -size 72974 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Icon.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Icon.jpg deleted file mode 100644 index d8da4250..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Player-Icon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27b3d86db8aae444fb5f59f615c9707ad9e3300fa32a96b9ae0b4830b21696b7 -size 239242 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Showcase-SM.mp4 deleted file mode 100644 index 605da1c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0efdd6750061c5a528ee4f1ec5f4fc4a2b833efed316eb0d252ff61bb7e9b7c5 -size 3812621 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Showcase.mp4 deleted file mode 100644 index eb540466..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:869670db090b66207286268e4c082b3d79d1e132950914813c7f4b94951e4795 -size 8279615 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Toolbox-Icon.png deleted file mode 100644 index 94c39d01..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/profile-card/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed3764e2dfda0f48832002ecb273253e64a185d187c52ae8cb90dad9a804c182 -size 36368 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Region-Structure.png b/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Region-Structure.png deleted file mode 100644 index fb87f2ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Region-Structure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9810160dcf6a97b4782691863ec6a6c677b9b8966640710558d4a857a5182fb5 -size 7507 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Showcase-SM.mp4 deleted file mode 100644 index 116fd1de..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0eea1c692620eb57d1f8f446c42253a6cd6ccc0f7a2b4061a41daae1ffce05c6 -size 6212803 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Showcase.mp4 deleted file mode 100644 index 1bc8de63..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc533afb3b73a4767a875eb885b2ca52b27394670dea330da2eb38dcaf08845b -size 15411251 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token-BasePart-Structure.png b/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token-BasePart-Structure.png deleted file mode 100644 index c08fe1d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token-BasePart-Structure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f82b95e03b2e4543bda2b6bc1f628ebc894d1d2aa03cb70723a5f736351f2b7b -size 10060 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token-Model-Structure.png b/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token-Model-Structure.png deleted file mode 100644 index ee0030a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token-Model-Structure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbfd7b3677af0a10de9024c25b830ae32e56e8415b5bba8058ac9625b9c2556a -size 13218 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token1-Explorer.png b/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token1-Explorer.png deleted file mode 100644 index 7855a244..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Token1-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50a04a09ce859e3e825af16869447ca9b7488aac0a04bbf1d3a2241f7da98ae0 -size 28535 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Toolbox-Icon.png deleted file mode 100644 index da03bc58..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/scavenger-hunt/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0988104d9bf3e3acb9d63b1e5606e63de2bf4b581f972adcbe58316bc3361f82 -size 37828 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Depth-Of-Field-Off.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Depth-Of-Field-Off.jpg deleted file mode 100644 index 6f9f7eed..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Depth-Of-Field-Off.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:232d87a045b69cab5542eb6604f2c39c118685ebdfb78cc60fe3da5901bbf18b -size 151630 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Depth-Of-Field-On.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Depth-Of-Field-On.jpg deleted file mode 100644 index 2106b27f..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Depth-Of-Field-On.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e65788cc288d2c1ecad17a1b08f1fba16dfcc67e3b547ce5af3319ab0979e45d -size 139618 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Dramatic.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Dramatic.jpg deleted file mode 100644 index 5fdca55b..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Dramatic.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91a6ead6b6acbd17a451a7e2e69c66100f73eaa898508115c0b6a5bc912b19ba -size 186781 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Monochrome.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Monochrome.jpg deleted file mode 100644 index 40e4eaf0..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Monochrome.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3a65d29e3488c93f19d199095a7f1dbd21571596283b8685526aa441477dc10 -size 144126 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Soft.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Soft.jpg deleted file mode 100644 index c9ea214c..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Filters-Soft.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf480c1072db361efe12e8949f0ed91a4f2ca2b316d8e8dabed3a8ab75241e7d -size 161461 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Flossing.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Flossing.jpg deleted file mode 100644 index 9ad2a386..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Flossing.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e029ab2d690fe5fe760f12c02d61893c7ba8cf30d26f086f3937407ac73e429b -size 156574 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Louder.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Louder.jpg deleted file mode 100644 index fb9c53d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Louder.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed6f363ff80b5cd95ff11eb3a88c2e78cf32bc64340d73ae0c803c5c161f9aed -size 154239 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Twirl.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Twirl.jpg deleted file mode 100644 index c30e239d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Poses-Twirl.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:379847ff9a24f53d2bceb8347a41b754fbe1dab3cb2da55e8ec02506ceb2e9b3 -size 158288 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Showcase-SM.mp4 deleted file mode 100644 index 99c4f65d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:deaf703a9d7399321a2ae4c5e693c20d3e0f34d344dc35cd35a554c8b51df02f -size 6329459 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Showcase.mp4 deleted file mode 100644 index 7e0432c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b8511b037b7abb6560e5198890550384391db8bc3862be1c5fc43382c20f808 -size 15058623 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Toolbox-Icon.png deleted file mode 100644 index 21bb30ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/selfie-mode/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5b656ee441bba58492a5ad299f03463ca526df594f025cfc91dc90bc1a2960e -size 37096 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/LocalScript-ConfigureSocialInteractions.png b/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/LocalScript-ConfigureSocialInteractions.png deleted file mode 100644 index 2bd371b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/LocalScript-ConfigureSocialInteractions.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:560d372fec7343c5245040e0ae63e104339a28ae57acc8fe5ff96ba88d4f70b3 -size 18390 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Showcase-SM.mp4 deleted file mode 100644 index be98d75f..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce2fa933cdee8e765325a20c06a01c1e77de8ad1ad63b91f0b035cb7856a05af -size 3013328 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Showcase.mp4 deleted file mode 100644 index cd23e0c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7413e563a8079c65912972814a4c49fc84d5ea6995eb8ab612156f2a673c9d1e -size 8087274 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Toolbox-Icon.png deleted file mode 100644 index d0978515..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/social-interactions/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bc79e058c425e6ffe10b86c3c50de68a682b97038bd931eb7aad02593f7571f -size 39955 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Restricted-Block.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Restricted-Block.jpg deleted file mode 100644 index 83084725..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Restricted-Block.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:195f414ad27069fdf4405d6c6496edb06b43725419c08b4c07704274d21a98e4 -size 141845 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Showcase-SM.mp4 deleted file mode 100644 index 1046f68d..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:801dcbc74d6eaa114745f28e12f4e2f316b6ce61870cbe5a1235529e8f71db01 -size 3951030 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Showcase.mp4 deleted file mode 100644 index 8ed7bf70..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cf0366a3f45df5b38576ff7f9330cd43c3c6f4f6450f4e7d2dc340a70e5aaa5 -size 9513745 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Toolbox-Icon.png deleted file mode 100644 index 39e69577..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/spawn-with-friends/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ccffbe6349010cfba0e51858a68c9ffac0ef97ef3a4ee19df9b73b51fbe8eae -size 36771 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Bundled-Mesh-Explorer.png b/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Bundled-Mesh-Explorer.png deleted file mode 100644 index 545eac59..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Bundled-Mesh-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54fc07dcc304ea5e73f34543590115ab854f73f88b5999763f561b093e6bb8ff -size 31480 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Canvas-Attribute.png b/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Canvas-Attribute.png deleted file mode 100644 index 91a64403..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Canvas-Attribute.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7cf7be6683126f8bcdc94e1a82176d47a821fd3c62193521db439d207c59827 -size 8368 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Position-Canvas.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Position-Canvas.jpg deleted file mode 100644 index 94501eeb..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Position-Canvas.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3940d53bde84b2a3f522cc30dd95015a8531f68853edd5034b7caf8edd582489 -size 172190 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Showcase-SM.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Showcase-SM.mp4 deleted file mode 100644 index 7c1d1f8a..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Showcase-SM.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8a80be3279cf5c29935d3d135c0f92230dcbf4e403e6f6278075be77366b227 -size 3084009 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Showcase.mp4 deleted file mode 100644 index 9b0ef370..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66ef7e7fbd6e2f61aa1abb6909046d03388a31ed0e63ef147c9fb366602fee03 -size 7114965 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/SurfaceArt-UI.jpg b/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/SurfaceArt-UI.jpg deleted file mode 100644 index a34124ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/SurfaceArt-UI.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fe897049bc85bccc6733040aa61a7bfe0c8fb8d70d279f13a8e227f3487b01d -size 107241 diff --git a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Toolbox-Icon.png b/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Toolbox-Icon.png deleted file mode 100644 index d176ccac..00000000 --- a/.cursor/rules/roblox/en-us/assets/developer-modules/surface-art/Toolbox-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84d35d2f96bb0dc88f66e5823a70460e03d7df56dd8e2c733c152e9c85b5f2df -size 36557 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/addToolExample.gif b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/addToolExample.gif deleted file mode 100644 index 1c3e0e8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/addToolExample.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6cf42c4d37e41963b4910d5eefb6fff9116fd5368cca22350a3599661e3b9b6 -size 819428 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-addToolScript.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-addToolScript.png deleted file mode 100644 index 450941c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-addToolScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddf798733ae15d6595ca50878b490187fec46f186c5a0ad64984a7b0b915ed79 -size 7237 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-game-examplevideo.mp4 b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-game-examplevideo.mp4 deleted file mode 100644 index f9b92aa9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-game-examplevideo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b39eaf77fb1c0e048dc45e020492fd8316405d976190598f13155e98cca6125 -size 3898934 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-gameThumbnail.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-gameThumbnail.jpg deleted file mode 100644 index cb00308a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-gameThumbnail.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:840a903150268a4771d8ed7225dcd499007349d90cf999531f954dfcb595e030 -size 108631 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-harvestItemFull.mp4 b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-harvestItemFull.mp4 deleted file mode 100644 index 4abc0218..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-harvestItemFull.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f06870c13a4e8b4172f651befbd62d867a6468b75efd125bd52c767a2039d25 -size 5340956 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-harvestItemShort.mp4 b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-harvestItemShort.mp4 deleted file mode 100644 index 6cec0124..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-harvestItemShort.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02fe110e17a681ec9467baf742d50d556aa06d24f5429df13727da1aadbf36c0 -size 4760528 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-item-example.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-item-example.jpg deleted file mode 100644 index cd13f03c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-item-example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c48cadd749fe8158d27e54784192f9639e8efcd370b3d0b7da8436a7e678f6db -size 125966 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-empty.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-empty.jpg deleted file mode 100644 index a1e951e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-empty.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd7b84539650efaba385c924ad7a3d91181818cc1a625a5efb2e88243e316f15 -size 39794 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-finished.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-finished.jpg deleted file mode 100644 index 8772317a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-finished.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:162a6c8944fee08f3f2344e58b79b1205d1d158d9c2f7d1ba916dbaf9fdaf4f1 -size 43688 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-withItem.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-withItem.jpg deleted file mode 100644 index 3b873907..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-leaderboard-withItem.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2759d24c808689c56f8d5baadeb36f7dde609e6a300cecb24c03cdd506ef9e17 -size 32843 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellItems.mp4 b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellItems.mp4 deleted file mode 100644 index 42ae5008..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellItems.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2bee033bc0c38eb28855b09300a54cbc78f263a3ccb4e1678d2b1889433e90b -size 3943897 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellPlatform.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellPlatform.jpg deleted file mode 100644 index 85be356c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellPlatform.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a041b444c6ac86f39b8876ce56f4f1a6199798ef66f7b6ca5bd49c941aeba8b -size 197132 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellingItemsHero.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellingItemsHero.jpg deleted file mode 100644 index 635e9835..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-sellingItemsHero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93dadcd54bfd5210031ae00493aa890a2a6d86aff7bccf503f2dae2a3dfd93a4 -size 196189 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-show-boolTrue.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-show-boolTrue.png deleted file mode 100644 index 54a2cec1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-show-boolTrue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65bebf588825ad1f7ac6a4752ca6e377ca036de35d24c9041796017781095e17 -size 6246 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-show-group.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-show-group.png deleted file mode 100644 index 69881d91..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-show-group.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75b702c292a95d5785a1ab5ee5daaa148cb5e6fb7e9a3c06444b184aff367b9d -size 7700 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showClickDetector.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showClickDetector.jpg deleted file mode 100644 index 5937c9f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showClickDetector.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c502116b51a0e8884ed590e4b7d0f8c2c5d2dd5731d24c7262b28f706472d51 -size 166325 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showSellScript.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showSellScript.png deleted file mode 100644 index 5186064a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showSellScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5afcd60e4b9821b767a564bb9fe587e8da9f4a59b700e1e3f6d7cb8f92239ab -size 6720 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showUpgradePurchase.mp4 b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showUpgradePurchase.mp4 deleted file mode 100644 index 15424593..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-showUpgradePurchase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8d946131da3a17570c228254005439eab47eb1fc42be282a7772b7cf403db89 -size 813321 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-testedTool.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-testedTool.jpg deleted file mode 100644 index baba6c7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-testedTool.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ef59f2ce56301999d66834ea7b04bb11bbfcc19e2b1f3bfdc72248606ba240f -size 129537 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-toolWithPlayer.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-toolWithPlayer.jpg deleted file mode 100644 index a7812cba..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure-toolWithPlayer.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c7599222c843c203085e6de74675772592269cd747da66f03f4ed323efc273e -size 224917 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventureGameTerrain02.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventureGameTerrain02.jpg deleted file mode 100644 index 7ac75d9d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventureGameTerrain02.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1294cf83e297830a8fab73a0220d32071340736f8f56605b2b1db672a8c66515 -size 43561 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure_leaderboard_addtoServerScriptService.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure_leaderboard_addtoServerScriptService.png deleted file mode 100644 index d24d66c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/adventure_leaderboard_addtoServerScriptService.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf17f8188da7ae2fc2c4eaabdc9a40bc40e10770811121ca8a5d0d0c0e22251f -size 11006 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/createdBoolValue.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/createdBoolValue.png deleted file mode 100644 index 787bd3fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/createdBoolValue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e32a84a1b376e65d6c9018a4afe410f8f12523a4a328f0dcce0448d351e8d4a -size 8548 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/crystalPart.rbxm b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/crystalPart.rbxm deleted file mode 100644 index b9aff2ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/crystalPart.rbxm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdafc64f20c9f93e1d3880880584ff2a0d417589c057e20207e20a9e15d33ef6 -size 24229 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/heroBanner_titlePage.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/heroBanner_titlePage.jpg deleted file mode 100644 index 8221480f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/heroBanner_titlePage.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7085ea33d2be2cdba29ac802bbbcaf44221b8dfece67101cff489a1c3a6104b -size 117872 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/map-crystals.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/map-crystals.jpg deleted file mode 100644 index 959ec020..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/map-crystals.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6389b55b3835dd1f2192965e249cc151e97a926c779d34d94fb843447936ab1 -size 269367 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/paintToolOptimized.gif b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/paintToolOptimized.gif deleted file mode 100644 index d3686da6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/paintToolOptimized.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ec1c830b1848a8a067ddf4996db57aed7fc698f9f6267000ec8a761bf806607 -size 831413 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/starterTool.rbxm b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/starterTool.rbxm deleted file mode 100644 index 3ffab0c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/starterTool.rbxm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74270ceeb1f01a2e431bdd115309b82ce0b0acdf326bca5df3cad423d51d85eb -size 5342 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/subtractToolExample.gif b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/subtractToolExample.gif deleted file mode 100644 index 18a1b216..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/subtractToolExample.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e51f88d1ee723b1de7428947c4b1707a9e92a69f0b845cc9b524356bc96b670 -size 587581 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/tools_starterPackClick.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/tools_starterPackClick.png deleted file mode 100644 index bc7a1de7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/tools_starterPackClick.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ee905c929d42cfa72c92b38f957634c9d59e387dd5c98695ed998801337e369 -size 28958 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setAnchorPoint.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setAnchorPoint.jpg deleted file mode 100644 index 969e9460..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setAnchorPoint.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8affa744c06ab26fe0a84b6ade01eb0e1eee7bddfc17073fd1b17661c8c1b99f -size 47703 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setOffset.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setOffset.png deleted file mode 100644 index d394ed6a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setOffset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21e6b745ae4916acdd5b6b1e227607226d34a6c5d23299a88d7917a7b9c1e987 -size 131617 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setPos.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setPos.png deleted file mode 100644 index 9109cc60..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setPos.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:440ed0239950d613eba77f3f320c042eded507786ef4ad314e3148fadd8af542 -size 134523 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setScale.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setScale.png deleted file mode 100644 index a4b14e1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_TextLabelCreate_setScale.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6f88a75aada35e1261feafed30882b00b4469e26ad52dbe33a9687bb198a0a4 -size 106243 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addClickDetector.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addClickDetector.png deleted file mode 100644 index 6996dbf8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addClickDetector.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8e54a42875f12250651cdce6af5295c57f6197f995ee55368813044ac8f05e1 -size 9679 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addScript.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addScript.png deleted file mode 100644 index f0d38667..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01fd3904a5d2ba63f58aa268cf4c717c1fb09045aa7b3fcd8db4f61e1e5a2260 -size 8795 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addSurfaceGUI.png b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addSurfaceGUI.png deleted file mode 100644 index 08dbd4b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_addSurfaceGUI.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:782905f4911843b7035e519da8e83c442f5b850041bda008b31dd3adc2f71df8 -size 9733 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_changeGUIFace.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_changeGUIFace.jpg deleted file mode 100644 index f822d72d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_changeGUIFace.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:665201a2490eca13b7eed107b58014e6eb36b3ab2431c7c43176a60bf764961d -size 62115 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_partCreate.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_partCreate.jpg deleted file mode 100644 index b13dedfc..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_partCreate.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79d41260bf493606b656ee18f6e7e295fe4890851df5fdc0a6ae8de94c98ceb2 -size 59533 diff --git a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_showTextLabelAlt.jpg b/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_showTextLabelAlt.jpg deleted file mode 100644 index b1694a70..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/adventure-game-series/upgrade_showTextLabelAlt.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af74ec5c8f809150138aa931d268b26d6e0fb95abdb98c895de3d5e6edc892ff -size 88331 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/Strucid_thumbnail.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/Strucid_thumbnail.jpg deleted file mode 100644 index fa80620c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/Strucid_thumbnail.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32361b4c9645f68d1c5e3bf814e8283478971e99e62ed88265eaeed3c897ef2b -size 186327 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_circle.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_circle.jpg deleted file mode 100644 index 5399af50..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_circle.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38aacaedbd79f08c3e07225ef2f4096045ec1c968446f3d8399bad2cad8fd0fe -size 30740 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_square.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_square.jpg deleted file mode 100644 index 5e6a610d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_square.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0d074179bcbebbb71717378f74a7bc5107d8c2248519715f3c3bd18c0063517 -size 29497 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_terrain.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_terrain.jpg deleted file mode 100644 index 30463f4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaExample_terrain.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7152ca6212a4941738a999cf731d086e54b5aa3a132a64ae382928ce56db8d32 -size 45903 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaIntro_lobby.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaIntro_lobby.jpg deleted file mode 100644 index 66d79eb4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaIntro_lobby.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f5728beebae0703822841872f448026ffaf83fc0d9a07f80b2ac96496d6a4b9 -size 157174 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaObstacles_advanced_topDown.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaObstacles_advanced_topDown.jpg deleted file mode 100644 index 9f48fc7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaObstacles_advanced_topDown.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bc54201e508fa6f5d26600116c3fc7b2a3120e1b0f45ec58b0feaf6b439df46 -size 37234 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaObstacles_sideBySide.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaObstacles_sideBySide.png deleted file mode 100644 index ace787a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arenaObstacles_sideBySide.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33c77de7ecb012f582832db29dfa183e2dfcde18917c1037e93a5ea0c61422d0 -size 325746 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showClientServerWindows_client.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showClientServerWindows_client.png deleted file mode 100644 index 4b18c1cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showClientServerWindows_client.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd0956e4b6ab234dd8eec0a8fa5b2928706e34d1129b6a283b395ef2e449d938 -size 145607 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showClientServerWindows_server.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showClientServerWindows_server.png deleted file mode 100644 index bca3f9fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showClientServerWindows_server.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01f99ac361cdbafdc80b3fc8d8ffe7f14912907925d42bcd1a8472030ee0b4ba -size 105047 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showFinishedOutput.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showFinishedOutput.png deleted file mode 100644 index 4537ea54..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showFinishedOutput.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fdab45022f41956018f8310dcb99eeeddfd83777390a97c31c6a90e8bf5b9be6 -size 2506 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showGameManagerCreated.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showGameManagerCreated.png deleted file mode 100644 index 1e077bfa..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showGameManagerCreated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69923d9fc3ad3321f17429e5fe2964140147cdc51d727d4a78cddb9821724504 -size 6185 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showGameSettingsCreated.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showGameSettingsCreated.png deleted file mode 100644 index 807dd4ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_2_showGameSettingsCreated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f05dab311734dfa92000bce89b34e5cde1521f2f41b0db1f65084d9e5806c114 -size 4952 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showFinalResult.mp4 b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showFinalResult.mp4 deleted file mode 100644 index 6b24b9fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showFinalResult.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cddca50d726f9c6d237091adc95770f183e83636d6c13e4c9c1f0be94e62600f -size 2186858 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showRepeatArena.mp4 b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showRepeatArena.mp4 deleted file mode 100644 index d536a2d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showRepeatArena.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0010267c1ed63ff6b213b7e6161aa67ea6babc19e7bc3e767b3b6fc3ae5911e -size 2248685 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showSendToMatch.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showSendToMatch.png deleted file mode 100644 index 35cd8fb0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_3_showSendToMatch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69b7a99c44b067eb5356d82b645e578b40b5434e86ace72dc0d7fb74921ccee0 -size 249074 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_4_outputFinished.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_4_outputFinished.png deleted file mode 100644 index c2239d0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_4_outputFinished.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7d365e66951d521883d7faf3401fd2b567d3e80de8cb3ce45a485d39f50c846 -size 1891 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_4_showBindableEvents.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_4_showBindableEvents.png deleted file mode 100644 index a9cefb19..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_4_showBindableEvents.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7790a27e00508ce5cfd240ae7b62c8276b10965f981f2945116727c92f3d2b8 -size 1432 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_addLocalScript.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_addLocalScript.png deleted file mode 100644 index f74bdfeb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_addLocalScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbd3e539289c62e5196ea2d4ab1c35685136c09ad229e2d56866c220ac966fc2 -size 4023 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showFinalizedGameLoop.mp4 b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showFinalizedGameLoop.mp4 deleted file mode 100644 index e186feba..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showFinalizedGameLoop.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4070e4f6024d2e552352099e4777a470f0b9d1c6f176eccc864070ec48fbcdd -size 4120679 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showGUITest.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showGUITest.png deleted file mode 100644 index cc235345..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showGUITest.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b785f678178f0a2e1b108f11869984a04086f53e99cb2015324a7cfb3bc42c0 -size 58331 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showIntValuesCreated.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showIntValuesCreated.png deleted file mode 100644 index 52f121a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showIntValuesCreated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aee360d28a328662b33c1410c7ee9fe64539b496cdd0b66fce7490db91c6de51 -size 7471 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showLabelCreated.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showLabelCreated.png deleted file mode 100644 index 088ccce8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showLabelCreated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05dcacd75f39ebca64192a19f878e1038b2b572957564c9b7cc18093d22343c7 -size 2911 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showMovingScaleGUI.mp4 b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showMovingScaleGUI.mp4 deleted file mode 100644 index 6f740b2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showMovingScaleGUI.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a02a2c32914e0b987caf203a3c0831f281fc5254ff88144727d7c77689868bd8 -size 145559 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showReadyDisplay.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showReadyDisplay.jpg deleted file mode 100644 index 97ae620b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showReadyDisplay.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5b099638e35c3895cd4d54fb7b9ce829cf251a1b96f0ea0a8126f92466d2960 -size 115693 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showTimerDisplay.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showTimerDisplay.jpg deleted file mode 100644 index 9b3cdadf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_5_showTimerDisplay.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac7a3f35c87062847bed4c11042ee1912fb22fbab62833249611d93ae1ed6731 -size 94404 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showEndGame.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showEndGame.png deleted file mode 100644 index 50528d5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showEndGame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a2f9f54ca0e518ef9ae3e5d4787e6ca841f1860e42f39ed98e8a62059fcba9d -size 89180 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showGameEndFoundWinner.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showGameEndFoundWinner.png deleted file mode 100644 index e6a38138..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showGameEndFoundWinner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f166e498e065e409936a192008d46a1f6765283c1aea424babf19ccf0cf9c52a -size 107862 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showGameTimerError.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showGameTimerError.png deleted file mode 100644 index 16b896c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showGameTimerError.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f99ddac621ae76c3157abe63a6f8d638245d23778c887e5756b10a67a67851b4 -size 3654 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showPlayersDefeated_inLobby.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showPlayersDefeated_inLobby.jpg deleted file mode 100644 index 2219e7c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showPlayersDefeated_inLobby.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:543b14f7301733be69a0c4023a236df3d6516cb59a5143b96e4be95ca4700278 -size 46393 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showPlayersDefeated_showPlayerAttacked.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showPlayersDefeated_showPlayerAttacked.jpg deleted file mode 100644 index 5efde672..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showPlayersDefeated_showPlayerAttacked.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86021a0184b06aca9a7484375ef9393c989589222e481ccf0430e51a35a529de -size 46128 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showStatusCreated.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showStatusCreated.png deleted file mode 100644 index b31ed978..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_6_showStatusCreated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61f962589cd49fe8f527491ee6f334f82e7b15b5922c5f3b23d6c5fbb537caf0 -size 4650 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showDifferentGUI_foundWinner.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showDifferentGUI_foundWinner.jpg deleted file mode 100644 index 82a2f990..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showDifferentGUI_foundWinner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:baa97320650dcb2f27ffbc2a924054199ee9a90491cb6c28f363b047a9fd5072 -size 62647 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showDifferentGUI_timeOut.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showDifferentGUI_timeOut.jpg deleted file mode 100644 index 97de1c14..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showDifferentGUI_timeOut.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b77c2e55fc23003d54bd1165d25cf336c6baaaba3bb9d68e978ec31a4a33287 -size 73788 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showPlayerWeapons_withWeapon.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showPlayerWeapons_withWeapon.jpg deleted file mode 100644 index 366ba025..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showPlayerWeapons_withWeapon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7fa794c3fe96273ba5b49be0b0131c3eb4de7b915ebfbf19856d4839bc7385a -size 52300 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showPlayerWeapons_withoutWeapon.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showPlayerWeapons_withoutWeapon.jpg deleted file mode 100644 index 79fe1136..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_7_showPlayerWeapons_withoutWeapon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5a3a8c32ad0c2eeb97b1a3b9dbc7b0204f4b93cb306681233b63148c10c9568 -size 47973 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_addedSpawns.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_addedSpawns.jpg deleted file mode 100644 index 85b55471..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_addedSpawns.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b780adfbb9a0ce516b0a61e77ae488842b5b7a5ceb496bdf15c87383a1da878 -size 83526 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_createPlayerManager.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_createPlayerManager.png deleted file mode 100644 index 5170cc53..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_createPlayerManager.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ab7a7c8bfc9fe88455004746918f3594263d701d0f9ea44541d4eaa88e6ba63 -size 5262 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_createTimer.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_createTimer.png deleted file mode 100644 index f5fae08b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_createTimer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d96d48a0eadf6ccf7aa96a1ba1443db1aa9daa0b3cabe11cfeadce4cd80fdeb -size 5437 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_finishedProject_arenaHero.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_finishedProject_arenaHero.jpg deleted file mode 100644 index 9ce5754c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_finishedProject_arenaHero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b4af60776cdb2e62fbaa096cbcacd059acf0553848e355d48baef93ba06b5d9 -size 40376 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_cleanup.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_cleanup.jpg deleted file mode 100644 index 227beac7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_cleanup.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:315842b5019992432374adfe926f31f62d0a7412f69abfbd3a6a83d692aee884 -size 65048 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_compete.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_compete.jpg deleted file mode 100644 index e0f655cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_compete.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40ed9a7c22e062dbf3978814deeb026353ae0ed78d60de2423f50544c1003aac -size 59440 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_intermission.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_intermission.jpg deleted file mode 100644 index ff405edf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_gamePhase_intermission.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb1be8cfe037d5f27ac2e247431012e0ab1c2424222d6b5ef5b7e7fd38010f9e -size 65996 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_playtestGraybox_cropped.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_playtestGraybox_cropped.jpg deleted file mode 100644 index 049c5b0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_playtestGraybox_cropped.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68e0fc914fa22874730cef2bd57a3628154431c52ab369ae2644adae0188656a -size 73431 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_showWeapon.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_showWeapon.png deleted file mode 100644 index a57df8c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/arena_showWeapon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac4d1450e3190b4dedff9003032d4353083f2afb3648a2207f2508bf82807394 -size 5048 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/battleRoyal_webFinal.mp4 b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/battleRoyal_webFinal.mp4 deleted file mode 100644 index 4df8f1bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/battleRoyal_webFinal.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2dc5a841d6008102163a7d596eb1ad600f712be658d37428379e1df70f067131 -size 2356017 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/islandRoyale_example_2.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/islandRoyale_example_2.jpg deleted file mode 100644 index e4a99dcd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/islandRoyale_example_2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:652577ec5efe6a634d3415188f31c504dabf43115dc296c1beecc822adde04e7 -size 124539 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/playerShowcase_Jandel.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/playerShowcase_Jandel.jpg deleted file mode 100644 index cd6fe811..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/playerShowcase_Jandel.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bf382e880c336e26086d388fda6ebe4c16419f4630f7dabb2724edd9c147b75 -size 58554 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/playerShowcase_luxeyes.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/playerShowcase_luxeyes.jpg deleted file mode 100644 index 696eda40..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/playerShowcase_luxeyes.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af17eb8a876045f003611d8003d78998ad7ed2153e29246889d0f56e7cce3664 -size 89000 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_grayboxExample.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_grayboxExample.jpg deleted file mode 100644 index 9de81b28..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_grayboxExample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78fe0dfc5dba16ec607072b077177e5a925f705ece8a5cd0e6d2cde0bc033db5 -size 209805 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_hero_lesson8.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_hero_lesson8.jpg deleted file mode 100644 index 2d28ab65..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_hero_lesson8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cc8079ba0e0e03b52cf739eaf01dfea8262be58ea2f1b3eebf48dafece5042d -size 147493 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_balanced.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_balanced.png deleted file mode 100644 index 132f0b5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_balanced.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e759a8fd6a21ee9ce4e27c2b4ae4c6596eadde47641e794ec279f99605cfb410 -size 10747 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_simple.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_simple.png deleted file mode 100644 index 7683b18d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_simple.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f828ffb708f9758a9bcd1e234ead28edd797cb73cdff745c376f1785d2a7b45b -size 4861 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_tooComplex.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_tooComplex.png deleted file mode 100644 index f93e77e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_obstacleExampleComplexity_tooComplex.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5593fa489b21012033a4a6ed4af5078720fc26152d696c894879935c5a48f47d -size 10895 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_thumbnail_alt.jpg b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_thumbnail_alt.jpg deleted file mode 100644 index 46317ce2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/roundBased_thumbnail_alt.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46bac538f3461dbab371e82ccfdca478324c0c8ee0666cc8768a4203de57a43b -size 45765 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/show-weapon-spawned.mp4 b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/show-weapon-spawned.mp4 deleted file mode 100644 index 6b24b9fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/show-weapon-spawned.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cddca50d726f9c6d237091adc95770f183e83636d6c13e4c9c1f0be94e62600f -size 2186858 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_arenaSteps_finalizedLayoutMap.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_arenaSteps_finalizedLayoutMap.png deleted file mode 100644 index 5ab5989f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_arenaSteps_finalizedLayoutMap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6a31093e4ff78818148e9b8fe12c3e2851166b399ed1732fa89605727e5bd46 -size 3350 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_example_obstacle.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_example_obstacle.png deleted file mode 100644 index ae375730..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_example_obstacle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2757944394ce8c18edda54307059430fa3189f8107a1c6edfa3fe7917329ded -size 2925 diff --git a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_playerSpawns.png b/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_playerSpawns.png deleted file mode 100644 index c337fd13..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/battle-royale-series/vectorMap_playerSpawns.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44a7846ef5d24e62aef8344e5cd09d80bc1a8f1dd493c922c937f89cbae3b493 -size 2357 diff --git a/.cursor/rules/roblox/en-us/assets/education/beta-testing-edu-experiences/BetaTestingGame.png b/.cursor/rules/roblox/en-us/assets/education/beta-testing-edu-experiences/BetaTestingGame.png deleted file mode 100644 index 3ed00959..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/beta-testing-edu-experiences/BetaTestingGame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f8ba7de51fbe1b3d98a87d44edf963f8647abc72357da902095807bac3c7538 -size 161109 diff --git a/.cursor/rules/roblox/en-us/assets/education/beta-testing-edu-experiences/alo-feedback-form.png b/.cursor/rules/roblox/en-us/assets/education/beta-testing-edu-experiences/alo-feedback-form.png deleted file mode 100644 index 353aca7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/beta-testing-edu-experiences/alo-feedback-form.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0db14863c1814c26a3d78c40628c7a375e6a5674826b5d8c3ce3bd20fd84ca2e -size 167612 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/CreateAndDestroy_template.rbxl b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/CreateAndDestroy_template.rbxl deleted file mode 100644 index 0f9e152b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/CreateAndDestroy_template.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1f74ad3ee1ade393a2da328d6c1be6feceb8568cbe9273ccbb849203a844b5c -size 123989 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ExpandedMap_920x640.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ExpandedMap_920x640.png deleted file mode 100644 index db925330..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ExpandedMap_920x640.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8e741d8e43646c7e7ac59e568c4a7c415393a8bfbb552924935a93c3ca2b7d2 -size 48306 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/FilterWorkspace_920x640.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/FilterWorkspace_920x640.png deleted file mode 100644 index 15c2cfbb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/FilterWorkspace_920x640.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e07ab63e81c11a4cabd3a4ff32fbfadf5df09385b7a4caacd2244d995060310 -size 49287 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/GameSettingsFoundpsd.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/GameSettingsFoundpsd.png deleted file mode 100644 index 9897c65c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/GameSettingsFoundpsd.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6fd845659a4cbf88d23f8f3148498cd239b71569346054304569c12b603e32d -size 44054 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/GameSettingsSearch_640x300.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/GameSettingsSearch_640x300.png deleted file mode 100644 index 8b8962c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/GameSettingsSearch_640x300.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a90388a333ab5236a32e595864be527261b114c5a3f5c016d9c55f091066b89d -size 41149 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/PlaceCustomBuilding_930x640.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/PlaceCustomBuilding_930x640.png deleted file mode 100644 index d1c3b25c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/PlaceCustomBuilding_930x640.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f036aefabd9d0cd7dd2cf4b0880a47e1ea499e19c510461bce327894534e75d -size 52615 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/PlacedHalfMap.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/PlacedHalfMap.jpg deleted file mode 100644 index 068cbe4c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/PlacedHalfMap.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a99e940370c6a44eca05165e2721e0aca2e7093b10314ab195152f6e3ae2034 -size 126504 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/SpawnLocation_Select_920x600.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/SpawnLocation_Select_920x600.jpg deleted file mode 100644 index 8b37713b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/SpawnLocation_Select_920x600.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a50e271c0c0db5c5b008ee07f9c90276bbdb44b97e9ddc0296bed2d0c1546b4 -size 129839 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_backpack.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_backpack.png deleted file mode 100644 index 8551b3bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_backpack.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cfa1fc08582fea9888b115350c67acd6639a8e63907a54b690cf2df67ca5d8f -size 615100 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_head.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_head.jpg deleted file mode 100644 index 16cc3765..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_head.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d71564c2e30a4d052bc1e247c15c1ae808afc534445ddbea07dfc7c7045b28f2 -size 101619 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_wing.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_wing.jpg deleted file mode 100644 index 11cc7773..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/avatarItemHeroBanners_wing.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1606232a18a6f684c29d0409508bc78796e0f3b363173fe7ca4d966672440f7e -size 170135 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/buildingExamples_large.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/buildingExamples_large.jpg deleted file mode 100644 index d240f3f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/buildingExamples_large.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a8bfb43c2117c38e6528fe31b9e84e787b066c9068e83d91dac0e0a9dbfd5f3 -size 57629 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/buildingExamples_props.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/buildingExamples_props.jpg deleted file mode 100644 index 6bbb2bbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/buildingExamples_props.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:347d9a38bc772774d6ebfe3566b3fadefa445c1ccfe9d165422eb1a88a069dad -size 53208 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_bannerTerrain.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_bannerTerrain.jpg deleted file mode 100644 index 6dc92099..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_bannerTerrain.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99a78177ca532c3fb944642de557094582c495894960b87113f522a0a4f3ff7a -size 140835 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_heroBanner_overCity.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_heroBanner_overCity.jpg deleted file mode 100644 index e1570b7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_heroBanner_overCity.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:618eb81d67c21d4614765737037cdc812bb97de85ff11c23e99553dec5a63734 -size 223470 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_introVideo_final_webOptimize.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_introVideo_final_webOptimize.mp4 deleted file mode 100644 index a189beb6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_introVideo_final_webOptimize.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:283e7743005ebe1f8b829973026b5010c53b9982130f11eb919f1f1e685b2f4c -size 4650847 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_moveFirstBuilding.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_moveFirstBuilding.mp4 deleted file mode 100644 index bd5c9299..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_moveFirstBuilding.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9015ade6d013f29512ca6156eed8c75fc5533e6e7d9442d2236e211a350c9c2d -size 254393 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_moveSpawnLocation.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_moveSpawnLocation.mp4 deleted file mode 100644 index c1d061dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_moveSpawnLocation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fbb81f59af8be81e50101107e1093ccf8fb7a8c5913ce29562fc69db6400119 -size 108157 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_quizGamePage.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_quizGamePage.png deleted file mode 100644 index ff36a90a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_quizGamePage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33d2e4d40504f451ae593f1a69c12e7099b4e35f5b4f71a1e9ad558473504176 -size 288528 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_quizGameScreenshot.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_quizGameScreenshot.jpg deleted file mode 100644 index cb858fbf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_quizGameScreenshot.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7ae195ab118e582a7885abb8027dc18e034739e74baae833ec70b706683e746 -size 118536 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showCameraControlsBuilding.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showCameraControlsBuilding.mp4 deleted file mode 100644 index c11d6f55..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showCameraControlsBuilding.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e58a7f7d16b8caaacd21b9d919e41009c3de2c960e52267e0916ff872c0c4eed -size 269532 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showDuplicateCity.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showDuplicateCity.mp4 deleted file mode 100644 index 188e7910..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showDuplicateCity.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f325d5f1170bc0118adc2fff9e65da1eca20309c5f541ebda9dbbcfe900eb7ce -size 627909 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showSelectDragCity.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showSelectDragCity.mp4 deleted file mode 100644 index ad8557b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_showSelectDragCity.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d60e453b4b6dd4418d107e0b9ccbc2823c1035d38e069888d93fd4f915d74a6 -size 125261 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_switchBackTop.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_switchBackTop.mp4 deleted file mode 100644 index d41fa038..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_switchBackTop.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d16fb5e71f047d85ebfe9ef1687fbebd275d44dd23c352147c30b351acf8f33e -size 146903 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_thumbnail_312x200.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_thumbnail_312x200.jpg deleted file mode 100644 index cec56724..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/cc2019_thumbnail_312x200.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d7602e97178aad09261e64452cbf6f7abf238ea317e94e1bd6de7da97d09c0d -size 42268 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_addTerrain.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_addTerrain.png deleted file mode 100644 index a0961fb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_addTerrain.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87dac727f1ec4a825b8b2a34479ace10a01d1ad27d74c1eda4dc63567a32a4fa -size 13597 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_changeShapeSize.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_changeShapeSize.png deleted file mode 100644 index ba0b31ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_changeShapeSize.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87d90c54a10ef89c7d371a01e8af9d35d0f37764aba6c06414a47dd78a7cda16 -size 24325 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainSmooth.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainSmooth.png deleted file mode 100644 index d5dd1e4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainSmooth.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fd058c8cee736aa2083fa2bc1f65ad8bc986200004d35468906001874c4c292 -size 14220 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainTools_paint.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainTools_paint.png deleted file mode 100644 index 78499374..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainTools_paint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c4d26ebbef746e4a5363561d3df6760eda1158f2944c7a7da4218b15c44e11d -size 14099 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainTools_subtract.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainTools_subtract.png deleted file mode 100644 index d9fdc75c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/ccs2019_terrainTools_subtract.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14f8504d95a826aea72d7879b20bf132b94a71b2245009b275f699ee56310210 -size 13448 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/changeViewSelectorSide_updated.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/changeViewSelectorSide_updated.mp4 deleted file mode 100644 index 4b187d34..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/changeViewSelectorSide_updated.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cb818db8cef1185e7b0e65c5eb239a9a45dd37a0c683e081396b0d281382b15 -size 180903 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/clickViewSelectorToTop.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/clickViewSelectorToTop.jpg deleted file mode 100644 index d0c30da0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/clickViewSelectorToTop.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9450ecdebed673c9d45b490cf583e342725414850f130aca968a21fa6f1291ae -size 127583 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/exampleCustomBuildings.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/exampleCustomBuildings.jpg deleted file mode 100644 index ae04fcf0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/exampleCustomBuildings.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9fb3c08d60b7105e12c9cc379104df21a8cf571de80477a347830af7ddf22c0 -size 113174 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/firstHalfSetup_800x450.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/firstHalfSetup_800x450.jpg deleted file mode 100644 index ca537db4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/firstHalfSetup_800x450.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23fb241187d376be02b8636c6299840a6a66b07d141a8325b701c5105415c6cf -size 131342 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/islandBlankExample_800x450.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/islandBlankExample_800x450.jpg deleted file mode 100644 index af53c8eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/islandBlankExample_800x450.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c77593a19cb8d35bf1e3ca6a4f191199e10bb2cbd78ccbb5c12e7b8d65aa167f -size 99818 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/islandTerrainAdded_600x600.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/islandTerrainAdded_600x600.jpg deleted file mode 100644 index a8a28237..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/islandTerrainAdded_600x600.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cb4812fceb7f0580f7b8a5eadad0051a28dd2153f692b2535770f9e122c2b8f -size 135816 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonBanner_3.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonBanner_3.jpg deleted file mode 100644 index 6f5f1103..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonBanner_3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b68b89d525fef7be69da716134b3fb796994811ee43bd94958815f4cefbbb95b -size 144268 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_1_360x360.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_1_360x360.jpg deleted file mode 100644 index 707daa80..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_1_360x360.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f00e97bffbfcce4eb2c2d48473b4623e4dfba3febba02ca15bc9c43dc37e3f38 -size 46575 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_2_360x360.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_2_360x360.jpg deleted file mode 100644 index a8a28237..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_2_360x360.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cb4812fceb7f0580f7b8a5eadad0051a28dd2153f692b2535770f9e122c2b8f -size 135816 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_3_360x360.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_3_360x360.jpg deleted file mode 100644 index c608fb1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/lessonThumbnail_3_360x360.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dccb82ee3c7fd6a400312c711a98dae52187842af5e7a59952a646addae626d6 -size 55924 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/playersOverlookingCity_banner.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/playersOverlookingCity_banner.jpg deleted file mode 100644 index dbd95807..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/playersOverlookingCity_banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59953e970eb28683cac51da171c1be1b71f587066ca43a2ec87e64a42eb13ac4 -size 245084 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/playtestRunCenter.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/playtestRunCenter.jpg deleted file mode 100644 index e045e827..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/playtestRunCenter.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc9897ad30d7139de2f2744818a5f41a91d58b7f3614b1c6c1f2fc9eec3ced85 -size 120523 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/roadsPlacedExample_600x450.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/roadsPlacedExample_600x450.jpg deleted file mode 100644 index c054c749..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/roadsPlacedExample_600x450.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6672cb9f58c09037a9cbd9109fbd3c73bf89f96e3be080c603441fff9925f7e3 -size 106483 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/show-terrain-360px.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/show-terrain-360px.jpg deleted file mode 100644 index ffc31356..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/show-terrain-360px.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c66be0263ff638acd92775b315517afbf0db097260d608420f5676ad44c1b57 -size 63270 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showFocusBuilding.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showFocusBuilding.jpg deleted file mode 100644 index 1b14ed5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showFocusBuilding.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e588e7fba93446686005f09d3a5cd0754984e9e30b45e83a127ff85bac513e0 -size 137406 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showIslandExamples_600x600.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showIslandExamples_600x600.jpg deleted file mode 100644 index 4b80126e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showIslandExamples_600x600.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d53b4a2302c0a0af85c6e3fe80a17e8b4df585a45dbf3317793d82b5b08945f -size 142833 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showIslandPainted_600x600.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showIslandPainted_600x600.jpg deleted file mode 100644 index 732e0c8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showIslandPainted_600x600.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9308f63cb4b0daca980020520ebb3dff69c33397b1363eda751e0a186e745e74 -size 120298 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showPropsPlaced.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showPropsPlaced.jpg deleted file mode 100644 index 57543460..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showPropsPlaced.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4ad020592a103d3167dfc92597b97b6a6d10bc9ddcad4975cd5ede37117254b -size 136123 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showSpawnLocations_800x450.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showSpawnLocations_800x450.jpg deleted file mode 100644 index f864150b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showSpawnLocations_800x450.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:312916a679d6b8c53a03d66e29f5f06aac2c77e67a6d56699c88a560569ead06 -size 85136 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showTerrainAdd.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showTerrainAdd.mp4 deleted file mode 100644 index 493504ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showTerrainAdd.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f463724a9a8caba0f1faab6a07e811fa568cf8de5d98b5c0a0f89ebb4bf1d8bf -size 468935 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showThumbnailCameraAngle.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showThumbnailCameraAngle.jpg deleted file mode 100644 index afc0308f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/showThumbnailCameraAngle.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7612cabad458c2cbc60704b669232e0d78471ac7c4ced2a652196177cdfce0f6 -size 166403 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/spawnLocations_2placed.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/spawnLocations_2placed.jpg deleted file mode 100644 index 3e2a5aa0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-create-and-destroy/spawnLocations_2placed.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0559b4bd4bdcc7f7e6bacddb908a90183fadaf9335ee919b2a7ba788cccd45b -size 125178 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/hero-new-assets.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/hero-new-assets.jpeg deleted file mode 100644 index 65729e4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/hero-new-assets.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d0fff7d084634033a4ce28b4fe0550b3480e8e1d49ab3dbb489d8ea014705c0 -size 204888 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/hero-ring-hat.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/hero-ring-hat.jpeg deleted file mode 100644 index dd191b97..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/hero-ring-hat.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2631a49e5ffe6ca0a720646276814c7e3cf398e18f601179fa1a6c86ba51dfa -size 188788 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/new-parts-design-1.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/new-parts-design-1.jpeg deleted file mode 100644 index e3ca5afd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/new-parts-design-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee222e9e42a0f385199f0aefdb4c9fb9090a4a44a97e7feaff2bbdd6123e538f -size 64663 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/new-parts-design-2.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/new-parts-design-2.jpeg deleted file mode 100644 index ed31b856..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/new-parts-design-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8451f49b0619c8e188414bf138c065bd2e79e27db81349fd89a8ae9847c3de5c -size 65446 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/show-assets-added.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/show-assets-added.jpeg deleted file mode 100644 index 321bc7ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-new-models/show-assets-added.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fff92afb771bbafa91233e760c3e0a962712c72d60076b39351198d0e9ed9c29 -size 306844 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/find-garage.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/find-garage.png deleted file mode 100644 index eb3c342d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/find-garage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5357b2601340829ba25cdb543834d439c79af24d84f3a6f03a985b36062c7ff9 -size 18552 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/paste-into-garage.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/paste-into-garage.png deleted file mode 100644 index 7cd4befc..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/paste-into-garage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e4603ed6afbb40c3bf70da4da3d894ac157f78c7d6d6239e3132b1afbeb9814 -size 22037 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/rename-model.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/rename-model.png deleted file mode 100644 index 2a6db084..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/add-to-the-garage/rename-model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0f587e94dd17fd08e9d49edbbbc7ffa0f6d49584c0e805b19259d617685f1bd -size 22975 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/move-wing.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/move-wing.mp4 deleted file mode 100644 index 2b99c8a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/move-wing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ecfee9e481ad13dbae496bed2f1044540226e0efe89ff3d2054c7ba214854e0 -size 4338517 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/rotate-wing.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/rotate-wing.mp4 deleted file mode 100644 index 3fd1cacd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/rotate-wing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81ae34afe8dde95ffe6c902777d5b4d502583cd7a44218f6dc97735659325efb -size 4728840 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/scale-wing.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/scale-wing.mp4 deleted file mode 100644 index c0f0e3a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/scale-wing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:becec83eaa263a6757d4571df8ea17d07a909fea7ef6727cfce90f9b6a6772a8 -size 5688768 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/wing-example.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/wing-example.jpeg deleted file mode 100644 index 82d3dda4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/wing-example.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e98b92863283e304106956e9bb827056447cc7436f7c266055b65c987eca24b1 -size 134609 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/work-area-correct.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/work-area-correct.jpeg deleted file mode 100644 index 51d60ed7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/work-area-correct.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25b2988dc593dc8b42b435b4fe51dcb44af6c7cedcb04235a044f39bff47d980 -size 90714 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/work-area-wrong.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/work-area-wrong.jpeg deleted file mode 100644 index 9af12f07..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/adding-wings/work-area-wrong.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca795983bd0faa30c7398695d2599b50d0413769bff3c059057991e31843048c -size 92881 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/add-image.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/add-image.png deleted file mode 100644 index d76cba28..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/add-image.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0288bce88069a9d3880474e320ef05e16bf3ef029aa5d6f86be8a8510b4657e4 -size 82676 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/body-highlighted.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/body-highlighted.png deleted file mode 100644 index e03433d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/body-highlighted.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3ae689749076ebef39a3f098d45c3132eb51a09597cc1329f7d4c4cf3bccaac -size 46168 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/callout-textureid.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/callout-textureid.jpeg deleted file mode 100644 index 05eee1af..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/callout-textureid.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ffcf3870d9938320c1ddb275dd6746fffd0bd936c7fe9d5b139e8c2971eac3d -size 71510 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/colored-ships.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/colored-ships.jpeg deleted file mode 100644 index 43fe42ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/colored-ships.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc2561e6a4b534f32964a6d5e428f3803137680ff1b722c59caba0b6543f7d3c -size 334257 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/new-texture.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/new-texture.jpeg deleted file mode 100644 index 5ee2280f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/new-texture.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba3d995bcb55adfc2ea5ca50881017c7a72cf8b1cb9d2e1c3096f85549363f50 -size 44122 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/original-texture.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/original-texture.jpeg deleted file mode 100644 index d16a18dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/original-texture.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:346393a082f34b0b3cb674c8eb626f06d7c1ece06498c5856c9c4f4aee0f4f99 -size 46285 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/scrapper-backpack.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/scrapper-backpack.jpeg deleted file mode 100644 index 96783b73..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/scrapper-backpack.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:775a0eef2d99ca38272895b326d5016d4488c3fae78ad8aaaf2c5d45e0c35bf4 -size 167617 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-blue.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-blue.png deleted file mode 100644 index 57e9f872..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-blue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e87ec5141f6856201f575ae77a0117854ef6c0799817396ee050bef12423a1e4 -size 181155 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-rust.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-rust.png deleted file mode 100644 index a9d29d64..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-rust.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4953776a8a0a6fd6978eaaf43302339f464f003cb2b0f1319115f7bedf76ea1 -size 197388 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-teal.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-teal.png deleted file mode 100644 index b6e959cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/colors-and-textures/speeder-teal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f68d6fcb4adb17f5887aa855b8fc8035c7205dfaaaeec79eb44d66b543bcf41 -size 90334 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/compare-speeder-speeds.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/compare-speeder-speeds.mp4 deleted file mode 100644 index bb156dee..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/compare-speeder-speeds.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e056ee4cba12f64ff74c999e5c86e20797b7826441f2a9904e425e2347c683 -size 906554 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/hero-group.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/hero-group.jpeg deleted file mode 100644 index d20f34a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/hero-group.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6ed41e42dac2a6ab7e686eb8d1b55d74219bfddc40d314add4397e5ffc2a390 -size 164038 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/open-explorer-garage.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/open-explorer-garage.png deleted file mode 100644 index a40ed3f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/open-explorer-garage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44a36c95a4f6826ade0592411ab6b81ec323f2e48e29d8510563cb54cd991d86 -size 25085 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/speed300.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/speed300.mp4 deleted file mode 100644 index 1b1c78a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/speed300.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa1e555719bbed26ee2546ce71b126759fed033df7d9195da450aaa602b32092 -size 2231635 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/speed50.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/speed50.mp4 deleted file mode 100644 index 3f34b933..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/customize-and-share/speed50.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3daebe0e6a4b867512134938dc3cc621089095102510a54a859b6e47d052f504 -size 5625252 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/hero-jetpack.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/hero-jetpack.jpeg deleted file mode 100644 index 0628b51b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/hero-jetpack.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:631966528901478524826326fe3caee1d02a528f43c04cc08af31ea2d2e12173 -size 188610 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/hero-winter.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/hero-winter.jpeg deleted file mode 100644 index 619ff4df..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/hero-winter.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0ddfa1754436c3d474022b5a6c526a53d663fc4b8557e45b065bb75c1dfe880 -size 271101 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/junkbot-hero.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/junkbot-hero.jpeg deleted file mode 100644 index 8ba505d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/junkbot-hero.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c504666196b516a12212a7447b3b78d2bb98234053a209f303404cec80e6a39 -size 102876 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/paint-terrain-snow.gif b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/paint-terrain-snow.gif deleted file mode 100644 index 2d010e1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/paint-terrain-snow.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5844cab69953e07a1aa8da3bcac5c2f2ef449935f15d7779809a872139a1c305 -size 598001 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/paint-tool-snow.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/paint-tool-snow.png deleted file mode 100644 index 825edba1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/paint-tool-snow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b88423fb11628b183592eda24e28b337a7bf87321ed058a89f56e903b31d4e4 -size 44969 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/select-snow-material.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/select-snow-material.png deleted file mode 100644 index f1404196..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/select-snow-material.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6a23a6cdf34679e68b114e4703a41eb96568517fd89df79bea64cbea431d557 -size 19765 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/select-terrain-explorer.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/select-terrain-explorer.png deleted file mode 100644 index e749c93c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/select-terrain-explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:381826c072e07a825450b49f4d5ab1a831b0ab088afd1f7889036520e6547b29 -size 12867 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/show-terrain-color-change.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/show-terrain-color-change.mp4 deleted file mode 100644 index 85074916..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/show-terrain-color-change.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:502997c1ffaf3b19dd6cffe3e21c3ea0f9a3b6f49cddaed13e07a860446bd3ae -size 254474 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-editor-edit-tab.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-editor-edit-tab.png deleted file mode 100644 index 5e1813a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-editor-edit-tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:659ffd42327823ca922c27cbc5270b579bf43d7d5c22fe8903280f474818272d -size 113110 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-expand-materials.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-expand-materials.png deleted file mode 100644 index bcbe51df..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-expand-materials.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:432c9e6c445184a4cfe703ec8adfa5e74a6d1f4ec72eaa09818cf46ac6926b33 -size 14659 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-winter-version.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-winter-version.jpeg deleted file mode 100644 index fc58291c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/design-the-world/terrain-winter-version.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:644feb1404b5e7c50a9fe586bc74aa0b1ba8350420a9e684fda8d24cfc526f9d -size 238551 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Decorative-Parts-Parts.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Decorative-Parts-Parts.png deleted file mode 100644 index bf413107..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Decorative-Parts-Parts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d16227ef0664e520ed017fc88c3c1d06d4867410de8c2d50b5b735c7c0d104b -size 376248 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Decorative-Parts.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Decorative-Parts.png deleted file mode 100644 index 36d50858..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Decorative-Parts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8b3765805cb366e164920fd8cd33c59a1f3b14264184f0e05f9c9b42bb315bd -size 264217 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Starting-Bodies-Parts.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Starting-Bodies-Parts.png deleted file mode 100644 index cca46c03..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Starting-Bodies-Parts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c4bba00722cdd9eb6f8fb57a2e940aeb7799f53d524dfa0a57e7878178038a3 -size 315419 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Starting-Bodies.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Starting-Bodies.png deleted file mode 100644 index 9736b67a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Starting-Bodies.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc882abba63dbad5fef1468a3879c1b702b2634546bca68c38df81f093103697 -size 368595 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Wing-Sets-Parts.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Wing-Sets-Parts.png deleted file mode 100644 index bf2a046c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Wing-Sets-Parts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:792e4a19d772588445544f24dd46a832b6e9c5c3239dc526cb60d35201713206 -size 364116 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Wing-Sets.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Wing-Sets.png deleted file mode 100644 index dafd5788..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/Wing-Sets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fe743c412389c1f3fcba1214f94995e6701b22b4355c1be473f2ba2dde699b5 -size 391922 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/move-camera-to-focus.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/move-camera-to-focus.mp4 deleted file mode 100644 index 43b6272c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/move-camera-to-focus.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbbe97228830152c705b532cc41d1342ecafa360f639a3ef66aeede7d2af2811 -size 493622 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/move-camera-to-focus.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/move-camera-to-focus.png deleted file mode 100644 index 04e0ed37..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/move-camera-to-focus.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f29f592fe2e6b983b80f07918177f77df2b8e0ee1d5e803f34b2335023cf699 -size 5445329 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-1.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-1.jpeg deleted file mode 100644 index d0dc662c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e3aa420001aa1a8c3a7530e706ffe8add32bada3bf829c1f836fc23952919bb -size 92711 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-2.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-2.jpeg deleted file mode 100644 index 2df886a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db01804804ec9720aab78730e581cd3f181a76925bc72b9c88851c6263ee58a9 -size 94876 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-3.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-3.jpeg deleted file mode 100644 index 3fbbbc0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/designing-your-speeder/speeder-progress-3.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7c5f8a3b0a2b7229a07d34ed0e5047a32aef86f200144ff00cf6a411fea1162 -size 98759 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/decorated-version-1.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/decorated-version-1.jpeg deleted file mode 100644 index 31683d88..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/decorated-version-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d61fe02e6fdd11e50f296d2cf04859cd81762b4d115fd74be6dc01b489f03a8a -size 81759 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/decorated-version-2.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/decorated-version-2.jpeg deleted file mode 100644 index ae7566c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/decorated-version-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e094fc9658cfe06c0eec1fd12285c3a41288d402b57476b4f76b8920a55335e -size 87176 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/duplicated-wing.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/duplicated-wing.jpeg deleted file mode 100644 index d8f1513d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/duplicated-wing.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f92a66e30b765e7a81bdcbea0de0cab021b936a0f26ecf2a896af62b150b2419 -size 247999 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/rotate-compare.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/rotate-compare.mp4 deleted file mode 100644 index d4091fda..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/rotate-compare.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd2617ed09cd8f2e6d1b974390b1277a8d508066874f7b0cd8a7f54e19c4e6cd -size 570818 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/scrapyard-decorations.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/scrapyard-decorations.jpeg deleted file mode 100644 index 2a8e340d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/scrapyard-decorations.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4e9f96bbadd6377d002ae2aaa4a75f6587223e739861fe8e58960f6319c9c33 -size 147275 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/second-wing.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/second-wing.jpeg deleted file mode 100644 index 0c75283c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/second-wing.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db39282132cfaff80d23639904d03c827b21c815ebf0815d08dd193b9cc89e36 -size 265006 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/second-wing.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/second-wing.mp4 deleted file mode 100644 index 3e7454af..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/second-wing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e9051ec16e1c7aa44724639852d58780481aa558eef8d5acd9afdeb6e4f47f9 -size 8483314 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-extension.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-extension.jpeg deleted file mode 100644 index 26748904..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-extension.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4364b407fad39d4ac44e2eaf090c9b56b2747c4093731a533067ce83d3cbb3cb -size 115380 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-1.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-1.jpeg deleted file mode 100644 index 0f998da9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37e791c7a8c1a4ee2b2eb35cc5fb420cfee78d449c35230b9e424872b7557355 -size 87154 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-2.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-2.jpeg deleted file mode 100644 index b1d43687..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b36013c890ddeaf164e3f493514b58ee0549caf29d17f749b9afd97496205006 -size 93363 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-3.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-3.jpeg deleted file mode 100644 index 3ccf1ee0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/duplicate-and-design/wing-variations-3.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fff17f288da804bdb7f13f2d4fdd43750ee32965192a73a088df131e567096e9 -size 90319 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/get-off-the-ground/galactic-speedway-template.rbxl b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/get-off-the-ground/galactic-speedway-template.rbxl deleted file mode 100644 index a2515786..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/get-off-the-ground/galactic-speedway-template.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ca78c652343dd8f5a27b618580b6d4e193c54ac08dbcd97348b48c381251944 -size 1964035 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/get-off-the-ground/lesson-banner.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/get-off-the-ground/lesson-banner.jpeg deleted file mode 100644 index 9367f16c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/get-off-the-ground/lesson-banner.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06497abbb1adc55b845a878b89b6bbc680a83e9f2961d1af9156bc8a13f90f80 -size 180999 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-1.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-1.jpeg deleted file mode 100644 index 3a13713a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:131d71acd59fd9a70a302f5f33fca9bbd0b9e3d0205886725778b3187d75a8c2 -size 56051 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-2.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-2.jpeg deleted file mode 100644 index dbd7d369..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0910d8989d53bc781c9888765e55b312f05f093a6631ae30789f6561c7d73ec3 -size 62521 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-3.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-3.jpeg deleted file mode 100644 index 1af9d2ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/extension-3.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:080a4ada047d448f103d05eb12ff8ef042bc594698eabc997353c0f96aef5541 -size 55062 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/next-steps-particles.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/next-steps-particles.jpeg deleted file mode 100644 index 8a49f6dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/next-steps-particles.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60fa4375d721e88c956cb47dfac0d9a0ec2fc76c9b618a67598cc4ed1f97504b -size 52908 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/next-steps-share.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/next-steps-share.jpeg deleted file mode 100644 index 265bb7c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/go-beyond-the-challenge/next-steps-share.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49ac3c7a80040ef29ea505d920e98c8eb25bcd3f10b44beb811a078ebac2e90c -size 48596 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/going-for-a-race/hero-race.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/going-for-a-race/hero-race.jpeg deleted file mode 100644 index 8fa78bb4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/going-for-a-race/hero-race.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f255af5ef98f1976d44357ab5d1777269e4651c4217ab16fad635e1a3b9a680 -size 139483 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/going-for-a-race/testing-plane.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/going-for-a-race/testing-plane.jpeg deleted file mode 100644 index b91784ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/going-for-a-race/testing-plane.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50775499e1aa70da4f254eec643c95243f8830cf4684938ad919644f54629cc8 -size 107315 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/group-select.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/group-select.png deleted file mode 100644 index 65f20c08..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/group-select.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fb187b1b75f380e7afa748331ed1330e987c98014f4eb8b49f897494a3f96e0 -size 105188 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/grouping.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/grouping.mp4 deleted file mode 100644 index a09b462d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/grouping.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c24cdd39322b95176a161af08e067c6925b1f18055c7fae3e22190ddfc521feb -size 1964174 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/test-grouping.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/test-grouping.mp4 deleted file mode 100644 index aeb3c2cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/grouping-the-parts/test-grouping.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08b2706175bd9d7e068fc53b80b02ba5edb954ebf8ad535486796645f339586c -size 320305 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-1.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-1.jpeg deleted file mode 100644 index 7a533c4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:217137d9fe6629ffad42e2aa0e89a7973832d30ce61589d558ed72dfe3a38c2e -size 51996 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-2.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-2.jpeg deleted file mode 100644 index 30045f24..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56c08cddb12d109435562155ddbfac5018c54a9b6b36596edff1e1b32dd34963 -size 62862 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-3.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-3.jpeg deleted file mode 100644 index c23182a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/lesson-3.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:263390174ce4b2ef62bbe47e7a895c3be9f4d76681a6140e67718be4188e73a6 -size 53936 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/overview-video.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/overview-video.mp4 deleted file mode 100644 index c45726f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/overview-video.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2607ac801a3142775242c624c495648b827782d7654f79f8c39eda502d810447 -size 2608919 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/show-quiz-game-example.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/show-quiz-game-example.jpeg deleted file mode 100644 index 24e6178b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/main-page/show-quiz-game-example.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06166a9b4a3fa3bc0ab3bd259e5ad91937d050b5a5908198e0c2f520fe5fdbb3 -size 140119 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/move-body.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/move-body.mp4 deleted file mode 100644 index 2eed3e0c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/move-body.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40eac4167ee17e1a1952a1a80c0796591b172f223301d66b3a5dc5d9c47dc003 -size 4064753 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-1.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-1.jpeg deleted file mode 100644 index 69b994ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92c3d2eec9e2af048401e0d1f897cc015bf9d54470130dfe6b011a9610c88439 -size 81144 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-2.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-2.jpeg deleted file mode 100644 index d1acbbb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:483ce3d9884dabc8492f5fd99ea39961bcf5619d3c44ab63060cb84e28e9caf9 -size 91706 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-3.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-3.jpeg deleted file mode 100644 index e87c882f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/moving-the-body/show-body-variations-3.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f1cda256fc16d8a558cde48ba65e135a7bc66cf8d57bbbe07f1e823622d8270 -size 93964 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/DistributeonCS.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/DistributeonCS.png deleted file mode 100644 index afd9e846..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/DistributeonCS.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89b5089beb02fe84afa22e4e9ed353ddac7fdc88a3ff52ae86ed98a816ea5ac0 -size 53408 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/GetModelButton.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/GetModelButton.png deleted file mode 100644 index c6d704fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/GetModelButton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b186a072f9d8f98566a6ef70f6292a66f85da5e3845c24d4d6590622163cd327 -size 82133 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/LinktoCD.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/LinktoCD.png deleted file mode 100644 index 68cff252..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/LinktoCD.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c07a265d9f62de4d36dfa3ab9573acc6e70691af617929661e5e283f6930d6aa -size 46940 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/hero-garage-racer.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/hero-garage-racer.jpeg deleted file mode 100644 index 89ae48c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/sharing-your-speeders/hero-garage-racer.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa2914194e20619320d3cd10d354b2d4f9977f9e1907e0d8a866ec2d8917f587 -size 139010 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-flight/interact-robot.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-flight/interact-robot.png deleted file mode 100644 index b281d0f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-flight/interact-robot.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f285cd927ae180287fcbe1339e1aece8119a76c4375386f8307fb6e941dade2f -size 1736608 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-flight/show-selection-gui.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-flight/show-selection-gui.jpg deleted file mode 100644 index 5043b91d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-flight/show-selection-gui.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d26c2d2265c75e2fe535a5dc0102b16e07ffc22dec473c2498f00caee3ad0231 -size 93830 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-2/quiz-game-page.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-2/quiz-game-page.jpeg deleted file mode 100644 index 69181c78..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-2/quiz-game-page.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4289ec76931ceca819db47f072fafb252ddfdd968bd0fb9b531bfeb3d70a4e19 -size 140637 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-2/scrapper-hat.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-2/scrapper-hat.jpeg deleted file mode 100644 index 6da41a3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-2/scrapper-hat.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf4ebc6d78fd6dd7ef297cd389b472d01126e6e599fa90b3cc74420e67cbf189 -size 168034 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-3/hero-alien-friend.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-3/hero-alien-friend.jpeg deleted file mode 100644 index 42e155a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge-3/hero-alien-friend.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf464300b7702b6eee918f85b134ad5856c0c2bd727b0dfc7b26a7dc394bed55 -size 235393 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge/hero-pauldron.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge/hero-pauldron.jpeg deleted file mode 100644 index 4063201b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge/hero-pauldron.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e89f6cc695906500856e1b726a2509970adedbfefa564162581c78675229bcf -size 164268 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge/show-quiz-npc.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge/show-quiz-npc.jpg deleted file mode 100644 index 65441b83..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/take-the-challenge/show-quiz-npc.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfbe81b89844b6ffd005bdf439c024a26c2e7abedcccb908adda16dec52a5c9b -size 489285 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/explorer-correct.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/explorer-correct.png deleted file mode 100644 index 46d76723..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/explorer-correct.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c426df7280ee00da228b6ab9350b7cbd54c0099e8454470edd6fc9500e9eaee5 -size 70166 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/explorer-wrong.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/explorer-wrong.png deleted file mode 100644 index b2abf0a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/explorer-wrong.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:241870c0cb9c979e1051e62f25d7afae7a7b858010b6e93b2da6f0a4889ee07a -size 23551 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/select-speeder.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/select-speeder.png deleted file mode 100644 index 7513b0a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/select-speeder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8bcbf01479eaa7cbdbb5c6ea0f86a0e39c2b867d73c1e710821c8aaa876bb5e -size 335442 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/test-speeder.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/test-speeder.mp4 deleted file mode 100644 index c2970706..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-galactic-speedway/test-the-speeder/test-speeder.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d74dd8879c6710b299c65ba71883d61c3547f4440ea15af5d358a23bacf9a4f -size 13211358 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/addKeyframes.gif b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/addKeyframes.gif deleted file mode 100644 index 095ed5f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/addKeyframes.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc51dfbc1288ef8e172fba30292fff9e9eb4fefa7b262eb713a98bbf382bcab7 -size 163016 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi-tier2-showButtonSetup.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi-tier2-showButtonSetup.png deleted file mode 100644 index 5d9107a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi-tier2-showButtonSetup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10e72868d2c8c0f62575ed9c7137f678dfdf6e89d2e467c96de5d328bdba10b2 -size 7396 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_nav_button.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_nav_button.png deleted file mode 100644 index 83f909da..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_nav_button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa33d95e620118aa6b5e4e117f6f0eedcbe286ef03e4ed99cca673b48e6150cc -size 1006946 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickFrame2.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickFrame2.png deleted file mode 100644 index 31e49cb3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickFrame2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df6031b070ad4d9e84af04b1df0125539f01d477939ecccb66a1adab2405249c -size 10811 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickFrame3.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickFrame3.png deleted file mode 100644 index 9b1ff0a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickFrame3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a1cd9d5b6d4eebcd2b14e3437ac48cac67637f0cb887e6557e85fb54efffe2b -size 28045 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickLooping.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickLooping.png deleted file mode 100644 index a9691f6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickLooping.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0668a692ca0ded76b08e2dc0f56b6394b75c75f51fae41628b346fdb824f1b16 -size 9205 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickPlay.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickPlay.png deleted file mode 100644 index cb716a4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_clickPlay.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19631581f88acd6c0dc9271f20fe24fb82198202d320392a817951f7816a47c9 -size 9374 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_createRig_showRig.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_createRig_showRig.jpg deleted file mode 100644 index a5a94966..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_createRig_showRig.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d5ad2b80e45ce91602971e6207daa3fa71c8accd50419e567f8c637b2431ea7 -size 71165 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_lessonSamples_lesson1.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_lessonSamples_lesson1.jpg deleted file mode 100644 index 502ace5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_lessonSamples_lesson1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65feee77d0ec422b3e404ffe00a16cbe489f32d83a9b0d83c46ab375fd482f19 -size 46609 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_lessonSamples_lesson2alt.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_lessonSamples_lesson2alt.jpg deleted file mode 100644 index 395df79d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_lessonSamples_lesson2alt.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36478c87faad3c1f482f215511290ae7e8bca73cf0a743c4971876dbbcc66407 -size 47389 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_selectFirstFrame.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_selectFirstFrame.png deleted file mode 100644 index 74c4f46d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_selectFirstFrame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c51f9e5020ddb556bceb37ae431141c264257d2104e9ead7363c5dbea92e103f -size 28921 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_selectPartHierarchy.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_selectPartHierarchy.png deleted file mode 100644 index cf8e85b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_selectPartHierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7be3b042e022f5be03544b3406a65adb44929d8fbadddaa3d8757bf6935b7e3f -size 25011 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showExportedAnimation.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showExportedAnimation.png deleted file mode 100644 index 4cb2681f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showExportedAnimation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab6c27bae9fbc38c017bcecda86abf285b8b05886d3adbb18d76c10c37a8ca41 -size 8771 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showFrame3_front.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showFrame3_front.jpg deleted file mode 100644 index f8f644e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showFrame3_front.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8916f8770cf2247d0301a9dee6af5b90e8a5b41bbf86c1552eff8369667367f -size 34929 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showFrame3_side.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showFrame3_side.jpg deleted file mode 100644 index 78a4e94d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showFrame3_side.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00d0b3ca9543f12b23e819bff22cc656a4a98a718e842e9ea50ba3b887eafd28 -size 25253 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showLastFrames.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showLastFrames.png deleted file mode 100644 index ad542fd7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showLastFrames.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66fd1e00c526d3bb902fa178850e4033fed58cdd481e316d7d67420e8a35bc90 -size 6341 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showPartsFolder.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showPartsFolder.png deleted file mode 100644 index 7c971bc6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_showPartsFolder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cdd793a8769593773d8e4453f4400f065a83c5eb371501c1db77e3be7713492a -size 22818 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_touchedPartExamples_obby.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_touchedPartExamples_obby.jpg deleted file mode 100644 index 4306cc53..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_touchedPartExamples_obby.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02c2b5fd831ac75787391502fbd43f74e4ef244b548cbe28e007c5980152d505 -size 62250 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_touchedPartExamples_treasure.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_touchedPartExamples_treasure.jpg deleted file mode 100644 index f000ec24..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_t2_touchedPartExamples_treasure.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2de9ae1f7c360d1268d9a1af11e29bfc8e1ff3c3ba964363a3dbebc874ffc317 -size 109740 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_tier2_extension_gameThubmanil.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_tier2_extension_gameThubmanil.jpg deleted file mode 100644 index 37c56b6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_tier2_extension_gameThubmanil.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a3b97a33d0958f1c042402d5c7563d05cbcc822e3b0322bb8c1c4a9719bde25 -size 68256 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_tier2_extension_partSetup.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_tier2_extension_partSetup.jpg deleted file mode 100644 index 38981ed5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/bipi_tier2_extension_partSetup.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f09f172ff9a886f805b5863d1326f83264c47355a225917a5c81cb5cd0ac38af -size 100460 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_changeLength.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_changeLength.png deleted file mode 100644 index b4405996..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_changeLength.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:358264fdc858eb42a4d596ee8d5e316341908dc721e766cba3aba67b2d4bfd7b -size 40049 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_clickAEPlus.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_clickAEPlus.png deleted file mode 100644 index 18b2dfe0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_clickAEPlus.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6509655c10aaacef275d72eb6cca70006d0f55ec32d041d2254ed253807874d -size 40012 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_clickOptions.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_clickOptions.png deleted file mode 100644 index 10a595dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_clickOptions.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f838ea01427ad4172360c00f54aa2abe347169370b712537120e913503916c1 -size 7241 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_createAnimationName.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_createAnimationName.png deleted file mode 100644 index de777df3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_createAnimationName.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc3ce959384eb6a8d4d77f108f9a327ac0428895b00da6e0d2422dd514925750 -size 11416 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_exportedAnimationWeb_alt.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_exportedAnimationWeb_alt.png deleted file mode 100644 index 6113c533..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_exportedAnimationWeb_alt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:344d262c81fb8bc3909b0ad301f64cf5d174c2b1b1ddf5de1e470eea4e274143 -size 50240 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_01.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_01.jpg deleted file mode 100644 index fbf5c822..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_01.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a848d652e86060f5947a9ea1ab8c1a4b3773328ac8e157d6818fbc979f518797 -size 25936 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_2.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_2.jpg deleted file mode 100644 index 5bf93b83..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1e7178fcde98b69741373c2e707e4af1a9d4de937eafc38a73434f1690ec4aa -size 27313 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_3.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_3.jpg deleted file mode 100644 index 7b53243a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_jumpAnimationStills_3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0f873585671dc426f2e7a96af1f1c3b89bbbb51ad6dde26b968da14e8da0081 -size 29195 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_selectKeyframeExamples_selectAll.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_selectKeyframeExamples_selectAll.png deleted file mode 100644 index 656659db..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_selectKeyframeExamples_selectAll.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfabde020cec1f169f06d133211e93e22bd324a2d7440bf51a60c6a136dff1b1 -size 4906 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_selectKeyframeExamples_single.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_selectKeyframeExamples_single.png deleted file mode 100644 index 89ea7fec..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_selectKeyframeExamples_single.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c6d8548dca96682d3ed95a249a9a65803ab20937686a55150742693cfc9cf5b -size 4904 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_showDurationCurrent.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_showDurationCurrent.png deleted file mode 100644 index 3f6394ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/ccs2020_t2_showDurationCurrent.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12dad2c16f844e770dd86b06142680508e0c72850f2f2af947922c702a299c2b -size 33198 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/exampleProject_tweeningButtonDoor.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/exampleProject_tweeningButtonDoor.mp4 deleted file mode 100644 index c3dccab7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/exampleProject_tweeningButtonDoor.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d81440e4ba84031dac104c65a547049b09fc413720d1634c579f59e28d80ab6b -size 799802 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/exampleProject_tweeningPetRotate.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/exampleProject_tweeningPetRotate.mp4 deleted file mode 100644 index ba3cc705..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/exampleProject_tweeningPetRotate.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4e774226e071ab373b9c659528521d6b686d15c6687acd165d9d6d881fdc4fb -size 557624 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/example_allTweens.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/example_allTweens.mp4 deleted file mode 100644 index 6c4849f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/example_allTweens.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33a3607d1915118c48360bc12d42b12322cebca5d1aa111aaf84e3aa2fc1236e -size 4502210 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showAnimationIDScript.gif b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showAnimationIDScript.gif deleted file mode 100644 index 32311ebb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showAnimationIDScript.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96aebf33e19bac896db9d259de8103a8a36f939d9ad9cc5205271bb2f5be612b -size 103691 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showChangeFrameDifference_opt.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showChangeFrameDifference_opt.mp4 deleted file mode 100644 index 9e3c4c42..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showChangeFrameDifference_opt.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7aeea0dab22f141edb4bc4a02af19f0457f82b9365bedd872f4c0f059f3a0c67 -size 262190 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showFinalAnimation_singleAlt.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showFinalAnimation_singleAlt.mp4 deleted file mode 100644 index 715193fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showFinalAnimation_singleAlt.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a65e3c3240a5b016c635b5b661f2828d7945d6d3eed7e0435609373558c69dd -size 721836 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showFinalVictoryPose_simple.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showFinalVictoryPose_simple.mp4 deleted file mode 100644 index 1f024f9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showFinalVictoryPose_simple.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31964d5fd700ace0cc0623337499be659e2719ece88fa6efc3eda274e195b5df -size 451501 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showImprovedAnimationMoreFrames_improved_optimized.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showImprovedAnimationMoreFrames_improved_optimized.mp4 deleted file mode 100644 index 5438ccd5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showImprovedAnimationMoreFrames_improved_optimized.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fcfd19aa3b0395e7e6602f786bef42a2f37b27925cb2f494a38de374423a9190 -size 349080 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showMoveBody.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showMoveBody.mp4 deleted file mode 100644 index efc3dd79..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showMoveBody.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb7470d0968d6f94887dc6a74eae255250f41bb1098c81c1d79910a435498f1a -size 121563 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showNPCAnimationsFeedback_noFeedback.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showNPCAnimationsFeedback_noFeedback.mp4 deleted file mode 100644 index 451d402f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showNPCAnimationsFeedback_noFeedback.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69a25dcd9fc38c846b2b1eb4e95db8445421a27864d6255397ce5bb304576f28 -size 871670 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showNPCAnimationsFeedback_withFeedback.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showNPCAnimationsFeedback_withFeedback.mp4 deleted file mode 100644 index 88523e27..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showNPCAnimationsFeedback_withFeedback.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5b5a5d29127dedaa075a59e66604e975585840f4dde85316df271d243727026 -size 762953 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showOverallAnimationTimelapse_optimized.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showOverallAnimationTimelapse_optimized.mp4 deleted file mode 100644 index f3d5f409..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showOverallAnimationTimelapse_optimized.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:413f6f0706513d0a4a1231d722f59cfa1f125cfe882d47a53ad8d186c7bf1328 -size 1355981 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showPose2TimeLapse_optimized.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showPose2TimeLapse_optimized.mp4 deleted file mode 100644 index 1e653d99..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showPose2TimeLapse_optimized.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc3f3a4f90bd42ef3088a16b62678c91e618b0a0bf8e270e308e3261b4084ede -size 2541262 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showRotateArms_web.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showRotateArms_web.mp4 deleted file mode 100644 index 28c27f98..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showRotateArms_web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8aafa656b47751a1217acc9d54bec39a4f08c3a465fa7772a359edfe994e37f4 -size 207007 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showScaleTween.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showScaleTween.mp4 deleted file mode 100644 index ab0a8f7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showScaleTween.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80bb20e64820315cfffdb7c15ded7e7ee432635b31c51de1c3a336c6c1929c66 -size 3220106 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenColor.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenColor.mp4 deleted file mode 100644 index 1f6a8af3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenColor.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:702a61c6f1e9b14723f30aa15d85f13a6e151898b606bdbaa0b4948e4823a5ac -size 619954 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenMove_Wrong.gif b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenMove_Wrong.gif deleted file mode 100644 index befd7caf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenMove_Wrong.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99c3b952d5500d06fa544fa69594334faafafe7c46f0697205d43e0dd60c9c89 -size 130002 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenMove_correct.gif b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenMove_correct.gif deleted file mode 100644 index 8f181283..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/showTweenMove_correct.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb63c8bb06d9832de7a4b253f86c6163486ce324fcbdedf87a4589d8260b133f -size 137871 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/victoryPose_finalSingleObbyExample_web.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/victoryPose_finalSingleObbyExample_web.mp4 deleted file mode 100644 index 4c991a3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move-intermediate/victoryPose_finalSingleObbyExample_web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:566d4b45f1bcd22363619b0b2920fc132f153622bb44b3a29807072c72ed521a -size 1038921 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-new-models/show-new-assets.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-new-models/show-new-assets.jpeg deleted file mode 100644 index a9bc9b70..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-new-models/show-new-assets.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12d5811ad581516795a36cb09dff3be10f6506afa9d91f93bc0cda7631dfdd96 -size 181558 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/full-swim-animation.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/full-swim-animation.mp4 deleted file mode 100644 index e41291c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/full-swim-animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93cf013cbfbabdcd042ab6677fbc25648f88407cc60fd0de981846fd8c5e5949 -size 360022 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/press-loop-button.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/press-loop-button.png deleted file mode 100644 index a4c27781..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/press-loop-button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f742a6b580a10e6a63183b50ec7698924902b6784f0ba84263bf9beea5de2918 -size 22199 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/set-timeline-middle.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/set-timeline-middle.png deleted file mode 100644 index dff27312..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/set-timeline-middle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6952bf7f97e6bcf0ca4eb84e480045ed9fd5b7318f84afadf4af9276b110813e -size 15879 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/show-full-swim-animation.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/show-full-swim-animation.mp4 deleted file mode 100644 index 61080cb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/show-full-swim-animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fc7863656e8ef4f1837cf1385111dc134c4eba9b4f90115a93095d1a4d95545 -size 3126073 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/show-middle-timelapse.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/show-middle-timelapse.mp4 deleted file mode 100644 index 786c83d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/adding-the-second-pose/show-middle-timelapse.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37ab8e5218f783b273644336fb4f7e1fdde4743a02b119ad72bfc3b3a037dd09 -size 24815318 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-1.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-1.jpeg deleted file mode 100644 index 4b4c77e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8b4f5a77378d514978cad11dd881f26f94ec4b03f2b28157b0030e1d6de2389 -size 57579 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-2.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-2.jpeg deleted file mode 100644 index e11b3727..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf03e029d86fc5439484f55da1cfbe5f8bb6f2bc0431f7b2d71468c2f2d04111 -size 91417 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-3.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-3.jpeg deleted file mode 100644 index bbc5996d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/lesson-3.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5aa079596844afa0d7285e1fd7b0cee810ca10e0c9508c8982ba5af121c4f169 -size 68924 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/overview.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/overview.mp4 deleted file mode 100644 index aced90b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/overview.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7f53d98215c42fa5f9e58451260660c74cb3f72a0ea331086b53cfe319c394e -size 670672 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/show-game-hub.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/show-game-hub.jpeg deleted file mode 100644 index b29160cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/beginner-landing-page/show-game-hub.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2e57e86b98c3c4aa283b1491688f8bb31e79a2f291a1b30474043e17b8d87e0 -size 56152 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint-2/game-redeem-npc.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint-2/game-redeem-npc.jpeg deleted file mode 100644 index 7c9e5f1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint-2/game-redeem-npc.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25bedb5321985ff789952027379fc1f25467ee80694c368d640c85cbeb0f5fb3 -size 68584 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint-3/game-redeem-npc.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint-3/game-redeem-npc.jpeg deleted file mode 100644 index 7c9e5f1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint-3/game-redeem-npc.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25bedb5321985ff789952027379fc1f25467ee80694c368d640c85cbeb0f5fb3 -size 68584 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint/game-redeem-npc.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint/game-redeem-npc.jpeg deleted file mode 100644 index 3c85a733..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/challenge-checkpoint/game-redeem-npc.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:244f8f0ae0557133fa2f8f9dccc6895f150ad9626d0aa4c9e5a535517eb205a7 -size 95326 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/Animations-Button.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/Animations-Button.png deleted file mode 100644 index 7511f7ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/Animations-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b503958f4bfc252feb34e969addeb3dbcc69f344fa18aa17bdaa743b94c34c34 -size 33777 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/CopyAssetID.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/CopyAssetID.png deleted file mode 100644 index 7622267f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/CopyAssetID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7a6ad8fcad93a9c617db4709292af51d24fe37950c25797d74ceadc106d64a0 -size 26356 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/finished-animation.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/finished-animation.mp4 deleted file mode 100644 index ed4a723e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/finished-animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cff02cef45fc913134e47d46da2d0351925aefc9b622b78db263b8932d467cb -size 1851703 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/search-walk-select.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/search-walk-select.png deleted file mode 100644 index 4c217b65..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/search-walk-select.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9846275d1b5699609d846fa76b187e59a4f2a753dad9f5d89d6d1f9a02f449cd -size 15563 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/set-animation-value.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/set-animation-value.png deleted file mode 100644 index c177fc5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/change-the-animation/set-animation-value.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c56ea99a885c4a4d434b9b3b4f460b949512b23e799e2cb748ea21cf4e8d0cb -size 67075 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/click-upper-arm.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/click-upper-arm.mp4 deleted file mode 100644 index c6d5d1cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/click-upper-arm.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7355edcdf129e5dd65123fc88b3b35c840cd1b4c881d516ebd3f4d80117f15b3 -size 1236761 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-crouch.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-crouch.jpeg deleted file mode 100644 index befc360b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-crouch.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e62c0e479cf2ddaf9c7e55483173f573573f94042072946aba72cdb83b8a630 -size 39801 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-dance.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-dance.jpeg deleted file mode 100644 index 68939fd4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-dance.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dee73e1cd076455767fcf79c9a83a3bd26d2109ae2c4eeb79a385f31c6144cff -size 35905 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-swim.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-swim.jpeg deleted file mode 100644 index 02d17b82..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/example-swim.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ef971bc8bed099d35b505549470d195bb2fc5544d5614b4aa45bf3c63b5af69 -size 44222 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/rotate-upper-arm.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/rotate-upper-arm.mp4 deleted file mode 100644 index 906b9ec2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/rotate-upper-arm.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf248551c7e62f319f2d48788ce0a8acb515a6cec6cb05a0f4b68c9c8812f854 -size 3607211 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/timelapse-first-pose.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/timelapse-first-pose.mp4 deleted file mode 100644 index 02f82421..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/create-the-first-pose/timelapse-first-pose.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55c97f0dd22daf3a5e10b8d8197d029ee8172c5f65b6d12e0cc50107394ffc1a -size 24016393 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/AnimationExample.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/AnimationExample.mp4 deleted file mode 100644 index fe2e1087..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/AnimationExample.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a2847b8ccbd6afdffdcf72061995b3d6d10290c1190cc4b46c6cd7877fc196c -size 5449501 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/highlight-figure.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/highlight-figure.jpg deleted file mode 100644 index b51572d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/highlight-figure.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1cd08f3e939636b4ff8637c065dfef49be8e445cbd82af5c91be876bf660eab5 -size 149745 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/rig-selected.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/rig-selected.jpg deleted file mode 100644 index 2f18e7ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/rig-selected.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8679e8baf0d24884f9753411ddc9462fe9afc41c37cfee528db4706a03863796 -size 56672 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/show-animation-breakdown.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/show-animation-breakdown.mp4 deleted file mode 100644 index 97cd93fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/show-animation-breakdown.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92c8ab3673d9874116448ef0840277d0afe8f561050256478b12335b2fa8a00d -size 508589 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/show-move-camera.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/show-move-camera.mp4 deleted file mode 100644 index f3803425..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/creating-animations/show-move-camera.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a8cbdd68a91192d7474e7284abd39d9e985a1f20c75482e95b8eadacd834075 -size 5975736 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/exporting-animations/hero-banner.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/exporting-animations/hero-banner.jpeg deleted file mode 100644 index 8a6f7152..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/exporting-animations/hero-banner.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:381ffe99ba9cbe7be8cef107cf9fda34003a09de6de71ca961002613ccdcc621 -size 84335 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/adding-new-models.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/adding-new-models.png deleted file mode 100644 index 3f0a3a12..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/adding-new-models.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db4acd56594dfc3778ce6e07ab73e3100ae1e3b90816091c0923b8c6fc740c13 -size 238501 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/hero-banner.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/hero-banner.jpeg deleted file mode 100644 index 035fb584..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/hero-banner.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc9547ede6f35d7ddb0167e64c1179e0ef1047474e8017eb90770002d3c6c72b -size 137309 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/learn-coding.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/learn-coding.png deleted file mode 100644 index 9a342855..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/learn-coding.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20abd631d969b2f4a3fa628200e15599165bc61c8a8fafeec1a5fea11b9ff0ba -size 87414 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/personalize-the-game.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/personalize-the-game.png deleted file mode 100644 index 6633cead..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/personalize-the-game.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:943d638246151b11ac4e818bab7539e49d459128b72edcf97a255268be8be690 -size 193097 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/share-animations.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/share-animations.png deleted file mode 100644 index 9a0bfd5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/go-beyond-the-challenge/share-animations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81415f5911c1e68d8edd6ea18cb6888e24f7cefa5db438fb447320d45d02df6e -size 70288 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/invite-friends-to-play/hero-banner.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/invite-friends-to-play/hero-banner.jpeg deleted file mode 100644 index 3195e1ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/invite-friends-to-play/hero-banner.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6944cc7ff290cbf1f523cf001ae4982e38098dcf22308d4283ca280461e71852 -size 186016 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/Scrubber.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/Scrubber.png deleted file mode 100644 index 4da2873a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/Scrubber.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:616cb97bcda2436080d593390af7f7b8f76203d64882cb13742597edbc3eaeb8 -size 7689 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/Timeline.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/Timeline.png deleted file mode 100644 index 1495a7af..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/Timeline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccce4d0ff1ea0000454785fb87d5f580b82bac6023ae3c0d34c2a29fd8cc8e13 -size 8142 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/added-last-pose.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/added-last-pose.png deleted file mode 100644 index 0203db0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/added-last-pose.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff8a97ff91c01d62ad90a434c1989869c65a3a261ea6282d30130a281df8d19b -size 48153 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/change-duration-to-end.gif b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/change-duration-to-end.gif deleted file mode 100644 index 630d444b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/change-duration-to-end.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ef23d462aa284b2781db558bc8e9d231446eb44de2975c4247afc5a341bd86c -size 30939 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/select-first-pose-diamond.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/select-first-pose-diamond.png deleted file mode 100644 index 0271bbe4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/looping-animations/select-first-pose-diamond.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09d5807a65811788557f4927904d957cbfc240073dd03bb5fef39501dd7bb644 -size 59698 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/overview-game-progress.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/overview-game-progress.mp4 deleted file mode 100644 index 99ed5731..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/overview-game-progress.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1ee2af3f36630dc49ce95e7fa9069ae1924f973c992c18d6e8c2f3db891ed86 -size 2010139 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/show-template-pick.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/show-template-pick.png deleted file mode 100644 index aff3cf6a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/show-template-pick.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ea755d1c2e06411d4ba08373dc287f2190b5b6041d71641f608c2cc6dd00ea5 -size 9899 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/template-example.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/template-example.png deleted file mode 100644 index 125663c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/opening-the-template/template-example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b791cab48421b189ac610e257f0c6f1de046331bacc33fe91c2a2433415198a -size 4470511 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/atmosphere.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/atmosphere.jpeg deleted file mode 100644 index cabe2e0c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/atmosphere.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17f2b7a7da1d6e34c44c6c2cdc56c16cf8d615ba071272ee2ee3a195eef5b294 -size 14589 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/open-game-settings.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/open-game-settings.png deleted file mode 100644 index 78801a2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/open-game-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cca32d1a3ea59bea513b2eba40c6c2a89ae7ec552a1d82818480058e249d876 -size 5792 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/particle-effects.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/particle-effects.jpeg deleted file mode 100644 index f31c16c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/particle-effects.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:661b4f500318ba62cdfb0d4f37cd2d7e9c17f38a25289fc334d8016d2154a211 -size 42755 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-explorer.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-explorer.jpeg deleted file mode 100644 index f13a2848..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-explorer.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:627df0aab4a2297a76e7ffac07e570683efcfeeeab0f00a7c4bba4c7f4934756 -size 124168 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-rename-after.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-rename-after.jpeg deleted file mode 100644 index 19bc4bd7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-rename-after.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0dfbca31777145266b42c43f597466d591c45d09389beb28eb184352d1bf3a82 -size 115624 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-rename-before.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-rename-before.jpeg deleted file mode 100644 index 5170ecb4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/show-rename-before.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bc38a3ef243cd583352dc1c2b0690e98d0263f9c8f0b550ec7bafd60af06b13 -size 109556 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/terrain.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/terrain.jpeg deleted file mode 100644 index c04d2b32..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/personalize-the-game/terrain.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8a1a762107a90a744aea2220315b4c296443f331f0457a056eb5d9cc7d005db -size 53685 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/publish-animations/Publish-Highlight.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/publish-animations/Publish-Highlight.png deleted file mode 100644 index 65a618b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/publish-animations/Publish-Highlight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edfdf432e9a17cf0dbb72e53d7769f7c139027b78cbbd6ffb7d695787f8208f7 -size 28920 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/publish-animations/publish-copy-id.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/publish-animations/publish-copy-id.png deleted file mode 100644 index feb48303..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/publish-animations/publish-copy-id.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac464430b98acc3ca69092aa08d6a255b0df130a8607c43f311f8cf80f9ddf35 -size 26940 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/save-and-publish/hero-banner.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/save-and-publish/hero-banner.jpeg deleted file mode 100644 index ee0195bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/save-and-publish/hero-banner.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c86b29124aec16ea33ef5b133311551e355a660d6f6c57067ac7b0c480ad8fc -size 140767 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/save-and-publish/save-animation.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/save-and-publish/save-animation.png deleted file mode 100644 index 9955a7c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/save-and-publish/save-animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d72b310d54ad33f992eb04768b2d7a4894b6355590243a46f9da443ffd862695 -size 19118 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/animation-keyframe.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/animation-keyframe.png deleted file mode 100644 index 76d94275..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/animation-keyframe.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26fe35b0f725b9d68b0590693795b29d3b42e87df9f03234f149a02d1188369b -size 5708 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/click-options.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/click-options.png deleted file mode 100644 index 9c39eb2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/click-options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0095b186b0fd4353b6b61bff88c575a78e3fcc89ed913361619d7b262b037d09 -size 6608 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/hero-banner.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/hero-banner.png deleted file mode 100644 index f828c83d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/hero-banner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1028eaa561022ca3c2d22e4b5d927f344b43b9e92bdf2c92deda00204b195a04 -size 309043 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/select-animation-saves.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/select-animation-saves.png deleted file mode 100644 index 15b0cd0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/select-animation-saves.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e51039f16fc7d2bc66ec445618ad5b7ca5e9e38c3a8eef840b036052fa300103 -size 20722 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/select-animation.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/select-animation.png deleted file mode 100644 index 140902fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/sharing-animations/select-animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f237b40bee7fa71d5c44f80e27640ed8f48c453b1c289fc7014c7c25a03ecb97 -size 16799 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-game-button.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-game-button.mp4 deleted file mode 100644 index 63848129..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-game-button.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:863268123275ed6fda21522829b4785b88b794fdd812552b3f3fae8082831548 -size 502609 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-npc.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-npc.png deleted file mode 100644 index 727b33d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-npc.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86003219a5705133bda5c4dd0eb9f64e0a3be89d8c0841d7a29b20cb6b3f65eb -size 2167541 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-play-game.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-play-game.jpeg deleted file mode 100644 index c1291102..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-island-of-move/test-the-game/click-play-game.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cf85b57c8b1f9c3c2a2ea0dfd1dea9366517bd2353a7c0b2755e5e1cc9ba6e3 -size 56722 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-events.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-events.png deleted file mode 100644 index 44e51384..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-events.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09171e3d42ef8e109ac236c05d67d7da30c93acdefcc0080c25fab42fdf2f7b5 -size 13671 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-particles-folder.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-particles-folder.png deleted file mode 100644 index 3ce59da2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-particles-folder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7af94e57d9025f85e96a918dce2cd8f82845f95e9d3e2e0e7ff19f90e46667a -size 10956 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-manager.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-manager.png deleted file mode 100644 index cbc8d6e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-manager.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c813e09e4905a76085acbb101248486567d86fe155101d252b4022793d222685 -size 18532 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-particles.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-particles.png deleted file mode 100644 index c42f1f97..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-particles.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43073322d104d6a944069e4d15213a78c22c73c4d36201e994fc3cf4d02fa94c -size 10105 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-script.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-script.png deleted file mode 100644 index 3be2b6e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/create-tutorial-script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04bd1c1f96c3333f4d4bc48dbe68dec2d381c92dfbc1137f9b9fa64717b68174 -size 12320 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/delete-test-player.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/delete-test-player.mp4 deleted file mode 100644 index df20959a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/delete-test-player.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c560aca64e1faf7fa219023824f2e54704d09dcc0ba92821df2076f7f49e263 -size 191643 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/final-example-2.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/final-example-2.mp4 deleted file mode 100644 index 7c1f0fc0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/final-example-2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aeb6b038a84fe0061e829e2aa68d4b7dd433a27e91e014e329198783686ae00d -size 2811771 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/final-example.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/final-example.mp4 deleted file mode 100644 index 7c1f0fc0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/final-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aeb6b038a84fe0061e829e2aa68d4b7dd433a27e91e014e329198783686ae00d -size 2811771 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/move-tutorial-beam.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/move-tutorial-beam.png deleted file mode 100644 index 6526d336..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/adding-scripts/move-tutorial-beam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1942b80657691fb8e9a006effcc2fb63970cc2ce13371121db83dae542b4c782 -size 11640 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/game-example.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/game-example.mp4 deleted file mode 100644 index 114cbb6c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/game-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bcf8a785a88747dd90a7884fe9c87c9cd5f44c0b3a6031f8d6cec2ad676cd255 -size 1267040 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/template-overview.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/template-overview.jpeg deleted file mode 100644 index 5cf00e80..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/template-overview.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00fba983223554549b00b145c27c55b4f548d973ee2add37e56db20af7e58cfc -size 136838 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/template-overview.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/template-overview.png deleted file mode 100644 index 083dba3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/become-an-artist/template-overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0c1d4d60b7efdcdf2d6eaa3595312fa1fb9e39cfed4d15cd37395d90e8412c8 -size 3764710 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/beginner-avatar-items.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/beginner-avatar-items.jpeg deleted file mode 100644 index 6190dcd2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/beginner-avatar-items.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1df7ba9b0dd2f700bcdea656f54797e840b4310d2c8bc4e7400aaef67e3f6697 -size 84479 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-1-thumbnail.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-1-thumbnail.jpeg deleted file mode 100644 index 239a1c1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-1-thumbnail.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf7c3dda02a7caf6bb5d276cfb06bc2ffe2e570d562103f101201b28b56b5f33 -size 88316 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-2-thumbnail.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-2-thumbnail.jpeg deleted file mode 100644 index 9d4c4267..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-2-thumbnail.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:471de5b33f0773cd84701dbaab74336f229abde95d11e8fee5af149f9f7dd869 -size 66162 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-3-thumbnail.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-3-thumbnail.jpeg deleted file mode 100644 index 16d916c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/lesson-3-thumbnail.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c00a8d51404fff1289514f019c830d36fb4b6076cfe0550b8f941ac5674e363d -size 77264 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/trailer.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/trailer.mp4 deleted file mode 100644 index eb24ef7e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/beginner-landing-page/trailer.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26ea9b61705e548d92ba3c0c1f6016aaaa09ad08e3065ad0aa1d1b9115fdb2bd -size 3259208 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2/avatar-items.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2/avatar-items.jpeg deleted file mode 100644 index 87448f9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2/avatar-items.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37c95cbf22884e5a8489338f4915d1672a0b06032b20534e0f852bb6125ca49a -size 116579 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2/prize-avatar.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2/prize-avatar.jpeg deleted file mode 100644 index c5f36158..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-2/prize-avatar.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89f012763dc39d86c2e462fc29cedd9d900fe0b3913a01fb3cb7976894025b35 -size 105334 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3/avatar-items.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3/avatar-items.jpeg deleted file mode 100644 index 29b1e495..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3/avatar-items.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e35aca4777dd3d279d64ee94d2bdb28dac799133708f0149f1f5551e9ce05220 -size 120576 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3/prize-avatar.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3/prize-avatar.jpeg deleted file mode 100644 index c5f36158..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint-3/prize-avatar.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89f012763dc39d86c2e462fc29cedd9d900fe0b3913a01fb3cb7976894025b35 -size 105334 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/avatar-items-hero.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/avatar-items-hero.jpeg deleted file mode 100644 index 424e663d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/avatar-items-hero.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6db3ef51a69e334dd659384a901de6dc693f328885bfe310f8894719d2df4dac -size 111012 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/prize-avatar.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/prize-avatar.jpeg deleted file mode 100644 index c5f36158..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/prize-avatar.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89f012763dc39d86c2e462fc29cedd9d900fe0b3913a01fb3cb7976894025b35 -size 105334 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/prize-avatar.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/prize-avatar.png deleted file mode 100644 index af2e1bad..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/challenge-checkpoint/prize-avatar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f488f5b14865695dfeb3927ace12101293fb8144d5998dd169db36c67015ebb8 -size 2211852 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/attachment0-to-player.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/attachment0-to-player.mp4 deleted file mode 100644 index 32261bf2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/attachment0-to-player.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a9dd907fe63a05496cae0bcf3f6402e528b7bd3d794d718141585c3ccdccc4e -size 430378 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/beam-texture-change.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/beam-texture-change.mp4 deleted file mode 100644 index e93c62ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/beam-texture-change.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31ac7a2e8ae3dc3408f99a75e6531d1070a817a829184684eb3f90f1c94d74ec -size 733311 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/default-beam.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/default-beam.png deleted file mode 100644 index aa955cb4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/default-beam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79fbbc1a34dbc3f82e62e162cba067aef0302978e5f394f756e24b18675c4154 -size 431696 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/face-camera-off.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/face-camera-off.jpeg deleted file mode 100644 index 49f546d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/face-camera-off.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64f6085b2243afe3a8e791d3c167c3db4be0f0d5532ee4dd860aa83ab8a9cc6d -size 25325 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/face-camera-on.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/face-camera-on.jpeg deleted file mode 100644 index 75a14a88..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/face-camera-on.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:869fff1bdeeaa599922f2deccf206c6a209156f2aaca30b4a7ae408d9817d812 -size 37940 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/finished-beam-example.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/finished-beam-example.mp4 deleted file mode 100644 index 5464e68c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/finished-beam-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a79830d45d5e430def3ccefbc240831073638eecc31277f3961ea1df1cd619e4 -size 1151279 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-face-camera.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-face-camera.png deleted file mode 100644 index b0140bab..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-face-camera.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41e7568d984110547c4afe1b41be30b252e34e227b6c378684e185f6b7aabbd8 -size 10843 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-goal-attachment.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-goal-attachment.png deleted file mode 100644 index e1a06f7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-goal-attachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e784ecd95316bfcbc1b88d40fcaedc2b2bb6b9e062bb504d646e398be538658 -size 12631 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-texture-mode.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-texture-mode.png deleted file mode 100644 index 274e4f44..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/set-texture-mode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b852ba825e1da1ad521a83e613484d35fc0a5d827895db4e14bd107588b645f4 -size 2397 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/show-static-beam.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/show-static-beam.png deleted file mode 100644 index 5caf0928..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/connect-the-beam/show-static-beam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb2a3fa3be312ac24bb052107c39b43053c858ec5bf02fd8921fcfbaa0cf24fb -size 558277 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/add-delete-colors.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/add-delete-colors.mp4 deleted file mode 100644 index ed14a50c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/add-delete-colors.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3851a1abcb6d8083b064cf84a8d1b928dd1b3d95d0148bd94c7a488d118f050 -size 192974 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/avatar-items.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/avatar-items.jpeg deleted file mode 100644 index 1325f7a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/avatar-items.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23e9983add0802a440a243725e3f5bcc653fb9f176caaeeaeaba0df36dedfa4a -size 106218 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/click-sparkler-particles.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/click-sparkler-particles.mp4 deleted file mode 100644 index b8585670..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/click-sparkler-particles.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a048cbf9ac531abae74795cb76a4ee829c473a1ed5623b91404a11610a8180a -size 170242 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/cut-staff.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/cut-staff.mp4 deleted file mode 100644 index 0527101a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/cut-staff.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73fae947a191c0ec76f91ce2d9c48dad42f4565984bc3686252cc1bef4e12298 -size 174979 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-example.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-example.jpeg deleted file mode 100644 index ec90fbb3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-example.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e004d9bb16f17680f72d247d0697440d1d9f174a8a890dd65b9619eb5cacc865 -size 144917 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-example.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-example.mp4 deleted file mode 100644 index 6e9e2bda..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:233f3d4e67d944f3c9ad15c9c358a89619cc8b9aa635ff900a2f732c9a05a7d1 -size 3094570 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-staff.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-staff.mp4 deleted file mode 100644 index f18b79b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/final-staff.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15a1736cd9dc831d1f16b22329836e8f6a809ef8116dba529f095164d49f3564 -size 2144068 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/move-colors.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/move-colors.mp4 deleted file mode 100644 index 75bf702e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/move-colors.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adb8f27049a6c33d595cd769bb06429061c0b6e3add3c1b855f075ea62cf01bb -size 3354489 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/non-selected-arrow.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/non-selected-arrow.png deleted file mode 100644 index 6178971b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/non-selected-arrow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ade8299c79fc4c6bce551dab9ada5f1434a326d157e7ee52f812004d3114b82b -size 12053 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/paste-staff.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/paste-staff.mp4 deleted file mode 100644 index 0bf7c18b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/paste-staff.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:480ef7a5ec8adea0c9e7d170a82b7bfe08052993b167d53b876de935fa7e7fd5 -size 196844 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/select-color-property.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/select-color-property.png deleted file mode 100644 index 7a5294c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/select-color-property.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31fca60734807ee75646290b8dd2bb3207f6124e378cb6c99323ca36e4391d43 -size 29768 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/select-color.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/select-color.png deleted file mode 100644 index 6178971b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/select-color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ade8299c79fc4c6bce551dab9ada5f1434a326d157e7ee52f812004d3114b82b -size 12053 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/show-sparklers.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/show-sparklers.jpeg deleted file mode 100644 index 7cc1844a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/show-sparklers.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dce204393196a29c3941b95c3fbda3bb9f5ad6082e5421b0a215778495a30156 -size 38359 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/show-texture.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/show-texture.jpeg deleted file mode 100644 index 0801acb5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-a-sparkler/show-texture.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1447b8bd1003023b0a2c7202affb73abcc179803c4ae201a2b8b96f5ba3218e7 -size 134329 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/beam-example.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/beam-example.mp4 deleted file mode 100644 index 63167956..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/beam-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e998e5beec66b3f3693b6588667bfb9d5021890d0717bb0112c523eab7b52e53 -size 331175 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-beam.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-beam.png deleted file mode 100644 index 5161de1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-beam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cc9c06de00920f490d46de6113d29d062d248e4f8e9a2ccb0969c1c964cfed2 -size 19012 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-goal-attachments.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-goal-attachments.png deleted file mode 100644 index 0b7e7df5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-goal-attachments.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed1febb5152b384100a4e800624257a846d05b3068e530880f3e8d12ca8d602a -size 28223 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-player-attachment.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-player-attachment.png deleted file mode 100644 index 2bc3b3ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/create-player-attachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5ce0586ee560e50ab9e85450bab17ea37a71c342b9484253c2eaf1796205ac9 -size 17685 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/edit-place.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/edit-place.png deleted file mode 100644 index 907efffa..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/edit-place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:257b39c2183973476b1d954bcd06de759d050810abb0a09a2d25481f9db4e94c -size 67511 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/open-template.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/open-template.jpeg deleted file mode 100644 index 1516f7f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/open-template.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bc32d4717a5c641a1c262f942176344c3ca735175d9c6d9e7bf969f400570e9 -size 172143 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/open-template.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/open-template.jpg deleted file mode 100644 index 40a324c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/open-template.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4bc7e8af587978cb98d51ea4e09bdd60910060317a227669c0e0c59e51e4d6d -size 232968 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/template-overview.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/template-overview.jpeg deleted file mode 100644 index adb0fb81..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/template-overview.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e22c8e8ecbb023e1f0cafc24b4165b5744e45e69f6f294a47f387e0d5ebecf3 -size 113046 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/ux-example-bad.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/ux-example-bad.jpeg deleted file mode 100644 index e5d46061..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/ux-example-bad.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddc66645192578c8918fe7dedf01edcdbb874f9882795539a691396e8122cb4e -size 89090 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/ux-example-good.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/ux-example-good.jpeg deleted file mode 100644 index d09a9737..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/creating-engaging-experiences/ux-example-good.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e717a08ac36c0c2ba3f11bd26b8327efbe77e5ac05f2cb97b9525777ed9e9015 -size 79892 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/experienced-landing-page/example-full-game.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/experienced-landing-page/example-full-game.mp4 deleted file mode 100644 index e61d8a2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/experienced-landing-page/example-full-game.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63652b823f288e19c96f210cfbf4a0990bfb240c65f2c51b34a2f3db861e4324 -size 4030214 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/change-size-example.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/change-size-example.jpeg deleted file mode 100644 index 66b40e52..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/change-size-example.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:278dcc7d0649571cc4646e681384245d6a8f36ea5532f59432b17143faafd89a -size 68676 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/change-size.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/change-size.png deleted file mode 100644 index 6b07357c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/change-size.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d301c9cf779998e0533f6f15becda022809457120b1f03ce8e7cf779bf6688a3 -size 3674 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/locked-to-part.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/locked-to-part.mp4 deleted file mode 100644 index fd2385e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/locked-to-part.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7d6e33fc34826de001d8a790434015e95665ab470e26eda199019b987808960 -size 714727 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/set-locked-to-part.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/set-locked-to-part.png deleted file mode 100644 index a31e680d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/set-locked-to-part.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01858b138e874a5076cfca2b786fa9b8bf981332e6a2c4c94e10a95fa6a45459 -size 2409 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/show-shot-color.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/show-shot-color.mp4 deleted file mode 100644 index 7eb598f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/finish-the-blast/show-shot-color.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5f0194c22f7acc7cb0cefca0ea11939c68ae9ae65cbb6f11bc06785224c3f94 -size 359709 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/invite-friends/hero-image.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/invite-friends/hero-image.jpeg deleted file mode 100644 index 9091d93a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/invite-friends/hero-image.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2823b6788f337e35b29a4eb27425768155e5b8c008823d4addc0400e76b5dd7b -size 256429 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/beginner.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/beginner.jpeg deleted file mode 100644 index 82f3b717..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/beginner.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a4a896310966a23aecff895156444f69d884ed0a44242f199f1c41dfc30bdbf -size 92725 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/experienced.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/experienced.jpeg deleted file mode 100644 index f2451e3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/experienced.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33315a31b2013e7eb574c8211247a1569c63d4d2add3ec68d7ce1160fc2ba6ee -size 88451 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/header.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/header.jpeg deleted file mode 100644 index f7af4f89..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/header.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:282717f1f0b2b5016740afcadbfb09727ff4a8bd80c028f1890a64a97f0a1570 -size 300194 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/prizes-beginner.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/prizes-beginner.png deleted file mode 100644 index 42677c09..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/prizes-beginner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:988215e29b455312e29c565c7eefa78c236086af90ad07e6d8040e7941ec370d -size 117803 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/prizes-experienced.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/prizes-experienced.png deleted file mode 100644 index 2dc223fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/landing-page/prizes-experienced.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce9c98d0f2599d1f52299208114a8aee958f6c8dafe9055acb954667996097f7 -size 45748 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/change-explode-size.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/change-explode-size.png deleted file mode 100644 index a318d9b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/change-explode-size.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a89942ccd5210fb221148b9eae846208db190efa2296962ed7156a212c0b0097 -size 21700 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/change-speed.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/change-speed.png deleted file mode 100644 index 05ac749b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/change-speed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a173d90ec43c71692dfd32f0bb709d51022497cac5e2d49ef7e3e830877e71f6 -size 19464 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/explosion-final.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/explosion-final.mp4 deleted file mode 100644 index 4da3fde8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/explosion-final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2187a0b2b6caeaf43fcdda4290cdcd0a3ed20120c5ed9d3f64a0b2cc4a5e5e56 -size 7047583 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/lifetime-new.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/lifetime-new.mp4 deleted file mode 100644 index e1209ad5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/lifetime-new.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:524c446642023669265a0daa8762458227cf58cdad3a29b9f8f22cf3b93baa78 -size 2783214 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/lifetime.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/lifetime.mp4 deleted file mode 100644 index 7d3979f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/lifetime.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71b4d8a430231de697f006299b6d561250fa77ab609f1433908f10e122adf8b4 -size 909037 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-0.5.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-0.5.jpeg deleted file mode 100644 index 031938e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-0.5.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb88e97697b02b6363250dc4e51efa41d9be71abd1f15085bcded7f9edd624d1 -size 85562 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-0.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-0.jpeg deleted file mode 100644 index 4e8b01db..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-0.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e783d13b717b98ce1a3d2f99a6de40f33cde13e32d28016c94ebc9e003d2ad05 -size 88477 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-1.0.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-1.0.jpeg deleted file mode 100644 index 31f236f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/light-emission-1.0.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a4c1d826aa490df4ef643ed206a79ec7c255f0e65ce603cca3b4838264da4e7 -size 69851 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/newsizecomparison.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/newsizecomparison.mp4 deleted file mode 100644 index a3de1100..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/newsizecomparison.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1aebe5fb6b4b7cdf326fae9d5077d865caf620756dbed0d2a32c073a10d6033 -size 5859784 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/rotation-speed-new.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/rotation-speed-new.mp4 deleted file mode 100644 index 91285ebd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/rotation-speed-new.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aeba3b71a424cad625cb2777b8bf8583dbc0831a2150d357300ef5d8942838b9 -size 2046778 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/rotation-speed.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/rotation-speed.mp4 deleted file mode 100644 index ae181cf3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/rotation-speed.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35490ff9ca93b9b8711dba08b2fcabbb1a7f99e08243a70b2231d0bc46633e09 -size 610533 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/show-random-options.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/show-random-options.png deleted file mode 100644 index aafa9adf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/show-random-options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd05615bee9b37624e4f619a31f78e371622bbe148deeb48a00579b260107a8d -size 25389 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/size-comparison.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/size-comparison.mp4 deleted file mode 100644 index c2ca02cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/size-comparison.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93be76baf4aed82652bd5b9b14e5358e360e745391002b71cd41ffe66b0ac331 -size 4307152 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/size-comparison_1.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/size-comparison_1.mp4 deleted file mode 100644 index bf4967f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/make-final-touches/size-comparison_1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:343051afb19177d67e5dd5e87f5ac611ee42e48a03b59da658a05d154cab3702 -size 6332547 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explode-color.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explode-color.png deleted file mode 100644 index c904e371..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explode-color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b494fa952a7be9bd0e6cf3949588394c0c8aa12e4dfe1269f9f03827cff36491 -size 21347 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explode-texture.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explode-texture.png deleted file mode 100644 index 090b9b45..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explode-texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1817acc0e37efa4bb394c53b380f73b268eeacda720921e8454eab261ac6c73 -size 22277 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explosion-color-texture.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explosion-color-texture.mp4 deleted file mode 100644 index 9a4bf6f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/explosion-color-texture.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4f7c6ad2fb2831dbcac10774907c1c027f41bf20a16ce0d685a63fe834f587a -size 2728833 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/final-shot-example.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/final-shot-example.mp4 deleted file mode 100644 index 5b4274df..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/final-shot-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c580f29c80eef37b865ca6de83a1da0eaad2256db9abaf64c12d35e1d22402d6 -size 823866 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/search-explosion.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/search-explosion.png deleted file mode 100644 index b0b83320..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/making-an-explosion/search-explosion.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48f7d6ab3bb82a87a9e33cc2361be787ce52854d7a6793e312524161cfdd3254 -size 13905 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps-advanced/hero-image.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps-advanced/hero-image.jpeg deleted file mode 100644 index 9128e507..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps-advanced/hero-image.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2143d8a7a014da6efa5b8940b4fb06a7ba2e9709f33359744e915ae48f097f24 -size 140005 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/extension-cards-sparkler.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/extension-cards-sparkler.jpeg deleted file mode 100644 index 24a3f0e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/extension-cards-sparkler.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cdb39d2bf8bc4c9c80b45733d26cd237de372013ce0565f79729bec4fab9b42 -size 27077 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/hero-final.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/hero-final.jpeg deleted file mode 100644 index 92db875c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/hero-final.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7e8b67325230bb81221e194541481169e90d674c85e1d835afda53c717df944 -size 185200 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/terrain.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/terrain.jpeg deleted file mode 100644 index 7ea1e843..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/next-steps/terrain.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e725ef8c5eef448ec32bc95a16ee825822a2f10be21f1c5410626dff5a975998 -size 27907 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Fire-Video.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Fire-Video.mp4 deleted file mode 100644 index ccec38bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Fire-Video.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fba774e2bf31dcb9d98a6b71eab9e71f5799d22a16a93afb379390ed730a538b -size 749542 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Portal-Video.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Portal-Video.mp4 deleted file mode 100644 index 2142ea79..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Portal-Video.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b788d83c7a15d7b3ec4dcb20ea52133dbd07ad18422164b98d71380b7174ef5b -size 1203849 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Rock-Video.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Rock-Video.mp4 deleted file mode 100644 index 22b663c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Rock-Video.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ff62b430df6422ca4d363e17c03a3db344d2b89c6710642cd8212d0de15d7f5 -size 307913 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Short-Arrow-Down.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Short-Arrow-Down.png deleted file mode 100644 index 1ff194d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/Short-Arrow-Down.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3ce9d267d1620efe3f55a2136d6966e03ea351abd9a3a504b4eff7e29314717 -size 1221 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-example.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-example.mp4 deleted file mode 100644 index 6c10baad..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13f6c1eb0e22da8554d3b4bd778c633e6521e1a26f122ec20afe155994062599 -size 625188 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-flame.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-flame.png deleted file mode 100644 index 4f553283..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-flame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:886e1333c20ea3a39717a706a6e015ecaab66453b2bda509d6c9d9f91a33bc67 -size 115177 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-holder.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-holder.png deleted file mode 100644 index afa9f5e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-holder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27eeda6147143e03bbf9499923e43a3a78a4ba6d18e1776f782378b9e757bc63 -size 1346380 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-portal.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-portal.png deleted file mode 100644 index 49202336..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-portal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23bfa20482ef7299de2d833a6e7959c12c077899842e240cbaa72d8110c5e8f9 -size 50769 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-star.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-star.png deleted file mode 100644 index 603d68b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/particle-star.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f73f3293b8071bfff37b45a4476b24608a615a5b34c3fea8f14f2cd647e4fd4a -size 29545 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-blaster-shot.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-blaster-shot.mp4 deleted file mode 100644 index 9c9caae5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-blaster-shot.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9845dbdeab9b9f570aad428831ff7c3363223e7db4a009ff4306bbfa9f39233d -size 265807 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-blaster-shot.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-blaster-shot.png deleted file mode 100644 index 6533c120..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-blaster-shot.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0175c808576372b2f2309f41b0c8f0ea84e1eda47db881fef50e7465d970d9cd -size 34132 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-color.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-color.png deleted file mode 100644 index fbca7f3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:613e839102f335dfe53ff3951c5e300c67d261ada0ff0c37fa81af81083f8250 -size 27213 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-explosion.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-explosion.png deleted file mode 100644 index 0c80b8d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/select-explosion.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f9140cfffcc62f1f512dc552964d09ade239ed341af69796c755a7f7ddb4d90 -size 13515 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/set-color.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/set-color.png deleted file mode 100644 index f3009e1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/set-color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd24b0de1f87f838f97f2303576c120502d82bfb51b68c84c36eccd734142d93 -size 2377 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/show-color-change.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/show-color-change.jpeg deleted file mode 100644 index f07fc19e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/show-color-change.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:486d2963ab4d8c8af0423f94e881b55557c612d4137273a1625adaded32c5116 -size 54628 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/show-color-change.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/show-color-change.png deleted file mode 100644 index 2005abf7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/particle-emitters/show-color-change.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:907f059b40a75020adb18a95a3c2289fba9458455d399b3f283ef29bc5109cee -size 127981 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/test-and-play/game-health.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/test-and-play/game-health.png deleted file mode 100644 index ac30864f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/test-and-play/game-health.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9acbb8c838ad1fbdf63af8f56d1d42fb5b5db17a7b8349e07e47078629dfaeac -size 1016571 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/test-and-play/start-game.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/test-and-play/start-game.png deleted file mode 100644 index a43b8a21..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/test-and-play/start-game.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edd21dd92ddab1ffecedaf5858c10bd34dd43a4b1e0defdf8c851456a9ff0f19 -size 1229546 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/before-after-particle-settings.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/before-after-particle-settings.mp4 deleted file mode 100644 index 5c525de1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/before-after-particle-settings.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b20c6a57d4b34e9221728c45c5651cd3b96be2f93f69956fdb6fd91518d7a44 -size 1577405 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/create-particle-emitter.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/create-particle-emitter.png deleted file mode 100644 index da3d0be4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/create-particle-emitter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a66623c0cad7b9357c8998f0f3981f5b3fc9785247b163cc9f1d675e870a09e -size 19755 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/default-particle-stream.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/default-particle-stream.jpg deleted file mode 100644 index fa554ae1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/default-particle-stream.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0de57475eea8857b906eb441ee157c259afd2722ea0a2fc6eed2260ce1d2bdf -size 44914 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/energy.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/energy.png deleted file mode 100644 index 7dd699ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/energy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5606400fa273414b1ab6ae4f3a43499b35aece925a880a177534266b2d556a0 -size 17363 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/gem.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/gem.png deleted file mode 100644 index 96f268d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/gem.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51fb2b5af901f6790315ad81f00a6260853e940bd2efc38aea3e49bb38c00abb -size 28919 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/heart.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/heart.png deleted file mode 100644 index ad05a16b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/heart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:091f2d18739062bb3941f7fec66c68957f011a29db6c64836993f88f45ee40d3 -size 7154 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/leaf.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/leaf.png deleted file mode 100644 index 0e9f48a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/leaf.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbb0ae0cb42f03089b2d2d42e51f0a2c98d32e99ac740dea5226910dfa4359c7 -size 23023 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/particle-interaction.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/particle-interaction.mp4 deleted file mode 100644 index cdb64886..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/particle-interaction.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81fae6626e33b629478fa0f10497036397527137a38a011063755e8165bbd01e -size 414841 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/paw.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/paw.png deleted file mode 100644 index bc4483c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/paw.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44337faf54a2de7643cce38916c910a3c62dc63968195d0526c610c5a1c9ba75 -size 18774 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/potion.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/potion.png deleted file mode 100644 index 9d1cff08..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/potion.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a6d47e9e284b273b953b2331bc82b8246c473c2d9d5b09cbd809ff9fe5d9ea4 -size 17249 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/set-enabled-off.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/set-enabled-off.png deleted file mode 100644 index 60716d03..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/set-enabled-off.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4c97c1d8fc46a47c0d1d0b3ec51e41e94a785787c782480078a8c72898c43c9 -size 14294 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/show-particle-texture.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/show-particle-texture.jpg deleted file mode 100644 index d9c5fba5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/show-particle-texture.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9cb46fd8e7f092beaae8ca7541de51496581299d7b43d13eb7dcea69c982694 -size 50064 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/show-texture-color-size.jpg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/show-texture-color-size.jpg deleted file mode 100644 index de0568c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/show-texture-color-size.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cac86e01ae257d45ac0bccb13616ca3c093c63aa089a94b84a6b867ed315970 -size 55628 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/spread-angle.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/spread-angle.mp4 deleted file mode 100644 index 112c88ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/spread-angle.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51abeac8ddaede10eb18b439b4f8f2f6eaf9431b7b1f5128a22e8d4a4e274afb -size 2330368 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/star.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/star.png deleted file mode 100644 index 568fb0e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/star.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:243c220445c3d3ffe90e55ab005627ebd61f988b8d536253528429d144c7d796 -size 19960 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/ticket.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/ticket.png deleted file mode 100644 index 2554fd95..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-particles-for-actions/ticket.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0ac7c789ecb798d98b56fa47cf02234af5460922dbd0c8465072592772218e5 -size 19055 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/circle-2.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/circle-2.png deleted file mode 100644 index 17f70191..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/circle-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50705e3c2593cd222ddf2f6e509154d1663a67c34c151e69929f36530b043c50 -size 32710 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/circle.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/circle.png deleted file mode 100644 index 85694699..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/circle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40cfac8b46552f8936b6ca6522b22464a29cc04770fa50064fe17ce6d778c75c -size 27097 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/heart.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/heart.png deleted file mode 100644 index ad05a16b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/heart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:091f2d18739062bb3941f7fec66c68957f011a29db6c64836993f88f45ee40d3 -size 7154 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/particle-texture-example.mp4 b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/particle-texture-example.mp4 deleted file mode 100644 index 20ef6cf0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/particle-texture-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1ddd15ab730a4fa93d9e0058aa2b1b1197dc4a58500e5af4c6c4d6063a9d3e1 -size 223635 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/paste-texture.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/paste-texture.png deleted file mode 100644 index 2c744187..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/paste-texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d4d00cd10cd6340bd8717fd22a852de104b77cd55ef4f7738db0e983e7adfa4 -size 60431 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/scratch.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/scratch.png deleted file mode 100644 index a07b0aea..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/scratch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30f9221c956a40f31565a130551c563c707b47b3a2552021a041b2e3d791a838 -size 31536 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/show-texture-property.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/show-texture-property.png deleted file mode 100644 index ec13beea..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/show-texture-property.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f25d2888f6557d88cecfcdd120ad53b173c27843fec39c3a4a0b1db3bb1836b -size 28586 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/smoke.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/smoke.png deleted file mode 100644 index b5877c9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/smoke.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c37e11e18d2565d318ece3fea0a75383c606726f424648ae0fdece43554d3d57 -size 45039 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/spark.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/spark.png deleted file mode 100644 index 1c9ae031..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/spark.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1db4329bcfbdeacb9dc6aaf26785036e00224d1dd1f908cf6485abd9be6823d4 -size 51783 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-1.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-1.png deleted file mode 100644 index 9e65ea75..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28bd2e2c196449b63ca89854a7fbb0d7f84997e571c1310ded8629e525b0032b -size 18196 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-2.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-2.png deleted file mode 100644 index 568fb0e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:243c220445c3d3ffe90e55ab005627ebd61f988b8d536253528429d144c7d796 -size 19960 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-3.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-3.png deleted file mode 100644 index 466d59b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/star-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc4d05ae824f13fd93d72c881f1b1132a0c6fc24a7df030bf5ea5e87136e779e -size 33065 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/swirl.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/swirl.png deleted file mode 100644 index 16d9f286..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/swirl.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:209c7376844dcc120ca288d495cb7e5d0674e69f70759787db2585ebf912f5f9 -size 64548 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/texture-changed.jpeg b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/texture-changed.jpeg deleted file mode 100644 index e419ac2d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/texture-changed.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27d4027716503b5ccdb5308997fbb42aae77ceab58a53d066c433e7a26f0aaa1 -size 72885 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/texture-changed.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/texture-changed.png deleted file mode 100644 index 2cf3b4e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/texture-changed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9456c1fad2104a82a2624df1301bd826c6cab5b478fbfc0b7affab3eea4b1e6 -size 789883 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/trace.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/trace.png deleted file mode 100644 index fead87ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/trace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5a8f12b0c4c255f8e457e734f7a45002ec0071eeba47b02358624c9659e82a9 -size 18940 diff --git a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/triangle.png b/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/triangle.png deleted file mode 100644 index 0b0ead8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/build-it-play-it-mansion-of-wonder/using-textures/triangle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b120e69c8db59204fc9f197e1c1a0e409742620d5861d8ce765ca47b4cb0492 -size 4648 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-1/coding-1-output-window_800.png b/.cursor/rules/roblox/en-us/assets/education/coding-1/coding-1-output-window_800.png deleted file mode 100644 index bf6f43ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-1/coding-1-output-window_800.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e4b1330a7069ea5731c13ff4e5ac60ef78901b397f37d52430a4ecd512898e4 -size 84032 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-1/color-changer_400x216.png b/.cursor/rules/roblox/en-us/assets/education/coding-1/color-changer_400x216.png deleted file mode 100644 index e162353c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-1/color-changer_400x216.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f2aaf8a7338773422f517375a88e098fe744ef830b8dd2a5cadca8b618343cc -size 10697 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-1/color-picker_800x140.png b/.cursor/rules/roblox/en-us/assets/education/coding-1/color-picker_800x140.png deleted file mode 100644 index 5b67244e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-1/color-picker_800x140.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c678d6c6b99f5b79fb357222ad2f9a7e325ae10f20c9728342c37e04cc5e7291 -size 8807 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-1/helloworld-output_800x150.png b/.cursor/rules/roblox/en-us/assets/education/coding-1/helloworld-output_800x150.png deleted file mode 100644 index ab2f8882..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-1/helloworld-output_800x150.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b8b3b128eb22626ea6cdfd89dbde5209863369b7fa423cdcb152196d61aad1a -size 8775 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-1/hover-over-serverscriptservice_400x400.png b/.cursor/rules/roblox/en-us/assets/education/coding-1/hover-over-serverscriptservice_400x400.png deleted file mode 100644 index 40d78715..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-1/hover-over-serverscriptservice_400x400.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8f11003e30fc8dcff1bfefac33eae01b04992c71fac1c685de8d663ffadd0c6 -size 16755 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-1/part-properties_400.png b/.cursor/rules/roblox/en-us/assets/education/coding-1/part-properties_400.png deleted file mode 100644 index c51f7186..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-1/part-properties_400.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40e9449807e5bfab268569e4936c96eee22d4ee3573de2648b2085a2241161eb -size 23116 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-1/practice-part_400.png b/.cursor/rules/roblox/en-us/assets/education/coding-1/practice-part_400.png deleted file mode 100644 index 756f9b79..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-1/practice-part_400.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63650b281251553b366dcb16b33541ea3df126fd8464ca432ff49ece0c9c9d87 -size 12616 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-1/scriptParent_finalExample_web.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-1/scriptParent_finalExample_web.mp4 deleted file mode 100644 index 1558114a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-1/scriptParent_finalExample_web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:109ee0472298c14ab3eb3ed0c033721cefbc566d4b3c689be89d0a4ff9ac6829 -size 517510 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-2/parameters-and-events_trap.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-2/parameters-and-events_trap.mp4 deleted file mode 100644 index d3db89bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-2/parameters-and-events_trap.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19045a9dabe66c34c09ebc0c6ac1f452eabf2cf4f08d4d591a24bb9023f72148 -size 2147475 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-2/red-button.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-2/red-button.jpg deleted file mode 100644 index 7bab33ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-2/red-button.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9aa90c78f963a492e6f215160390848e36cba15e8d731733d9bec40dbe3aa7e8 -size 106413 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-2/transparent-bridge.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-2/transparent-bridge.jpg deleted file mode 100644 index 3e093501..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-2/transparent-bridge.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:304903ccb163e5ccac9d2e21a41f242338a25fcbd7e102e838ca832dfd3bd8ec -size 119405 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-3/coding3Hero_ifElseIf.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-3/coding3Hero_ifElseIf.jpg deleted file mode 100644 index 8b1da76a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-3/coding3Hero_ifElseIf.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4c7cf74b12d46474ff02f9e76ad7e8efcc79a3bfd1e3e92d4b44861711ee6d0 -size 100156 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-3/coding3_colorPointBlockFinalizedExample.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-3/coding3_colorPointBlockFinalizedExample.mp4 deleted file mode 100644 index 1fe6d62b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-3/coding3_colorPointBlockFinalizedExample.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76d6ee157985592aa396a799ec9cbdf0ab8f595aaa9dfa8dad4603c8d2cbd582 -size 5726137 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_loopingColors.gif b/.cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_loopingColors.gif deleted file mode 100644 index 1e9f5603..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_loopingColors.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:340a8c4146b268a3fdfb66422055915f14c86c98e9d3ba964e4f605b812f184b -size 35964 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_showParticles_web.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_showParticles_web.mp4 deleted file mode 100644 index 522a17f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_showParticles_web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0dd7934554f8e3eccfcf351892d7b0cfb7add99bde373edd7ede90de3f9b0a37 -size 730061 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_showPointChange_web.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_showPointChange_web.mp4 deleted file mode 100644 index 1c2de82c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-3/colorPoint_showPointChange_web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b4f035d69727fbc678ceb8b0a7eddbe55f443f43e421c4a941b92ec1cd66b79 -size 852312 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-3/raceCourse_showDistanceBetween.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-3/raceCourse_showDistanceBetween.jpg deleted file mode 100644 index 47e1d86d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-3/raceCourse_showDistanceBetween.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc6dab117760b34013a331338e51246831e49d0af1a403000a7ae0f59507ebad -size 141702 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-3/raceCourse_showPartCraeted.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-3/raceCourse_showPartCraeted.jpg deleted file mode 100644 index 7ea42ad4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-3/raceCourse_showPartCraeted.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcdff1b651436db0eb51f761792dbc6693df4a292ddf026ecfdab02e39b5e7cf -size 117269 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-3/trap-exampleFinal.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-3/trap-exampleFinal.mp4 deleted file mode 100644 index 9d2ab718..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-3/trap-exampleFinal.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0165f78a6123ec4e6faf7b585a432a26f127fecd91fd0192324db9fb734130c0 -size 920611 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/CupCakeBloopers_Compressed.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/CupCakeBloopers_Compressed.mp4 deleted file mode 100644 index 25eb95c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/CupCakeBloopers_Compressed.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9db4121c04cb0af5ec03af6329b67b7d03d37b8c278e5f881501c07d49ef1926 -size 2612405 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/Fade_480x320.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/Fade_480x320.png deleted file mode 100644 index 6bd2c2de..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/Fade_480x320.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0aa8b87e9baa8fcae093502fd4abe168586391a747cc793a1a1c20ae8c5a45ba -size 64336 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/LoopingTower2_Compressed.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/LoopingTower2_Compressed.mp4 deleted file mode 100644 index d9fa0dbb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/LoopingTower2_Compressed.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b5cc10e72e89b6acd3e33c92ab4cd02e6e978acf774463aeab526ec9b92b3bb -size 1042691 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/NestedLoopsDiagram300x500.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/NestedLoopsDiagram300x500.png deleted file mode 100644 index 620b11b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/NestedLoopsDiagram300x500.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b1bf259e1a021e03764a2944586bbf6bd3d3641d7c67ef0deb727eff0472b5b -size 5825 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/florLoop_lightAdded.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/florLoop_lightAdded.png deleted file mode 100644 index 2e8b816e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/florLoop_lightAdded.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5306e36c5cae0aad60921716280dd74a992b5a007829aeebcf8ecc42b26700c1 -size 10539 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge-finishedCountdown.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge-finishedCountdown.mp4 deleted file mode 100644 index 73d50825..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge-finishedCountdown.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:305fdd8ef8ab6c74383bb7ac209ed0381394ba4bd675969d2cba4e113a11c936 -size 403923 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge_addTextLabel.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge_addTextLabel.png deleted file mode 100644 index 4810586b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge_addTextLabel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aebb75931bec52cd516b0b07b16d59f426c2b6741eb114db8c3e480a2ee05e1d -size 11786 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge_bridgeSetup.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge_bridgeSetup.png deleted file mode 100644 index ce5dc032..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopBridge_bridgeSetup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41f7de931b1699a589ce52e2f9f0233945b1e72d006633f1f4bb5de796b4f2a9 -size 231754 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic1.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic1.png deleted file mode 100644 index a097cbfc..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5f7949216f47ed7e0ed48cdbf6afc150f8a9dfa54d1be09ef67ca3b90bf3794 -size 10999 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic2.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic2.png deleted file mode 100644 index 5c8365f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f1149f7f86f5de50477a9ce8ba91708423f4e79c052b1095187c419d199078a -size 14099 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic3.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic3.png deleted file mode 100644 index 752bc423..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoopDiagram_generic3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:741002bab10b677f48b69eee2232b0d9184722bcc5a643ffac540f63432e44e5 -size 15882 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoop_annotatedExample.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoop_annotatedExample.png deleted file mode 100644 index 44ca3ca5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoop_annotatedExample.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2730ec85449c2b98187706fa952dd8ff7adc7935b75638b34d6065a9bb427436 -size 15880 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoop_outputError.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoop_outputError.mp4 deleted file mode 100644 index e9054b6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/forLoop_outputError.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6a68125d7de4171b9d4fbc51ed05b3832bce3d6282189d186002060d524c602 -size 845529 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-finished.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-finished.mp4 deleted file mode 100644 index 6cd3b14d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-finished.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc062ddcc2b4f6e88bc34bcc1eec00c1c320a65017b3e79c3e5b0952ef196355 -size 123183 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-increase.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-increase.mp4 deleted file mode 100644 index cb1810ec..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-increase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc47d7b295145148893f0fe24118f9256f1090c2f44733222cff99125951a6d5 -size 111495 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-singleLoop.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-singleLoop.mp4 deleted file mode 100644 index 831541e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-light-singleLoop.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73050d2d66a7698baeb0dc90302421fcc97481093c8dc88c01604bd6c7b0d597 -size 86397 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-lights-lightPart.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-lights-lightPart.jpg deleted file mode 100644 index 76c01796..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-lights-lightPart.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b23892ddad2f4cb62d78573f49984e2766870ad468458b02654b86e9305d8d40 -size 40138 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-lights-setClockTime.png b/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-lights-setClockTime.png deleted file mode 100644 index b564de9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/glowing-lights-setClockTime.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a04a73da9439a01854cac1008f916edf22d1a5b3fd7fb219b35d730227fb0e3 -size 5547 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/loops-and-parts-finishedPart.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/loops-and-parts-finishedPart.mp4 deleted file mode 100644 index 34303784..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/loops-and-parts-finishedPart.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c4e928daaf82fcc1322064ba04042b60654f70c0976d29b8ca5e843f7bf1bfa -size 499787 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/nestedLoop-finalExample.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/nestedLoop-finalExample.mp4 deleted file mode 100644 index afd24561..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/nestedLoop-finalExample.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb8cc903b1597f67d7c64b2868c2eede75a82226bdf23c34794bbacae8a69372 -size 194666 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-4/timedBridgePresentation.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-4/timedBridgePresentation.mp4 deleted file mode 100644 index a4d11ba3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-4/timedBridgePresentation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:184db35c1828ec4642a42126f13211a2affb561630054f86592190c51f139ff1 -size 755808 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/Making_Changes_to_Arrays_-_Final_Project.rbxl b/.cursor/rules/roblox/en-us/assets/education/coding-5/Making_Changes_to_Arrays_-_Final_Project.rbxl deleted file mode 100644 index 88020786..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/Making_Changes_to_Arrays_-_Final_Project.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c09298ac2d504cb4541d0e525a58674c76d829530128dbd8b9fd423e3c81a04a -size 15427 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/TemplateNPC.rbxm b/.cursor/rules/roblox/en-us/assets/education/coding-5/TemplateNPC.rbxm deleted file mode 100644 index aafc2fa1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/TemplateNPC.rbxm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69d70ccdd404b55340f5dcbe3ae1e9effe580d59eb6ce84f530cef83d77b8d3d -size 21136 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/coding4_arrayFunctions.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-5/coding4_arrayFunctions.jpg deleted file mode 100644 index c8b90b58..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/coding4_arrayFunctions.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51cc95550fdf0ce30061a28a992feb242e80a7e82a34b2bec8af2b340cc3a462 -size 122884 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/coding4_introToTables.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-5/coding4_introToTables.jpg deleted file mode 100644 index f32fcf44..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/coding4_introToTables.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bdd8e05842ae12704daee41be6354c3c4dce00e6c8e3c8752eff737790ebf26 -size 162831 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/disappearingHero_16_9web.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-5/disappearingHero_16_9web.mp4 deleted file mode 100644 index 96917418..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/disappearingHero_16_9web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2114a8e628fbe404c58fe12eaa9daddc1dd7ecdf79dac303965828a8cdf9355 -size 650800 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/introArray_showDialogIndexes_optimized.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-5/introArray_showDialogIndexes_optimized.mp4 deleted file mode 100644 index 083f884e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/introArray_showDialogIndexes_optimized.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:155ccdeaa1140e5582662a2c52516794cf5871d82338c4d1a78d3459ad77056c -size 158925 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_projectTotal_optimized.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_projectTotal_optimized.mp4 deleted file mode 100644 index b4bfa9e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_projectTotal_optimized.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2248faefd31e84bee3b1d8a8f721620a9dcb4b7e5204826d938ea66c4cd0a263 -size 351898 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_showFullLoopIndexes_optimized.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_showFullLoopIndexes_optimized.mp4 deleted file mode 100644 index 352fbfd9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_showFullLoopIndexes_optimized.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:192d910a246a1d1641433020dc07994d2390e936d202f41140fa88f6ed85c0e6 -size 232782 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_showSpeech.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_showSpeech.jpg deleted file mode 100644 index c2fcead1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/introArrays_showSpeech.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fea406fdfe16dd7b3c080fe71ef7e4dc80c3fcd3fad145ff009886b9613e0d66 -size 116418 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/showPathDisappearFirst_web.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-5/showPathDisappearFirst_web.mp4 deleted file mode 100644 index a5eef9b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/showPathDisappearFirst_web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:495cafc17a4aefa68f0316d79fc8b9cc28f3e40b8282e3f9c98a616a4b139250 -size 283392 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-5/showPathDisappearIndexed_web.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-5/showPathDisappearIndexed_web.mp4 deleted file mode 100644 index 479ae3af..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-5/showPathDisappearIndexed_web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dc4d5363b0397280645f35eb8218900e19018f76e5fe01782423233887445f9 -size 521256 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/abstraction-backpacks.png b/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/abstraction-backpacks.png deleted file mode 100644 index 1f92891c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/abstraction-backpacks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5a8757f8b653c8855e980712748e2b8b746961c078014811b55bffb62ca2a53 -size 8737 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/backpack-violet.png b/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/backpack-violet.png deleted file mode 100644 index fe86f654..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/backpack-violet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:386890c0432090e6d42a9537368d6b8df2a64ec5e6e90c4093d7d522e81a3f5f -size 12651 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/backpack-yellow.png b/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/backpack-yellow.png deleted file mode 100644 index 6e2da554..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/backpack-yellow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11231e04083a93cdce0dda94d9a4f15994207d77f03ac03d0ecd399567e45cbb -size 11533 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/no-abstraction-backpacks.png b/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/no-abstraction-backpacks.png deleted file mode 100644 index 9622d28f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-abstraction/no-abstraction-backpacks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92e5c6403c538fdea50e9378f90d667002f31a17e0dc44f77eb0a92eceae81e1 -size 33217 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-algorithms/square-and-child-squares.png b/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-algorithms/square-and-child-squares.png deleted file mode 100644 index 6020ee9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/coding-concept-algorithms/square-and-child-squares.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce53c8cc2661b0ecbc62366560d97b4f94036d211ee8d5922ab5e43f094ba617 -size 2508 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/Intro_to_Module_Scripts_-_Starter_Project.rbxl b/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/Intro_to_Module_Scripts_-_Starter_Project.rbxl deleted file mode 100644 index bad963ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/Intro_to_Module_Scripts_-_Starter_Project.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:362a96f9edfe6478225fb3d79a7cf856f8096fb731e1d919ce2104ac404ab78d -size 83247 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/create-module-script.png b/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/create-module-script.png deleted file mode 100644 index fbe63aa7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/create-module-script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9a8e729903f99db5e74cd485152d8b3bebf5fde22a09ef1918ebe2b862e622f -size 12058 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/creating-modules-hero.jpeg b/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/creating-modules-hero.jpeg deleted file mode 100644 index 31bfca93..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/creating-modules-hero.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:007746910c7b719b9f821443debd01f3abe5b4dc94bc9e92ce2b1398e1ba7efb -size 149065 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/final-example.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/final-example.mp4 deleted file mode 100644 index 068bbcb6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/final-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:965fadb20d8b9ed949797ae4696087af8af71a2b1973e4e26660578deb99d6d6 -size 1151733 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/get-first-key.mp4 b/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/get-first-key.mp4 deleted file mode 100644 index c35b45cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/get-first-key.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f68ba134d79ce90b4ea751f58da55304b2131802e9a7bcb6eab0b82d564a924 -size 212985 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/module-template-example.jpeg b/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/module-template-example.jpeg deleted file mode 100644 index 878c7cec..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/module-template-example.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79fa460a0228cef4a2a79a2186de3b070df2afe37eca65a0f179cc7aabf4a27d -size 88841 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/show-leaderboard-key.jpg b/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/show-leaderboard-key.jpg deleted file mode 100644 index 473b57b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/creating-with-module-scripts/show-leaderboard-key.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05c76af7f89fee1e8ff28eb77bc1735c64c5280946b00a00e9e1c11965b1a015 -size 28445 diff --git a/.cursor/rules/roblox/en-us/assets/education/coding-6/intro-to-module-scripts/create-module-script.png b/.cursor/rules/roblox/en-us/assets/education/coding-6/intro-to-module-scripts/create-module-script.png deleted file mode 100644 index b99f94e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/coding-6/intro-to-module-scripts/create-module-script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8943bafa13c4554dd1dfef6812a2c2c6a725b042ca78e9cb81fa5a2ca819885c -size 11778 diff --git a/.cursor/rules/roblox/en-us/assets/education/developer/Designing-Educational-Experiences.pdf b/.cursor/rules/roblox/en-us/assets/education/developer/Designing-Educational-Experiences.pdf deleted file mode 100644 index 1ed003c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/developer/Designing-Educational-Experiences.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a4d50ff760fd289232e5502538ac41d80a3b86f119c47992d3e9ee52741a3bb -size 9298714 diff --git a/.cursor/rules/roblox/en-us/assets/education/developer/petGame-pets.jpg b/.cursor/rules/roblox/en-us/assets/education/developer/petGame-pets.jpg deleted file mode 100644 index e0d6e263..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/developer/petGame-pets.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f208aded520df1d500ad8deee26cb21c748dacf994cdfdf62c732bbf3328a03e -size 209702 diff --git a/.cursor/rules/roblox/en-us/assets/education/developer/thumbnail-luaLearning.png b/.cursor/rules/roblox/en-us/assets/education/developer/thumbnail-luaLearning.png deleted file mode 100644 index 78228603..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/developer/thumbnail-luaLearning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf183f82c92d47b667098b4790687eb748134f8f39966ed425220240e3488002 -size 428321 diff --git a/.cursor/rules/roblox/en-us/assets/education/developer/thumbnail-missionMars.png b/.cursor/rules/roblox/en-us/assets/education/developer/thumbnail-missionMars.png deleted file mode 100644 index 24471930..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/developer/thumbnail-missionMars.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d65af67c0bf12c45e33cdd6157520c43bdda7c93389db3830c371cf689178de5 -size 388811 diff --git a/.cursor/rules/roblox/en-us/assets/education/developer/thumbnail-untamedAnimals.png b/.cursor/rules/roblox/en-us/assets/education/developer/thumbnail-untamedAnimals.png deleted file mode 100644 index 757be44c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/developer/thumbnail-untamedAnimals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e846469b8ad803e2e777c70943568729e6df8d2898f565cba66b68a100bce505 -size 640897 diff --git a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/bipi_lessonPlan_thumbnail_312x200.png b/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/bipi_lessonPlan_thumbnail_312x200.png deleted file mode 100644 index c8dc0853..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/bipi_lessonPlan_thumbnail_312x200.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53d34479dcccf785debc9f2f81ae66fcdb7056b796c5422b2e704157d09f5734 -size 115758 diff --git a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/ccw2019_thumbnail_312x200px.png b/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/ccw2019_thumbnail_312x200px.png deleted file mode 100644 index 3d68c0f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/ccw2019_thumbnail_312x200px.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0ecb9b201db77f5178386a0ea80fc3ef45ffeeacd3d6ff1ca5fe8218bb2b989 -size 88892 diff --git a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/introToGameDesign_thumbnail.jpg b/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/introToGameDesign_thumbnail.jpg deleted file mode 100644 index 98185e05..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/introToGameDesign_thumbnail.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:525f1a9e4595e2d375d2ef6759846419e6f817e40cb85c9576dbdb98c4b3ac8e -size 40418 diff --git a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/introToStudio_thumbnail.jpg b/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/introToStudio_thumbnail.jpg deleted file mode 100644 index 2f162175..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/introToStudio_thumbnail.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79c0f51300972e44b016daaacc272ea8424e6ee86f782bb65aa1a38529060f84 -size 42409 diff --git a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/newGettingStartedThumbnails-develop.jpg b/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/newGettingStartedThumbnails-develop.jpg deleted file mode 100644 index 9533c819..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/newGettingStartedThumbnails-develop.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c73f97fcf5aa53ea5af1fc08098b3c850b1cca9b8ee7139351e0ec234e2ce4d -size 33519 diff --git a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/newGettingStartedThumbnails-games.jpg b/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/newGettingStartedThumbnails-games.jpg deleted file mode 100644 index 8f3c0e6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/newGettingStartedThumbnails-games.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82909fbc51d8f7d7615abf2fb42309353aeed413a60203cca7ba8fab19fe01fc -size 23416 diff --git a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_adventureRthroAlt_312x200.jpg b/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_adventureRthroAlt_312x200.jpg deleted file mode 100644 index dde2f725..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_adventureRthroAlt_312x200.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ab94a36ae534544db792dc406783a0cee1672ad99052f692f2dffcebafadb12 -size 35020 diff --git a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_remoteLearning.jpg b/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_remoteLearning.jpg deleted file mode 100644 index 5770b8cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_remoteLearning.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3928b8466463537b611cb23f0e49bb1f635b1dd3ba08378406758ee0eee9224f -size 42413 diff --git a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_traps_312x200.jpg b/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_traps_312x200.jpg deleted file mode 100644 index 79a57601..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/edu-landingPages/thumbnail_traps_312x200.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5aa83d7bb93b53c038deb8fa71ea2f312c762c0e39e963dadafc5c960efcbf1 -size 33400 diff --git a/.cursor/rules/roblox/en-us/assets/education/educator-onboarding/Handout_-_Getting_Ready.pdf b/.cursor/rules/roblox/en-us/assets/education/educator-onboarding/Handout_-_Getting_Ready.pdf deleted file mode 100644 index 6680e6e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educator-onboarding/Handout_-_Getting_Ready.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:252ba6216314eb9b28440c6a1ede6530b943b0ed2a96def060f6180124b46478 -size 98444 diff --git a/.cursor/rules/roblox/en-us/assets/education/educator-onboarding/hero-banner-classroom.jpg b/.cursor/rules/roblox/en-us/assets/education/educator-onboarding/hero-banner-classroom.jpg deleted file mode 100644 index 26a808d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educator-onboarding/hero-banner-classroom.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98b6a01a31e6337e7c694379a1c903e69914bad130992045633a3f1a9ea67766 -size 135233 diff --git a/.cursor/rules/roblox/en-us/assets/education/educator-onboarding/hero-robloxHQ.jpg b/.cursor/rules/roblox/en-us/assets/education/educator-onboarding/hero-robloxHQ.jpg deleted file mode 100644 index f41241a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educator-onboarding/hero-robloxHQ.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d5b73bfc95f21dcd51169004d0b6b8266c266170e5d23fb18adf006fc3ccdcc -size 167643 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/Bianca-Riviera.jpg b/.cursor/rules/roblox/en-us/assets/education/educators-page/Bianca-Riviera.jpg deleted file mode 100644 index bba26f46..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/Bianca-Riviera.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff9e97da9b66c88b33c9ab43f7aa1481df68310f5771719da925dd5a97f14338 -size 45186 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/Code-Wiz.png b/.cursor/rules/roblox/en-us/assets/education/educators-page/Code-Wiz.png deleted file mode 100644 index 2f67fe66..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/Code-Wiz.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ca3e3997bcc37d528b8ca1353e1e01bec24ec5f5e6eefbf467bd6605dcd452f -size 32670 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/EDMO-Round-1.png b/.cursor/rules/roblox/en-us/assets/education/educators-page/EDMO-Round-1.png deleted file mode 100644 index ea275f6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/EDMO-Round-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73c16a6630a3b8f392569de4bfbd8ed89758721bbcc3194734000d080bce280e -size 55916 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/Genius-Academy.png b/.cursor/rules/roblox/en-us/assets/education/educators-page/Genius-Academy.png deleted file mode 100644 index 00333352..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/Genius-Academy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbfc8b93188826f31d3d2228d4278047a722d2dc407eb873848685a52f6b49df -size 112862 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/Large_Code_Ninjas-_White_Horizontal.png b/.cursor/rules/roblox/en-us/assets/education/educators-page/Large_Code_Ninjas-_White_Horizontal.png deleted file mode 100644 index bb26b4ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/Large_Code_Ninjas-_White_Horizontal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c66facfc992c4c082bd2e67300dc3b553cce9253dcc898b0eec1f04acf02ccf -size 11459 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/Natalie-Clabo.jpg b/.cursor/rules/roblox/en-us/assets/education/educators-page/Natalie-Clabo.jpg deleted file mode 100644 index 6f0d77e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/Natalie-Clabo.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1700ba1fffbe8addd32778e7f47af06e32d103b6ccef58f6aac3e6330e6041cc -size 52057 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/The-Math-Obby.jpg b/.cursor/rules/roblox/en-us/assets/education/educators-page/The-Math-Obby.jpg deleted file mode 100644 index a8ef7c20..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/The-Math-Obby.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b36d4f2ce2a8fa25c6d0ffb718c8e47b577210d8f2461a85c0d8db4ed19967aa -size 61222 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/WGFactory.png b/.cursor/rules/roblox/en-us/assets/education/educators-page/WGFactory.png deleted file mode 100644 index 149037f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/WGFactory.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21dcfd5ffa453aeb16d91bc80fd73bd063684ada064ab7cc05d516fe91b44a4d -size 29420 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/alvinblox.png b/.cursor/rules/roblox/en-us/assets/education/educators-page/alvinblox.png deleted file mode 100644 index 3b985469..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/alvinblox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:988274d564564b28781bda3e2c172d88195c07f975136782acfe89e492f3b95f -size 22470 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/code-kingdom-logo.png b/.cursor/rules/roblox/en-us/assets/education/educators-page/code-kingdom-logo.png deleted file mode 100644 index 4ec0156a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/code-kingdom-logo.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ad85bfc8313f4283f8952bed67d70d8c97537a85071d310e96070e3ec930b20 -size 16491 diff --git a/.cursor/rules/roblox/en-us/assets/education/educators-page/id-tech-logo.png b/.cursor/rules/roblox/en-us/assets/education/educators-page/id-tech-logo.png deleted file mode 100644 index 8003e790..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/educators-page/id-tech-logo.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f73c237bf27ab4d61e29e6a85791d70a5d0978df18875d6924ae21f28bf0315 -size 21533 diff --git a/.cursor/rules/roblox/en-us/assets/education/first-safety-and-civility-game/Create-Your-First-Civil-and-Safe-Game.pdf b/.cursor/rules/roblox/en-us/assets/education/first-safety-and-civility-game/Create-Your-First-Civil-and-Safe-Game.pdf deleted file mode 100644 index 570f7715..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/first-safety-and-civility-game/Create-Your-First-Civil-and-Safe-Game.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d51206726a92f6e281c9b46e74ab011ac3a4a26103d2d160592095309304bc3d -size 28670887 diff --git a/.cursor/rules/roblox/en-us/assets/education/first-safety-and-civility-game/civility.png b/.cursor/rules/roblox/en-us/assets/education/first-safety-and-civility-game/civility.png deleted file mode 100644 index f5166673..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/first-safety-and-civility-game/civility.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a7e3401b23010d76a794557c6607edbf4a6c1e073f172f8fcec8ea67cf7b0a6 -size 248504 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Anchor-Tool.png b/.cursor/rules/roblox/en-us/assets/education/general/Anchor-Tool.png deleted file mode 100644 index 7daed030..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Anchor-Tool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de4080d10799d3446a62c6a5c2146f653325748d48e8d16693fa7c51f5b8aa53 -size 53701 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Move-Tool.png b/.cursor/rules/roblox/en-us/assets/education/general/Move-Tool.png deleted file mode 100644 index 73ede752..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Move-Tool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81741ccb89de24ab10c02cc299e8a20ffbd8010ea088eea0496c069183355b27 -size 22323 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Rotate-Tool.png b/.cursor/rules/roblox/en-us/assets/education/general/Rotate-Tool.png deleted file mode 100644 index dfc1ec41..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Rotate-Tool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e2f66bc1e08f83a1eada02cf355136a216c9b2436c8d9f99b1aac73c07c894d -size 22359 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Scale-Tool.png b/.cursor/rules/roblox/en-us/assets/education/general/Scale-Tool.png deleted file mode 100644 index b480346d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Scale-Tool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16140996c8172685bd4b065392271ef4fb5c63810b46d3d906bc8339126f738f -size 22311 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-A.png b/.cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-A.png deleted file mode 100644 index 8ce65123..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:321900d4fb45eae8da7bcfe8633bfde345d768f6d2a4ba755f021a46a976c093 -size 34285 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-B.png b/.cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-B.png deleted file mode 100644 index 457060c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f7f34d1d867eae85758eea8f54607bdc1481edc06f6076e3f2ba12e7ad36662 -size 35656 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-C.png b/.cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-C.png deleted file mode 100644 index 12f83c93..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Snap-Settings-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9ac2f7c1ce265946c3b1c09e925f7fc6fab1b5568265f3a658bbd38c3a4eedd -size 35748 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Galactic-Speedway.jpg b/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Galactic-Speedway.jpg deleted file mode 100644 index ae876545..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Galactic-Speedway.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d81b43ecc92296336828536f7bb7fe2e41e3e2bec1ab7d94fa4104028bfd743a -size 338259 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Island-Of-Move.jpg b/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Island-Of-Move.jpg deleted file mode 100644 index 8e9a1ae3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Island-Of-Move.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a797100c576eaba525ad26c85232712a8c7fe061186562e278d11ca91ddcba8 -size 382070 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Mansion-Of-Wonder.jpg b/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Mansion-Of-Wonder.jpg deleted file mode 100644 index 4252a8ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Mansion-Of-Wonder.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e8d4300c462d5ef2d7742ce4e7cba04caa4fde6ca7a708f0d92c3c2b45a65fd -size 286713 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Story-Games.jpg b/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Story-Games.jpg deleted file mode 100644 index 02cf9e85..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Studio-Setup-Story-Games.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c4b1d49715015bcee0c3cffb95cec1247521a200b409f9f5b17c50cec349f45 -size 260507 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/Toolbox-Inventory.png b/.cursor/rules/roblox/en-us/assets/education/general/Toolbox-Inventory.png deleted file mode 100644 index 96c192e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/Toolbox-Inventory.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04c746708446aaa2ba2ca9e49917f28e115940c7fdc7f466eb081f4031a2a4d9 -size 20193 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/play-button.png b/.cursor/rules/roblox/en-us/assets/education/general/play-button.png deleted file mode 100644 index 230d6cb6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/play-button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b72a5ea08414eb52784566528ecb6e4bfc65db1530a21a68b71bcbd085b3067 -size 9388 diff --git a/.cursor/rules/roblox/en-us/assets/education/general/stop-button.png b/.cursor/rules/roblox/en-us/assets/education/general/stop-button.png deleted file mode 100644 index 009bbf86..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/general/stop-button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:063aeb4225ff4b743295742c7ca891d6ca6edf3794740918a17e83f9f6129c36 -size 10178 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/Handout-CollaborationGuidelines.docx b/.cursor/rules/roblox/en-us/assets/education/handouts/Handout-CollaborationGuidelines.docx deleted file mode 100644 index b6966924..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/Handout-CollaborationGuidelines.docx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:733c7f7bc45a6d6215e51522a330cfb9490ef71e58220f45ea29d63db62e7ea9 -size 188594 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/Roblox_Classroom_Kit.zip b/.cursor/rules/roblox/en-us/assets/education/handouts/Roblox_Classroom_Kit.zip deleted file mode 100644 index af752389..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/Roblox_Classroom_Kit.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9caa697a3da7e8b16da08780c0bd0e29e7b9748f3db96cda01dc925cf3cb837 -size 2131845 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/animation-feedback.pdf b/.cursor/rules/roblox/en-us/assets/education/handouts/animation-feedback.pdf deleted file mode 100644 index 47e4aae2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/animation-feedback.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e41922d1af3a93eeaf1c3bcc85f0c3d77a8fd6a9b262bbd7367ee9af68eb3e42 -size 84048 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/digital-safety-presentation.pptx b/.cursor/rules/roblox/en-us/assets/education/handouts/digital-safety-presentation.pptx deleted file mode 100644 index 8fb058f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/digital-safety-presentation.pptx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9a815fef139b0ec569d48c52dcdc82895d45b2ff39d9bfaa8fdd4d6fac8b401 -size 881721 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/digital-safety-scavenger.pdf b/.cursor/rules/roblox/en-us/assets/education/handouts/digital-safety-scavenger.pdf deleted file mode 100644 index ec39538c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/digital-safety-scavenger.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:354eb096c70b278f2a220cb1ecdbb06acb81992b230d0c25b07778b61395b46b -size 82244 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/introToCoding-cheatsheet.pdf b/.cursor/rules/roblox/en-us/assets/education/handouts/introToCoding-cheatsheet.pdf deleted file mode 100644 index bfedba38..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/introToCoding-cheatsheet.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d95ff74575900ba220771ece716d4a38f2848928ddf63e1ec9da50f6c4d8383 -size 185263 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/introToStudio-cheatsheet.pdf b/.cursor/rules/roblox/en-us/assets/education/handouts/introToStudio-cheatsheet.pdf deleted file mode 100644 index 00a0485a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/introToStudio-cheatsheet.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7eaf238958e52079681283a6cf5a0e1bdb5070c63f761b66383f54b61c4e15d -size 87578 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/project-feedback-presentation.pptx b/.cursor/rules/roblox/en-us/assets/education/handouts/project-feedback-presentation.pptx deleted file mode 100644 index 68306bfa..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/project-feedback-presentation.pptx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6a69bf096f685b43acb2232519185ebec188db2d4dd949f8d1eb68e31ed4bc3 -size 1269316 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/project-feedback.pdf b/.cursor/rules/roblox/en-us/assets/education/handouts/project-feedback.pdf deleted file mode 100644 index 030c292b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/project-feedback.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50618a44621c35e6f90fddb299299e194d3bf299d4f92824cedf08128d19a712 -size 85085 diff --git a/.cursor/rules/roblox/en-us/assets/education/handouts/upstander-roleplay.pdf b/.cursor/rules/roblox/en-us/assets/education/handouts/upstander-roleplay.pdf deleted file mode 100644 index 603e8fa5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/handouts/upstander-roleplay.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:159ffb98c80415c6c570028f0e00751f3da8b1ebe86250d7f558abd1553e15a4 -size 71303 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/Upstander_Situations_Handout.docx b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/Upstander_Situations_Handout.docx deleted file mode 100644 index 57b616ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/Upstander_Situations_Handout.docx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81b95547e4f626a4848135ac5682327a0402dbca5df1f9bb075e5f8aef6a8b6a -size 39870 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_onlineCommunityHero.jpg b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_onlineCommunityHero.jpg deleted file mode 100644 index 2912c349..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_onlineCommunityHero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdb8b78b38956917876691870946c8d48e4ea027c1077c8d531bf252da44b820 -size 259080 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_showNPC_bully.jpg b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_showNPC_bully.jpg deleted file mode 100644 index 40ec2f02..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_showNPC_bully.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f92d87b218202be6d84c8bafaec3c4873fa5d96df818728649f0fbf74faecf80 -size 64700 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_showNPC_noBully.jpg b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_showNPC_noBully.jpg deleted file mode 100644 index 84b2ef1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/digitalCitizenship_showNPC_noBully.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cc8b918818cec9f58b82d7eb0382a6d13fac98c51c43fbaf0d6396913d1cdbf -size 72192 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/hero_digitalCitizenshipIntro.jpg b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/hero_digitalCitizenshipIntro.jpg deleted file mode 100644 index dbddd08a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-civility/hero_digitalCitizenshipIntro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89dbef696fb2926f0d1f4e4b811e835c54e86d5989d3c1af13c51cb5425d1327 -size 220130 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/Digital_Safety_Scavenger_Hunt_Handout.docx b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/Digital_Safety_Scavenger_Hunt_Handout.docx deleted file mode 100644 index 84f39bf4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/Digital_Safety_Scavenger_Hunt_Handout.docx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:416941f9a011f11d50a18a63909fabf6898f9feafc3749e779f6947ff2739d02 -size 39569 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/Intro_to_Digital_Safety_Lesson_Slides.pptx b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/Intro_to_Digital_Safety_Lesson_Slides.pptx deleted file mode 100644 index 8e310dc5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/Intro_to_Digital_Safety_Lesson_Slides.pptx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:579ea4012597fa0b74e0672f566c8e6bd8ce6b3af276fdddea8b448882af0572 -size 874045 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_gameHero.png b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_gameHero.png deleted file mode 100644 index c7cba442..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_gameHero.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cde510fde0a290cc2f5b57b5deec67e9ee9d3fcd757c4b1d22064803a6514427 -size 275023 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_heroImage.jpg b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_heroImage.jpg deleted file mode 100644 index f5801861..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_heroImage.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d659f90faec1ed2d2c45d98287310e3af0e5441a5079e43f1938099da1fc71f7 -size 239356 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_reportClick.jpg b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_reportClick.jpg deleted file mode 100644 index 23ebac66..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_reportClick.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99e24fe0832a08be16592f7204a9233c312cff9d8b95aefce6e08e853563ebae -size 1098751 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_showReport.jpg b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_showReport.jpg deleted file mode 100644 index 94c6850b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_showReport.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a19c211b43d1bb9d171ac4dd6f2b0ccbc63f30631ca5c2d53c5a7aa8f2fa62d5 -size 1684383 diff --git a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_youtube.png b/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_youtube.png deleted file mode 100644 index 6bc83cea..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/intro-to-digital-safety/digitalSafety_youtube.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22b259a617e0d29a99ac36a368a5c52351446a095b8262b464191222473f65d0 -size 163605 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/ConfigureServer.png b/.cursor/rules/roblox/en-us/assets/education/legacy/ConfigureServer.png deleted file mode 100644 index 33eef046..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/ConfigureServer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfcce5d2d4b13a85dfaa508b90b6c3c32eb6f2cfe02a2f50879ff5d3ba19c214 -size 25199 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout-CollaborationGuidelines.docx b/.cursor/rules/roblox/en-us/assets/education/legacy/Handout-CollaborationGuidelines.docx deleted file mode 100644 index b6966924..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout-CollaborationGuidelines.docx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:733c7f7bc45a6d6215e51522a330cfb9490ef71e58220f45ea29d63db62e7ea9 -size 188594 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout-CollabrationGuidelines.pdf b/.cursor/rules/roblox/en-us/assets/education/legacy/Handout-CollabrationGuidelines.pdf deleted file mode 100644 index 8d804c08..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout-CollabrationGuidelines.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb96fb16a1e0112634c8f6063e14da26bdb33cd7a50081855af768245b43992e -size 233312 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Computer_Science_Quiz.docx b/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Computer_Science_Quiz.docx deleted file mode 100644 index 799a25ec..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Computer_Science_Quiz.docx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffd8e80febbe84b609d8da8b5f204aaaf73201153258eae498fb8fd31a08cb1b -size 41421 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Computer_Science_Quiz.pdf b/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Computer_Science_Quiz.pdf deleted file mode 100644 index b5f2d09f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Computer_Science_Quiz.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca24ff8dbbc3f765f5a2cb157ad2b3dcc5f6b234490a255ba0af61ea1dd3045b -size 67086 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Getting_Ready.pdf b/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Getting_Ready.pdf deleted file mode 100644 index 6680e6e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Getting_Ready.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:252ba6216314eb9b28440c6a1ede6530b943b0ed2a96def060f6180124b46478 -size 98444 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Project_Rubric.docx b/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Project_Rubric.docx deleted file mode 100644 index d05c9efa..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Project_Rubric.docx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8c0db0edacd58bbb78f9e2aad9d8592f25155b0ed00e0ce2d969fef4d348611 -size 42132 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Project_Rubric.pdf b/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Project_Rubric.pdf deleted file mode 100644 index 751b462e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Project_Rubric.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49d0c223ce87e47529a70c9b681b04d71546060a786c4f78aa073f624de5a5de -size 72132 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Roblox_Client_Quick_Start_Guide.pdf b/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Roblox_Client_Quick_Start_Guide.pdf deleted file mode 100644 index 410ac920..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Roblox_Client_Quick_Start_Guide.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f033a700656b4bb8a676f5b894ea7fd5a30d02139cf237cbc0b88c589f53d279 -size 1598737 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Roblox_Glossary.pdf b/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Roblox_Glossary.pdf deleted file mode 100644 index 49fd5fe3..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Handout_-_Roblox_Glossary.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b8b6e6408091aa63e93fa32796c7985bf920a089282855990ff2abee96cce7f -size 78079 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/NameServer.png b/.cursor/rules/roblox/en-us/assets/education/legacy/NameServer.png deleted file mode 100644 index 7eefacab..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/NameServer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:506e579a7d95d1c4c222b217160cba40c98c0f95d1cd7d525a7934aa2bc8f88c -size 250844 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/RobloxStudio-Cheatsheet.pdf b/.cursor/rules/roblox/en-us/assets/education/legacy/RobloxStudio-Cheatsheet.pdf deleted file mode 100644 index 00a0485a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/RobloxStudio-Cheatsheet.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7eaf238958e52079681283a6cf5a0e1bdb5070c63f761b66383f54b61c4e15d -size 87578 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Account_Creation_(Student_Handout).pdf b/.cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Account_Creation_(Student_Handout).pdf deleted file mode 100644 index 819c0071..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Account_Creation_(Student_Handout).pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f71d475640071842e168f0c23b44f56767186c6992be95af54518116a9575ddc -size 97653 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Assessment_Handouts.zip b/.cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Assessment_Handouts.zip deleted file mode 100644 index 7cbe53da..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Assessment_Handouts.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5be68c345ea4e91fd083167373ee1b138d66ad92858c773ddd1d1c89c8616052 -size 212777 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Classroom_Kit.zip b/.cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Classroom_Kit.zip deleted file mode 100644 index f2cf596b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Roblox_Classroom_Kit.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71089c7f99ab456dd4d3503af091ba8b42be92844a7194d5e70107713db09765 -size 27411246 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Safety_education_brochure.pdf b/.cursor/rules/roblox/en-us/assets/education/legacy/Safety_education_brochure.pdf deleted file mode 100644 index b884df4c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Safety_education_brochure.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:167c63f917ba27b6aea1a4a587f69b66619402bef9dfa04c166453f5a40097f8 -size 256254 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/ServersTab.png b/.cursor/rules/roblox/en-us/assets/education/legacy/ServersTab.png deleted file mode 100644 index 1dc80ccf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/ServersTab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87be77d68e4ed48e17acf6c96542ce5c7f0486f82267aeb55ab6f531e64ab1fc -size 300914 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/Twitterheader1500x500.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/Twitterheader1500x500.jpg deleted file mode 100644 index 84724b05..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/Twitterheader1500x500.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c940908c62c7fc08ff3a9196084ad03d87b888360a720693e451ac198a5a26cc -size 190747 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/VIPGamePage.png b/.cursor/rules/roblox/en-us/assets/education/legacy/VIPGamePage.png deleted file mode 100644 index 10c196ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/VIPGamePage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0ae6b6f3f2940d2f9192440e86767377637e62756280ebc7709f552a687bd08 -size 30632 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/cityScape_312x200.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/cityScape_312x200.jpg deleted file mode 100644 index 79046b25..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/cityScape_312x200.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fcd36439afe0c8145aea196a7505fbccb94aa1098cfe8c48f41868a2d249422 -size 39251 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/classroomThumbnail_312x200.png b/.cursor/rules/roblox/en-us/assets/education/legacy/classroomThumbnail_312x200.png deleted file mode 100644 index 7b19ea73..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/classroomThumbnail_312x200.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a5dc7647d37459afeb0eff132e8e4ff0c659916a6919bb03f37af8743ccdc5f -size 111252 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/coding4_loopingArraysThumbnail.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/coding4_loopingArraysThumbnail.jpg deleted file mode 100644 index 4d7e5c13..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/coding4_loopingArraysThumbnail.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2091c3a69927c6506bd6a0cda539e807dde51103faf494d641311f7e3a5ecf4c -size 23016 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/collabrationArticle_heroBanner.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/collabrationArticle_heroBanner.jpg deleted file mode 100644 index 42751240..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/collabrationArticle_heroBanner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fef327d8d926d3f052423b438cad0a4a24a42405263b3cf91c3ca0359927392 -size 134233 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-allowCopying.png b/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-allowCopying.png deleted file mode 100644 index cd90b562..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-allowCopying.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:691fe044ff81cf72c3311a359e3bb658ed6ece72942ea1fa9821a4d977c2133e -size 10088 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-clickCreate.png b/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-clickCreate.png deleted file mode 100644 index 763cfd45..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-clickCreate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:320f3dc7f20ad404d9e995a1026647c4857df6c41e6842f2b47075ead559580e -size 3865 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-createNewGame.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-createNewGame.jpg deleted file mode 100644 index 664a6119..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-createNewGame.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc00f210bd5f32651737cf0d2f866373686f1fc1be4ebab1e25b6f87d16d86a4 -size 55889 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-editPlace.png b/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-editPlace.png deleted file mode 100644 index af17706c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-editPlace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04417b61d0fe3723bc0e37c6efebe3d306f103b2cfffaff08d92a421d6d81422 -size 10440 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-editTemplate.png b/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-editTemplate.png deleted file mode 100644 index 75d11f4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-editTemplate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e700ee6b11e735c0f408d0bc6ac8bf20b75386faf5a2ad0058076e9ed281aa7 -size 6399 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-gameSettings.png b/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-gameSettings.png deleted file mode 100644 index 7ebb0292..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-gameSettings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:464b44d3e74324ef6a460f5c0590302cf0a117a4e4a74f494fe1dc3676a7c1d3 -size 5926 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-setCreator.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-setCreator.jpg deleted file mode 100644 index 19ea34e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devStarted-setCreator.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1d8191f7927721175a16c31ae8b754fc1773ced48bf1516a09be57829341f64 -size 11746 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-BrandingExample.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-BrandingExample.jpg deleted file mode 100644 index 3f1db41d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-BrandingExample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:452b0242b69c5fc454f83dac675159713bdda2c13ea80c1b692a9d7497377e2d -size 170082 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-assetKit-01.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-assetKit-01.jpg deleted file mode 100644 index 0e1d424c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-assetKit-01.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d77bc869e5d558d654725814500b69d11283e7b9dcca2b94538d66a335aa9761 -size 112762 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-assetKit-02.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-assetKit-02.jpg deleted file mode 100644 index 8beb2830..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-assetKit-02.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bfabfe21dd0bfd10b275b0add06a15307e8f55277911be28bd29abed4358c86 -size 103491 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-mansions-byjus.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-mansions-byjus.jpg deleted file mode 100644 index 88cda0d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-mansions-byjus.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c61297242dd21322a081c795d4298c944ddf156fea414ff6dda6f98ae7a5e419 -size 157565 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-mansions-original.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-mansions-original.jpg deleted file mode 100644 index 1b217ec1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-mansions-original.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63512fc1363d2deb5b0ff5c2b864defd2ba803ab8d49db2dfaf74c7b48751b07 -size 115020 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-newTemplates-city.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-newTemplates-city.jpg deleted file mode 100644 index b964ceea..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-newTemplates-city.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d68835578bd1b2ed63f8ea57ce67d6e979b2062593cd552a68b85b9882d62b7b -size 73784 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-newTemplates-spaceship.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-newTemplates-spaceship.jpg deleted file mode 100644 index 5435523f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/devTemplates-newTemplates-spaceship.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea8cd64238f3b5ec90a8296afd23d232adf8282972dc33229289af4317acf5a3 -size 54584 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/hero-banner-peopleTalking.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/hero-banner-peopleTalking.jpg deleted file mode 100644 index 2377db0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/hero-banner-peopleTalking.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a30c1f205f2b3a5b8668f5d6c555db094928e8968694b45a402259121998b69 -size 142001 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/hero-classroomLab.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/hero-classroomLab.jpg deleted file mode 100644 index 7310b1f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/hero-classroomLab.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:796709994ce5b1fe134fe65188ed226fab580bdc7b858afb0d6cbcbb6a5231f1 -size 102281 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/impactPage_hero.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/impactPage_hero.jpg deleted file mode 100644 index 6c7adf1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/impactPage_hero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93463a0e7ea3930714828101a7cee16ca346cda6b8d75c14d0e4f5267a8132a9 -size 230818 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/introToGameDesign_thumbnail.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/introToGameDesign_thumbnail.jpg deleted file mode 100644 index 98185e05..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/introToGameDesign_thumbnail.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:525f1a9e4595e2d375d2ef6759846419e6f817e40cb85c9576dbdb98c4b3ac8e -size 40418 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/introToStudio_thumbnail.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/introToStudio_thumbnail.jpg deleted file mode 100644 index 2f162175..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/introToStudio_thumbnail.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79c0f51300972e44b016daaacc272ea8424e6ee86f782bb65aa1a38529060f84 -size 42409 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/knnoss-palace-example.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/knnoss-palace-example.jpg deleted file mode 100644 index 61448137..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/knnoss-palace-example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9db83cc53e04e3c7b34790027db778c7b49dc691773b38835502025fd242183 -size 542167 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module1-exampleStudio.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module1-exampleStudio.jpg deleted file mode 100644 index b8a02b69..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module1-exampleStudio.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cbe3a2fa998d4a91bf381da0288956fc7cbd4fd9c68e16da2a8ac82b702b633 -size 446183 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module1-gameExamples-normalCurve.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module1-gameExamples-normalCurve.jpg deleted file mode 100644 index f18b1640..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module1-gameExamples-normalCurve.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84fe5da1cd2e9775a72d9f46e97034975ce9b3db2ce9a4b7fde8a3dc0ed17a20 -size 98756 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module1-gameExamples-ocean.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module1-gameExamples-ocean.jpg deleted file mode 100644 index b2fd9727..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module1-gameExamples-ocean.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20fa7b535666f5d899e9a094193ad8395ace908632ac0f46da9111ceac83c093 -size 85808 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-addEmail.png b/.cursor/rules/roblox/en-us/assets/education/legacy/module2-addEmail.png deleted file mode 100644 index 75e0ae15..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-addEmail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be50243cf84085d53ee3b73f0b8b6b7ea4995de80b09dc268d20a03fa3d12b21 -size 54651 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-capture.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module2-capture.jpg deleted file mode 100644 index 8dc8d656..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-capture.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3bdc40e445e26b128ab74e59761e3ef8c755ae97aeac2f6f5b3c23f18cefc0b -size 57893 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-clickPlay.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module2-clickPlay.jpg deleted file mode 100644 index 464484c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-clickPlay.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:411a629398a3b8d53be8738e15f149dc6555b884a472fda72ac52d9b3dddce43 -size 289807 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-finishedTraining.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module2-finishedTraining.jpg deleted file mode 100644 index 9189697c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-finishedTraining.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:050bacb01e08bfae6a2e38d9d18e007b937a22cb102e24fd9f5eb8082faab6ed -size 87565 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-gamePage copy.png b/.cursor/rules/roblox/en-us/assets/education/legacy/module2-gamePage copy.png deleted file mode 100644 index f2d5b346..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-gamePage copy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c17d9f6bf46fb728b8d082abedffaf17423774eb4424aadaf27036d167fb77f -size 350693 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-gamePage.png b/.cursor/rules/roblox/en-us/assets/education/legacy/module2-gamePage.png deleted file mode 100644 index 01d1c89f..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-gamePage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:914ea21c7b510694d860fa6228b33811170209002b82b429b59ccbb664f9fe62 -size 344710 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-homepage.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module2-homepage.jpg deleted file mode 100644 index 35708a4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-homepage.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9791cd6db351655137b2038028a69bf52543b83f16708afe313d9272f84a908e -size 65593 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-settings.png b/.cursor/rules/roblox/en-us/assets/education/legacy/module2-settings.png deleted file mode 100644 index deb3fda5..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e6ded29670d4725ef852e7e63ec243745ea53b77fc00472c02e76f781bcaab2 -size 16122 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-trainingExample.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module2-trainingExample.jpg deleted file mode 100644 index 108cfd01..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module2-trainingExample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf5e43ec99459cb01a1870e00196d9d82afa182ce655cbce9039e349f75317d0 -size 166382 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module3-signinScreen.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module3-signinScreen.jpg deleted file mode 100644 index ef3b4266..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module3-signinScreen.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cb1e373d67f017114c16a791d397845e2ff250d9463e8b35dd314a9d7cb1255 -size 76460 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module4-luaLearningQuiz.png b/.cursor/rules/roblox/en-us/assets/education/legacy/module4-luaLearningQuiz.png deleted file mode 100644 index ea95d448..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module4-luaLearningQuiz.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc6d49631c143f2e921abe9932313877d7fbeb278bd6b16f64405a9f5b9a0ddd -size 19300 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module4-showChat.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module4-showChat.jpg deleted file mode 100644 index 30fa671b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module4-showChat.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8659ab7b1c61ca1b3d7356663bb0b9a17ca95bf6f737a4b5bda07fcef76a019e -size 27010 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module5-gameImages-450x250-lua.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module5-gameImages-450x250-lua.jpg deleted file mode 100644 index 136e24fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module5-gameImages-450x250-lua.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40452f30e5f565baba272710527bbc2a66f5bcf2d36ea023bca800560245ca0f -size 21119 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/module5-gameImages-450x250-ocean.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/module5-gameImages-450x250-ocean.jpg deleted file mode 100644 index 30ef043d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/module5-gameImages-450x250-ocean.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:494ef056b5bfe2da53ee1fb9a5fd0252831bc349d1b574bca25d54cf4e5f3984 -size 82087 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/plane-crazy.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/plane-crazy.jpg deleted file mode 100644 index 8d18d36e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/plane-crazy.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b51198d2bfffefe6022dab5adff1f2a46af3a071b526830ab9ec468e5c076c3 -size 37391 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/thumbnail_digitalCitizenship.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/thumbnail_digitalCitizenship.jpg deleted file mode 100644 index 38a72dcf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/thumbnail_digitalCitizenship.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a1bbf0fa2cc28f21bbc555516587afa183e62a5454799e78b008d824be2b329 -size 60956 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/thumbnail_digitalCitizenship_312x200.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/thumbnail_digitalCitizenship_312x200.jpg deleted file mode 100644 index af65a74b..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/thumbnail_digitalCitizenship_312x200.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:829d6b3d26e8d0e2b3f6c331a186cba056aeda50db91cc55428a92628ed3f98b -size 50716 diff --git a/.cursor/rules/roblox/en-us/assets/education/legacy/worldbuilding_thumbnail.jpg b/.cursor/rules/roblox/en-us/assets/education/legacy/worldbuilding_thumbnail.jpg deleted file mode 100644 index 46063d4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/legacy/worldbuilding_thumbnail.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea70c53cc042366e613d7554cef0693268e8d294ef744bb01f172adc502e3f8f -size 50194 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/adventureGameReferenceHandout.pdf b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/adventureGameReferenceHandout.pdf deleted file mode 100644 index bab381e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/adventureGameReferenceHandout.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f35f8a9a436825238d0a1834f4db7aff6624061adc74199635fe8a3a495a434 -size 124135 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/adventureGameVisionHandout.pdf b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/adventureGameVisionHandout.pdf deleted file mode 100644 index a0313eb7..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/adventureGameVisionHandout.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c87233822a61ba5d569bdf7a4204a50dd8ae29f0922d118a89d9ec000d4c5ebb -size 95312 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-evaluation.pdf b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-evaluation.pdf deleted file mode 100644 index c8832e95..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-evaluation.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31cd7b6f2e12b5cb90691dd2df1398c4207f3bc1f7e50f0942ee7e2744064049 -size 72032 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-hero.jpg b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-hero.jpg deleted file mode 100644 index 8a6f7152..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-hero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:381ffe99ba9cbe7be8cef107cf9fda34003a09de6de71ca961002613ccdcc621 -size 84335 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-presentation.pptx b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-presentation.pptx deleted file mode 100644 index a5301cd1..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/animateInRoblox-presentation.pptx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ddbf1e6c880ed01d871569525184c545d2f27fa344579ebec9d812c1fe32441 -size 5330326 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/createAndDestroy-hero.jpg b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/createAndDestroy-hero.jpg deleted file mode 100644 index dbd95807..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/createAndDestroy-hero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59953e970eb28683cac51da171c1be1b71f587066ca43a2ec87e64a42eb13ac4 -size 245084 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/createAndDestroy-presentation.pptx b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/createAndDestroy-presentation.pptx deleted file mode 100644 index 930d1bb4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/createAndDestroy-presentation.pptx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f30b50f9125f72c20ab85d0a2c9e698d0b1bece92bccf67e2d79791cc1d72153 -size 6670391 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galactic-speedway-hero.jpg b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galactic-speedway-hero.jpg deleted file mode 100644 index 82d3dda4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galactic-speedway-hero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e98b92863283e304106956e9bb827056447cc7436f7c266055b65c987eca24b1 -size 134609 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-evaluationHandout.pdf b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-evaluationHandout.pdf deleted file mode 100644 index 75126a41..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-evaluationHandout.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0bbf1e8d935e9d4c576a2a190e872e80e8493aece42d11f300d6caf11490815 -size 47416 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-presentation.pptx b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-presentation.pptx deleted file mode 100644 index 5d898636..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-presentation.pptx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8696ba82dd9f13bd4df88c8f9b90650b25dd0797a1e78fee8875be186d2a0725 -size 7052174 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-quizQuestions.pdf b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-quizQuestions.pdf deleted file mode 100644 index 4cb3202a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/galacticSpeedway-quizQuestions.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ea0cf39786cdfed4437a59485bc9a59d516cd3d2af6131b0eaa14b901c740bc -size 65282 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/introToGameDesign-brainstormHandout.pdf b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/introToGameDesign-brainstormHandout.pdf deleted file mode 100644 index 71b97316..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/introToGameDesign-brainstormHandout.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bae3a579782beda47f30c174f2283841c3a9286406e7b166869ac0fce1b82be -size 56240 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/introToGames-hero.jpg b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/introToGames-hero.jpg deleted file mode 100644 index 71ddcd19..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/introToGames-hero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09962f4848396f06ba4d54844802f990ceda0302613e1a69f121fb1303a84c29 -size 115262 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/robloxDeveloper-hero.jpg b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/robloxDeveloper-hero.jpg deleted file mode 100644 index a4577d55..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/robloxDeveloper-hero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faad2f30d7db7521c5a881e1f99b5e32861d08aebc055503ef970fa99d34acbc -size 81074 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/storyGames-hero.jpg b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/storyGames-hero.jpg deleted file mode 100644 index 2c82bb6a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/storyGames-hero.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:317075e3b9713c31b0be11c4b1a7dff26fd12f724e25dab8ccab40af352982ca -size 146838 diff --git a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/storyGames-overviewVideo.mp4 b/.cursor/rules/roblox/en-us/assets/education/lesson-plans/storyGames-overviewVideo.mp4 deleted file mode 100644 index ec32c7c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/lesson-plans/storyGames-overviewVideo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b117ee2c8bfa4ec4b4c1666c6906dd64d5bba63352b0cca67e3d49b8535e24a -size 4008902 diff --git a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/edu-marketing.zip b/.cursor/rules/roblox/en-us/assets/education/stock-graphics/edu-marketing.zip deleted file mode 100644 index dbce0099..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/edu-marketing.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b93649782d4cca69883610607d087cb579393c46590c07ecd54af92ef717051 -size 502048545 diff --git a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-robloxHighSchool.jpg b/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-robloxHighSchool.jpg deleted file mode 100644 index d3ce1d4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-robloxHighSchool.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13b265a7b2dd1b772419cb1b7b9d2c99949987784daf83cb4def5920ee9700de -size 138867 diff --git a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-robloxUsersPark.jpg b/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-robloxUsersPark.jpg deleted file mode 100644 index dbddd08a..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-robloxUsersPark.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89dbef696fb2926f0d1f4e4b811e835c54e86d5989d3c1af13c51cb5425d1327 -size 220130 diff --git a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-spaceStudents.jpg b/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-spaceStudents.jpg deleted file mode 100644 index 942040ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-spaceStudents.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2163c31f41a65bffc0ddac29f5afe24454129abed02770aa9327c96535d8109 -size 134725 diff --git a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-studentTeaching.jpg b/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-studentTeaching.jpg deleted file mode 100644 index 04f0e86c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/hero-studentTeaching.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3548b9ee57120bd82843304c1d48a276c6821dd6b158bf349cd0ef1e5166c39d -size 82321 diff --git a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/thumbnail-studentTeaching.jpg b/.cursor/rules/roblox/en-us/assets/education/stock-graphics/thumbnail-studentTeaching.jpg deleted file mode 100644 index 0eadd87c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/thumbnail-studentTeaching.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ed7c6b425c5c93d88b8551d024eca738e46de698de8499c3045a25438770d53 -size 45219 diff --git a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/thumbnail-teacherInClassroom.jpg b/.cursor/rules/roblox/en-us/assets/education/stock-graphics/thumbnail-teacherInClassroom.jpg deleted file mode 100644 index 7010cbf4..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/stock-graphics/thumbnail-teacherInClassroom.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec5a0a8af602ec1bc54dd1e27b42c0162f40c9bdd147d608d2303e97507c74d7 -size 47810 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/StoryExample.png b/.cursor/rules/roblox/en-us/assets/education/story-games/StoryExample.png deleted file mode 100644 index 807b4d85..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/StoryExample.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c0bb3328013180a65bb38e338bbc9ff468d9af8b8463b18041789d330687747 -size 265318 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/StoryManager.png b/.cursor/rules/roblox/en-us/assets/education/story-games/StoryManager.png deleted file mode 100644 index d41b054c..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/StoryManager.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ec552182377da6da9774a7050c8a3f487993222778cb3f11170093420384ff0 -size 34648 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/Story_Games_Template.rbxl b/.cursor/rules/roblox/en-us/assets/education/story-games/Story_Games_Template.rbxl deleted file mode 100644 index 51d125bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/Story_Games_Template.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:657503a99bdddf4e151099d10102b079b7df0aacc0e14476f51449924a350894 -size 93818 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc2018_annotatedStory.png b/.cursor/rules/roblox/en-us/assets/education/story-games/wcc2018_annotatedStory.png deleted file mode 100644 index 3d5b8600..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc2018_annotatedStory.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ba1760a6a3cd5c998af585e2a86ae24fdf289046a0d332388c349ab8b54170d -size 30256 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc2018_quizGameExample_900x500.jpg b/.cursor/rules/roblox/en-us/assets/education/story-games/wcc2018_quizGameExample_900x500.jpg deleted file mode 100644 index a5080dbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc2018_quizGameExample_900x500.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c31ef5ac8dd1cf709a3037a71817a45197cf3948601355ad58671ddc84eeff4 -size 100968 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/wccVideo_final_wSound.mp4 b/.cursor/rules/roblox/en-us/assets/education/story-games/wccVideo_final_wSound.mp4 deleted file mode 100644 index ec32c7c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/wccVideo_final_wSound.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b117ee2c8bfa4ec4b4c1666c6906dd64d5bba63352b0cca67e3d49b8535e24a -size 4008902 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroOverhead.jpg b/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroOverhead.jpg deleted file mode 100644 index 5f2b9280..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroOverhead.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cf94f1c2b96284676508a29ea4e0a53e3a6681b8a09de42bfb3b1e665612e83 -size 145104 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroPedestal.jpg b/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroPedestal.jpg deleted file mode 100644 index f06f8870..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroPedestal.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0aad244721e6c05f3fd486a3e0901ba80a186e1ff45ed760fa8496efde5f9e15 -size 85996 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroUsing.jpg b/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroUsing.jpg deleted file mode 100644 index 38a66ca2..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_heroUsing.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c794059e3b01a445c8177a1e7889dc504e8950b609599d3155ada9de7aa81103 -size 111960 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_1.png b/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_1.png deleted file mode 100644 index 08c118af..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:255d135d48a7972681e446094a6a6f0c0d646638b47a5ff59ebcf963c27eae6c -size 47322 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_2.png b/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_2.png deleted file mode 100644 index 84edeb20..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02daecd102adaeb32217e9e0bd0003560c74d3421de3f7f140b5dc878c21abfd -size 69833 diff --git a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_3.png b/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_3.png deleted file mode 100644 index 16aff9bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/education/story-games/wcc_lessonThumbnail_3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ca7ac393fc7c75cd61fbab38cb90ef97e710a345cd6d0c5a60b88724e6cb2a2 -size 110844 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/ArcHandles/ArcHandles-Example.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/classes/ArcHandles/ArcHandles-Example.jpg deleted file mode 100644 index b391fc8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/ArcHandles/ArcHandles-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14f009c4345b914b02d39f8832fadb281f5dad61780ba613a4c1bffb4430f094 -size 173952 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/Beam/Curvature-Diagram.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/Beam/Curvature-Diagram.png deleted file mode 100644 index 17e88de8..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/Beam/Curvature-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe795848d6e2761237a0e322c03cce53b34cff03648e3cf9a4e12bac1f1f8969 -size 312376 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/DeviceSafeAreaVsFullscreen.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/DeviceSafeAreaVsFullscreen.png deleted file mode 100644 index 663f76f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/DeviceSafeAreaVsFullscreen.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9e16043206e975bedc018b6e15b0c74ebaf7a0df55b520f82539dd5dd58d8dd -size 349377 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/NearPlaneZ.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/NearPlaneZ.jpg deleted file mode 100644 index 522bab05..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/NearPlaneZ.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdffb2547a3cdc3ef224de045f52fc69f823ee2a663febf3fa0c57105945f001 -size 283403 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/ViewportPointToRayOrigin.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/ViewportPointToRayOrigin.png deleted file mode 100644 index 127514fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/Camera/ViewportPointToRayOrigin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:864741016b22c13fa132017e021183dad5fba5641a7fb98def80154aba841aef -size 325771 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/DepthOfFieldEffect/Depth-Of-Field-Diagram.svg b/.cursor/rules/roblox/en-us/assets/engine-api/classes/DepthOfFieldEffect/Depth-Of-Field-Diagram.svg deleted file mode 100644 index 06c68b2f..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/DepthOfFieldEffect/Depth-Of-Field-Diagram.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee44decaae436b008d368687fe7e2f2b69c6c8b8c8979ff3cdb06446dbb5eba5 -size 10910 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/GetAdjacentTriangles.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/GetAdjacentTriangles.png deleted file mode 100644 index 80a759b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/GetAdjacentTriangles.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c857a1e90218d202fef2061639608ae27a50665a781bc9848feedea2bb9abfd -size 9271 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/GetAdjacentVertices.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/GetAdjacentVertices.png deleted file mode 100644 index 90f9d956..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/GetAdjacentVertices.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a27b272cb51172e9161c11bf57270c5f6f7930b4ae2862dc5679e394ee9bf59c -size 8273 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/Winding.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/Winding.png deleted file mode 100644 index 7190f2d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/EditableMesh/Winding.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f085294bf773d926beb238ea5f808b77186c04fa734afcf586a64c1bed87f99a -size 29288 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/GuiBase2d/AbsolutePositionCoordinateSystem.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/GuiBase2d/AbsolutePositionCoordinateSystem.png deleted file mode 100644 index 9aa18bd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/GuiBase2d/AbsolutePositionCoordinateSystem.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0022f040550c3f2ed338203a2b2fc267dd3f15974add0fbd465c7cc0287dc211 -size 349547 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/HapticEffect/Position-Radius.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/HapticEffect/Position-Radius.png deleted file mode 100644 index d394be57..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/HapticEffect/Position-Radius.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec286d76443dd0a5320b0665b18c4b61f0930f7b24621dbb8180867ad15bce81 -size 116693 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenGui/ClipToDeviceSafeArea-False.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenGui/ClipToDeviceSafeArea-False.png deleted file mode 100644 index 246190f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenGui/ClipToDeviceSafeArea-False.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ec52767b1899ae4e3bc03d1665d5a4388400a097dd531df0074d90263bffcd2 -size 336032 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenGui/ClipToDeviceSafeArea-True.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenGui/ClipToDeviceSafeArea-True.png deleted file mode 100644 index a98898a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenGui/ClipToDeviceSafeArea-True.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:340061c127397d0977ad3cc7246122dfc61111030e39577e0e84fe158da59be4 -size 334083 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenshotHud/Diagram.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenshotHud/Diagram.jpg deleted file mode 100644 index 61361021..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/ScreenshotHud/Diagram.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42819acf63845a202d8ddd569b91b5bd76a787915e9f48e5b2ac78e454c47011 -size 212188 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FillDirection.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FillDirection.png deleted file mode 100644 index 2bfa93a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FillDirection.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f8d4a14076f5b793a82e93c8549440c8fe8088b61072d640d6af7b39a94195 -size 40081 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Fill.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Fill.png deleted file mode 100644 index dab4a58b..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Fill.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69714eef99ea1c602996475ea803f1e6d89be41ec6c6f24e5dd15c18779f32ad -size 48700 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Grow.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Grow.png deleted file mode 100644 index ce0cb51a..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Grow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64f763680c168038173293cf53ea58d63074941838155d221df474ab6119ea52 -size 25823 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Shrink.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Shrink.png deleted file mode 100644 index 8ab5ba17..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/FlexMode-Shrink.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e00b1fc438dcd1dd091710cafec4de8a24a5152017dfc856853331b67dbce4a7 -size 25702 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Cross-Direction.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Cross-Direction.png deleted file mode 100644 index aa9ea15c..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Cross-Direction.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6051bf7777905dbcd65863c28d03ef9363356e5cca7e89adc60df9233b30ca3e -size 28522 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Options.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Options.png deleted file mode 100644 index ec1fee19..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24a5df3a8e71f9726224c0978d4fb2acf991826f970d9871741b3e1a7c9e9fd7 -size 65055 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Tabs-3.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Tabs-3.png deleted file mode 100644 index c2ca70b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Tabs-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:543d676381e4a65ad2f92dadd57d7cc1280cb29e8071cab7275c4f32cd46a29d -size 165158 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Tabs-6.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Tabs-6.png deleted file mode 100644 index 51d0d2b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/HorizontalFlex-Tabs-6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dab6905839a4a0457c48d4ee90cf018c6e9df93ec6b5da7f38801dcb573cc131 -size 170940 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment-Start.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment-Start.png deleted file mode 100644 index a51cb6d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment-Start.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53cf1cc2ccf757260f3e62d464542833f449e5166c98a7e353cda6212f5c398d -size 173561 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment-Stretch.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment-Stretch.png deleted file mode 100644 index 6629ef41..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment-Stretch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e50e06c7b785300e3ce459735f934423662470dd2f26773377747992791b8b7 -size 176420 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment.png deleted file mode 100644 index d7d3e612..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/ItemLineAlignment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53bf95f93831b019396c2b04c1b172f9c711549e5a94414dd28f32b631be91ce -size 80107 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/SortOrder.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/SortOrder.png deleted file mode 100644 index 5a11b689..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/SortOrder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccf852b0ee52ae208bd93b994d8106081acad9f56299b41a18ed6f2506002738 -size 23376 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalAlignment-Center.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalAlignment-Center.png deleted file mode 100644 index b2b6656c..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalAlignment-Center.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37307a274d34e1e26f584f775324f4447d40a02fa0c66e4db42e2919a2ae830a -size 22410 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalFlex-Cross-Direction.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalFlex-Cross-Direction.png deleted file mode 100644 index 70c58f88..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalFlex-Cross-Direction.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4fb5f12e046a865d7be36eeb6540219bfbe4e4f0ffea6765fe1dfd42ce01099 -size 31174 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalFlex-Options.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalFlex-Options.png deleted file mode 100644 index 1c9b69b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/VerticalFlex-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99de0c73d56072f8714e5037d6ac4c6e5a63ea7446d194b03966303b4138a47e -size 55021 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/Wraps.png b/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/Wraps.png deleted file mode 100644 index f9d939bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/classes/UIListLayout/Wraps.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4d611b4c6f69bec1f4e06595f4f536aef8dc5554bd52d7b088e5e3123d42eb3 -size 33345 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Accanthis-ADF-Std.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Accanthis-ADF-Std.png deleted file mode 100644 index 6194cbac..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Accanthis-ADF-Std.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acf237bddd1277427d4cc229d9c59b88e1c5a14dc2ac015106b58afecc45f863 -size 32166 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Amatic-SC.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Amatic-SC.png deleted file mode 100644 index 90a41434..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Amatic-SC.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa035b465b104219c4c60eedbff50c0184c530697123eacdf7a4b4350d275253 -size 57588 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Arimo.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Arimo.png deleted file mode 100644 index 859ae98b..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Arimo.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebbe34a47535cbb9aac399f6f0605d60e7514153520516ec5b12ecf36151d659 -size 79821 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Balthazar.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Balthazar.png deleted file mode 100644 index 551aaf92..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Balthazar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb07cdb82c64cd519b4e1f4bf9665d182d9f3c3ca04199ef58241f923a8c93a5 -size 36904 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Bangers.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Bangers.png deleted file mode 100644 index a283fbdb..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Bangers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e82c11aff3329e71ab69d2a669361bf75ab83e2a4dfabe1ca123b7241597a28 -size 43159 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Extended.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Extended.png deleted file mode 100644 index bacbeebe..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Extended.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19b1f77eddc0d4055712a37aeb0e7d41cbe388e8b979a4920b79943e736eb494 -size 89138 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Mono.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Mono.png deleted file mode 100644 index 9c5df783..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Mono.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6275a0279861f5edecabd85d6f1017ac7b302ab3117028fe9781184b60b296ee -size 59182 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Sans.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Sans.png deleted file mode 100644 index 00d73b38..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Builder-Sans.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff84a3fba4c66b5693e9cfacf00085b352d9605db73b360bcc1b419d61277acc -size 118002 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Comic-Neue-Angular.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Comic-Neue-Angular.png deleted file mode 100644 index 472922f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Comic-Neue-Angular.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05c29453bd8745d2a00fa51528756f26f3299a9b103fbbc08884664fd0bb1b1b -size 30122 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Creepster.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Creepster.png deleted file mode 100644 index 6226c145..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Creepster.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f456c6c10b070568f5a8ec4eeb9cf413c1fd15130bab6e068597a1d85a9b2b8f -size 42584 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Denk-One.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Denk-One.png deleted file mode 100644 index 3a95057a..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Denk-One.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b948c2d9b165fd8231182af06182c29f1134ca9f77497258d9740ee89a20b42 -size 33671 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Fondamento.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Fondamento.png deleted file mode 100644 index bda43f28..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Fondamento.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ec928034cc0718c553b1e2cec2e59bc8feb96c88d427d454678efede157e9e7 -size 36233 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Fredoka-One.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Fredoka-One.png deleted file mode 100644 index 123c5ad0..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Fredoka-One.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2b72f9c6c01e956d06a43c2bcdd4674fa45771cae86ac826771bd62fc8580bc -size 33990 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Grenze-Gotisch.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Grenze-Gotisch.png deleted file mode 100644 index 509017b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Grenze-Gotisch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78b01197aa6d13e504ef9fa68cbb549abfbb4f474358fcd8caf2f1033616b4f6 -size 186658 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Guru.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Guru.png deleted file mode 100644 index 1c6d84e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Guru.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5466f2119a7681a420c4f23570d48aaf5b92e2edfc561bcceca1638db5cffdbd -size 35920 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Highway-Gothic.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Highway-Gothic.png deleted file mode 100644 index 3f20d59a..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Highway-Gothic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1505cbcfe40c54dc29ddec6266e51beab9b5d1f2c4e8841851283d605026f1f8 -size 28814 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Inconsolata.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Inconsolata.png deleted file mode 100644 index dbb7e2fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Inconsolata.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:004a8d9f2028ae8ff11e747dd51196aed7e4fa14e4e2ca02402294278b6697dd -size 122226 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Indie-Flower.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Indie-Flower.png deleted file mode 100644 index 71571e75..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Indie-Flower.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d642de76880cd71423d7d383816d5b457d893b35d8baa3d58d720d4981c127c -size 37199 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Josefin-Sans.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Josefin-Sans.png deleted file mode 100644 index 02ca575f..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Josefin-Sans.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5896f44e556b8c2ed73455917de1fb97988ae9f093bd6919044584972c5288b5 -size 111090 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Jura.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Jura.png deleted file mode 100644 index 2b8d437e..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Jura.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38441ec9ca3d1064c280e2e4a05476018375fbd0a326b0aeba94608e96c306bc -size 80932 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Kalam.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Kalam.png deleted file mode 100644 index 41065dee..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Kalam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:465f846264d84a0c2f1dd9e664a283af52d05e3cc3431f3b35c043228dc38394 -size 80186 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Luckiest-Guy.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Luckiest-Guy.png deleted file mode 100644 index 751e48b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Luckiest-Guy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e559949f061690d0e6cda902dc0fb0988fa2c047354bff2bcd607ae4f70bb46a -size 33397 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Merriweather.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Merriweather.png deleted file mode 100644 index 8290635b..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Merriweather.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a6dbd1080057f8d98f167081cd827b3ef5b4a8fc5885622bd81e80d27ecd063 -size 94643 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Michroma.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Michroma.png deleted file mode 100644 index 19171807..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Michroma.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7d590ca20b2ce71e2dc687a55df7a13697761d3c3431a875f13e5295aee6d6b -size 25987 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Montserrat.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Montserrat.png deleted file mode 100644 index 5d1966c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Montserrat.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92a41ea05b811f41ad8fd468d583d7317d50e6478752ffec1b590903d7156fb7 -size 128880 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Nunito.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Nunito.png deleted file mode 100644 index 55057bd2..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Nunito.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:088d22d5f98467396b6643a64ad20d7f8e62d1626f0a913552b8db4ddb420468 -size 127754 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Oswald.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Oswald.png deleted file mode 100644 index e115db0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Oswald.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0761ac81833fa75cf79eef315f783b25fb8762d5aea7fa4d7706e1d56bbb768 -size 102737 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Patrick-Hand.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Patrick-Hand.png deleted file mode 100644 index 94da5686..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Patrick-Hand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:819ff13cc2020b616f605c8746c71af1c0e957d17b6fddbddf6b44cba0eebcb3 -size 36452 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Permanent-Marker.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Permanent-Marker.png deleted file mode 100644 index 1488db78..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Permanent-Marker.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69a21de97685ae9431ec6fb425ba2d2d34151f8690dfb96bbb92d8ebb4117e71 -size 35978 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Press-Start-2P.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Press-Start-2P.png deleted file mode 100644 index 1756cd7c..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Press-Start-2P.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac2cc19d1751597fbf5d045b516cf343347c7d96a8b1ce07017b21c73d68dbc0 -size 14099 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto-Condensed.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto-Condensed.png deleted file mode 100644 index f1ff12d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto-Condensed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a88de4e512c49ae73c2feef095f37b863210d4d3fa8653afc1e953d53b41a90 -size 56891 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto-Mono.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto-Mono.png deleted file mode 100644 index 7872f773..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto-Mono.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f30c122cb630ddaacd715d49ddd799d674dc08564855784faa0950dbdadb9a8 -size 120528 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto.png deleted file mode 100644 index 7b328e6c..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roboto.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ba39e75c022714c3998d67b76227bdbc9605bf6cba207b290d077405eab810e -size 104898 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roman-Antique.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roman-Antique.png deleted file mode 100644 index 07bd590a..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Roman-Antique.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9459d98f38f90d9de813aaab70267f10c97c4652411cdb4d753a39ee1105f4a4 -size 39169 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Sarpanch.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Sarpanch.png deleted file mode 100644 index 8fd128a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Sarpanch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab5cda0a5fd60a733ec088b3b61bb1165fb487284a1c842819865763e89500fd -size 72114 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Source-Sans-Pro.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Source-Sans-Pro.png deleted file mode 100644 index 41024a10..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Source-Sans-Pro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f9d287360e7c5daf578feb5eb1f31a0018f33b5b20c277650d77b53c5cd723d -size 108195 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Special-Elite.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Special-Elite.png deleted file mode 100644 index 005cc714..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Special-Elite.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a6e45a50af210d8e97929ee30497bf5e24baacef53663b108a57369723fca9e -size 43879 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Titillium-Web.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Titillium-Web.png deleted file mode 100644 index bc559848..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Titillium-Web.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee65dbf2150093eda00a0330cbd264829eca6692531d8671abb6b3a0c5b3ffa8 -size 105367 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Ubuntu.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Ubuntu.png deleted file mode 100644 index f588bbf0..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Ubuntu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ca849e63a626c32019ce1d187ba4de6453febdd396226dbfec6d2492b047393 -size 78779 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Zekton.png b/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Zekton.png deleted file mode 100644 index ef3fe169..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/datatypes/Font/Zekton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80d9c9c74fc0746b609ffbe2487447618d4cc5cf7e6d1db5b88bfb935160d31f -size 25810 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AlphaMode/Fern-Cutout.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/AlphaMode/Fern-Cutout.png deleted file mode 100644 index c9622f6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AlphaMode/Fern-Cutout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3ce87941d82258178b92a39c173b94a7c3de3f510dfbee8bac10a27d5290db0 -size 249943 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AlphaMode/Fern-Overlay.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/AlphaMode/Fern-Overlay.png deleted file mode 100644 index c9993f8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AlphaMode/Fern-Overlay.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05e8fbfc9beb5f83c9c17133cfdbd21752cac3c8e91fa9f868e40591f0b4ae60 -size 275478 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Mono.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Mono.jpg deleted file mode 100644 index f3f2235b..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Mono.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82fda136126cf7eb9723d5f18db346178b9c9cdddb71c4faeaedc412c66b49a3 -size 196751 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Quad.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Quad.jpg deleted file mode 100644 index baa1016b..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Quad.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23a023234a880eee589506733c6bb3443c97d7b2eb5220eb6707e98999c22fea -size 222797 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Stereo.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Stereo.jpg deleted file mode 100644 index d4425a1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Stereo.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b13296c511654e74e4305d1b3deca1d6fad29b3f34c19f4d6ffefca39523411 -size 203627 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_5.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_5.jpg deleted file mode 100644 index 112dd58e..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7df6717f66f5b521ea4bd8da1c56250aaaafd3501be39453d8ba97ef656558dd -size 227595 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_5_1.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_5_1.jpg deleted file mode 100644 index 7ed98100..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_5_1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc2cefe0bd786511e031a7ac66a96b3b7f02541971e913841fa4504d4f556b23 -size 230861 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_7_1.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_7_1.jpg deleted file mode 100644 index 97293c70..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_7_1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97e3987815b364fd768867ff81cf2b3314d6eeac1f2fd4556cd4a9504e1a5540 -size 251067 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_7_1_4.jpg b/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_7_1_4.jpg deleted file mode 100644 index 0ba70b60..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/AudioChannelLayout/Surround_7_1_4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:728f0113eee24026a02e49901bfddc532ac90fdff1fe543af59779942b690532 -size 288760 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-In.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-In.png deleted file mode 100644 index 2939ba22..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-In.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81118254962813c671617216b0693d312a1d4055f9733e91575e596a6da55432 -size 128510 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-InOut.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-InOut.png deleted file mode 100644 index 5760d9eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-InOut.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b001782d33abec4c6864a468152df838ec1d278c210c35012e9e2ede3660d2f -size 127321 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-Out.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-Out.png deleted file mode 100644 index b7a055ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/EasingStyle/Easing-Styles-Out.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f13cad7b9573a817666966fe877ef39c41b980adb4ab06f4d9cd9b4a401f0413 -size 126595 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/AmaticSC.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/AmaticSC.png deleted file mode 100644 index 74ea178a..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/AmaticSC.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5635c28a2314308178be5f5e8f846f2742e013fc6e02eb66051a5e223c38e062 -size 31753 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Antique.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Antique.png deleted file mode 100644 index 5e64e3a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Antique.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:645521fd0b548658bb81ed697b0ddfe75f78e1a86b1dfaf86cce1669ceda474a -size 40303 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Arcade.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Arcade.png deleted file mode 100644 index 8514c9c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Arcade.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c226edee055d94c4ea68c19b7c943e9a903e1c0fc279627d7b731d6cdeb6f5a -size 12094 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Arimo.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Arimo.png deleted file mode 100644 index d1fd2c05..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Arimo.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1217aead581b14d826092ee285ed8d0aedadd78f2fc296f22cac85e7e33ee39 -size 31653 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/ArimoBold.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/ArimoBold.png deleted file mode 100644 index febf134e..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/ArimoBold.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87fd1f7b50afe1f2a9155ad1fc6614f29c9958a1286af3fd7d513e0011f4faed -size 31570 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Bangers.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Bangers.png deleted file mode 100644 index 3fff1afb..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Bangers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:121a995ec24e119c325ddba421e9d727ed83580fecab6175f49df884c4f585ac -size 41506 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Bodoni.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Bodoni.png deleted file mode 100644 index c642b8cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Bodoni.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a42112fe8df4d40972d6ee585ca81a81dda130b635130bb61c275909f86a1844 -size 30879 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSans.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSans.png deleted file mode 100644 index 2d1dec14..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSans.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8560cae37a4c6760acff5b78ca38a57f61374f598950c0ae88df5398e136e4cd -size 31927 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansBold.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansBold.png deleted file mode 100644 index 26fd67c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansBold.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4da08afe2669833f9a599aa99f7dff823ff533aefef957174c052c14bc60d1fe -size 31281 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansExtraBold.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansExtraBold.png deleted file mode 100644 index 78fdf60b..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansExtraBold.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48c028a04914009a9cc624791082e9085454ee73b8ba658d111ae42344b26c22 -size 31577 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansMedium.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansMedium.png deleted file mode 100644 index 3888527e..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/BuilderSansMedium.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d57936a3ee1503d3b1e1996aca5e762df9c0650e0debd2b7348511b7dafaf6f -size 31910 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Cartoon.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Cartoon.png deleted file mode 100644 index 9cb56812..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Cartoon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eeb6fd0a5f5f649d1c311f48c8664793a1f3a0e68c17a1c9a089d328de83910c -size 30762 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Code.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Code.png deleted file mode 100644 index 38fee7e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Code.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78fa859e534d5accdf087c25eab0f245e6946cf2d9b2c2b97e74ae67994ea08d -size 29380 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Creepster.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Creepster.png deleted file mode 100644 index b0c2aa4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Creepster.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bed3cae4b4140c0ecb3391d0d8a8817b3ae1ac2773b73d038058d179475bc534 -size 41283 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/DenkOne.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/DenkOne.png deleted file mode 100644 index 3c16e940..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/DenkOne.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f782e6b62aae6a05d950c1fa05ef745c6261b82cda57409eb527a19370348d3 -size 33273 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Fantasy.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Fantasy.png deleted file mode 100644 index 0a90197c..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Fantasy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47ad674314c90fa32520903c90bd1dffaa222005a570fe22661d2f4d2749d10f -size 36280 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Fondamento.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Fondamento.png deleted file mode 100644 index e689f7b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Fondamento.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc7e5fc174277fdacd0851f874ae1faf96f87f0c5d47531f1252158769740fdc -size 37945 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/FredokaOne.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/FredokaOne.png deleted file mode 100644 index 561b0ffa..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/FredokaOne.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfdc6b15d11732937462aae1b7646363fe5fb7ab09de836a782c0365119a37a6 -size 34786 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Garamond.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Garamond.png deleted file mode 100644 index 7e85f4b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Garamond.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3596ed52cbeb4b289b0cde9e5105baaf5131c66722cb19bf3e53368e77e78541 -size 36917 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/GrenzeGotisch.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/GrenzeGotisch.png deleted file mode 100644 index 39391fd0..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/GrenzeGotisch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9aded09802c9bc206f86153e81da471ca23e907d6f7fb30448c376d9c8597581 -size 38844 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Highway.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Highway.png deleted file mode 100644 index 1bd50d82..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Highway.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af9219ffda3f17fcbd5b66b355ab45b750d6e74d5df7272e2faaf44b96233928 -size 29958 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/IndieFlower.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/IndieFlower.png deleted file mode 100644 index 7c0355fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/IndieFlower.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:670dc62923883b31250101d25a2cc324807687a14ad4f0742419afeed1858a6f -size 38276 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/JosefinSans.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/JosefinSans.png deleted file mode 100644 index 3719722d..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/JosefinSans.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae010bbb35656ad45bd6bc480031ccec924e51ab55d92eb8075cd378ecee4ba6 -size 29920 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Jura.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Jura.png deleted file mode 100644 index 2b6d8baf..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Jura.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bc811c5d8119613af30c9062931467d921cb1fd380ba57655d4efade4a153a1 -size 29456 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Kalam.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Kalam.png deleted file mode 100644 index 7e4fab34..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Kalam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e80b475154289616979cfc061d51fde7477d7d6234de936b45c3ee31ba1bb07a -size 39318 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Legacy.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Legacy.png deleted file mode 100644 index d3400d37..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Legacy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70542f30127dc305648395830ac9678e76beace0cd41482fa58ce2d4e80f26c6 -size 30163 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/LuckiestGuy.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/LuckiestGuy.png deleted file mode 100644 index 2057e8d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/LuckiestGuy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d07d2cb01662659a5edb5a9c6fa39ffbdd55867358919cb977ff98673b970ceb -size 35346 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Merriweather.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Merriweather.png deleted file mode 100644 index 73a13abd..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Merriweather.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44c4eb40ce5258ceadcc9f30fd73af64ded03b559cbd92791bea33b6075af781 -size 37967 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Michroma.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Michroma.png deleted file mode 100644 index 3633f45c..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Michroma.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c7e74dd4c3405949266c99d89d2cc1b0181f40b2c000c0528350de2ba0412c1 -size 29309 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Nunito.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Nunito.png deleted file mode 100644 index 241d31e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Nunito.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c82ddd4f34ea708e294cb52c4f472f37ff6fb281e7d9b792a1d19133b16568c7 -size 35292 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Oswald.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Oswald.png deleted file mode 100644 index 4afec077..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Oswald.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cde8b54ac042a5572dd18b1df0e715dfb0b2df2aede5ca010e0356530f1eb4aa -size 32069 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/PatrickHand.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/PatrickHand.png deleted file mode 100644 index ab1ed470..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/PatrickHand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:915d18b8cf7f610440153d94418f8f5388658754d6a0c93f9836e455f4c4cc3a -size 37966 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/PermanentMarker.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/PermanentMarker.png deleted file mode 100644 index 02c6bf44..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/PermanentMarker.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:623e1a0390f8e79f313f507e40abb1756e50f9d60e06286dc8e188ffafa8a40b -size 40618 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Roboto.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Roboto.png deleted file mode 100644 index c6b4715b..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Roboto.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f487537d4264fd1a09dc333f30879aeae62d8cb3b4205d23256d0826f76e09b -size 34071 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/RobotoCondensed.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/RobotoCondensed.png deleted file mode 100644 index e7ada026..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/RobotoCondensed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d48f66a587acaaab50a9080e9a6d1183d97ea36ca4bc736571a016de8e136938 -size 31801 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/RobotoMono.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/RobotoMono.png deleted file mode 100644 index 9b7331cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/RobotoMono.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebac72ed2ea5a9409f9f3ac38ffa694d1b0dacc9d4e0dfec2e0a820175b5d29d -size 33746 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Sarpanch.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Sarpanch.png deleted file mode 100644 index d75cb0e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Sarpanch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bb382e8d72e8dbf842ff48d33d315fc5468880690780081e6416136786c895e -size 22213 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SciFi.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SciFi.png deleted file mode 100644 index 98ff6492..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SciFi.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08eb840a0f8b3e7615aed881b202909642176d3487cc1aaf7387a4403c146c7d -size 24716 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSans.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSans.png deleted file mode 100644 index c67763d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSans.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:506692c38c5fc0b8835de5b2215399c9f1776f04365410f57e3f143d1972281a -size 31781 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansBold.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansBold.png deleted file mode 100644 index d1543f54..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansBold.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35319b4efdc524bec6a900730bd8ffd49bc3346d64c3aad802d4a8d36f6bec9c -size 31191 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansItalic.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansItalic.png deleted file mode 100644 index 7eef5030..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansItalic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3071ef73ab7465b7ae7e9ff2ac3277b771ea763d562d14e4ffa4376f4c20ff9f -size 34136 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansLight.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansLight.png deleted file mode 100644 index 8ba0584f..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansLight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43240bd32b7232fc86078fb5def62f340953fd84b2049f7fcd734480ed0e3206 -size 30608 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansSemibold.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansSemibold.png deleted file mode 100644 index 3b9026a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SourceSansSemibold.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b64884b89e17a7860799b683ab1503e02452a1a0f2184e3e41267a97e2650136 -size 31832 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SpecialElite.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SpecialElite.png deleted file mode 100644 index fcec4eb7..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/SpecialElite.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:827f5dc88a3d4143e6dc79008ba6d3c2e295424feedcdf3daca364589631aa21 -size 47886 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/TitilliumWeb.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/TitilliumWeb.png deleted file mode 100644 index e34dd136..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/TitilliumWeb.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f087e9fcd1c00c6705de0eb2b3e8e9cfcefa5a498bc06ca691fdbbc648cdf176 -size 32551 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Ubuntu.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Ubuntu.png deleted file mode 100644 index c854ec00..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/Font/Ubuntu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3855e2b2cd52425cf0e1bde94add568ee1982f025305e7704ee1ef5d5733fe3f -size 34064 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/CoreUISafeInsets.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/CoreUISafeInsets.png deleted file mode 100644 index dac9b175..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/CoreUISafeInsets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b97340b1766ea6223da1543aae6335c7e3e699392ece3828e5c20f8634fb5855 -size 339954 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/DeviceSafeInsets.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/DeviceSafeInsets.png deleted file mode 100644 index dc4c54f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/DeviceSafeInsets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9430cc3f61c39dfdaf1d0dc63e0d49389436867fae890c3d2a990eb0057b116 -size 322046 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/Inset-Regions-All.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/Inset-Regions-All.png deleted file mode 100644 index 36dd632f..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/Inset-Regions-All.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1d2c34112196dc3334e3c834575bed76a5d59d9ad7faf3e5991bcbf0a756bf4 -size 357049 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/None.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/None.png deleted file mode 100644 index c8f0384a..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/None.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:673644fe7a3d861aa5df2d01c595f57ef50597b9e0d68e2eaf74ee3372e664c5 -size 287485 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/Top-Bar-Cutout.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/Top-Bar-Cutout.png deleted file mode 100644 index e2f21648..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/Top-Bar-Cutout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:177b8ea9654978f1c7ac6869a6b31c610cfe1aa3eeca9e9b804df6ee8c246da8 -size 275023 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/TopbarSafeInsets.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/TopbarSafeInsets.png deleted file mode 100644 index cab730b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/ScreenInsets/TopbarSafeInsets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a982f31c30c1037b8f98080e9953eab77d8fa8a2878938ae779490f1591dc6d5 -size 271400 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/TextureMode/Stretch.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/TextureMode/Stretch.png deleted file mode 100644 index 4ff7d037..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/TextureMode/Stretch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51364a5b3f82f82a3c5b1b22821a9ab198a2f01c52e4e092681b4ddc112e0fa0 -size 169144 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/enums/TextureMode/Wrap-Static.png b/.cursor/rules/roblox/en-us/assets/engine-api/enums/TextureMode/Wrap-Static.png deleted file mode 100644 index c387ef0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/enums/TextureMode/Wrap-Static.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a0679367c838947ed0452b6822e521d81a8d3539d76b6e53d94b3297b87bc57 -size 202158 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/32-Bit-Restriction.png b/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/32-Bit-Restriction.png deleted file mode 100644 index 977bf3b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/32-Bit-Restriction.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:041e65012dc857001718d92d80063f0d224a866d5f0b186b4de739fcc954c662 -size 28517 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/AND.png b/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/AND.png deleted file mode 100644 index 23927047..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/AND.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc2dda66e483fbe941238cd40bfb8eadce8b22518ad981c48b277f4776aeacd0 -size 23500 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/LSHIFT.png b/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/LSHIFT.png deleted file mode 100644 index d3c962ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/LSHIFT.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9778258fa293d560496b6e3477eaf381232da539ae65bf27d002fc18c6f559f3 -size 18013 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/NOT.png b/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/NOT.png deleted file mode 100644 index d399a02b..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/NOT.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45ea96decd8eabe9fd2f5a1b0fe54e19cff682aba88bfb4da41cfcb56d6c92e6 -size 13611 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/OR.png b/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/OR.png deleted file mode 100644 index 29749516..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/OR.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60130b2625a75b2e1fd0e21e2852a6f01f7624b143f4e5be9b4b6a3c5d27b757 -size 22785 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/RSHIFT.png b/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/RSHIFT.png deleted file mode 100644 index 7eb78443..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/RSHIFT.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:315c10d354197b4c33fc4b4872dbc15c01e1128c774c960f41815b088e66db27 -size 18707 diff --git a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/XOR.png b/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/XOR.png deleted file mode 100644 index 9bb9727e..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-api/libraries/bit32/XOR.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f6dabfe9e4c69195ccfe3bf1615d012efb4cd6a3b093055dd7e4022aa86f592 -size 26717 diff --git a/.cursor/rules/roblox/en-us/assets/engine-comparisons/Studio-Properties.png b/.cursor/rules/roblox/en-us/assets/engine-comparisons/Studio-Properties.png deleted file mode 100644 index c30be075..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-comparisons/Studio-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e99bdbf78948091cf42d870e814ec43ded56d7c15ee1d77b19d15263507f9e4 -size 87843 diff --git a/.cursor/rules/roblox/en-us/assets/engine-comparisons/Unity-Editor-Layout.png b/.cursor/rules/roblox/en-us/assets/engine-comparisons/Unity-Editor-Layout.png deleted file mode 100644 index 1acf0307..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-comparisons/Unity-Editor-Layout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:331b28802bde3f4934cace9ee27e14e9e953ffe73014160302f1b47719b9c856 -size 323830 diff --git a/.cursor/rules/roblox/en-us/assets/engine-comparisons/Unreal-Details-Panel.png b/.cursor/rules/roblox/en-us/assets/engine-comparisons/Unreal-Details-Panel.png deleted file mode 100644 index c012590f..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-comparisons/Unreal-Details-Panel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f5a2c21c6c180bb0cfa92e1e6e0b858235aa26326dcb1426de754693d760278 -size 123461 diff --git a/.cursor/rules/roblox/en-us/assets/engine-comparisons/Unreal-Editor-Layout.png b/.cursor/rules/roblox/en-us/assets/engine-comparisons/Unreal-Editor-Layout.png deleted file mode 100644 index 80ddd04f..00000000 --- a/.cursor/rules/roblox/en-us/assets/engine-comparisons/Unreal-Editor-Layout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c15ec3263522030818c5291172b98a38dcdbe4a7482fb2d67af1abef47ad58b7 -size 458673 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/ads_manager.webp b/.cursor/rules/roblox/en-us/assets/feeds/ads_manager.webp deleted file mode 100644 index 42e404d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/ads_manager.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:905e17385e0f2601e934ebcad248b05e6280786c6638c774ff4b6bf52f4b30c1 -size 104916 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/advertising.webp b/.cursor/rules/roblox/en-us/assets/feeds/advertising.webp deleted file mode 100644 index 74871c88..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/advertising.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07ddb133ece34dac51a1fe32b75ba69fbef99ef7a6d63fddf96cf25aad117b03 -size 7648 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/age-based-chat.webp b/.cursor/rules/roblox/en-us/assets/feeds/age-based-chat.webp deleted file mode 100644 index 254bde46..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/age-based-chat.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:185a8abf0f74a77ad5dcb67338a85f2c21cde2015131139f2134b6f32fe1cfa9 -size 95956 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/age_chat.webp b/.cursor/rules/roblox/en-us/assets/feeds/age_chat.webp deleted file mode 100644 index 254bde46..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/age_chat.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:185a8abf0f74a77ad5dcb67338a85f2c21cde2015131139f2134b6f32fe1cfa9 -size 95956 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/analytics_essentials.webp b/.cursor/rules/roblox/en-us/assets/feeds/analytics_essentials.webp deleted file mode 100644 index c293d4f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/analytics_essentials.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9d245744a46761348a98a6c8188d86506c933d9bf82f47d5cc5dbefe0595768 -size 6824 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/animations.webp b/.cursor/rules/roblox/en-us/assets/feeds/animations.webp deleted file mode 100644 index fd34a956..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/animations.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:640baa71ffd8dcdacbbf257dd1c77ddb516568c3556550605ca7baf54a2bebba -size 5554 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/asset_repo.webp b/.cursor/rules/roblox/en-us/assets/feeds/asset_repo.webp deleted file mode 100644 index 76c9f79f..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/asset_repo.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7410e7172c101b30847d77de8cd2602afd5b8e1926a2b8eeaff615f24ee87d93 -size 213146 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/assets.webp b/.cursor/rules/roblox/en-us/assets/feeds/assets.webp deleted file mode 100644 index 5d382a0c..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/assets.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d936128090bfe109e627921ce2c08da04bd5ef15ae31fc41a3bfd8a0f54e9a6 -size 9564 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/audio_speaker.webp b/.cursor/rules/roblox/en-us/assets/feeds/audio_speaker.webp deleted file mode 100644 index 95893274..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/audio_speaker.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:904f6559cd45b0bcaec9bc1bc7f7c0f658b9c4248776861e091bb1ef33bbd243 -size 594 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/autosetup.webp b/.cursor/rules/roblox/en-us/assets/feeds/autosetup.webp deleted file mode 100644 index dcfd6bb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/autosetup.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:937708512befb0cb361ae788d89f44ed4435039c622540933d8e0b449d0db88d -size 124108 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/avatar.png b/.cursor/rules/roblox/en-us/assets/feeds/avatar.png deleted file mode 100644 index bd72a54a..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/avatar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcb0045e8907ea1c74e373c35a29297957e932afd7fa610372e766f1aa968d13 -size 54389 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/avatar_items.webp b/.cursor/rules/roblox/en-us/assets/feeds/avatar_items.webp deleted file mode 100644 index cc1c35cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/avatar_items.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5f643a5285f3f4cdbd7bcd284ff40cda2b5c455e11bd600cc62d267368545c0 -size 44144 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/avatars.webp b/.cursor/rules/roblox/en-us/assets/feeds/avatars.webp deleted file mode 100644 index 576fd86e..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/avatars.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32c4793f7eb465ca567e6c764214e86b791f3308bc030b21b11a5f709068f118 -size 12234 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/bans_dash.webp b/.cursor/rules/roblox/en-us/assets/feeds/bans_dash.webp deleted file mode 100644 index ca615bf8..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/bans_dash.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:121fb375b564fc9f2b774db068b0c2d04220791adb73c069dfca9fdd26b64b58 -size 48212 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/blender_stream.webp b/.cursor/rules/roblox/en-us/assets/feeds/blender_stream.webp deleted file mode 100644 index 606963a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/blender_stream.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5c183f1d9152ecbf67d5fd454411abc460c42b368150722411bd15794afaaf9 -size 194384 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/boots.webp b/.cursor/rules/roblox/en-us/assets/feeds/boots.webp deleted file mode 100644 index 1d7e1cd0..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/boots.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fde744b3d571819142d8c93d9e648d0353940e629e1dbf5b935e37f91eccb96 -size 162070 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/browse_store_dark.webp b/.cursor/rules/roblox/en-us/assets/feeds/browse_store_dark.webp deleted file mode 100644 index f03c80b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/browse_store_dark.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:447461169c6a15289e24b7d011d7850787cee39ccbb8c60fbf6384edfb9fb05d -size 44076 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/browse_store_light.webp b/.cursor/rules/roblox/en-us/assets/feeds/browse_store_light.webp deleted file mode 100644 index eb8119e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/browse_store_light.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:565a5a76ca8924cc7f85c11b3ef8254009962d64adf74f9009aff7665331838c -size 42414 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/caging.webp b/.cursor/rules/roblox/en-us/assets/feeds/caging.webp deleted file mode 100644 index 4bd6d7ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/caging.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed2e889fbf9f4a00ce322de0545d6cd3bf21d658a2deed1e179bd81532c4f259 -size 551802 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/camera_manip.webp b/.cursor/rules/roblox/en-us/assets/feeds/camera_manip.webp deleted file mode 100644 index aa70627a..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/camera_manip.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b86453f94eb32a5f81ab0a6db57d71451d78f61ac61f7b2b2d9e8444b1bc8be -size 163230 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/character_specs.webp b/.cursor/rules/roblox/en-us/assets/feeds/character_specs.webp deleted file mode 100644 index cc5707fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/character_specs.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b257bdc3cc4305ead34d5569258254b183e183c9c7191fed544d0a41bbf710c -size 11228 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/characters.webp b/.cursor/rules/roblox/en-us/assets/feeds/characters.webp deleted file mode 100644 index 9e5e62d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/characters.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd2e4fb02110b55aa44a18623aeb88b125cfe29e2e99b6df46fe99bbc01d923c -size 11152 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/client_mem.webp b/.cursor/rules/roblox/en-us/assets/feeds/client_mem.webp deleted file mode 100644 index dcfbee74..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/client_mem.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7c02ceb0cc862308ef9e495c719a5f8d2f57f107dad6b2c077339f6f1fada87 -size 113692 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/clothing.webp b/.cursor/rules/roblox/en-us/assets/feeds/clothing.webp deleted file mode 100644 index b12cf8d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/clothing.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f81aaf0576747dd3d9f305fc2ec7b023a1ffd977d8ad202414c2102fd71720cb -size 253694 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/code_org.webp b/.cursor/rules/roblox/en-us/assets/feeds/code_org.webp deleted file mode 100644 index c954688e..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/code_org.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:173ac64a9ed1011edaaa18567b618e60bb5c8ac7394db218c75196001d2d88a5 -size 112398 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/collaboration.webp b/.cursor/rules/roblox/en-us/assets/feeds/collaboration.webp deleted file mode 100644 index b419f4eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/collaboration.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c77f7fe978ff0da8bb56ec5eb3b6090c245404edf04dc6a14752743c3e478df9 -size 10154 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/content_updates.webp b/.cursor/rules/roblox/en-us/assets/feeds/content_updates.webp deleted file mode 100644 index b6ace059..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/content_updates.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29c41a0ea914743242761c72001cf8945802b45866fa19ea50ef9b1fc721b069 -size 14250 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/core_loops.webp b/.cursor/rules/roblox/en-us/assets/feeds/core_loops.webp deleted file mode 100644 index 7e68d65b..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/core_loops.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53416f998f9cc86022f6ecc2d5b40e2b3070d4da51d281cd2fb5c320c31829e3 -size 7502 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/create_sliding_door.webp b/.cursor/rules/roblox/en-us/assets/feeds/create_sliding_door.webp deleted file mode 100644 index 04a3b46e..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/create_sliding_door.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6196baffd2932b2e1d209d47376b3de1c8ed15c5b1e60c65c05051b0ede418a -size 70394 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/creator_hub.png b/.cursor/rules/roblox/en-us/assets/feeds/creator_hub.png deleted file mode 100644 index 3c7715df..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/creator_hub.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f6c02defa1918b7839c29bd4e1d9ba9de32f9e1f75b7e900eda616f6782df94 -size 28029 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/data_model.webp b/.cursor/rules/roblox/en-us/assets/feeds/data_model.webp deleted file mode 100644 index 1faaf686..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/data_model.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:511c8b2ef280155d33f2500f073ce3323ee7b9a8596330fd4648fbc14a96f7ba -size 3652 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/datamodel.png b/.cursor/rules/roblox/en-us/assets/feeds/datamodel.png deleted file mode 100644 index 861c1293..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/datamodel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:494927820ca815aacd4d0fc728bdefab402a501bc949d95f68e61793b1bd0c77 -size 42543 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/datastores_mmo.webp b/.cursor/rules/roblox/en-us/assets/feeds/datastores_mmo.webp deleted file mode 100644 index fe3c80ff..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/datastores_mmo.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3531eedafb79a6fbe1b8cc789064cf3c6fa94535b811ba2e576e40bef4870192 -size 103886 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/debugger.webp b/.cursor/rules/roblox/en-us/assets/feeds/debugger.webp deleted file mode 100644 index 6d175a79..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/debugger.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c427296a0001ca0bd44a6efc2f8e769b42ee4477adb39e52d483f314dd85aca3 -size 101156 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/debugging.webp b/.cursor/rules/roblox/en-us/assets/feeds/debugging.webp deleted file mode 100644 index 1be90bca..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/debugging.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f0e547327560c6333d25d3b8604f1aa605e3b6142bd604224eb7574995f166c -size 27396 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/developer_console.webp b/.cursor/rules/roblox/en-us/assets/feeds/developer_console.webp deleted file mode 100644 index 84c43256..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/developer_console.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8a72cbe28963c6bdf333452b8be17f5bbffae18c8981e240e1b4f4fe1a7cc5a -size 13500 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/dynamic_cloth.webp b/.cursor/rules/roblox/en-us/assets/feeds/dynamic_cloth.webp deleted file mode 100644 index 1fda9422..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/dynamic_cloth.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd6fbddcbb8f8d9e11bae20b9deac55fa25bbf2c3c37b6311eaa3b489a9bc4cf -size 57218 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/engine.png b/.cursor/rules/roblox/en-us/assets/feeds/engine.png deleted file mode 100644 index 5ab48ae2..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/engine.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8bcb451b681b5b88f8d3cf939067b02cd6dad30868af1dd6d59ce53890229f4 -size 48237 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/enyu.webp b/.cursor/rules/roblox/en-us/assets/feeds/enyu.webp deleted file mode 100644 index c96ab9f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/enyu.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa06224a56ebd4a5e87455f5c3ec26956c4d3aa53ce6727f371b2e9bbbba0379 -size 61538 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/event_sequencer.webp b/.cursor/rules/roblox/en-us/assets/feeds/event_sequencer.webp deleted file mode 100644 index 9ca815bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/event_sequencer.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12c81447f13ce4a924c44d7692fd53f32b3a5a6799fac13f221f8880ffd4c94e -size 8880 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/events.webp b/.cursor/rules/roblox/en-us/assets/feeds/events.webp deleted file mode 100644 index 7d12df30..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/events.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a4b1ad5f8839929d8c7954b455d90b82d0b45ad4431541de2cede1a4a3ee624 -size 10792 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/forum_widget_thumbnail.png b/.cursor/rules/roblox/en-us/assets/feeds/forum_widget_thumbnail.png deleted file mode 100644 index 39689ab2..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/forum_widget_thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f961f438df706193fc97ff6060b3e3c167ecd91510eaef88ef1089634349929 -size 2863 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/forum_widget_thumbnail@2x.png b/.cursor/rules/roblox/en-us/assets/feeds/forum_widget_thumbnail@2x.png deleted file mode 100644 index cc41113e..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/forum_widget_thumbnail@2x.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8192f0bbe5fee8f467b723fffe5fd01b0c96bde08f4b1e51964e5b01e34348c -size 5756 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/fps_design.webp b/.cursor/rules/roblox/en-us/assets/feeds/fps_design.webp deleted file mode 100644 index df748322..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/fps_design.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51acbc244ffa364f84781e4d2d18280dc3b6c3d6a2f83ff5dcc50dbf188b906a -size 187046 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/friend_invite.webp b/.cursor/rules/roblox/en-us/assets/feeds/friend_invite.webp deleted file mode 100644 index eccca9e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/friend_invite.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1d620d4ee29b250f3cfbf968a98a5f5c5c02f4f70bbbc6d5b77043aa25de3e7 -size 261508 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/game_design.webp b/.cursor/rules/roblox/en-us/assets/feeds/game_design.webp deleted file mode 100644 index 6d4597d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/game_design.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8285975852533f19070e97fd800aaec700a6fa23d882ac508cac4007ebaca91e -size 23262 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/generate_textures_with_ai.webp b/.cursor/rules/roblox/en-us/assets/feeds/generate_textures_with_ai.webp deleted file mode 100644 index 06a77440..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/generate_textures_with_ai.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0057824ebfeb8abbc9b3cb152feb184211ba9a7bd2644c35f4274070fee4797 -size 106158 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/getting_started_ugc.webp b/.cursor/rules/roblox/en-us/assets/feeds/getting_started_ugc.webp deleted file mode 100644 index 46b6c5bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/getting_started_ugc.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7648c93b3a5c969d7496f28e68c4251e06af1f3989aed76bad301b922488f708 -size 87922 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/graybox.webp b/.cursor/rules/roblox/en-us/assets/feeds/graybox.webp deleted file mode 100644 index 137d7416..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/graybox.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd6932bfddca25bb133e835acceaec6accca3d6d31714ab0397f5e57686e3dff -size 75000 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/halloween_game_jam.webp b/.cursor/rules/roblox/en-us/assets/feeds/halloween_game_jam.webp deleted file mode 100644 index bdd40a44..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/halloween_game_jam.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2eb259ec8c81a161a16e6fab5ae9b7de96003a05f1b23469fbf73151a8cf4b8 -size 214900 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/heads.webp b/.cursor/rules/roblox/en-us/assets/feeds/heads.webp deleted file mode 100644 index 85646f6a..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/heads.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f11b27debaca89a957260bc980e04b11dd124870a20b0ee77db30de8385f89d -size 8190 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/input.webp b/.cursor/rules/roblox/en-us/assets/feeds/input.webp deleted file mode 100644 index a4403377..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/input.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e51a4deb581dee5dca8b869ec83a942d4e71567a74003af3b0896cb173cb6bc -size 4502 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/laser_beam.png b/.cursor/rules/roblox/en-us/assets/feeds/laser_beam.png deleted file mode 100644 index c295ee16..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/laser_beam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1235036833e5241ff5c545d1332f9f627327bd20a56db0255008d328088450c -size 22191 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/laser_beam_tutorial.png b/.cursor/rules/roblox/en-us/assets/feeds/laser_beam_tutorial.png deleted file mode 100644 index a71038af..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/laser_beam_tutorial.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86b1423d31090c42b8fd5bff5fea948ee8ef3bd9dbf3c3e52b0d5515b7da9685 -size 75772 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/layered_clothing.webp b/.cursor/rules/roblox/en-us/assets/feeds/layered_clothing.webp deleted file mode 100644 index af02516e..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/layered_clothing.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25e6df86d961b328a81bb8ed4ecb06e6f5a53d613916a598cbe9ba5ed0d99494 -size 8668 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/lighting_effects.webp b/.cursor/rules/roblox/en-us/assets/feeds/lighting_effects.webp deleted file mode 100644 index ebf438a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/lighting_effects.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbedc4fcb5e7789d5a525d4eb6e2238b8cc1777badd2af4e1cfc407031798e9d -size 7258 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/lighting_terrain.webp b/.cursor/rules/roblox/en-us/assets/feeds/lighting_terrain.webp deleted file mode 100644 index 43facb64..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/lighting_terrain.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b59b067ac292b17a6759f4cd51d4f2dfa5f001e4b9449e7cbdad44392d985ab -size 252026 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/localization.webp b/.cursor/rules/roblox/en-us/assets/feeds/localization.webp deleted file mode 100644 index a266f8ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/localization.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa326ce8e1f9e3a4d56ec5e2258c6ed21f6d47d775e442e7aa1e39e6ccfdf2ad -size 8930 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/lod.webp b/.cursor/rules/roblox/en-us/assets/feeds/lod.webp deleted file mode 100644 index 7ff741f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/lod.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce76defce4f77aaa7dab47c9ad5353ad9d684c2a827416ea0f4ee29072a954cb -size 103894 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/luau_oop.webp b/.cursor/rules/roblox/en-us/assets/feeds/luau_oop.webp deleted file mode 100644 index 033715b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/luau_oop.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bb96e863383f838d1652c15b702fe406fef5ccfe7ea58e05adec3b14f0444bf -size 42724 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/luau_time.webp b/.cursor/rules/roblox/en-us/assets/feeds/luau_time.webp deleted file mode 100644 index 6200c06f..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/luau_time.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9af622ebe46ccc82e1b0ab8495fd1b786fb9e2144d045da0f2c0e4aa1a14446 -size 101310 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/make_hair.webp b/.cursor/rules/roblox/en-us/assets/feeds/make_hair.webp deleted file mode 100644 index 6b75901e..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/make_hair.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57de22f4cd15869d642b4d971db1bfa238f01d369866e07407adf04d8df2027c -size 149892 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/making-a-bag.webp b/.cursor/rules/roblox/en-us/assets/feeds/making-a-bag.webp deleted file mode 100644 index 89df473c..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/making-a-bag.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08dd664d7202755007208473a431b25622416095d4c36d3d793e607514e76aa8 -size 48400 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/matchmaking.webp b/.cursor/rules/roblox/en-us/assets/feeds/matchmaking.webp deleted file mode 100644 index 05085a67..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/matchmaking.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25f05b9653e378b4b0733d75f0f060625df7442e69efca480e8b2c555d5e26b7 -size 9622 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/memory_leaks.webp b/.cursor/rules/roblox/en-us/assets/feeds/memory_leaks.webp deleted file mode 100644 index eebce465..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/memory_leaks.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84a9fb39e17fb90eb7ecdb222ab0d44300e9a7264b9f42b7c44188c4c2c7d9f4 -size 52268 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/microprofiler.webp b/.cursor/rules/roblox/en-us/assets/feeds/microprofiler.webp deleted file mode 100644 index 4bdea833..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/microprofiler.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d58376f268c9de251d03cc88f3d680af3d6da82994b094f46dd47abea41dbe79 -size 12092 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/microprofiler_advanced.webp b/.cursor/rules/roblox/en-us/assets/feeds/microprofiler_advanced.webp deleted file mode 100644 index ad110dd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/microprofiler_advanced.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af6c9f14b0bdf9fd77791f92f7a0df7c2eb32abe87eb34d2a89a3f3a0f4b4e33 -size 60742 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/microprofiler_how_to.webp b/.cursor/rules/roblox/en-us/assets/feeds/microprofiler_how_to.webp deleted file mode 100644 index 933de12b..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/microprofiler_how_to.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1e2512d9eeee0b2aa8ad7935ea6b315a6de70db7342e2e569a477aea692fbde -size 201522 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/microprofiler_memory_profiling.webp b/.cursor/rules/roblox/en-us/assets/feeds/microprofiler_memory_profiling.webp deleted file mode 100644 index e7679f59..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/microprofiler_memory_profiling.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccb8ea536906fc95e04d7032bfceecef0f64a59b7ffb17d26753fe5749b30a3c -size 109446 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/modulescripts_sleit.webp b/.cursor/rules/roblox/en-us/assets/feeds/modulescripts_sleit.webp deleted file mode 100644 index 3e2f3015..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/modulescripts_sleit.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3198378dded2670a10ee13302912aaafb96ad1a4e9faf2b3ed1a520b2fe4b352 -size 140708 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/npc_kit.webp b/.cursor/rules/roblox/en-us/assets/feeds/npc_kit.webp deleted file mode 100644 index 7b56c427..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/npc_kit.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:066fea53a8404bbee9077609caa4bb4aeddff39b0ebb2257460ce2e7c4f0f735 -size 8592 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/obby_chat.webp b/.cursor/rules/roblox/en-us/assets/feeds/obby_chat.webp deleted file mode 100644 index f1968bf5..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/obby_chat.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3821dd27bef00c454583225baacfa3fdc6e6dc25b908f320678d8f0cab74efe -size 276370 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/performance_basics.webp b/.cursor/rules/roblox/en-us/assets/feeds/performance_basics.webp deleted file mode 100644 index 448a90ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/performance_basics.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3af04dfa502c8472cf8a3effa229c43570bdb4dc284a5a73cd72f9fe709c04db -size 94600 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/physics_101.webp b/.cursor/rules/roblox/en-us/assets/feeds/physics_101.webp deleted file mode 100644 index aa720f64..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/physics_101.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6acb28e7482eef7152523f6f137a86e907f78b613096a4ffca50cc0f3de46422 -size 40466 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/players.webp b/.cursor/rules/roblox/en-us/assets/feeds/players.webp deleted file mode 100644 index 91e4c2ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/players.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a355e50c11f7aa15ecf5df02efe986fe686e74ddfc8b4a21ee0d29e1620f291 -size 12780 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/plugins.webp b/.cursor/rules/roblox/en-us/assets/feeds/plugins.webp deleted file mode 100644 index 11af6635..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/plugins.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc576c244c02a5b5e4ddb55b53dc20a70d2e6ab6864c13cafa323b205fff32c8 -size 11666 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/polarcub_store.webp b/.cursor/rules/roblox/en-us/assets/feeds/polarcub_store.webp deleted file mode 100644 index 1349e4ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/polarcub_store.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b08c5ac2e4c139db4fb9eb0211f86422532dc39bb936c91c40950c3c4668093a -size 334952 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/polish_environment.webp b/.cursor/rules/roblox/en-us/assets/feeds/polish_environment.webp deleted file mode 100644 index e190a4cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/polish_environment.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4736ce46ac3cd5100bc0886e52033577f835a2e1e645aee09f8d60762605b617 -size 85484 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/promotion.webp b/.cursor/rules/roblox/en-us/assets/feeds/promotion.webp deleted file mode 100644 index 214f07fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/promotion.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb22a2d9a9f487ae1a74e818ac90f4a88723408749c7f2e47a50ce9934aab84f -size 9742 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/real_world_optimization.webp b/.cursor/rules/roblox/en-us/assets/feeds/real_world_optimization.webp deleted file mode 100644 index a770cf10..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/real_world_optimization.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c48c038e5d2a380b0679a4620fc0010a8ecb0ecf5d56f36be0f0e359e48d71f -size 540288 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/rewarded_ads.webp b/.cursor/rules/roblox/en-us/assets/feeds/rewarded_ads.webp deleted file mode 100644 index 86b3d7f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/rewarded_ads.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a7b0282bc6faf860c88988ee12e83ec80a37af297bfebfc7163b2ece8c6e905 -size 27082 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/rigging.webp b/.cursor/rules/roblox/en-us/assets/feeds/rigging.webp deleted file mode 100644 index 3e915f3e..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/rigging.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02fd489019980c92245b8afd127a337f6f8e59e481f545e38ecac6b0b9238cdc -size 3200 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/rigid_accessory.webp b/.cursor/rules/roblox/en-us/assets/feeds/rigid_accessory.webp deleted file mode 100644 index 3a59dd79..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/rigid_accessory.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f46bc31427c61634111b7b754bee014cda1d8b56aa860979922f01a6d64e9587 -size 59830 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/robloxYoutubeAvatar.webp b/.cursor/rules/roblox/en-us/assets/feeds/robloxYoutubeAvatar.webp deleted file mode 100644 index ee4b6cf6..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/robloxYoutubeAvatar.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd2d7bc8c8e9bc7ce4b059afe7ac045601c28e04124ffcac27528769dd3b89a1 -size 8666 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/roblox_studio.webp b/.cursor/rules/roblox/en-us/assets/feeds/roblox_studio.webp deleted file mode 100644 index 8e4b6a90..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/roblox_studio.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bf5649ab5fcb75992671eefe25fb2f23760ebe413a9f34b97f204d3dda28d64 -size 7172 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/rp_interview.webp b/.cursor/rules/roblox/en-us/assets/feeds/rp_interview.webp deleted file mode 100644 index 49c73d38..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/rp_interview.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:948fed227a8e8c1bbf7aeb5f7b3c6ba0470b55eacad37fec23ad5e5c9402dc44 -size 215896 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/rp_modeling.webp b/.cursor/rules/roblox/en-us/assets/feeds/rp_modeling.webp deleted file mode 100644 index 80bfcde1..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/rp_modeling.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fbf9501538b2241b838a2dadcc2584f3cf09c8413cf1a3adaafcc9b0c09ec8b -size 215184 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/rp_texturing.webp b/.cursor/rules/roblox/en-us/assets/feeds/rp_texturing.webp deleted file mode 100644 index 8326d8b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/rp_texturing.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65534f5c25135811609b522c53d4c99e9cac462c90c00a3e1f63376eeeeae3b3 -size 195438 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/rush_ugc.webp b/.cursor/rules/roblox/en-us/assets/feeds/rush_ugc.webp deleted file mode 100644 index 4959977b..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/rush_ugc.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f94bf3bff54b8c7e79e358e5669c2d4b7bae2807d43f639cc3e8a0d1dc858e83 -size 405728 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/script_editor.webp b/.cursor/rules/roblox/en-us/assets/feeds/script_editor.webp deleted file mode 100644 index 5dc9f261..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/script_editor.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1aa4a28a39896fa4aa5a2b7c86ad2d176a8da384c65c15456699b3c306d8a920 -size 13486 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/script_locations.webp b/.cursor/rules/roblox/en-us/assets/feeds/script_locations.webp deleted file mode 100644 index 717a1023..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/script_locations.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33bbfba5f0cd38444a4981b51d12fc9bf4c720fb6767b529584f2c0f2b6e1fd0 -size 43046 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/scripting.webp b/.cursor/rules/roblox/en-us/assets/feeds/scripting.webp deleted file mode 100644 index ef45f91e..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/scripting.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d59e190ed5e17e6c88189fa0f542fd1f9a1606085da7974e0d0d92e6b06a4018 -size 3304 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/shoes.webp b/.cursor/rules/roblox/en-us/assets/feeds/shoes.webp deleted file mode 100644 index 58f4a296..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/shoes.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c8612267479f0395bed859aa71af53a2b9b07296e4b50ab7fd991586cffddff -size 140840 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/single_multi_script.webp b/.cursor/rules/roblox/en-us/assets/feeds/single_multi_script.webp deleted file mode 100644 index 0f46d806..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/single_multi_script.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f91d61977068c3ec7086be21495cbfbac1ac9331546d38b098ade687a2c7126 -size 124862 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/sketch.png b/.cursor/rules/roblox/en-us/assets/feeds/sketch.png deleted file mode 100644 index caade157..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/sketch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3766cef3c884e7c30124a0eea1b9f41f07167bc354e416d666e4b240a3df102 -size 76331 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/smooth_damp.webp b/.cursor/rules/roblox/en-us/assets/feeds/smooth_damp.webp deleted file mode 100644 index 9137a3f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/smooth_damp.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25bff09fb0ef86a043ec65c344ce0980e2895a7328431e0d8abab97bd3deea05 -size 93120 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/social_design.webp b/.cursor/rules/roblox/en-us/assets/feeds/social_design.webp deleted file mode 100644 index d35a93ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/social_design.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e17d765f535ca94a64596d884edbc9b31ff1fd047710a964132818e036ab1942 -size 7950 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/stephen_remotes.webp b/.cursor/rules/roblox/en-us/assets/feeds/stephen_remotes.webp deleted file mode 100644 index f8e6289f..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/stephen_remotes.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68bbb6a50658747cd71cf1c3d1d5a0cf220923670c4ecc448d61ef783cca7f52 -size 103068 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/studio_comments.webp b/.cursor/rules/roblox/en-us/assets/feeds/studio_comments.webp deleted file mode 100644 index d40ae8fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/studio_comments.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fbccc00d17d36291a09c0c42fd6dd51bdaae991b8aec7db845e85f148125754 -size 88610 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/studio_icon.webp b/.cursor/rules/roblox/en-us/assets/feeds/studio_icon.webp deleted file mode 100644 index 50c36eaa..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/studio_icon.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68d616978f46b5671a3d067e7a522751bc5ee2d78bdcca8173a8739ff39ddc69 -size 16452 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/studio_shortcuts.webp b/.cursor/rules/roblox/en-us/assets/feeds/studio_shortcuts.webp deleted file mode 100644 index 4e1eb6cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/studio_shortcuts.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e16e48ca50845e785192b9166def1732f3115a1cd299a3b87c4a7891ed08050a -size 13672 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/studio_tour.png b/.cursor/rules/roblox/en-us/assets/feeds/studio_tour.png deleted file mode 100644 index 1edb9bdd..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/studio_tour.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ac9ea33dfeb9ebd6d138e166b93e44fff163c564b6bb0644e9cbf36759f5c91 -size 60329 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/studio_upsell.webp b/.cursor/rules/roblox/en-us/assets/feeds/studio_upsell.webp deleted file mode 100644 index 1d430874..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/studio_upsell.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:099dce976473f7f3d918ea4014fb03b5ff87e60ec59ba5b406ee3e2458384845 -size 9074 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/subscription_design.webp b/.cursor/rules/roblox/en-us/assets/feeds/subscription_design.webp deleted file mode 100644 index adecd106..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/subscription_design.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c2977fd82213cc5c8a87f7ddfe213522af1e2fbc761e1a191b38f4619d8967e -size 44888 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/terrain_editor.webp b/.cursor/rules/roblox/en-us/assets/feeds/terrain_editor.webp deleted file mode 100644 index dd13e6da..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/terrain_editor.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38f83c8d06609589d86d517bbde1931ee053bb116ec7b7d38f50e32be4737d79 -size 4030 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/tutorials.png b/.cursor/rules/roblox/en-us/assets/feeds/tutorials.png deleted file mode 100644 index b6afd40f..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/tutorials.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1cf1cdfa6d5e16a80b24532d41cfb851f3462014ef1e1fe6f88cb59dc4bbacb6 -size 48788 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/ugc_homestore.webp b/.cursor/rules/roblox/en-us/assets/feeds/ugc_homestore.webp deleted file mode 100644 index 8dac75c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/ugc_homestore.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51a3a4708a5d70ac60a67a654ab50786809ac1ff1ed75b1115f6fcffa3ce5858 -size 258864 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/ui_style.webp b/.cursor/rules/roblox/en-us/assets/feeds/ui_style.webp deleted file mode 100644 index b8b5f185..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/ui_style.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a198b967f2186ec5db521549f7ef485501f2631d47dd00baebf419b8a5ee5fe3 -size 43880 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/user_base.webp b/.cursor/rules/roblox/en-us/assets/feeds/user_base.webp deleted file mode 100644 index 4a5d8d8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/user_base.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c359a9a183bc08cae753172abe9bf11bab6212212a221f5bbe73e23a1e9832e7 -size 13466 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/validation.webp b/.cursor/rules/roblox/en-us/assets/feeds/validation.webp deleted file mode 100644 index 63935f90..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/validation.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18776a6a1e6bd4abf944e83a039cbfd6c4257a73444a2f4c43b03927d47dca2b -size 109992 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/version_control.webp b/.cursor/rules/roblox/en-us/assets/feeds/version_control.webp deleted file mode 100644 index b6073aec..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/version_control.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a94ac02fab340129695b54d4fe278043fccfe645df997bf35d049a70e85df8a2 -size 173724 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/video_previews.webp b/.cursor/rules/roblox/en-us/assets/feeds/video_previews.webp deleted file mode 100644 index f8f6720a..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/video_previews.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db6c06de9990609f03309350b1d8069d2f0bfd561e2a171405b6fb288d9bc2b2 -size 44230 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/workspace.webp b/.cursor/rules/roblox/en-us/assets/feeds/workspace.webp deleted file mode 100644 index 88874673..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/workspace.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31fde6e4cf23d651380ea4e16efe297a49cccfa8590ff84392cad39f8ba9f7d8 -size 4902 diff --git a/.cursor/rules/roblox/en-us/assets/feeds/world_building.webp b/.cursor/rules/roblox/en-us/assets/feeds/world_building.webp deleted file mode 100644 index c77057da..00000000 --- a/.cursor/rules/roblox/en-us/assets/feeds/world_building.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e91cc9e0d2ff77d9feb2eff487e8c448ad9833a14be61c6e298144abd8c5f25 -size 59076 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-1.png b/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-1.png deleted file mode 100644 index 2fb30732..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de741f08909602994d8c10634ed41e619289dd995b5e51f3bbc4acc51a7ca852 -size 10274 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-2.png b/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-2.png deleted file mode 100644 index d7e3c114..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:783f029575e70d1d70c28586ad09dcb1b1d44fc84f837f983de143f0f43f5a1c -size 21378 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-3.png b/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-3.png deleted file mode 100644 index 57d63d4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f24aff3c78b76044e3c6a75fd26db0670da8573f1693ac3ad60a3039dae89d2f -size 25371 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-4.png b/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-4.png deleted file mode 100644 index d428206a..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/balancing-virtual-economies/balancing-virtual-economies-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16bdff0171f6a74b6ac6a200bd077faa42cdbe0f9d4f427a5a83a1835203d6c1 -size 20073 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update1.jpg b/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update1.jpg deleted file mode 100644 index 7343bbab..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a82b8f5f1408211d69de2fc1a4609a89dca9aff118f80c7951c5bfb891babc0f -size 175731 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update2.png b/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update2.png deleted file mode 100644 index 9e045b61..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:444101528b18e6b42170804640facb7533b52dd112c6a0df05a53dc3f774ba8a -size 18013 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update3.png b/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update3.png deleted file mode 100644 index b786b843..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c3098727f0261a2c47802fc107cf6224e1922455b46f068f1a9a93307a87ab9 -size 48977 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update4.jpg b/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update4.jpg deleted file mode 100644 index da269c89..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a4622d422df83800d430a2724f0760a2be132d271ffdda012184920cb8e8963 -size 225140 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update5.jpg b/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update5.jpg deleted file mode 100644 index ba9b4f39..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5cfe84484fea8558376c96b426fc2f8432c4a0a4ebea6d503cc21cd0130521e -size 82704 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update6.png b/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update6.png deleted file mode 100644 index a390210a..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/content-update/content-update6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:013684aebf694950611272ff1cae355a7a00524cba54b0b125cb496a917fb2e4 -size 388662 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-1.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-1.png deleted file mode 100644 index 56860ade..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:384b4bf27ffd695672b902ebed5f9298bd7baba9e92a96467c5cba5aeb5590e9 -size 1627385 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-12.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-12.png deleted file mode 100644 index 51ec5169..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-12.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72571ffced7dec0093a4ec77abc50a7e9002c398aa2253d1d38c76f459013352 -size 1795690 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-13.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-13.png deleted file mode 100644 index 5319654f..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-13.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e89f09524af16f038cdddf37663d5d2400b4781da2642c0b0981802f3f4d54b -size 917380 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-2.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-2.png deleted file mode 100644 index ee333e26..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdc6c084ed4690a735ddce3237881f2d5a9cc98de82af9a12244e3f0229f4f69 -size 1524035 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-3.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-3.png deleted file mode 100644 index 0d510400..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc0fc093cd747fa3f64ea06063e8e7ed4ccf2208654f46564e97ae2361778ff0 -size 1842899 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-4.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-4.png deleted file mode 100644 index f6b31c14..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f13b7a6db38fec753bf5b654fbf78cff5449ab9c187420ab69d5d10aa7b3697e -size 1752152 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-5.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-5.png deleted file mode 100644 index 6db52889..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9c685d06acf592b65d6582a5e04c936df90eea128b44220897cf0816ef06018 -size 3061376 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-6.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-6.png deleted file mode 100644 index fe0df5bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89473e0c137b92f1c7274356257b5e4a3150a5a558ef527e555d30e535b4e532 -size 373058 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-7.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-7.png deleted file mode 100644 index 25d96e5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-7.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a5ac6e638fac1117112763c238d86124f0c9eb4c74d0a6b0056c08a02d35da1 -size 406583 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-8.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-8.png deleted file mode 100644 index 515a18f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-8.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c36431f9c6dd13d2621d47b87d5c00192268701627fd9ec3b5d10a87ce31088d -size 33341 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-9.png b/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-9.png deleted file mode 100644 index 6c6ef335..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/contextual-purchases/contextual-purchases-9.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbf85a47fabe8ae6389d30275b63e7dcb4dda16b679b9fc499ecee73aeba9dc5 -size 1130944 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops1.png b/.cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops1.png deleted file mode 100644 index a0226b06..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfdb7dd158344f13126232565fa490e95dc1e4e9212ad592e538999090c90cd0 -size 2479693 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops2.png b/.cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops2.png deleted file mode 100644 index abfcaeb3..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e27c028d9875c394f094f46d947ef58badd78b389b6ec9c284fb7958eca14b6f -size 2505150 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops3.png b/.cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops3.png deleted file mode 100644 index 72cd0109..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/core-loops/core-loops3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:273aeeb33a577f9f6f006dda64519b29d817036fd5b4e7c1158f333841e59400 -size 2529296 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-0.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-0.png deleted file mode 100644 index 9df2580a..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c74e7bee0c1d74fd84bf4e242400cc06aeef1820058ad1734c220ef94dca98a -size 174175 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-1.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-1.png deleted file mode 100644 index 67d724fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:863558c1b4a349274d7f916e7a6398362a9213c7ef9fe2b1da57861802bd0c8d -size 368515 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-10.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-10.png deleted file mode 100644 index 2a1d11a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-10.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86181cdc206eee50e64f0b61d6b85843fcb016caeb60d163d79489b6e30a0d6a -size 220268 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-11.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-11.png deleted file mode 100644 index 208cf07d..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-11.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc4acb1523a7991bc19f40d889a0100cbee68d7857c3cbd80475cb4b594c3be5 -size 1337954 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-2.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-2.png deleted file mode 100644 index 926574fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5666637482c6850de1e6934f31eaf39eb677cc381f58b808a040c9767feaf6c1 -size 191307 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-3.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-3.png deleted file mode 100644 index 0d9e0262..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d340c80a98ee656137932532ba606ef9dd481e5e3f90e9f71993b680fd43771 -size 1669088 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-4.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-4.png deleted file mode 100644 index d3d432aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad6e04b0a5967a2d515cc4678cb9c72e84c95117a5089ab2a46a9ca83a528358 -size 183189 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-5.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-5.png deleted file mode 100644 index c4c13774..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32bd311dc7d5e555ff503506e7c275111c24cc083173e315f3ab1a8f7b6c0b83 -size 3184542 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-7.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-7.png deleted file mode 100644 index f204f3af..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-7.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ba2ee2844f3b9450bfb896c21a08e8306e45a711e3807fc960df9535dda2f35 -size 1358292 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-8.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-8.png deleted file mode 100644 index 6aaaef0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-8.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a4638fbb95ae14b7b13530d22b719c498d777ad88e76caf5a13688cc0d3bc85 -size 217509 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-9.png b/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-9.png deleted file mode 100644 index 7e3b5daf..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/introduction-to-quest-design/quest-design-9.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c1ab7cefd20742483901169d782113bd056c915997f0eb9e81fa860ab62d95d -size 146207 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/live-ops-planning/live-ops-communication.png b/.cursor/rules/roblox/en-us/assets/game-design/live-ops-planning/live-ops-communication.png deleted file mode 100644 index 251ef02a..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/live-ops-planning/live-ops-communication.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0a625ed3c07d1def774fce6a6186be8d335df456fbe66064377c4749ea73a20 -size 122686 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/live-ops-planning/live-ops-planning.png b/.cursor/rules/roblox/en-us/assets/game-design/live-ops-planning/live-ops-planning.png deleted file mode 100644 index 618915da..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/live-ops-planning/live-ops-planning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29518ef19cb5abaad854532a77f5e73d2d3673f58867888f93fe089bd0a6be4c -size 1935517 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-1.png b/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-1.png deleted file mode 100644 index 5b3f6e52..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56fab3dd15be37559435134284f58d3d448ab1abda24d99ab98e56f6cb1d6d84 -size 387577 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-2.png b/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-2.png deleted file mode 100644 index b8aaa0d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e42ebd1ee632af6d114beec530a81e96d47123451cb184482d28a7b08c8ed8ef -size 752819 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-3.png b/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-3.png deleted file mode 100644 index 4cf041fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da60c4326446976a17487d2d9bf2918a758ef6e4f6c57b4014b2863630fb6b13 -size 933409 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-4.png b/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-4.png deleted file mode 100644 index f311d685..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/live-ops/live-ops-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a1610f0a9a3075caadd24d70e75bbcb38bbc8641fc992c82255a7857909ceaf -size 1149319 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-0.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-0.png deleted file mode 100644 index 59e854b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85324d1f88d4db73c0b0c53904cf9ce412dab4a4ea53d91b2f0be9310a8cf9e8 -size 3303454 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-1.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-1.png deleted file mode 100644 index 17ee95be..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8fe1fa7809332bb7225ce4edd3883f85422450ad1c700abb6feb97d77ed949f -size 3912474 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-10.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-10.png deleted file mode 100644 index 6f5f9843..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-10.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5bb55382a4fea106021932f1c326b62deb949a112911b501bba371b88cda1714 -size 468664 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-11.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-11.png deleted file mode 100644 index 7454fe53..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-11.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b6a623f3782c04f517177fc607771041d48dcbb296e96e3caadd35637085a91 -size 2700191 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-12.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-12.png deleted file mode 100644 index f345f09f..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-12.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32b5a8e758ca3f40e53bc26b2a22d7c2af2d0d29fde5c75813030b23afd271e4 -size 1565704 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-13.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-13.png deleted file mode 100644 index 89dbf6b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-13.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e52103f67866ff3859c3485111bf9bc04a228b534bfbff24426e545bb4410eaa -size 814532 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-14.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-14.png deleted file mode 100644 index c8375132..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-14.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ab6e484df34d41497fefde7b638cb236937a377b9fcf436f5b747e200c105ca -size 246521 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-15.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-15.png deleted file mode 100644 index 280282b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-15.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b3c87536cc98528af437e39151aab815dd16728894e3e429024b03da9449f89 -size 965748 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-16.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-16.png deleted file mode 100644 index f360f17f..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e54aa10bed2981c47ddf529c50ab0295de14b7c82db2cdf3a8c2d47063260efc -size 198404 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-17.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-17.png deleted file mode 100644 index c134b145..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-17.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd143886f80afa9f1322000d2fd7baa94b494b1d13dd1e711456c25396d9cd6d -size 185103 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-18.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-18.png deleted file mode 100644 index 1ebf4ef7..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-18.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfcdb09af0a86e3d6cb3b2b63d0b6da0357b7e7da0d73956fe42652f9d5fd6ae -size 261495 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-19.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-19.png deleted file mode 100644 index 1c1e4f47..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-19.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7dfc29749b17236b9ade0baf9025c7770d4bd0dcd57b29c1b6cbc6f05061dcb -size 200075 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-2.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-2.png deleted file mode 100644 index 62f1d9b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87a77e08d56356538c35bd663bea9dc4ae4f2796a3f5fd62631a540b3afa6bd4 -size 248833 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-20.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-20.png deleted file mode 100644 index 8decd17a..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-20.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:266cb2a33af3a5d65524b19ee78763ff784811cc923b218a6c2feb7a302afe2a -size 595242 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-21.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-21.png deleted file mode 100644 index 93b36c2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-21.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:806de053da7628ad6a78e4ae4192eded64536b0ffd13bc071dea82e8a719c9b3 -size 449338 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-22.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-22.png deleted file mode 100644 index 4d882704..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-22.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90e33dd53f472210c6a01715bb47dee971a682353bcc4af33269c832c01f1c82 -size 511679 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-23.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-23.png deleted file mode 100644 index 9e24d1c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-23.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:266f21f3424b107b65856e9c79222760ddfa57b2e338fcf90bb0a9c549190a7c -size 495697 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-24.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-24.png deleted file mode 100644 index 37a062be..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-24.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25478ae877301ea4790ec147b1358da7a76ca33fbc6706eab84163b0d0ff7d63 -size 2799676 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-3.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-3.png deleted file mode 100644 index 19d42bdf..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:136f1ceb4c8d4cfc8ff1210442271753037c7575e22416a67f9f9c0f227b42cb -size 162645 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-4.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-4.png deleted file mode 100644 index 5d9113f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73a90696cf8a79ff1204b8da5cfc1d48bc24d3c25625511b29fcf5db867384e6 -size 236330 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-5.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-5.png deleted file mode 100644 index 24d78d43..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42dff11b3fd955e4af637c7e2b61d2b8ad7b02d3bf1d4bf685f0ca0ccf7f0e04 -size 2149965 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-6.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-6.png deleted file mode 100644 index ec67589f..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc5ee550bea3062ddf1c0d28863cefb4941476ac9e9ee01af097f205a7a42c03 -size 171108 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-7.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-7.png deleted file mode 100644 index 291d2a7e..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-7.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89d76cb98d8d07e7a56ad96d6a9ca592c95e67517aa84dd5635823065095f707 -size 430058 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-8.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-8.png deleted file mode 100644 index d33fddd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-8.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e143202fa6dd1e80d472244fbd5e208d3378fc5e224cad703fae2030f700f322 -size 332446 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-9.png b/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-9.png deleted file mode 100644 index 21b410b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/monetization-foundations/monetization-foundation-9.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9c78b7c0313e626cdb70e897da6b1af5cf93fa7efcac557ff2e5d1d60cafdfc -size 1194902 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-1.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-1.png deleted file mode 100644 index 608f897d..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:369d0b1680d3f8eca1a581ae3f43467d4c9008ef0c15c89cc5b2bffd5fb77ab7 -size 780106 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-2.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-2.png deleted file mode 100644 index 51c56d63..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc7e5d78a625d4e849a7c1925b88a95ccb17ad7effa76027a04b0670b11cb4cb -size 894888 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-3.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-3.png deleted file mode 100644 index a0a0001e..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9127d4c206197c75dfa89a6b7bfa937af38f998c8f66b20e84013245a54092a7 -size 767551 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-4.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-4.png deleted file mode 100644 index 8757ff1f..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/contextual-tutorial-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cdeceb7189e601640efb6d423a0e1bbc58165af15e8cceea68a6eb1ad2fc9d4d -size 721133 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-1.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-1.png deleted file mode 100644 index 0e615da8..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfc7102cc1dfd107bdb9cd0db0898b6b4cf80785924efe3549cdbdd973cf9955 -size 264180 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-2.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-2.png deleted file mode 100644 index 9ea9eac1..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c1f55d50d54e1c602d1e323a599c9553c5181fb00de58a5a3ddeef45808f11c -size 276213 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-3.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-3.png deleted file mode 100644 index 6cef7235..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a677137fe75c7920fb4d1f0b069e7e0cc1d2813a9aeae2f820b3e49916ee8be4 -size 1277774 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-4.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-4.png deleted file mode 100644 index 8b864c2e..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/timed-hints-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27e2d7499ef8990ea22340590e0a9ece0ef60c78c608af15e61bfe12cf5590c7 -size 837447 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-1.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-1.png deleted file mode 100644 index a18c8ffa..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a210adbc45049f92cf58c75df4ebae864cb604f7a7a27ac848201d3e288a89c1 -size 5358778 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-2.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-2.png deleted file mode 100644 index 4bc3e1a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51861f65b87446bea091f80e3c26e405ad2fe99c0fdce3b053b4e694fae58d31 -size 993483 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-3.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-3.png deleted file mode 100644 index 02a592a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89dae3637139bbb4e5c9d5e834f4463f9919a3a7cac26a3a30a5554039309625 -size 1241974 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-4.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-4.png deleted file mode 100644 index f0a3f049..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca240c1dfd40e34aecd944d247282d28aa8a80a1b80048a4a729e32c686df225 -size 1089789 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-5.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-5.png deleted file mode 100644 index 27c823df..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e05d3e6c6e384f5540e1b960706a9b80b6c52576588a849d48b7832d12f0cf3 -size 1964740 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-6.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-6.png deleted file mode 100644 index 8d7f35c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22647f5f1d00d6a4c59d53216b98a0485db09dc848d1e02d49afb19c368877e8 -size 709946 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-7.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-7.png deleted file mode 100644 index 95b175ff..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding-techniques/visual-elements-7.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c29282cd82f13d36b53e2ba67d5dc1ad657fd89284918cdc64d4c5a18b57d749 -size 1691262 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_1.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_1.png deleted file mode 100644 index 9863a61d..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:382832ca8d9abde2c9bac9c2d0f08489f9addfeb52551371f8aa9d2ac2bd7116 -size 53031 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_2.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_2.png deleted file mode 100644 index b2adda4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f481472cf8c4d48450f7a49c1a17bb6284fa7800b419c19b46104503f2805851 -size 178929 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_3.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_3.png deleted file mode 100644 index b8630a1f..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a6c0ad74a8960f34e296b7a13464ec407b63f42da8ff6508ca742c74baa8b49 -size 96061 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_4.png b/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_4.png deleted file mode 100644 index 93b36c2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/onboarding/onboarding_4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:806de053da7628ad6a78e4ae4192eded64536b0ffd13bc071dea82e8a719c9b3 -size 449338 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-1.png b/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-1.png deleted file mode 100644 index 94f7acda..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce6b32c6eb2c7d44e44c00b770168808e67fad46e99111fedea53c7d9434709f -size 3047542 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-2.png b/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-2.png deleted file mode 100644 index 6c161234..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f822940d4fbe59091b6d45efee9177253108ed8738d4d9631e29c280c558ccb -size 2191308 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-3.png b/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-3.png deleted file mode 100644 index 347c3be3..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6cfc7e4df66d3639e64575b85698582a2a452414c7f00d1a939647758b65039 -size 355508 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-4.png b/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-4.png deleted file mode 100644 index 11bdd4f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/prototyping/prototyping-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e5a38def6576a1d5257319cbc71bf8ca6f48b8467cfefb9ea18a7bd4919c46e -size 415491 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-0.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-0.png deleted file mode 100644 index 93b36c2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:806de053da7628ad6a78e4ae4192eded64536b0ffd13bc071dea82e8a719c9b3 -size 449338 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-1.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-1.png deleted file mode 100644 index 2430e300..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:328ac3f07063bfba442739be38bbdddc10e0eddfd8dc028fb07ef1d67a50424a -size 3728516 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-10.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-10.png deleted file mode 100644 index 71c75593..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-10.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9f59500588e9c5eda18494999cb6bcbfdb6df73d02cc5ac42a0db12cc7bb739 -size 1056855 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-12.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-12.png deleted file mode 100644 index 07f2438f..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-12.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86f6c1cc1155b6b0fe9d2687a620b36651d83e0011f90e7163fd1afd930eb05e -size 1839257 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-13.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-13.png deleted file mode 100644 index e75ab8f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-13.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12a5eb0ed1630dc47d2aadead9b528f0c7324c7e92f75edd044e1e848f882013 -size 335884 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-14.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-14.png deleted file mode 100644 index ddab8217..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-14.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0ada76f040aef35536c594218fa6788e65a41406db67784fa181b5ec42ccb1d -size 624013 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-2.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-2.png deleted file mode 100644 index 37a062be..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25478ae877301ea4790ec147b1358da7a76ca33fbc6706eab84163b0d0ff7d63 -size 2799676 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-4.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-4.png deleted file mode 100644 index 4fcefd0c..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9da99ba974599d57c342c376be62001b0531facb038527c024fbe8fe28e99b7 -size 772141 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-5.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-5.png deleted file mode 100644 index fe97056d..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80d0f7233eb380a36f576e48a7279df9d71b55f9e1c10cd2751a18f5664fb666 -size 782324 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-6.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-6.png deleted file mode 100644 index 665798b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:efa7263c55f9a31c07c948512235d139c68c111d9e5a0cbda08e17692b978939 -size 943748 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-7.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-7.png deleted file mode 100644 index 6eceaaa3..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-7.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:325d4a2979466421777bd3a6ff5e94f72a0034907d699be22738707b7c4f4a11 -size 857668 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-8.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-8.png deleted file mode 100644 index 241d192d..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-8.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eaf5de39ad275dc022b8fe460aea73d052fb0576175b70a4b57379bf19dad2bb -size 848599 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-9.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-9.png deleted file mode 100644 index 14f27103..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-9.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c86ba7c301e34ff781fa2d30468a83d6239bce75819777dba34196c68dbb6544 -size 1086249 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-ui1.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-ui1.png deleted file mode 100644 index a092cf6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-ui1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eea87036953feb92f2a535484b0dfeeaf7e097661027eccb7f8334510c95d61b -size 41408 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-ui2.png b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-ui2.png deleted file mode 100644 index 241d7445..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design-ui2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:188505eda4b3bb14794f1de7d964ce20c17c357a37f6021c4d86448cdc30ce24 -size 75921 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design.pdf b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design.pdf deleted file mode 100644 index 2927d6db..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-design.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c415f2680d3bf4f33286437725b8db16cdc1ec3796b7cb44bf0042ec669ed53 -size 343279 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-spreadsheet-.xlsx b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-spreadsheet-.xlsx deleted file mode 100644 index 35343b56..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-spreadsheet-.xlsx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:002125efc9648ffb21ff18605549db212d241e7ace50c35c895d55f68b0d29ec -size 27250 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-ui.pdf b/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-ui.pdf deleted file mode 100644 index 63b85ecb..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/season-pass-design/season-pass-ui.pdf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:460eb663d2df5772ce38f61e787c79dcaff431a11bc4a4ac37710eab2b6a4ea8 -size 1967194 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-1.png b/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-1.png deleted file mode 100644 index 6655229a..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f97ad0509c0a367cb213ef29ededefebfb5b13ef8571432892ba831789cd0222 -size 634357 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-2.png b/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-2.png deleted file mode 100644 index 59a395ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e35246316b31f98222d5dfe2606b9c6d6da257aeac01405f98480781d1e96c65 -size 113534 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-3.png b/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-3.png deleted file mode 100644 index c6271370..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a6e60ec8693ef25382fce68fe666fe122bfc6bf501eec9ce127254b8c360566 -size 107568 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-4.png b/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-4.png deleted file mode 100644 index 208cf07d..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/subscriptions/subscriptions-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc4acb1523a7991bc19f40d889a0100cbee68d7857c3cbd80475cb4b594c3be5 -size 1337954 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-1.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-1.png deleted file mode 100644 index 6f3fc613..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08af8314de05e69ddbf1b35e9dd258a41fcdfea0cab00cf31f554095f95801da -size 1794939 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-10.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-10.png deleted file mode 100644 index 2cf88cf8..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-10.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e54e36a60b2530b4334fdbe1318a05b231530157e387c64fdcea84194d70effa -size 1723588 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-11.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-11.png deleted file mode 100644 index ddc0489b..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-11.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e081262b6d195c71b75aec5ace957f8aa2a201c641ae6f6a180f8a5b4426b9f5 -size 1590193 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-12.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-12.png deleted file mode 100644 index 8b1510ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-12.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a01b865c759cd79bd2ab859735126672832b5495d28e7690ddc20e82c00e5ad -size 1469725 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-13.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-13.png deleted file mode 100644 index 7a298ed2..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-13.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c04c493df7855601a34724c44725066fcb253f14f36cb2134f1eae2108fe8c5 -size 259941 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-14.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-14.png deleted file mode 100644 index 74783487..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-14.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6568d1373004fa995ad012c453da336fae09a5ac209f1df9d85f8275a9cc8f9a -size 341695 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-15.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-15.png deleted file mode 100644 index 569fc7f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-15.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f573cd9ab9142a531c2c62b0230ce9a27e2a4f6203b505d011f146a3976367fa -size 1261913 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-16.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-16.png deleted file mode 100644 index 30373ac7..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-16.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4057a9b3fba8e3662ccadf27b0ad4f5c13eaba7032bb9054487fd67656c8c569 -size 719489 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-17.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-17.png deleted file mode 100644 index 5486fe23..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-17.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faef05bb4c062ec36b33f18007fe7d6df60714f6745b863819bed374fdc17ed9 -size 42450 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-18-video.mp4 b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-18-video.mp4 deleted file mode 100644 index 4b15f913..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-18-video.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bfcdaaa3de827ecfee9a3bcf476ece9a93c42d3d27737db44ceb27a2ffc32a4 -size 10818931 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-2.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-2.png deleted file mode 100644 index 284d3966..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb3d55239c29fb67c989ed8c68d84005900f24d79bf0e81100228c611ad1cc3c -size 486719 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-3.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-3.png deleted file mode 100644 index 548c2bd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0104bf0f06a6be99f6fb568b6824fc83f9086b0e918483d4265f482e785dfb1 -size 555440 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-4.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-4.png deleted file mode 100644 index 7f4c2b3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbc09758d013e13c32da810466f41643c252e4715cee0519113065f6922da368 -size 7348358 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-6.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-6.png deleted file mode 100644 index dd15199b..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:787b678ca893ddb4e7cdf42e48e7fd371711cbe27159d60834dcc53d54b7967e -size 1784652 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-7.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-7.png deleted file mode 100644 index d6d18505..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-7.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42f97429d495f9b791068d53ce0031cde4c9a14c7db1375b77d50ab56b9dcc19 -size 1586728 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-8.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-8.png deleted file mode 100644 index 93b36c2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-8.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:806de053da7628ad6a78e4ae4192eded64536b0ffd13bc071dea82e8a719c9b3 -size 449338 diff --git a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-9.png b/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-9.png deleted file mode 100644 index f3ea370b..00000000 --- a/.cursor/rules/roblox/en-us/assets/game-design/ui-ux-design/ui-ux-design-9.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d80e814413196032f72ab318a91c72d7190d5a7bac8979b26a87e86d3f8ca965 -size 1502182 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Catapult.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Catapult.jpg deleted file mode 100644 index b0e880a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Catapult.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e127dfb9a26157e788381569f75339554efaa1c825912a35415576c7c2b71eeb -size 546421 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Platform.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Platform.jpg deleted file mode 100644 index 011019e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Platform.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5796c38983e7b8c01d496fae04f14e33c4a236cc36e2386410390d40b479f31e -size 461298 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Projectiles.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Projectiles.jpg deleted file mode 100644 index 1354edd9..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Projectiles.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a97e0489da9c751df06997de346daa013dfb343570ae18b6c3a90fd297413a17 -size 521708 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Viewport.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Viewport.jpg deleted file mode 100644 index da0c5464..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/AssetPack-Viewport.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d7c2f2a1f99ba8d26212c6866ba56c413b582c1b8ab5702d2e70334d5ca1e08 -size 2065845 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Baseplate-Template-Icon.png b/.cursor/rules/roblox/en-us/assets/getting-started/Baseplate-Template-Icon.png deleted file mode 100644 index 5474c872..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Baseplate-Template-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d6b34af46cd599eb3f5834d605527663de9489ecc7b5bf71915f5687ed19cec -size 86297 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Baseplate-Tile.png b/.cursor/rules/roblox/en-us/assets/getting-started/Baseplate-Tile.png deleted file mode 100644 index bbb761e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Baseplate-Tile.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86659f78d1794b44cd5ef062092292b32ddde2f0bf50d2e82f06552056df0ed7 -size 110891 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Course-Completed.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/Course-Completed.jpg deleted file mode 100644 index 8ed954f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Course-Completed.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e61f8554b38258a0c655117742b2e9b72c01ceff0d2c51dd3269b1caead2e87e -size 187345 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Course-Gravity.mp4 b/.cursor/rules/roblox/en-us/assets/getting-started/Course-Gravity.mp4 deleted file mode 100644 index c9f4022e..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Course-Gravity.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:194c89e2129264ba9f38a77a2edfcdf7b39016a5169e2ee8e5e7942f848e50e7 -size 1335097 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Course-No-Baseplate.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/Course-No-Baseplate.jpg deleted file mode 100644 index 192d42da..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Course-No-Baseplate.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15537e14c8664831730ac8d9b6b7cf4f74bcefae017fc118a147f5643a7721c9 -size 98636 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/DataModel-End.png b/.cursor/rules/roblox/en-us/assets/getting-started/DataModel-End.png deleted file mode 100644 index 148da85b..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/DataModel-End.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cdc5d400c1ea35394d5736b070ba35234977d9776b7f8f853593c27bbb4b8ed -size 72727 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/DataModel-Start.png b/.cursor/rules/roblox/en-us/assets/getting-started/DataModel-Start.png deleted file mode 100644 index bb6f79dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/DataModel-Start.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bd7c0fd1a21869362652c46dafe70817d56f8d5f24ad26e524414a000173e9d -size 24397 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/DataModel-Workspace.png b/.cursor/rules/roblox/en-us/assets/getting-started/DataModel-Workspace.png deleted file mode 100644 index 2a79fd82..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/DataModel-Workspace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f0e8dc8fb066c7454b0c69848e6488b4e35b779b9d616b6086b20cefcfb327d -size 111082 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Experience-Page-Default.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/Experience-Page-Default.jpg deleted file mode 100644 index 5b82cbc1..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Experience-Page-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:923be08c0ea94bf8b9bfd86a7461f6da1ab65ede296f25f7ad15878758dbc265 -size 225970 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/First-Inserted-Part.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/First-Inserted-Part.jpg deleted file mode 100644 index 787521a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/First-Inserted-Part.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbd4ca4e4152c87282f1931b8c942053afc59f1219b289e276ffa402f58cba22 -size 210465 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Moved.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Moved.jpg deleted file mode 100644 index 0e71a53c..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Moved.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a74777bf0202e7c345181131d7640435106ba16d2a8386b2c17bb40022462bf -size 162718 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Rotated.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Rotated.jpg deleted file mode 100644 index 52c1eedc..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Rotated.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5925c389df12b6d881924a4f9f6e73bf9782d729b29e4e270de867225631b037 -size 168093 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Scaled.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Scaled.jpg deleted file mode 100644 index 08b1ff75..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Scaled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9bd991b0d0028a0f7068ef2e460eb22d676bf780fd1d04fa130b492c0249efb9 -size 158101 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Styled.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Styled.jpg deleted file mode 100644 index fd23a985..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/First-Part-Styled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfb279392ac74b676e81758ba13f85c9a36a25a8df080bd519c9b34a51460eba -size 206995 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/ModernCity-Tile.png b/.cursor/rules/roblox/en-us/assets/getting-started/ModernCity-Tile.png deleted file mode 100644 index 9122107f..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/ModernCity-Tile.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bccf8cf6675a878955bfc2e02402b38253b8938c007fca3402e5dda4a30ae648 -size 185762 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/New-Template-With-Spawn-Location.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/New-Template-With-Spawn-Location.jpg deleted file mode 100644 index 5ec14f14..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/New-Template-With-Spawn-Location.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60962c87b1c6cabb04d8612a315581c6a3a7f08fd863ffe86597cf16d9206057 -size 220843 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Overview.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/Overview.jpg deleted file mode 100644 index 53338808..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Overview.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:073c7f5e9aaec40f2acfdf3c2ff40ae4bf81caf54e031b3212ba544ee3360a66 -size 1708704 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Projectile-TooClose.mp4 b/.cursor/rules/roblox/en-us/assets/getting-started/Projectile-TooClose.mp4 deleted file mode 100644 index fb3064f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Projectile-TooClose.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bdad77bb2158e8cb91dc08bb10a586c71ca24bf46efa220695da1b8282797ea -size 2864779 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Projectile-TooFar.mp4 b/.cursor/rules/roblox/en-us/assets/getting-started/Projectile-TooFar.mp4 deleted file mode 100644 index 05497408..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Projectile-TooFar.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71962f95e94c716fd8a75d7756c3044e6a9d72518eb0ee898645d09b827b076d -size 3346441 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Projectiles-1.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/Projectiles-1.jpg deleted file mode 100644 index f177013b..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Projectiles-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9929015093dcb6757015a86c48fc90a7e9c3c58b3af6c1d71b47e2e1769f4732 -size 1745536 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Projectiles-2.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/Projectiles-2.jpg deleted file mode 100644 index de7b29f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Projectiles-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4c847f6da3494ab216e1b7b554adf3e221390789ad2151f7291b6817f4e2f82 -size 1742828 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Projectiles-3.mp4 b/.cursor/rules/roblox/en-us/assets/getting-started/Projectiles-3.mp4 deleted file mode 100644 index 1b7c8c2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Projectiles-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5d579663824f072e9c8ab09456238563ef6b933bce75097394308beebe710be -size 9492809 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Publish-2A.png b/.cursor/rules/roblox/en-us/assets/getting-started/Publish-2A.png deleted file mode 100644 index 91dac291..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Publish-2A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b5c97e843ac1e479743e3b1a98f2584bdd2e1ba5345a11000c2c39d72097994 -size 128620 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Publish-2B.png b/.cursor/rules/roblox/en-us/assets/getting-started/Publish-2B.png deleted file mode 100644 index fb4a9be7..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Publish-2B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7477f45b72e390dbf0b468a7d6b64e4c5bc151fd877b593d671c56538177cf60 -size 130741 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Racing-Tile.png b/.cursor/rules/roblox/en-us/assets/getting-started/Racing-Tile.png deleted file mode 100644 index cfa96bf5..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Racing-Tile.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9de1109d40e7fb9681d004f98e122be876548eadf7a02f81ed9c731b6a5ae60 -size 178904 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-1.png b/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-1.png deleted file mode 100644 index 5668c19e..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63fa3ba5fe7ca9a7492c3551b5358ff1709e4095e504afeb5d199b36a4075fd8 -size 92973 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-2.png b/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-2.png deleted file mode 100644 index d5dc991b..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3d65b2776247f511f968dc3831ee6dd89048044dbf28062329d0b02e325e901 -size 94031 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-3.png b/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-3.png deleted file mode 100644 index 139b1c95..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf2d73245ffb03d2299c5251c137f5d7a44273caeab4e898b4c552d184a67018 -size 94328 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-5B.mp4 b/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-5B.mp4 deleted file mode 100644 index d3f505e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-5B.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91bead40d8a4853353cd2009684b06615902f5d159ffbce5615470d83295e596 -size 6552326 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-5C.mp4 b/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-5C.mp4 deleted file mode 100644 index bdcf5a87..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Scripts-5C.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f10df8a16f86372db9793959eee68f53975300562c952eaba88b9dbcce02c67 -size 6092107 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Targets-1B.png b/.cursor/rules/roblox/en-us/assets/getting-started/Targets-1B.png deleted file mode 100644 index 6790dc22..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Targets-1B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd97ea567fecbd11358e0161474df0ec389e839b2cc61c1246294b59822e7845 -size 56012 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Targets-1C.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/Targets-1C.jpg deleted file mode 100644 index ce5b06ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Targets-1C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a019e9e4ee3586af099688ddf933e8554d2bcd6aa42b58fbedac52eea77817ac -size 1846151 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Targets-2.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/Targets-2.jpg deleted file mode 100644 index 32f397eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Targets-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adc1f58ca6adf8f82162b0aab8198407dc71acdb1ebecee049d1837ab74c40fe -size 662465 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Targets-3.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/Targets-3.jpg deleted file mode 100644 index b5363194..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Targets-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:970a7ab0e30f5141296ccb4b1624415200f5fbf64984f41e818164eab644b535 -size 675555 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/Workspace-Baseplate-Selected.png b/.cursor/rules/roblox/en-us/assets/getting-started/Workspace-Baseplate-Selected.png deleted file mode 100644 index ab6ef849..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/Workspace-Baseplate-Selected.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aec8ebe5723cdbaaa859deffb7a74aed9dcc8eb93d8bcc9eef8b80e178c404a6 -size 45323 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/developing-on-roblox/Global-User-Community-Chart.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/developing-on-roblox/Global-User-Community-Chart.jpg deleted file mode 100644 index dc417f98..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/developing-on-roblox/Global-User-Community-Chart.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d3e8d17547d49537536a845ddca16c47bcd005051f17ebc97cfa879e2aa38d8 -size 256679 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/developing-on-roblox/Percentage-O13-Users-Chart.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/developing-on-roblox/Percentage-O13-Users-Chart.jpg deleted file mode 100644 index da3beb53..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/developing-on-roblox/Percentage-O13-Users-Chart.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99b2374484f4abb715ba819ab2e160f11a7756b0ed1d90a192fe1d8d48fda7c1 -size 103676 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Community.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Community.jpg deleted file mode 100644 index 4a6dbfb1..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Community.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8dce77f68427667751acf324c10ba4b0f0f62e5d5516904ac4d2ae1c6e2e92b -size 270469 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Everything-You-Need.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Everything-You-Need.jpg deleted file mode 100644 index 3c97c02e..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Everything-You-Need.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c104c1d0df2557b601e20a165b514a811cd32fe3261deb302439874bc7dfc241 -size 436551 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Everything-You-Need.png b/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Everything-You-Need.png deleted file mode 100644 index 21d34a5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Everything-You-Need.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fa4c6952a5632a41649d1fcabdb00b12dbc3b8f5c1cba42850e9be5c9ed7fbc -size 674073 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Instant-Global-Access.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Instant-Global-Access.jpg deleted file mode 100644 index eaadb0ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Instant-Global-Access.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d62401216822046b565e000a50a4699500d896ac3eb268371cb1be62be189d9a -size 283734 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Rapid-Iteration.jpg b/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Rapid-Iteration.jpg deleted file mode 100644 index 7ee93a59..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Rapid-Iteration.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9230fbc4931cee9da114d3599411022c1d160fd923dc245485fa09f44960cc2 -size 230922 diff --git a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Rapid-Iteration.png b/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Rapid-Iteration.png deleted file mode 100644 index d0ced7c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/getting-started/platform-overview/Rapid-Iteration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4802507807de626fb1d618779f9eb8197a436f37d37828bb5e8120892e53a154 -size 1002450 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/AddIPToIPFamily.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/AddIPToIPFamily.png deleted file mode 100644 index 28206528..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/AddIPToIPFamily.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c47129c3036cdd1860ab8e694c7e847c1da79ffd4f4f0650994345f2dfca046 -size 117324 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/AddLicense.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/AddLicense.png deleted file mode 100644 index 650138d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/AddLicense.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b7dc1f147a8db3f0f9d20939da42fa9fee811e2bd61746710828607047be9fa -size 57104 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/AddLicenseStep.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/AddLicenseStep.png deleted file mode 100644 index 1ab137bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/AddLicenseStep.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87b367cc11b03a5280b5972c0dac611ff7bbf292efe85dd6e290fcc87546181c -size 120671 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/AvailableLicenses.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/AvailableLicenses.png deleted file mode 100644 index 1b80cf6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/AvailableLicenses.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41c4808c1bfc71a6499c5ed3fc03f4dc5b301237a2e16b896525c92e53b58ff3 -size 659777 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/BlueLockLogo.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/BlueLockLogo.png deleted file mode 100644 index 632f9da2..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/BlueLockLogo.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e98318b1fab7065d6cdc19ebcd759ab18bec7d7dcda2c112bef2efc09bb451f9 -size 468047 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily.png deleted file mode 100644 index cd6dd869..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1be6cba056491a3e98e14c3cc8f72fe5c67ef1638b843cf73f837fe7fdc5abf9 -size 122282 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily2.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily2.png deleted file mode 100644 index 8882885b..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37d4f2591af308edde3a86cf0210d9cd9c160df2d7c6d765bca148c7ee5ac6f1 -size 75601 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily_NoFlow.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily_NoFlow.png deleted file mode 100644 index f9f0e4f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily_NoFlow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0451e6280203a5f70b6abad10ea37bb7a85e22b7b24eaed26c4bac175c51afaa -size 90058 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily_YesFlow.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily_YesFlow.png deleted file mode 100644 index 2e03e9ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateIPFamily_YesFlow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c77d53e4b229543af4b8f7d2f42abb8aee4fda85aa30a761bf8e7f9544097bd7 -size 143554 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateLicense.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateLicense.png deleted file mode 100644 index 5a6bac2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateLicense.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28d597a0778bd4a3d731e6a19a85288da568eebbcb5f0b0492bdf2c066061784 -size 143610 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateListing.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateListing.png deleted file mode 100644 index 0deb078a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateListing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:550198f6a3b1eb34e3ba055f13a95fcddf93f2540594af1a5c46f45a522e9562 -size 69079 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateListingStep.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateListingStep.png deleted file mode 100644 index f15b738b..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/CreateListingStep.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e40acc21026239bd9f94ea60eb0b57e6a68c6cbc70a45e894884cad03ab29ae -size 60527 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/ExploreLicenses.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/ExploreLicenses.png deleted file mode 100644 index e589898d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/ExploreLicenses.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e75467e4b3d6d0b08e66fe7de0decd943c263738bba0f61f6192878c32e3a174 -size 1235315 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/Fall.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/Fall.png deleted file mode 100644 index 7ca995de..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/Fall.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:761174852836f7ff12e6d6f2f535e9df737ddbba61b6543a9c79cebd46775f4d -size 1279456 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/IPFamilies.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/IPFamilies.png deleted file mode 100644 index 4e63f39b..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/IPFamilies.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ff7ba870f690814fe8bd924378a8969906bc83f6c85a2bcb8dd8d56961e6a38 -size 261735 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/IPLicensing.mp4 b/.cursor/rules/roblox/en-us/assets/ip-licensing/IPLicensing.mp4 deleted file mode 100644 index e73a40df..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/IPLicensing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:030c819e365daac81b24a921b2eb3d45265a035a3e18dac6847d8ae028aa3a46 -size 119326713 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/IPRegistrationFlow.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/IPRegistrationFlow.png deleted file mode 100644 index a9f64f2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/IPRegistrationFlow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78d5b531d61242a921a5c734d093043de21a6ae37715334acbb36c3176fbf3cc -size 264538 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/IPRegistrationPage.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/IPRegistrationPage.png deleted file mode 100644 index 06222ac8..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/IPRegistrationPage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77b9873300145931fc3411379e354a65f4b9bbb7a380bfa1f98bea430ceda56e -size 211464 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/LicenseListing.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/LicenseListing.png deleted file mode 100644 index 62e7a059..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/LicenseListing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ac2a53860536996dfb17b6fba5fcf1c539e6819bc4e8e6d6cff913ae4bcd6d5 -size 269503 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/LicensesCatalog.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/LicensesCatalog.png deleted file mode 100644 index 3dc1eb9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/LicensesCatalog.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe697d8a5a7605df7763bf992690834622f25b0fdbcda1b7a8e0a4958a5d9be8 -size 718409 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/LicensesPage.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/LicensesPage.png deleted file mode 100644 index 27d41040..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/LicensesPage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0498e2d791a9bd8336712441564153d8d11eadb6ce982b169626aa304ccd4f4 -size 153956 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/bluelock.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/bluelock.png deleted file mode 100644 index 00959497..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/bluelock.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffee9fce2830227c712b660cd9250b3a47664a2d1e52e34b60c786f3839f2e4c -size 1964574 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/catalog.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/catalog.png deleted file mode 100644 index 54becd3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/catalog.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c13d4dd5670f8fe99fad92b16f72fad00488572838e9104fbdc81594ce1460b0 -size 618003 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/kodansha.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/kodansha.png deleted file mode 100644 index 2f33345d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/kodansha.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:545cd3c1943ea01a4852fa8baeeee8b17b7075637ec72c17a2986b31e69f273c -size 5039768 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/lionsgate.jpg b/.cursor/rules/roblox/en-us/assets/ip-licensing/lionsgate.jpg deleted file mode 100644 index 72c6fcf3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/lionsgate.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e18bea5277be523d0c16d5c93aa247300570876f12eb307c8e09340347faf7d0 -size 42743 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/logo-dark.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/logo-dark.png deleted file mode 100644 index dcdc765f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/logo-dark.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b8417d9d41e51b571535a9ca1051eecb7c0f887aea7457e536bfa169d27cf36 -size 87627 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/logo-light.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/logo-light.png deleted file mode 100644 index 03f39f8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/logo-light.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a03bf03c0e766c7af062f1732963c1449e2586fafe0fe93adac2e6872a50ead -size 69100 diff --git a/.cursor/rules/roblox/en-us/assets/ip-licensing/rivals.png b/.cursor/rules/roblox/en-us/assets/ip-licensing/rivals.png deleted file mode 100644 index 72abcdeb..00000000 --- a/.cursor/rules/roblox/en-us/assets/ip-licensing/rivals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9308ba7dfe5e1fe9cdb0bbddb6f88bd4a5e3e30b3605235ed6ac74a8aeadf686 -size 560757 diff --git a/.cursor/rules/roblox/en-us/assets/landing/Avatar_Banner_Landing.jpg b/.cursor/rules/roblox/en-us/assets/landing/Avatar_Banner_Landing.jpg deleted file mode 100644 index 10fc01ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/Avatar_Banner_Landing.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a12f362a0ecab1f45f6a2de40a5d117de4e5b9393787c977fd15537f24f0d4bf -size 536342 diff --git a/.cursor/rules/roblox/en-us/assets/landing/Cloud_Banner_Landing.jpg b/.cursor/rules/roblox/en-us/assets/landing/Cloud_Banner_Landing.jpg deleted file mode 100644 index 9de2173f..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/Cloud_Banner_Landing.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9093d64d6debb96634d35af6c4983e225ca43b8c20c0cf6499b57631f57de772 -size 468645 diff --git a/.cursor/rules/roblox/en-us/assets/landing/Data-Model-Mapping.png b/.cursor/rules/roblox/en-us/assets/landing/Data-Model-Mapping.png deleted file mode 100644 index b69b6c4b..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/Data-Model-Mapping.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f86fb3a1ec9a8a52f1d9373c0067dc29bec0fdb2eb661242c5446450c6bf32c4 -size 192231 diff --git a/.cursor/rules/roblox/en-us/assets/landing/Exp_Banner_Landing.jpg b/.cursor/rules/roblox/en-us/assets/landing/Exp_Banner_Landing.jpg deleted file mode 100644 index 6dd97f29..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/Exp_Banner_Landing.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a8f9048067dd8ea689d07efd7c2e10d82a7d76b1ff32637a970a8e629f74e31 -size 199608 diff --git a/.cursor/rules/roblox/en-us/assets/landing/Growth_Banner_Landing.jpg b/.cursor/rules/roblox/en-us/assets/landing/Growth_Banner_Landing.jpg deleted file mode 100644 index eeae1300..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/Growth_Banner_Landing.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5d6057029160b8410b47823c37552340bdb76bb36b48efc84759111408f0f4d -size 146535 diff --git a/.cursor/rules/roblox/en-us/assets/landing/affiliate-link.webp b/.cursor/rules/roblox/en-us/assets/landing/affiliate-link.webp deleted file mode 100644 index 0c32a650..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/affiliate-link.webp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69f4aab8036c15c78c5c664c6bc495757d4afdbde83213c95c154dde0c9e93f8 -size 235076 diff --git a/.cursor/rules/roblox/en-us/assets/landing/aged-up-avatar.jpg b/.cursor/rules/roblox/en-us/assets/landing/aged-up-avatar.jpg deleted file mode 100644 index d95aea70..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/aged-up-avatar.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78aef3c76ea88e3805f521dc2f1f7f6f488f4f20e2ceee5a5eb93cee198d160c -size 183904 diff --git a/.cursor/rules/roblox/en-us/assets/landing/app.jpg b/.cursor/rules/roblox/en-us/assets/landing/app.jpg deleted file mode 100644 index 8d0e1672..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/app.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5c93b2b6927b87dd36069f323bb54f1e0c4489733030d4a4ded10fb1995f777 -size 173602 diff --git a/.cursor/rules/roblox/en-us/assets/landing/assets.png b/.cursor/rules/roblox/en-us/assets/landing/assets.png deleted file mode 100644 index 231d3578..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/assets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:314461eff430f06ba8b544deb2bcfdfac022161e6970c94a4945592e1d82d659 -size 215326 diff --git a/.cursor/rules/roblox/en-us/assets/landing/avatar-play.jpg b/.cursor/rules/roblox/en-us/assets/landing/avatar-play.jpg deleted file mode 100644 index c26bdaf4..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/avatar-play.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a86f9e26933a04b346128cc62ad610d3d1c5525fa862a70ec680bc2d80925bba -size 401900 diff --git a/.cursor/rules/roblox/en-us/assets/landing/blender-logo.png b/.cursor/rules/roblox/en-us/assets/landing/blender-logo.png deleted file mode 100644 index 6b0cf018..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/blender-logo.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:028872ba3f83b50921b2bba292ef4950fabc62a981ba8c1725aeb745dd5edc9b -size 97279 diff --git a/.cursor/rules/roblox/en-us/assets/landing/chat-translation.jpg b/.cursor/rules/roblox/en-us/assets/landing/chat-translation.jpg deleted file mode 100644 index 4750b8c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/chat-translation.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6267af7ffadf575e53873d2809bfb3af13c6c29af83557117b708fda92a9eaaa -size 331755 diff --git a/.cursor/rules/roblox/en-us/assets/landing/cloud/banner.jpg b/.cursor/rules/roblox/en-us/assets/landing/cloud/banner.jpg deleted file mode 100644 index 624c0531..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/cloud/banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11ce0502d5c2ce8162f9aeceecfc2eef018505ce6fe241b5bf4ab8511de80ee3 -size 284549 diff --git a/.cursor/rules/roblox/en-us/assets/landing/core-experience.png b/.cursor/rules/roblox/en-us/assets/landing/core-experience.png deleted file mode 100644 index 52d0a99c..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/core-experience.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db447c88b27fa1c5cb9412e178b4352b647268d05441e2641af38f6ef02f54e2 -size 1061191 diff --git a/.cursor/rules/roblox/en-us/assets/landing/datamodel.png b/.cursor/rules/roblox/en-us/assets/landing/datamodel.png deleted file mode 100644 index 25dd872b..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/datamodel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd20836983a119cac9b9f36a4cc917550f6f9c27fc081cfd133c38e551fb79e3 -size 176779 diff --git a/.cursor/rules/roblox/en-us/assets/landing/device-family.png b/.cursor/rules/roblox/en-us/assets/landing/device-family.png deleted file mode 100644 index 3ecdfd92..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/device-family.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ac47522c09b5d951010e3fd96d37d193aad15bddcd0fcc44785880e3bc0594a -size 838285 diff --git a/.cursor/rules/roblox/en-us/assets/landing/discovery.jpg b/.cursor/rules/roblox/en-us/assets/landing/discovery.jpg deleted file mode 100644 index 9575ce3c..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/discovery.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01c1695cda140abc4ace4b7cd811713e3472f25663715f12d6e84a194bc37e4c -size 421584 diff --git a/.cursor/rules/roblox/en-us/assets/landing/ebp.jpg b/.cursor/rules/roblox/en-us/assets/landing/ebp.jpg deleted file mode 100644 index c1602dad..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/ebp.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d05577db5ece8e0b77f3064fda65ce520a200c0cc56b0acd6cdef587aed04fb -size 131957 diff --git a/.cursor/rules/roblox/en-us/assets/landing/education/banner.jpg b/.cursor/rules/roblox/en-us/assets/landing/education/banner.jpg deleted file mode 100644 index a3f3b5a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/education/banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c17b0125c0a7d6c55809f4b1343cfc1efd20e884ef1419d6e012e7b18900576 -size 251390 diff --git a/.cursor/rules/roblox/en-us/assets/landing/engine-simulation.gif b/.cursor/rules/roblox/en-us/assets/landing/engine-simulation.gif deleted file mode 100644 index 1a88c1b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/engine-simulation.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87bd85ce0c5510bc04686d2c4c3f84024948d6db13dfcb29bfc34b971a26d12e -size 10321864 diff --git a/.cursor/rules/roblox/en-us/assets/landing/engine/banner.jpg b/.cursor/rules/roblox/en-us/assets/landing/engine/banner.jpg deleted file mode 100644 index 92129102..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/engine/banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c41e0d9de660eb73f590de8ce7711d3db6739a79fffb91b5758f48fd7986bbd -size 175310 diff --git a/.cursor/rules/roblox/en-us/assets/landing/get-started/Laser-Tag-Template.jpg b/.cursor/rules/roblox/en-us/assets/landing/get-started/Laser-Tag-Template.jpg deleted file mode 100644 index 5f2f029d..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/get-started/Laser-Tag-Template.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f531f93e08c7dedce8f7e272a6966e7e2c7593f363ba4544fa55e688f65fa839 -size 99238 diff --git a/.cursor/rules/roblox/en-us/assets/landing/get-started/Platformer-Template.png b/.cursor/rules/roblox/en-us/assets/landing/get-started/Platformer-Template.png deleted file mode 100644 index ad6490a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/get-started/Platformer-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a5c07ca3071a0a586c3e34879053f06a8944ec1651e7257604016849cf4d8e9 -size 3146100 diff --git a/.cursor/rules/roblox/en-us/assets/landing/get-started/Racing-Detailed.jpg b/.cursor/rules/roblox/en-us/assets/landing/get-started/Racing-Detailed.jpg deleted file mode 100644 index 37dba833..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/get-started/Racing-Detailed.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6c6f2cd857fa553609f4a4943aaf80803fb980617342d83174e008749f0ca20 -size 573171 diff --git a/.cursor/rules/roblox/en-us/assets/landing/get-started/baseplate-template.png b/.cursor/rules/roblox/en-us/assets/landing/get-started/baseplate-template.png deleted file mode 100644 index 7235ea2e..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/get-started/baseplate-template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a70f761584ba2244c563b599dbb671ef9097b07e062cd7cda6444fc3be3aa591 -size 237976 diff --git a/.cursor/rules/roblox/en-us/assets/landing/get-started/first-experience.png b/.cursor/rules/roblox/en-us/assets/landing/get-started/first-experience.png deleted file mode 100644 index df05ef0b..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/get-started/first-experience.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ee02a9c9f33ea0e901adaba8dc42f013c442dd281547b9e8894eb3f552ceab2 -size 1129662 diff --git a/.cursor/rules/roblox/en-us/assets/landing/get-started/modern-city-template.png b/.cursor/rules/roblox/en-us/assets/landing/get-started/modern-city-template.png deleted file mode 100644 index 64e91855..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/get-started/modern-city-template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0d24f9147ba0e263dcd3a551baecc0829b992d6ee4de278a9f7853237d6605c -size 551614 diff --git a/.cursor/rules/roblox/en-us/assets/landing/get-started/racing-template.png b/.cursor/rules/roblox/en-us/assets/landing/get-started/racing-template.png deleted file mode 100644 index 569cc82c..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/get-started/racing-template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf146c9ee032ff6ac0f7bd376e0dad6cbf8ff9ca34806f85e4cb14d87c79f8b3 -size 585572 diff --git a/.cursor/rules/roblox/en-us/assets/landing/get-started/studio.png b/.cursor/rules/roblox/en-us/assets/landing/get-started/studio.png deleted file mode 100644 index 7ecb8579..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/get-started/studio.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:253c6f0c3b5c661d22b1685dc5afd844197bea3a95755ab702c5506a474c6319 -size 1934133 diff --git a/.cursor/rules/roblox/en-us/assets/landing/get-started/video-interviews.jpg b/.cursor/rules/roblox/en-us/assets/landing/get-started/video-interviews.jpg deleted file mode 100644 index f6be1441..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/get-started/video-interviews.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c59900b1dfe755e2ba4a0ae4989b265ed25dc0c054629944db28e731c4ec28ec -size 112902 diff --git a/.cursor/rules/roblox/en-us/assets/landing/groups.jpg b/.cursor/rules/roblox/en-us/assets/landing/groups.jpg deleted file mode 100644 index 7cad11fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/groups.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6f1970962afc176f947649218553e31cb183a5fdff46859cfcab62c6d3239cc -size 195987 diff --git a/.cursor/rules/roblox/en-us/assets/landing/guides/banner.jpg b/.cursor/rules/roblox/en-us/assets/landing/guides/banner.jpg deleted file mode 100644 index d0f5e58d..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/guides/banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3028756f300cbd6e3287e7c3075266a9fad2ea1abbc7c889c067f472e634d802 -size 156026 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_announcements.png b/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_announcements.png deleted file mode 100644 index 5fa72f40..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_announcements.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cf3085e63fd0d6386724e30d2de3ff66399d10afc1bd6466cb500828c097bc4 -size 21738 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_avatar.png b/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_avatar.png deleted file mode 100644 index 8d93ea55..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_avatar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1dfb8c8f756aa14318adeb63ead8557b54774c97140ba70cf6ce9e2d7cfcc699 -size 24887 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_building_visuals.png b/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_building_visuals.png deleted file mode 100644 index 7cc512ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_building_visuals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12009cbad1a34a61df17d1c40230208596374a7c354bfe4726194ada85cd701d -size 24554 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_education_tutorials.png b/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_education_tutorials.png deleted file mode 100644 index 2eff2ffa..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_education_tutorials.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f70ffe2b2ff567f5a6258e33cbd18f9bb5f310308474631da7c3b385be3b495b -size 25661 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_open_cloud.png b/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_open_cloud.png deleted file mode 100644 index e298f1f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_open_cloud.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f345b2c2cf4f2598093f497e06cd5a30ab3f94e94fe5c0f30d85c7bafd6b8531 -size 17792 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_production.png b/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_production.png deleted file mode 100644 index 4a0d291c..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_production.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea72c94502db89990cbcfa5951cb343f8072ae37af3ae8da94ceda7e4089e559 -size 25625 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_scripting.png b/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_scripting.png deleted file mode 100644 index feef4a6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_scripting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6924045b5624c0d3db08453213417493dbd1b192cdf195aa4fb05caabc952acf -size 24040 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_studio.png b/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_studio.png deleted file mode 100644 index 3e1cd692..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/articleBanner_studio.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b05ffa479ad930ff87e711a5942eb88ce8f9bf38ee28139db1781004bddb80d8 -size 25272 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/banner.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/banner.jpg deleted file mode 100644 index 61e3cd89..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78ef314222a250d7f7974e16e43e743bcd20f6ca01278361dc602602b130c344 -size 228056 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/creator-store.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/creator-store.jpg deleted file mode 100644 index 3ce10eab..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/creator-store.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19db8f6d18c1566b1c720849885065787bd0264ee24d2205653cb07b63141d11 -size 304092 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/discover.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/discover.jpg deleted file mode 100644 index 2a2114f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/discover.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3cac90c37b23708fb2a35f2556a4892f6f53fe6aede4cc041a43e13e2f89766 -size 572176 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/started_creator_dashboard.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/started_creator_dashboard.jpg deleted file mode 100644 index bbfad3ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/started_creator_dashboard.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cae5d4d5c660b2cefe1d5138c3890d0a47554ba6aa92982b3987eb5768771877 -size 53379 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/started_studio.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/started_studio.jpg deleted file mode 100644 index 76d7dee6..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/started_studio.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:219ac921ef6ef9dceb5cd4b05b929526131a1714d8e60e7445410d749574a2ef -size 128989 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/topic_avatar.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/topic_avatar.jpg deleted file mode 100644 index b7f1e2bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/topic_avatar.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6aa5686a3f9a0f79a07c19806188b17447b21f49ba2b567cee06d3f154cda27 -size 73506 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/topic_building_visuals.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/topic_building_visuals.jpg deleted file mode 100644 index bcb8f277..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/topic_building_visuals.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f0b5e304e1e8098c0c967ae9c72ca47e6d77d8f9372466045847d1bc22c92cd -size 149646 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/topic_education.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/topic_education.jpg deleted file mode 100644 index 6300c225..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/topic_education.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b15d40379fb44a14e0ab364277f5515fb333f293ef1047e98fdcbc1c0d605241 -size 160272 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/topic_production.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/topic_production.jpg deleted file mode 100644 index dcc6d76f..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/topic_production.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5b5c45686744f4f33fc7f383dd03bea98067756f4d149701d0f87e960e77485 -size 153371 diff --git a/.cursor/rules/roblox/en-us/assets/landing/home/topic_scripting.jpg b/.cursor/rules/roblox/en-us/assets/landing/home/topic_scripting.jpg deleted file mode 100644 index e7493209..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/home/topic_scripting.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e750da740c80a5ad7ad9a23af8585176dca9630e9da7c247f3ad7e7ebfacf75 -size 174090 diff --git a/.cursor/rules/roblox/en-us/assets/landing/hub-home.jpg b/.cursor/rules/roblox/en-us/assets/landing/hub-home.jpg deleted file mode 100644 index f5058ac4..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/hub-home.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1a06606cef5894c5da480b9b8a1ea247ea0e51cd1c38362d7ab82e99af12f31 -size 256263 diff --git a/.cursor/rules/roblox/en-us/assets/landing/in-exp-monetization.jpg b/.cursor/rules/roblox/en-us/assets/landing/in-exp-monetization.jpg deleted file mode 100644 index c7403985..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/in-exp-monetization.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b29584b52b6c44ffdcd89407d88bc65e8d363aa4b8b6c36935024178ad1db215 -size 468347 diff --git a/.cursor/rules/roblox/en-us/assets/landing/limited-items.png b/.cursor/rules/roblox/en-us/assets/landing/limited-items.png deleted file mode 100644 index 9cae5b5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/limited-items.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6726ca57f16884edbffe92c432f050e65ef1bb6e081ed9fed1a39d958c65dab -size 297783 diff --git a/.cursor/rules/roblox/en-us/assets/landing/marketplace.jpg b/.cursor/rules/roblox/en-us/assets/landing/marketplace.jpg deleted file mode 100644 index 734de5f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/marketplace.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6e3d4ea1233512d3b6e1d82b573b351e02858e0bf947c796ec9c4d487131180 -size 215075 diff --git a/.cursor/rules/roblox/en-us/assets/landing/monetization/hero.png b/.cursor/rules/roblox/en-us/assets/landing/monetization/hero.png deleted file mode 100644 index cf6ed578..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/monetization/hero.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff2210aa55c0f7ad127ba18efb26995eeed0376dadf08420a1c81e94f132adcf -size 3877158 diff --git a/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial1.jpg b/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial1.jpg deleted file mode 100644 index 6aad4372..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fd2373256bbfdc236ed4223cb47e524a74df36a422802a0574649c390575bcd -size 967928 diff --git a/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial2.jpg b/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial2.jpg deleted file mode 100644 index 73b3a30b..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9acf01a291a3cece8ea76493c539c25fea1a52a0051d374836aa15b5c9e4d34 -size 6343420 diff --git a/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial3.png b/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial3.png deleted file mode 100644 index 8a826a52..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbea877a77568ddb929d83f3319ab4c01dc5604456402395215551e062a70b99 -size 401951 diff --git a/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial4.png b/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial4.png deleted file mode 100644 index fb951139..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/monetization/testimonial4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a79478787194f8a64dc7752c13dee1e2090c59fa5a06b26a54c3fa7096a27974 -size 5267580 diff --git a/.cursor/rules/roblox/en-us/assets/landing/plugins.jpg b/.cursor/rules/roblox/en-us/assets/landing/plugins.jpg deleted file mode 100644 index 6c6fd54f..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/plugins.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43b382f1339d3a522217114e5b0957ea6e9146b3e730365411989d51b18ef707 -size 119030 diff --git a/.cursor/rules/roblox/en-us/assets/landing/price-floors.png b/.cursor/rules/roblox/en-us/assets/landing/price-floors.png deleted file mode 100644 index f450a3a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/price-floors.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09142535f196efc0acb7ef982cadc599fab8633f278c51f0f32acb897c81d8c2 -size 284879 diff --git a/.cursor/rules/roblox/en-us/assets/landing/scripting-animation.gif b/.cursor/rules/roblox/en-us/assets/landing/scripting-animation.gif deleted file mode 100644 index f4f9fb31..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/scripting-animation.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d5a78b4a7315cf87275cfb7df7af51ef5baa81da48e6945163af0fd031bff65 -size 9827618 diff --git a/.cursor/rules/roblox/en-us/assets/landing/scripting.png b/.cursor/rules/roblox/en-us/assets/landing/scripting.png deleted file mode 100644 index a93be0f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/scripting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4045c32630a8cbe26f9d789d02a8747825334fb319ad6a92b083df297438970 -size 263716 diff --git a/.cursor/rules/roblox/en-us/assets/landing/sponsored-items.jpg b/.cursor/rules/roblox/en-us/assets/landing/sponsored-items.jpg deleted file mode 100644 index 7bb1fbc5..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/sponsored-items.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2d060d16fba8ceee4300a189e8fc77df37bb182fd184c944f723ccd83be3aed -size 75077 diff --git a/.cursor/rules/roblox/en-us/assets/landing/store.jpg b/.cursor/rules/roblox/en-us/assets/landing/store.jpg deleted file mode 100644 index 3c7d436d..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/store.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84fa7b0727f65788451e00c02ab7ae65f30fb200a5ca3551679f27a4586514ba -size 201824 diff --git a/.cursor/rules/roblox/en-us/assets/landing/ugchomestore.jpeg b/.cursor/rules/roblox/en-us/assets/landing/ugchomestore.jpeg deleted file mode 100644 index abce2555..00000000 --- a/.cursor/rules/roblox/en-us/assets/landing/ugchomestore.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6b960340bb9e04a82fb7b5db1980a78815c636b1ba821aca5a5e25b034885e3 -size 202869 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Gusts.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Gusts.mp4 deleted file mode 100644 index defcafef..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Gusts.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:108fbd3f1da7cb2509d12c10cc8a1cb2c3902f00c6be67644e670254814f1745 -size 18401609 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Particles.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Particles.mp4 deleted file mode 100644 index d53a4e01..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Particles.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b040a97ab207f279b0e4859bddb22297571ddb65c9f941790f9e64b349bf0329 -size 18927846 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Showcase.mp4 deleted file mode 100644 index 49d9ff4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Global-Wind-Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7ca96c126f388f89d8be7bfe6d4f867ac9e1c5e85d098743912d1fba4a219e0 -size 13864702 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Wind-Direction-Widget.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Wind-Direction-Widget.jpg deleted file mode 100644 index dac5e942..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/aero-fluid-dynamics/Wind-Direction-Widget.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fd37ed86de5ee114e930ac2c075a834367340742c4e0eab77eee22727ea6aaf -size 301633 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Color-A.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Color-A.jpg deleted file mode 100644 index 14f273b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Color-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c179536cafee326fd987dab7fadd830f5c678b5eac50a640578e5bd352104b0 -size 144512 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Color-B.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Color-B.jpg deleted file mode 100644 index fcfc1bea..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Color-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3adbc335162f3f799a1790dc14c8d7c012c13618a7b6822295fb229241917e8d -size 148242 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Decay-A.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Decay-A.jpg deleted file mode 100644 index 6a29d790..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Decay-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f40941f0731bb45abe7b067df973cb6af25dfdb14ef15658a02effd2bb79fd54 -size 143340 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Decay-B.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Decay-B.jpg deleted file mode 100644 index 9e125cb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Decay-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a2ed5f27a3ba835fe682825914a9baf7b3bd77304ab524c9b92f8836ae8e276 -size 160738 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Density-A.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Density-A.jpg deleted file mode 100644 index 9bcf9122..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Density-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2d1adb05702d932c2a8e678032e2ec380bd3fcdf4d0b6a1da9d6ead307306ba -size 172962 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Density-B.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Density-B.jpg deleted file mode 100644 index 6239a1d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Density-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:589ecef30723bfefb5b724e9e19c2183c9c603c964b6807c1f93cb7cad4a5301 -size 160056 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Glare-A.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Glare-A.jpg deleted file mode 100644 index 9399751b..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Glare-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a5c71752d59a0456785f41fed347fc711b43425c27a76bac21e1b3819986458 -size 154288 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Glare-B.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Glare-B.jpg deleted file mode 100644 index 6a29d790..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Glare-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f40941f0731bb45abe7b067df973cb6af25dfdb14ef15658a02effd2bb79fd54 -size 143340 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Haze-A.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Haze-A.jpg deleted file mode 100644 index 4cdf273c..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Haze-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7c3665e65408875bc0fc440cb10c695860d63d9699ead19226ea5917aa0b962 -size 143692 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Haze-B.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Haze-B.jpg deleted file mode 100644 index cd9fa1cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Haze-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f745f81986418133f1bfaf3b82ddac35d2dfeb4d042e8c41657b95bc90443c70 -size 110586 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Offset-A.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Offset-A.jpg deleted file mode 100644 index e7d79052..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Offset-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84f7b14880cd5d06145cfef9462f27c11812413ae84b35afc3e4dd5170e3c786 -size 157159 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Offset-B.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Offset-B.jpg deleted file mode 100644 index b2fa339a..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Offset-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a75b8241d70f1b2b31d3ab099d08328b3c7a51bbed411d121b8202b071072317 -size 157507 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Sahara-Sunset.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Sahara-Sunset.jpg deleted file mode 100644 index 35174e3b..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Sahara-Sunset.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06a3d725a08c8e7f118e8aa93b2f26f2ac8bde0ebdeafa68cde004dc8d2cda27 -size 111662 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Showcase.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Showcase.jpg deleted file mode 100644 index b915e158..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/atmosphere/Showcase.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b98239480c3eb33eb32f2af9c4690ef628d6b9a63675d9543f4debb47141ed4d -size 100949 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Attachments-Rotated.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Attachments-Rotated.png deleted file mode 100644 index 370eb3e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Attachments-Rotated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fe406eebf2c67b541778d131b7a3e0a8c2eda0c3f4ef9161ca89d62e78058ec -size 66673 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/ColorSequence-Applied.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/ColorSequence-Applied.png deleted file mode 100644 index f140db13..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/ColorSequence-Applied.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2efa81dfb9aa5f15b8816a25b0b069e952bafd85289ce8ca193ddaeb0e12fd6b -size 134383 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Curves-Applied.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Curves-Applied.png deleted file mode 100644 index adca06cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Curves-Applied.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:472eae0516c49ea578acaac091e6ca8fbc2cc4594c4c742602724232d8441637 -size 165226 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Default-Beam.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Default-Beam.png deleted file mode 100644 index 2ce3abff..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Default-Beam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c90d1cf74ae66d7b7ee4a5429252416b1110e503820d6d1fb85138845b54bff6 -size 63199 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/FaceCamera.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/FaceCamera.mp4 deleted file mode 100644 index 8b95718d..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/FaceCamera.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29d9177cfd98ea12f5e4275aacc9f949170384ed1a897133d9decd51bb5d2a17 -size 1507917 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Showcase.mp4 deleted file mode 100644 index 336207b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13e3fe00d60927a1be24bade0f2bfb329cb2995cfa60bef9ba18b10b405559fe -size 4645569 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Texture-Applied.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Texture-Applied.png deleted file mode 100644 index 7d445fb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Texture-Applied.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a6567500954a695c9171bd51f6ff9f3d00f8dff72e399a313c71f7cca543008 -size 43193 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Transparency-Applied.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Transparency-Applied.png deleted file mode 100644 index d91d488b..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Transparency-Applied.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4f1ef5be49aeed1318cd391d90a24918a711f52cef69b042b62585a406bc962 -size 41432 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Width-Adjusted.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Width-Adjusted.png deleted file mode 100644 index 222a68ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/beam/Width-Adjusted.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b49541d46b97f50f923c4c44af7821ccde7696c05ed62c01c514441a5ebc34b -size 152131 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Color-A.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Color-A.jpg deleted file mode 100644 index 5aabb676..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Color-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0799231f8bcadcd3e744ab8b06516b0728df6d9e8964329ad02227eb5d3a8266 -size 156460 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Color-B.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Color-B.jpg deleted file mode 100644 index dec6db80..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Color-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fbe84a3b8d6a604ebd9eaf6ee6371df77577cc0afb610d9605fd167d55a692f -size 144567 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Cover-A.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Cover-A.jpg deleted file mode 100644 index 59b855e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Cover-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1130aef3359c5221a1ccfcdf4cb4ebf70ecc265b8d7e733bfcc3c50684461693 -size 150685 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Cover-B.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Cover-B.jpg deleted file mode 100644 index 41c912a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Cover-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08799c4af3d2115dfa92ef1a79cfdc115699c5c30eb2c4ffff5ff8aa12258a93 -size 146875 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Density-A.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Density-A.jpg deleted file mode 100644 index fc431f46..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Density-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c9145847d822a41d776dc5f197220a4a852966115ed0934303f5dab53df59f5 -size 148976 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Density-B.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Density-B.jpg deleted file mode 100644 index 9033b9d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Density-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26909337796af7aba685e18ac1f8bb01e3a8c3a625a3099218a990d3dd455349 -size 144013 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Showcase.mp4 deleted file mode 100644 index 2237e064..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/clouds/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce8c4eedecd6f3765a8760be77c62562aad2b39f9c56c4698620338ee4c63fa4 -size 4396162 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-10.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-10.jpg deleted file mode 100644 index 65b8147d..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-10.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ed4876be5d655dec5d6cc6a214fb909f61dc7027d6140aa10bb051bf770132e -size 136380 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-2.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-2.jpg deleted file mode 100644 index 7f6a9ebd..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a27050f0890062b10c25b4151b1ec45912572781fcca39e84241d5daa44e93d -size 121884 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-50.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-50.jpg deleted file mode 100644 index db36da9f..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Brightness-50.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c224c37445f2d74b2aa0d7c45fe89bb1d20df9bc6cca8a7bf0a5271b2b84873 -size 135549 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-0-255-125.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-0-255-125.jpg deleted file mode 100644 index 4eec1e7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-0-255-125.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3926b925913ae527d923ec7cfa27190296abe45d7b004d4e8ebf0cc26a7094f0 -size 137589 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-255-100-50.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-255-100-50.jpg deleted file mode 100644 index cd2ed184..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-255-100-50.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e144d6a1d90048866c58cb81be99c8bd980472ae3be7af9d5a279a9cc015c8f3 -size 130130 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-75-150-255.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-75-150-255.jpg deleted file mode 100644 index f0215c58..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Color-75-150-255.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04cba0397489957bc3a869775f7a0a5815bdd0a5622db5a66dee20e8ee3ceebf -size 129833 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Shadows-False.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Shadows-False.jpg deleted file mode 100644 index c47ce31a..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Shadows-False.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:230538b5d3a23e243d94125a47617b563680b49aab444bb168563768f5cb4dcf -size 261018 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Shadows-True.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Shadows-True.jpg deleted file mode 100644 index f29c4628..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Light-Shadows-True.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec196bfd77485acbe64e63c0fe484aef91deb604eae6d9d022a760b167aefa46 -size 264801 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/PointLight-Range-12.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/PointLight-Range-12.jpg deleted file mode 100644 index 6b37039b..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/PointLight-Range-12.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb2ee40b59a41d7a755341096cb61864d50d7ff712300d92765037efa7bf2d35 -size 236523 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/PointLight-Range-8.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/PointLight-Range-8.jpg deleted file mode 100644 index 3a81d869..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/PointLight-Range-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a16685213638ce598355a6f076a2511f9afacd8d164876b19047aa09e971cfab -size 208169 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Showcase.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Showcase.jpg deleted file mode 100644 index 4d16435d..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/Showcase.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74d15edfdd28284caacb4394f3acd141c4d1cc73ade4da89b3e9ffad46acd469 -size 139953 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Angle-30.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Angle-30.jpg deleted file mode 100644 index 7fa546d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Angle-30.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfd3f103ba3efe295d70e46c1e2ca55e44f066928c1b2f42b1646b559ca5df5f -size 242134 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Angle-75.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Angle-75.jpg deleted file mode 100644 index 7cb001fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Angle-75.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7244ce1dc1f5afb8719273b97e068b279b92c13f0a5d6785ffc7a25237784a5 -size 264358 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Face-Bottom.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Face-Bottom.jpg deleted file mode 100644 index 9c751d85..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Face-Bottom.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c398760731d79619ace5718cd0c775ffc9f732d6eeb547224e56ddd907d4288 -size 255838 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Face-Left.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Face-Left.jpg deleted file mode 100644 index f2be620e..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SpotLight-Face-Left.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c634e4ef0d56b1da2e21c5d19a84277cc39f39d51fd35f046411864392d64343 -size 252716 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Angle-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Angle-0.jpg deleted file mode 100644 index 111cf1c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Angle-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6e2480da1f81b8ac377357dde7903614871e0cc94f78bdb2cedd8f25e897e82 -size 245574 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Face-Bottom.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Face-Bottom.jpg deleted file mode 100644 index b651a6d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Face-Bottom.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4731216a38d9764c78e6910b315fbad007ad400b6b43003c3496d58c8be9668 -size 256996 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Face-Right.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Face-Right.jpg deleted file mode 100644 index 5a08cfda..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/light-sources/SurfaceLight-Face-Right.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc29a4e5ff6927dc2bab2ea4e87faac3999fc2d1cb5f785a3f652891a9a71022 -size 273860 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-0-0-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-0-0-0.jpg deleted file mode 100644 index ee07c544..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-0-0-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61bf68b96c3cd7715e48583a7bfd2f31e920918644bfa77ac9c4f88543cd5ec3 -size 203378 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-160-80-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-160-80-0.jpg deleted file mode 100644 index f15e2372..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-160-80-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07de6071621bb425633795e14c3a4111b7b2fef86d604268545aee03ec3f7908 -size 205718 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-25-0-125.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-25-0-125.jpg deleted file mode 100644 index 89f9981c..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Ambient-25-0-125.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8f0f2b96d50179187e432a10a656900470f3be5d07ebdf49e14fc7184c24d64 -size 209236 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-0.5.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-0.5.jpg deleted file mode 100644 index c303c4a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-0.5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3902a4286afe8136f524936f7908eccd78554306b529b7cf0642e656f5c261f0 -size 125065 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-1.5.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-1.5.jpg deleted file mode 100644 index 7d296315..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-1.5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e012fd72f4776137c54e99c16e7e7b033edc9737567f8b11abe36cce105960e -size 167652 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-3.75.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-3.75.jpg deleted file mode 100644 index 20297829..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Brightness-3.75.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e67823e4767b13e533030c7ef138d4ce6d2d043df49a5903322fa8d9028d67c -size 216722 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Bottom-0-255-190.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Bottom-0-255-190.jpg deleted file mode 100644 index b99755a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Bottom-0-255-190.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c107c8d56864e7649acc94c09a9c9d15a0bb760e30114d16da35a569304e72fc -size 184315 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Bottom-255-0-220.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Bottom-255-0-220.jpg deleted file mode 100644 index 602f3e27..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Bottom-255-0-220.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a01249e31b28724b2cd31e72db460bdfdf1df8323405b42f9928212927d1691 -size 182560 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Top-0-100-255.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Top-0-100-255.jpg deleted file mode 100644 index 46c7e373..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Top-0-100-255.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a6cad863b1a2d72bb6a077a2c5a8e67d633e1a078bbadcccbfb6980aaf208ed -size 166949 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Top-255-60-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Top-255-60-0.jpg deleted file mode 100644 index fa7ed828..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ColorShift-Top-255-60-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f2baa57166364cd58ce1f1f040264820d1726e148e8a3ac9c24497b98edf82f -size 172126 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentDiffuseScale-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentDiffuseScale-0.jpg deleted file mode 100644 index 99958143..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentDiffuseScale-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:230c3d055f9effc72854689337d2971e9270b03776c13b884d56d093c6304b92 -size 145078 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentDiffuseScale-1.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentDiffuseScale-1.jpg deleted file mode 100644 index f384a3b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentDiffuseScale-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfe3fc987f15b980a6ddfdcebaac65003c1776dda52d328206680d529d1f76e5 -size 151617 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentSpecularScale-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentSpecularScale-0.jpg deleted file mode 100644 index f33e5bc9..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentSpecularScale-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ce0ca8afc3cc2256f471c4af367d11d4fb4ca816177c6eb83f75cafc85ac4dc -size 160351 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentSpecularScale-1.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentSpecularScale-1.jpg deleted file mode 100644 index 5a0bc141..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/EnvironmentSpecularScale-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6de464c7dc418aeb29887a55b6f3b9cd68c8668fd21d45b690e5c2d64a125ad7 -size 185347 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation--1.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation--1.jpg deleted file mode 100644 index e277ecd7..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation--1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d3d27afafb633fb0e91ae3a88174225a82ec69de73365275dd8a910112fd7a3 -size 100189 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation-0.jpg deleted file mode 100644 index 415490d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61f067eac629d42aa973742583c6355ad7d86d832865ec88ad7dcd49ff995ad4 -size 124147 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation-1.25.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation-1.25.jpg deleted file mode 100644 index 833530ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ExposureCompensation-1.25.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd1cac36b7cc0cdf65a412b7968fc75758e4e808bb3cf3f9f8a15d8250ccb4ec -size 139380 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Geographic-Latitude.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Geographic-Latitude.mp4 deleted file mode 100644 index abc946aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/Geographic-Latitude.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f355601dbe157c3bd8977d53d780910690cf5c2462f0e7c2ceff4b975112d2c8 -size 7109542 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/GlobalShadows-False.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/GlobalShadows-False.jpg deleted file mode 100644 index d317b265..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/GlobalShadows-False.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfa29c41aba01087bfbad4b0dd7bad56fd3e68ad0d2a11a29898f7bc17d32aab -size 142081 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/GlobalShadows-True.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/GlobalShadows-True.jpg deleted file mode 100644 index 810ee482..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/GlobalShadows-True.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e1afbfaa724864f98b8a4abf855fefb1a3082fc3a9461ca09a3344ba04fa59a -size 125161 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/LightingStyle-Realistic.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/LightingStyle-Realistic.jpg deleted file mode 100644 index f2c0fc73..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/LightingStyle-Realistic.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bcff7287ea9d471dcabde7e8217bfcadf3b6577cbca192be6a7c2d413779c1b2 -size 347000 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/LightingStyle-Soft.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/LightingStyle-Soft.jpg deleted file mode 100644 index 97fbf550..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/LightingStyle-Soft.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96d54d1c067eda3388b37dd5dfdeae0bb28e3e44a5d05fb37e64c7922fced8e6 -size 350293 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-0-175-255.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-0-175-255.jpg deleted file mode 100644 index 5b09e2a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-0-175-255.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cdabe7ce0d02f4055aa5b194362dccec3804a7186a510b8d20da87ac7536e92f -size 110378 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-200-150-240.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-200-150-240.jpg deleted file mode 100644 index ebe83a4c..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-200-150-240.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc80fedc2685da82bbca8a0b08e1d7c2e23b5c51c31e446b28e4b70bc4bf934a -size 109818 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-255-150-50.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-255-150-50.jpg deleted file mode 100644 index 75d1f273..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/OutdoorAmbient-255-150-50.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3003b98acba3db61e213455539f838657acaf6689cb94d434078c19d472e2b4 -size 117154 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ShadowSoftness-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ShadowSoftness-0.jpg deleted file mode 100644 index 07705c72..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ShadowSoftness-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5210c37505914d7d065d9ad624eed926f5720a453eaee1b48cc4f62a3ff07063 -size 145182 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ShadowSoftness-1.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ShadowSoftness-1.jpg deleted file mode 100644 index 0f95ae8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/ShadowSoftness-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c364a13b2e3fe964bfdaf4766c6d0142146a23b6c103e8f8dbc486e164e13120 -size 136080 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-0.jpg deleted file mode 100644 index 3d18d361..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93203b47d5d51ebe128f2951e67039ba53f24afc9ac3f77b917b8b7825e40591 -size 132819 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-17.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-17.jpg deleted file mode 100644 index 785803f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-17.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d425d8999671453112e0f41bfd7ee78d891c0d8d087e0118b71916a776cf19c8 -size 222032 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-6.3.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-6.3.jpg deleted file mode 100644 index 86f305ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/lighting-properties/TimeOfDay-6.3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5d80e49b9d21f59d26521ad3babd42e7a7f621bdc80c0458c4ccf1247da3eb5 -size 200685 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/8x8-Explosion.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/8x8-Explosion.png deleted file mode 100644 index 4bd02798..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/8x8-Explosion.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06b82c2f8d9d8f4638dccbefeb84552c67ad99c00fb832d67d315c2c7ef061a7 -size 431505 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Color-Examples.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Color-Examples.jpg deleted file mode 100644 index 83457a70..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Color-Examples.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4900309e8435afc0e4789332fc5164a560c2aaac0cf4625e868126868b06bba -size 191391 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-ShapePartial-0.5.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-ShapePartial-0.5.jpg deleted file mode 100644 index 4ddf5274..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-ShapePartial-0.5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d274a557dce627615c7e91fb51730c4018646dfd224aa12d02622a2bc0dc271e -size 101797 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-ShapePartial-0.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-ShapePartial-0.jpg deleted file mode 100644 index 51f12164..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-ShapePartial-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41bc3f4623397eb769abeb344d3824e800181812af96d42b730a82b404d479e8 -size 103451 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-Surface.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-Surface.jpg deleted file mode 100644 index dedd07da..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-Surface.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14f970269eb911359cb45530e0d8a7787a74f4f4e922b826f741a5a23dd44915 -size 104148 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-Volume.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-Volume.jpg deleted file mode 100644 index dbbcdff4..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Cylinder-Volume.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f5ff7c6568dced97445bd13c96c23446bb64e2ecd0414ada7c5df2a35f377dc -size 101002 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Disc-ShapePartial-0.1.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Disc-ShapePartial-0.1.jpg deleted file mode 100644 index fac4fd80..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Disc-ShapePartial-0.1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:264550a847ede9ec397af22c432fb9e6dcc2e26c48dad9cfe863d94bfcf8c6d5 -size 107598 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Disc-ShapePartial-0.5.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Disc-ShapePartial-0.5.jpg deleted file mode 100644 index cfec3a49..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Disc-ShapePartial-0.5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faac4c339ee1b83c87082deee8cc606243b2fff5c078198aeaa28bb6d616b7de -size 103700 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Emission-Direction.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Emission-Direction.mp4 deleted file mode 100644 index 0c5976e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Emission-Direction.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0846e6ea10a74b5f5bc651ca141851e7ff25c5f549cbc5fca3a06ea8daf5c291 -size 5467699 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Flipbook.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Flipbook.mp4 deleted file mode 100644 index df3299f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Flipbook.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7c54c7bcbd86fdfb11cc4767718e4aa3d6b3f334dc912dbd25983149881838b -size 3687059 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/LightEmission.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/LightEmission.mp4 deleted file mode 100644 index 40f8bad7..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/LightEmission.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65cbf869669b9fedaab5efa3a4c5fad4eb1f8624acab7db2887f147bad100b41 -size 3092908 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Orientation.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Orientation.mp4 deleted file mode 100644 index 80fd836b..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Orientation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6293f76351599cfa7cbc3a48d5f28f8086cd97932a50402512962cda6c0b68cd -size 9706293 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Box.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Box.jpg deleted file mode 100644 index 6dd956e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Box.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5f8bce9f792fc921ee9086f7439a477dcdcf3eadd24a5d72295ee5e059c64c8 -size 101300 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Cylinder.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Cylinder.jpg deleted file mode 100644 index c6ab1599..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Cylinder.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7080077db7ee3f36659468396ce9e04db5471eb5ed490471f1351141fcb0aa3 -size 100273 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Disc.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Disc.jpg deleted file mode 100644 index c9a7afc1..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Disc.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92541620d4e677f18acd2e0ac8ce82a758bf14e9b7ffcd6cce55891338ccde73 -size 101121 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Sphere.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Sphere.jpg deleted file mode 100644 index 28a7a42c..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Shape-Sphere.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52de844ee2634557698e6fc99061d1ca232bb79ffc81eea7feeb1f86b17e3e31 -size 101203 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/ShapeInOut.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/ShapeInOut.mp4 deleted file mode 100644 index db1742e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/ShapeInOut.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff84ced0c38d86b37968bb3b8cb86224d9aa7b8f18b4a3b6636dad03ea93dc49 -size 5729860 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Showcase.mp4 deleted file mode 100644 index 065531ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce13ee297f14afa98df3edd3482ac563bf47ed7ab1654f0c1cf1ee16dd677e2d -size 3648506 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Size-Envelope.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Size-Envelope.mp4 deleted file mode 100644 index 99add40b..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Size-Envelope.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8c41df785a1171955a3862f1a6663be9fbdc7876a36fe064dc7caed49aed084 -size 2867761 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Speed.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Speed.mp4 deleted file mode 100644 index ffdd8524..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Speed.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d62196980691abdf1ea6ddf451411c3bbe50399aaeeb8991a95cdae10b5b640a -size 3314263 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Sphere-ShapePartial-0.5.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Sphere-ShapePartial-0.5.jpg deleted file mode 100644 index ee2c2847..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Sphere-ShapePartial-0.5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb9321db416ea8d915e63acdb0c51fda37902e49d2f2de7baf59fa9e4d043e16 -size 101886 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/SpreadAngle.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/SpreadAngle.mp4 deleted file mode 100644 index bcd9792c..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/SpreadAngle.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3b570f08bacdc73dc0085d358c6b12df23b21865cd03b71768caba0db3710d1 -size 6701290 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Squash.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Squash.mp4 deleted file mode 100644 index e583b269..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Squash.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5dcee432aab966e2596295691e078d33497c6c6953d6fc04c6c5fce5acb30990 -size 2700048 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Texture-Examples.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Texture-Examples.mp4 deleted file mode 100644 index 91ccb76c..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Texture-Examples.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21fbdc8ecae2bac6ea99ea0e13d9e42c73aee1132ce3f961f3a5296ee3d5343f -size 3359762 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Texture-Indicated.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Texture-Indicated.jpg deleted file mode 100644 index 401bf9ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Texture-Indicated.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef22890d124ca69f980545383e99c30343d5f69f98e1d88119d39a0fe61db703 -size 122012 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Transparency.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Transparency.mp4 deleted file mode 100644 index b2188cfc..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/particle-emitter/Transparency.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b49ae2ac7a196859cacca2f11be9a687b49ecc93e864d399bc0703e697dcf412 -size 5910427 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BloomEffect-With.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BloomEffect-With.jpg deleted file mode 100644 index feb8dda8..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BloomEffect-With.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4145db1659d2db76ab5984545b6b8344ab91bfc7ab95e01102d261aef809edae -size 122673 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BloomEffect-Without.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BloomEffect-Without.jpg deleted file mode 100644 index c2a94c3b..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BloomEffect-Without.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:674e7185d326c4d2374a48a62ed96177054df9f55a7ec841451a6674098c213d -size 123560 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BlurEffect-With.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BlurEffect-With.jpg deleted file mode 100644 index 5809bea6..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BlurEffect-With.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:599d53962013d92c698a7be9e06e7c07ce9371854985ba0606af1ef1798dfd56 -size 80145 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BlurEffect-Without.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BlurEffect-Without.jpg deleted file mode 100644 index eb004f73..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/BlurEffect-Without.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bce9c32cf5eeb00cdab95e47a67b9f51d6eba71b55b9b6176d3fc2ab84902fac -size 123986 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorCorrectionEffect-With.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorCorrectionEffect-With.jpg deleted file mode 100644 index 80ab1bf1..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorCorrectionEffect-With.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c82b242adab153d68c28d55ca2321948b71ea073af12c372b41f80fd9de9e504 -size 107385 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorCorrectionEffect-Without.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorCorrectionEffect-Without.jpg deleted file mode 100644 index 18ae86bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorCorrectionEffect-Without.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fafcc19fa984c41b44e083397e6efaae162305d3555af5d27634b51124c7f9d -size 114525 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorGrading-Default.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorGrading-Default.jpg deleted file mode 100644 index 06a3a541..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorGrading-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68115afb00d64985e2bc2bad2618e34614669b6116145270d8d9705f4b74fbc8 -size 203289 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorGrading-Retro.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorGrading-Retro.jpg deleted file mode 100644 index f16a1621..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/ColorGrading-Retro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc5776feec9ab79ae82f2361a5ac532fdfadea60415463da4b766feddf233257 -size 186353 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/DepthOfFieldEffect-With.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/DepthOfFieldEffect-With.jpg deleted file mode 100644 index d76c31a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/DepthOfFieldEffect-With.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66c575e2ad7dfde2e65b79810601b77b67b98d30e0bd76014ccdc26243fc6aca -size 176246 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/DepthOfFieldEffect-Without.jpg b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/DepthOfFieldEffect-Without.jpg deleted file mode 100644 index 5cfc32c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/DepthOfFieldEffect-Without.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a288a9f2dec8d0cbe13c60a7f009939713493d748397432b68db8671e0cd493 -size 204755 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/Sun-Rays-Effect.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/Sun-Rays-Effect.mp4 deleted file mode 100644 index db47a24a..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/post-processing/Sun-Rays-Effect.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e3d103020235f89ece97a5d3bbc52e1d5fb0e2ed995538b1cdff9812364fd34 -size 6490670 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Folded.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Folded.png deleted file mode 100644 index 2d00b9b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Folded.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddf72166152f347372209895b5d6bd72a73dd11fa0b1999af9c4e9f41179c305 -size 672399 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Orientation.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Orientation.mp4 deleted file mode 100644 index 2283b6be..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Orientation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45052e21e070983eab5833b5924da659608e0a3c8fd53ae6b2927d27ddc2720b -size 10650302 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Property-Faces.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Property-Faces.png deleted file mode 100644 index a1921036..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Property-Faces.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95f3955ba3bccf4edc94cb51c5f8540c9239ba1669fd11d7af31c5fcb61ad4fd -size 232126 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Unfolded.png b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Unfolded.png deleted file mode 100644 index 29bdac40..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/skybox/Skybox-Unfolded.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bb0d5ac700d4bbe5a9efedc8df82010f063a97e00d47d98bdaa73c9a2657d62 -size 238360 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Attachment-Width-Between.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Attachment-Width-Between.mp4 deleted file mode 100644 index 28793c7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Attachment-Width-Between.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d6ff2df353bf386562ba94e5f2d0c29492727d9cd8d97fb9fbc61af30ff6b39 -size 2272647 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Color-Static-Gradient.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Color-Static-Gradient.mp4 deleted file mode 100644 index 8effd5a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Color-Static-Gradient.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7ea228be6210fd8d1ebf49b7774b4bbded5fab027f263c449f4ff20149adaad -size 3804417 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Lifetime.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Lifetime.mp4 deleted file mode 100644 index 1c955f39..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Lifetime.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b69640af53d14ebb862befb6513f6e3bb4cdc2b9c5196403d4b18708a8134eef -size 1006009 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Showcase.mp4 deleted file mode 100644 index 1c8227e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:442c0bf6993811c3e30f11c14a74b936d7ef7b05972b63f2bec9e017c564bd36 -size 3244336 diff --git a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Textures.mp4 b/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Textures.mp4 deleted file mode 100644 index 4875c4b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/lighting-and-effects/trail/Textures.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b178927ac15dac2d2b734e03fd87cc026a46db3a65758aef47570b5bbf75882 -size 2559755 diff --git a/.cursor/rules/roblox/en-us/assets/localization/ATC-Studio-Disabled.png b/.cursor/rules/roblox/en-us/assets/localization/ATC-Studio-Disabled.png deleted file mode 100644 index 21f95666..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/ATC-Studio-Disabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:647f3b7cc58b6dd17589c31a1385641a2b3d00b7988c111dcd0c44f31e87a370 -size 79482 diff --git a/.cursor/rules/roblox/en-us/assets/localization/ATC-Studio-Enabled.png b/.cursor/rules/roblox/en-us/assets/localization/ATC-Studio-Enabled.png deleted file mode 100644 index 67d86cdf..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/ATC-Studio-Enabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a75c6094204d7fd808e1fc382ca1cf44f4b01eaad5b7d9c0de1deddf394c289e -size 81101 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Add-Languages-Menu.png b/.cursor/rules/roblox/en-us/assets/localization/Add-Languages-Menu.png deleted file mode 100644 index 64304a8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Add-Languages-Menu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:352dc7487063cedce76b8892584a9c0f4132fa8f492496b4b28b81ddb3c1d25c -size 32814 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Add-Languages.png b/.cursor/rules/roblox/en-us/assets/localization/Add-Languages.png deleted file mode 100644 index 7114cd8a..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Add-Languages.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:769a2d4ab24dbd135af2eeb187db68eba89d80a29a3ad36db9b7e70550213d19 -size 103240 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Automatic-Translation-Quotas.png b/.cursor/rules/roblox/en-us/assets/localization/Automatic-Translation-Quotas.png deleted file mode 100644 index 005eef24..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Automatic-Translation-Quotas.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d8247ca4cdae5e84b9842060a2660d582592d072a00ad90622306fa040861c0 -size 85009 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Change-Source-Language-Dropdown.png b/.cursor/rules/roblox/en-us/assets/localization/Change-Source-Language-Dropdown.png deleted file mode 100644 index 41a97f3e..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Change-Source-Language-Dropdown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5932d538596fb44b88e5450eb8c9dd5386745a92367a7c2e03c5ec334d2ac7c9 -size 103009 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Concept-Banner.jpg b/.cursor/rules/roblox/en-us/assets/localization/Concept-Banner.jpg deleted file mode 100644 index 1d3b9d0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Concept-Banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50a2fbcfec39a1e30f94d225afe686a7784576953161bf7ac79ee65616f25639 -size 229588 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-A.jpg b/.cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-A.jpg deleted file mode 100644 index c47d2a4c..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:629f0943867526f1775c007bdd11ae5a8b994f3ec30c3e177092c1ad7bc1e7ec -size 92654 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-B.jpg b/.cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-B.jpg deleted file mode 100644 index 9474b56c..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84159f45ea67a937e98321743179093686b45ffd9872cc9ba9cc39ce6a98e849 -size 88790 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-C.jpg b/.cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-C.jpg deleted file mode 100644 index 59d9f355..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Dynamic-Content-Example-C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb8fae964e8361cf29b95cefe8b3297562e2e7942fa515c09370e69c95d6ab1a -size 86204 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Experience-Page-Configure-Localization.png b/.cursor/rules/roblox/en-us/assets/localization/Experience-Page-Configure-Localization.png deleted file mode 100644 index 353070c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Experience-Page-Configure-Localization.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d1153224fb7d8706b9ec7609beb21cb4c022c7f35cf7976462f25a1c0f41000 -size 85371 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Game-Settings-Configure-Localization.png b/.cursor/rules/roblox/en-us/assets/localization/Game-Settings-Configure-Localization.png deleted file mode 100644 index c5a6a845..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Game-Settings-Configure-Localization.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2293b880bb3c2c11323c7a572a62e9f6c94c7c373e5f6430b8e8b0afc5330d69 -size 26761 diff --git a/.cursor/rules/roblox/en-us/assets/localization/In-Experience-Language-Switcher-Modal.png b/.cursor/rules/roblox/en-us/assets/localization/In-Experience-Language-Switcher-Modal.png deleted file mode 100644 index 91d5280a..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/In-Experience-Language-Switcher-Modal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:969bf1465cea86319a0cbe851f45eb862620999cc0d79a29831da3e5ca3e73da -size 580183 diff --git a/.cursor/rules/roblox/en-us/assets/localization/In-Experience-Language-Switcher.png b/.cursor/rules/roblox/en-us/assets/localization/In-Experience-Language-Switcher.png deleted file mode 100644 index e632b376..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/In-Experience-Language-Switcher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55e41ed635717af7159abe3c72329b7104ccd9032f2d571a4147dc3461b0e784 -size 1320223 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Invite-User-As-Translator.png b/.cursor/rules/roblox/en-us/assets/localization/Invite-User-As-Translator.png deleted file mode 100644 index 0a0fc625..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Invite-User-As-Translator.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed28681d255c1ac0ca1e761e02a4f77d2a14dc453b869c0cb137a90c8b3332c7 -size 25461 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Locale-Left-Nav.png b/.cursor/rules/roblox/en-us/assets/localization/Locale-Left-Nav.png deleted file mode 100644 index 60fc66c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Locale-Left-Nav.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80e5c2dd3e6d56a34bb4bf8564fc208761042fb399e6d17e26cf1c57dea2d391 -size 194718 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Locale-Source.png b/.cursor/rules/roblox/en-us/assets/localization/Locale-Source.png deleted file mode 100644 index 6c704583..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Locale-Source.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e23c95de30a930ef04e25fa57e5487e45d9e6d73e9b81fdb9d5c8dbb928eaec -size 116660 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Locale-Translation.png b/.cursor/rules/roblox/en-us/assets/localization/Locale-Translation.png deleted file mode 100644 index 0a44ac33..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Locale-Translation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0115025df7d64c881a21b9841d10a81e7ba710a02ab7f1cb2122898d9e4b99d -size 274448 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Localized-Image-English.png b/.cursor/rules/roblox/en-us/assets/localization/Localized-Image-English.png deleted file mode 100644 index 2bf40702..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Localized-Image-English.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8870148b2f6c2a6f18652e4e12012bde95d258876ba62e79c6ab1bff21dded41 -size 107937 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Localized-Image-Portuguese.png b/.cursor/rules/roblox/en-us/assets/localization/Localized-Image-Portuguese.png deleted file mode 100644 index 81c9cc0c..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Localized-Image-Portuguese.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:347b3d8a52d19e6af63d550adffc9078d28e206b71b2301f56dff74319de0571 -size 106377 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Localized-Image-Spanish.png b/.cursor/rules/roblox/en-us/assets/localization/Localized-Image-Spanish.png deleted file mode 100644 index 147165f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Localized-Image-Spanish.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2af6acc51cfd8d4215bc16ae33456ebeed763e09e7c6f24739892cf384660d9 -size 107866 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Lock-Translations.png b/.cursor/rules/roblox/en-us/assets/localization/Lock-Translations.png deleted file mode 100644 index ef8e6390..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Lock-Translations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7999a016049edcadad40970a01c0226f3f1f2afcbbdf59b72685f81d2cb31b90 -size 59423 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Parameter-Diagram.png b/.cursor/rules/roblox/en-us/assets/localization/Parameter-Diagram.png deleted file mode 100644 index f37be168..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Parameter-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:975eefe4a14c3894278a603a54a7a7605dfc5ede689ab5d030801927d207e92d -size 27359 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Add-Source-String.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Add-Source-String.png deleted file mode 100644 index 3ad27542..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Add-Source-String.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dadb882efc935f28a79945f98b1ba96865571ee71a8d90fd435c3625844c55fb -size 64927 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Information-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Information-Thumbnail.png deleted file mode 100644 index 5fbb43b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Information-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31a572e32605677beee1d6d3e5eacb9dae50831fbf0999cd30a470f8deb8b915 -size 133501 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Information.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Information.png deleted file mode 100644 index 8cf05935..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Information.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c7111f339287f2d8cef621e430973712b7f8c9f68009f3b9561e281207444df -size 106706 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Product.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Product.png deleted file mode 100644 index 8311ca42..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-Product.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00119b0dc89082f7e22ccbf981236787a7851d02191f9b5548d1fbc9535d05f1 -size 129589 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-String.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-String.png deleted file mode 100644 index 18ec649e..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Adding-String.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a44f6c845fea6d73399847539f5ebe658eed5c4a465777d5f0e3a10f9698169d -size 171997 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Automatic-Translation.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Automatic-Translation.png deleted file mode 100644 index 2254d179..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Automatic-Translation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1fb8ac8d2c3d89c599c9a445a7ad80a30571fd5c64b73634f47cb06d64a32a7 -size 103945 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Clear-Strings.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Clear-Strings.png deleted file mode 100644 index 9e662e90..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Clear-Strings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22433a7e4fee47cf63df54d1f25e33adfd135351119cc2dd54ac991c6ba1b7bb -size 343814 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Enable-ATC-Auto.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Enable-ATC-Auto.png deleted file mode 100644 index 0985ecca..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Enable-ATC-Auto.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c0e7db5d999e9f50db7ba16c46620f8cd976ed6bfc6a16bf265a527e32a1837 -size 280168 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Enable-ATC.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Enable-ATC.png deleted file mode 100644 index 43dcf439..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Enable-ATC.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00d360e3ec0d2b1442fc259b4248b4f8bf22eac2f9e960393e358249c50d312e -size 280528 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Manually-Remove.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Manually-Remove.png deleted file mode 100644 index c68d6a8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Manually-Remove.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:deca759d3dc90715fda607927dd23bc9769b9175292659e39c12fef4ba066e0d -size 11461 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Translate.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Translate.png deleted file mode 100644 index f19dead7..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Translate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03b6dbb48fa739267186915dab9475ea5277bb24b6e56c99db87f62f4b8a3254 -size 49140 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Portal-Use-Translated-Content.png b/.cursor/rules/roblox/en-us/assets/localization/Portal-Use-Translated-Content.png deleted file mode 100644 index a4981fd0..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Portal-Use-Translated-Content.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc40e7235d2442b2aa77c5a4a74da730ad0625c8c27f5ff8a1632f7e6afeb3d0 -size 280037 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Translation-Reports.png b/.cursor/rules/roblox/en-us/assets/localization/Translation-Reports.png deleted file mode 100644 index 67e383d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Translation-Reports.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70851993eda68575330e9114dfc2bdbcbd14d504c11ea9fe1832dce861590e64 -size 56547 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Translator-Portal.png b/.cursor/rules/roblox/en-us/assets/localization/Translator-Portal.png deleted file mode 100644 index 1e636a26..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Translator-Portal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e41ce0f9c65b2dccff46983c5e0afb0e5158c92a5c851d2a7331d87d3a87db4a -size 374975 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Translators-Tab.png b/.cursor/rules/roblox/en-us/assets/localization/Translators-Tab.png deleted file mode 100644 index f5705895..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Translators-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb80ed7a074a3abced6b86445f43eff68e9a0954706c988a0a0206618f2e8e4e -size 54927 diff --git a/.cursor/rules/roblox/en-us/assets/localization/Update-Log.png b/.cursor/rules/roblox/en-us/assets/localization/Update-Log.png deleted file mode 100644 index 3aa466e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/localization/Update-Log.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ef98bb62e44d7f6d1bde34803b86315d1cba39de5703605eed2520f39cc538a -size 128140 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Blender_Screenshot.png b/.cursor/rules/roblox/en-us/assets/makeup/Blender_Screenshot.png deleted file mode 100644 index ddbff190..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Blender_Screenshot.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e48fdc1e80ea0df35b050f3a54877c0a4b83865ce4870f348729478824fb62c -size 432286 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-1.png b/.cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-1.png deleted file mode 100644 index 5d3f2f98..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6709b4d44fdf357ce8dd8d9b8e5fd4779c3e082b7c5e45472503fefd934f84e -size 39363 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-2.png b/.cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-2.png deleted file mode 100644 index 1f97d8b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b06ec1ad5818426c7dc7bbfaf4a566ee3b600a2f7fce593e5a640d31578911aa -size 218263 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-3.png b/.cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-3.png deleted file mode 100644 index 3e1d1bbe..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Creation-Steps-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5afb45b6e67a8e64c6e97b440bfa8f22df398b9fe66f4fcd1f52a49e5cb12dda -size 174917 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Imported-DataModel.png b/.cursor/rules/roblox/en-us/assets/makeup/Imported-DataModel.png deleted file mode 100644 index 1c4fee90..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Imported-DataModel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa094c124dc88a46fe4534b51761e6642d4866a11b145829b49356d259062a41 -size 108039 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Blender-Datamodel.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Blender-Datamodel.png deleted file mode 100644 index aabd84c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Blender-Datamodel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:caf6d2239dd4ef63b60321749fe7fce3e0fe38fc54731b1caa54a9fa84b958a9 -size 44762 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Character-Folders.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Character-Folders.png deleted file mode 100644 index 8b2ac8f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Character-Folders.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e82e84d5771d12b933b830b46c9ee9bd61706effb72e3f54bada6edd7aacc90c -size 58825 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Acc.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Acc.png deleted file mode 100644 index c453d0df..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Acc.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0f6981e58d9730d76fa1a79d605cc5f1c62f27c938fbb7d8b1ea5f17ece91d6 -size 17347 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Accessory-Datamodel.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Accessory-Datamodel.png deleted file mode 100644 index 32027477..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Accessory-Datamodel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c9d384792b843010734c65ea81efb2d28c4966f1b2422d572c1c96eba944f04 -size 43750 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Section.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Section.png deleted file mode 100644 index 2b02c401..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Eye-Section.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:991a9e54079ac1e91b65a9c880d4c0b91075ca7da385d4ada281b1c095d903d5 -size 675556 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Face-No-Highlights.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Face-No-Highlights.png deleted file mode 100644 index 5496b705..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Face-No-Highlights.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6eda218caeaf0cbf0f0cb63c0c3422f51262a151d98d43dc59c2e9b805d385c -size 683017 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Face-Section.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Face-Section.png deleted file mode 100644 index 3f55975d..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Face-Section.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08636550ff4c8b2474f2848e8fbf8ad7f97fd939ff54a9135b7806e9fb20e8fe -size 725690 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Full-Render.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Full-Render.png deleted file mode 100644 index ba5f0f0b..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Full-Render.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:111775694f0e0573af14bfa5d8267ebc4d5ed61a5933230131335e94caf99457 -size 677964 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Mouth-Section.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Mouth-Section.png deleted file mode 100644 index 9d5fdc66..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Mouth-Section.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5c29ba7f88bc55ae90d1d75eb33b127e3b523a6f5034b84717afb55d2102527 -size 582730 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Studio-Datamodel.png b/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Studio-Datamodel.png deleted file mode 100644 index 0f59f005..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/Makeup-Studio-Datamodel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41bb05b938556bf85b2fc1db5d9952fba34673646657c3df8b0a1395bf0cae9b -size 12866 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Anthro-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Anthro-A.png deleted file mode 100644 index 7410ff72..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Anthro-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1dbd48e3220022f9812a673a2891e3fe357aa32fefce65dd6a46424a51d8f189 -size 530220 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Anthro-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Anthro-B.png deleted file mode 100644 index d8efe36b..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Anthro-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14e45c3dcce7dbe0ec373f1320e9cc0e0701de3b6b939902696772fb3d74d884 -size 435328 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Creatures-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Creatures-A.png deleted file mode 100644 index 0944b705..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Creatures-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6697ae03796bc7c9030d6d555c90c04741f9253645c0a6cfdc84b145208680ca -size 427142 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Creatures-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Creatures-B.png deleted file mode 100644 index 64fdab1f..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Creatures-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83216e19d7cfef1c28614c9b93e852cf038113b6014c55d125bb25a52a053425 -size 287330 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Ears-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Ears-A.png deleted file mode 100644 index e0e1aeba..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Ears-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46f1c850b9515d77fcf8dada54db6d484e87e2cab5e2fb93997960994bb6e3b2 -size 119308 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Ears-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Ears-B.png deleted file mode 100644 index 23581c35..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Ears-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f32a18d608ec486e9feae001a826adb24dbcbc0bdac0bcea3151282c4e7c67e5 -size 47824 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Equidistant-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Equidistant-A.png deleted file mode 100644 index abd69f18..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Equidistant-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76340277ffeb68911b3e811d3d83dcf28d7800df4f2170c8b604b1cb6299c94b -size 12708 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Equidistant-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Equidistant-B.png deleted file mode 100644 index 79c52ebe..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Equidistant-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe0a08b8f16559f3f1f7199e4fc4ad100035a3e5d6f92d684db0b72d1305d1f2 -size 53456 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eye-Enclosed.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eye-Enclosed.png deleted file mode 100644 index 02d35a4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eye-Enclosed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:674d9cbd7d681c6021cdeea0474220ef178869e4d9cc1afce06e13d34c867573 -size 89721 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eye-Inner.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eye-Inner.png deleted file mode 100644 index e50c0992..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eye-Inner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:594f87c1ffcad79efd4ef858bf08fb25c863c76ca3b128b56b195c7a7414244d -size 270557 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-Layered-Clothing.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-Layered-Clothing.png deleted file mode 100644 index bc65a3b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-Layered-Clothing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4f9c6dbe4f68f5106ffc659c4150a20c2d445176a8cd588dd8a3b64d9bb3e77 -size 17242 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-Textured.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-Textured.png deleted file mode 100644 index 2f88e1a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-Textured.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b9b9d92694cf12f1be0ec9d0fae2fb8e1d4049e0c3c808fbf25814103f6ef4a -size 269828 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-head-tail.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-head-tail.png deleted file mode 100644 index 34bf1b15..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Eyebrows-head-tail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8926fc303ea852ea38e65e7657438bfddc7d9ff952af63ea080fc1902d2e03f -size 8191 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline-A.png deleted file mode 100644 index ccf43759..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c9ba7eb6762c3d03e3dd76e1e93b5a4cb9b3afd644f2e1f447a7d9b52c6de2b -size 191056 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline-B.png deleted file mode 100644 index 78ac5c50..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbb924d1f2de9b459407996d8e46596df42ec98db244ce72508b08137c5544f6 -size 126338 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline.png deleted file mode 100644 index fb2b8fe8..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Hairline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0a03a89d057c1485aab32483396035d916bb90233a1beb3bf76ea59acd25005 -size 164781 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Inorganic-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Inorganic-A.png deleted file mode 100644 index e1c03745..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Inorganic-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9232e7e13f63d38fe281432894bb3250a296468a0e21b5ff46d453811d31094 -size 477473 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Inorganic-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Inorganic-B.png deleted file mode 100644 index a9b88d16..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Inorganic-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4263dd8eef279829edbe7980cc745f68d0e5243344078d4df2e66aeb3d6a5e6 -size 364855 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Middle-axis.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Middle-axis.png deleted file mode 100644 index 5fccd2fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Middle-axis.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41dee3ac191f72ba9cadaeadc27c28f934d53aecce4ab003c9c1f52944b66724 -size 217646 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-A.png deleted file mode 100644 index a16f9593..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:899e815aec5dceb521e19994f95db059c08abd520f916b5c972724b91c1d794c -size 379730 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-B.png deleted file mode 100644 index 6c9f7034..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04801f39776c15fd27c54108295adc5c10646195be506f8c053cbd936db7e44a -size 404142 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-C.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-C.png deleted file mode 100644 index 0f108a32..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2467c4398638b25e84efbf3e092de610c73ed7e342cc4072deca784e084add3d -size 897249 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-D.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-D.png deleted file mode 100644 index dfec394c..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79cb52c21290f010b60eac39cffb07d58bda220bf138dfa4eb5ed3559f0d112a -size 633778 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-Eyebrows.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-Eyebrows.png deleted file mode 100644 index 1cfb81ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-Eyebrows.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86314be12757143b671e04a0afefa014c434be5a0f01cacd3377afade3bcc931 -size 114031 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-Regions.jpg b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-Regions.jpg deleted file mode 100644 index a0cf59bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Missing-Regions.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2dd8f8bfae851fe9624e1ce20ce03dc21c546cb0ebe102bdefb264ba1087ac31 -size 49579 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Mouth.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Mouth.png deleted file mode 100644 index d09cbcd3..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Mouth.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f55ac1252f2e66f371909c53b8f96fd84ea923f47188c687f084062ddc6a991 -size 114815 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Neck-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Neck-A.png deleted file mode 100644 index 5e17042e..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Neck-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9780a4c46d2aa29ae446ff16d1e82f6728b310c8350c49cdbe466c9788ccf1c -size 19824 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Neck-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Neck-B.png deleted file mode 100644 index 5993236f..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Neck-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b48a34d21fd2afaf533bfcc019b5847de4f3b05101592847da2b51c16ae7b10b -size 73588 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Non-Vertex-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Non-Vertex-A.png deleted file mode 100644 index 4723a175..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Non-Vertex-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f9abf57b3668497a7c72ce053dbd72cb97f01ada50812f2326167a04052604e -size 56355 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Non-Vertex-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Non-Vertex-B.png deleted file mode 100644 index c56fd2a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Non-Vertex-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb0e975123d1fb0b638ccbbd927c14edc4232e5aebbb2bf35908b18b012efba6 -size 181332 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Nose.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Nose.png deleted file mode 100644 index 4d7ba919..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Nose.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c082859e198b2aa26fe89cc570fd4b1a807efcdffe6c0f97459423992aeff6a -size 170475 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Paint-on-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Paint-on-A.png deleted file mode 100644 index a1f3b5c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Paint-on-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:040585bd16cd80ccfb2b934f4531501b32ca6962877aca6c7e6e6d836d4639d4 -size 238801 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Paint-on-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Paint-on-B.png deleted file mode 100644 index 8c872370..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Paint-on-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5808296f63665984bfb689f6e09adacfec78db42ecf3c23717e25077a4ad1b2 -size 385544 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Primary-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Primary-A.png deleted file mode 100644 index 5ce7016c..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Primary-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8a162da472b7dc2c7869277407416a31451007c464f502be055b6006e5bd44f -size 191623 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Primary-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Primary-B.png deleted file mode 100644 index bcb29361..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Primary-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb43bd1032a1c9c67ff2856c16e734705dc81affa55f2e218ff5cb2a6f0ff1e2 -size 293634 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Tight-Cage-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Tight-Cage-A.png deleted file mode 100644 index 88c4ef64..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Tight-Cage-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1e42fda94ded363e997f75bbdd65c8ca70e9cc497d51226d15b0b9e93a99705 -size 196840 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Tight-Cage-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Tight-Cage-B.png deleted file mode 100644 index 3e2ba95f..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Tight-Cage-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88f2c1b44077c495d1531ba785320f7d05dce7eeaf60d7092172719c6b76955a -size 42364 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Vertex-A.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Vertex-A.png deleted file mode 100644 index 11dec133..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Vertex-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:453b7f58442489dd9c68f568b9177e7590513fb6634d1ffbe1c6cc3b4ded24b8 -size 14208 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Vertex-B.png b/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Vertex-B.png deleted file mode 100644 index a8b2931d..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/caging-examples/Vertex-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c7d764c700bb6fad9ea414d84692f11e869434e541ca1d96b65f1ed12fc9992 -size 173217 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Assign-New.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Assign-New.png deleted file mode 100644 index dc62a927..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Assign-New.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f8a2004e7d81bebc0592a6061b8ae7834d104fc49ca163ac2aa1b9f2d5f087c -size 38185 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Expected-Nodes.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Expected-Nodes.png deleted file mode 100644 index 4cc201a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Expected-Nodes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62883a982ad0db630851c3cd53d3346f2172e6559ff82aafd735c5c03282a74c -size 125210 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Select-Region.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Select-Region.png deleted file mode 100644 index 0a7bfd85..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Select-Region.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:465f072b20b054042a14633daeeb62b30c851ce6c23943b1f9616cc79b35aa80 -size 22505 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Thumbnail.png deleted file mode 100644 index 37abd2d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f01936a2a35cc795e89b52f255a2b5f442d83a257dde55e77fcccbf75bda6538 -size 774181 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Unlink-Image.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Unlink-Image.png deleted file mode 100644 index 118a084d..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Blender-Unlink-Image.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ab672fe7ef7bd3c9152032cb11d94306cef3a43c0da9b691514496d31eb6956 -size 58980 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Fbx-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Fbx-Thumbnail.png deleted file mode 100644 index 604eaec1..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Fbx-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c19b75770479baf32c0c957e92a5eddf61b0a70741b7aa361461729221e8a8f2 -size 788517 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Blender.zip b/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Blender.zip deleted file mode 100644 index f187eaf0..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Blender.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c1c0ef142b2ca0dc9c09d53edc2e9f4fe55cfb382bf53b82cd193e43e9735c5 -size 76316174 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Fbx-Gltf.zip b/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Fbx-Gltf.zip deleted file mode 100644 index d745009c..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Fbx-Gltf.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e8489fdf72dc63c2ab3eda62f2b9aaa8b4649733428644911d10871ee037131 -size 414831799 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Maya.zip b/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Maya.zip deleted file mode 100644 index 89969bb6..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Reference-Maya.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96d0506429d49043beca44fc8ce642492b5cf8e8f32d4bc5320a9218a54431ab -size 32733257 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Textures-Photoshop_Gimp.zip b/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Textures-Photoshop_Gimp.zip deleted file mode 100644 index f822d51d..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Textures-Photoshop_Gimp.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b9e1dde9d865ab63d058ff407312e0d7bdaad9d4494d8b551dbe55a8f54026e -size 30183818 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Textures-SubstancePainter.zip b/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Textures-SubstancePainter.zip deleted file mode 100644 index 514eb4cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Makeup-Textures-SubstancePainter.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da677ddb85347560722e718fee13b268a078b45cfcda03aa848cd4ddb256456a -size 416341554 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Expected-Nodes.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Expected-Nodes.png deleted file mode 100644 index 078bbc54..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Expected-Nodes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e3535ad17f0d2b30b071cedca9d01f36272b5e24867a3a23c9317fd04786008 -size 102781 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Replace-Texture.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Replace-Texture.png deleted file mode 100644 index 338eaeb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Replace-Texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67a79c66774187c0298cb4d079fa4d8f12ee33eb7729ddc9a0e820772cdca09a -size 233754 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Select-Graph-Network.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Select-Graph-Network.png deleted file mode 100644 index 38564c72..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Select-Graph-Network.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73f23197fad5401d2989db5ee8b032000914bd9ed42d8b7f383de6029fec7c81 -size 33239 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Select-Hypershade.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Select-Hypershade.png deleted file mode 100644 index e049d48e..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Select-Hypershade.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87d3824400f76e627df49c980c773b667a66cd182aaa894d1098abe6f751ce6a -size 28559 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Thumbnail.png deleted file mode 100644 index 32618779..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Maya-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b352392345db47a43a45b2c3964c6a3bed33261d135cc8780fb13db00235daaf -size 311939 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Photoshop-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Photoshop-Thumbnail.png deleted file mode 100644 index 7ed7a7ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Photoshop-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f01ba957af533bc6ad9ddc48b9f3e59e83cd5b501e05da37b0dcc9b2e40fe4bc -size 262534 diff --git a/.cursor/rules/roblox/en-us/assets/makeup/resources/Substance-Thumbnail.png b/.cursor/rules/roblox/en-us/assets/makeup/resources/Substance-Thumbnail.png deleted file mode 100644 index 65803d4c..00000000 --- a/.cursor/rules/roblox/en-us/assets/makeup/resources/Substance-Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d3f062110723122f4d4d028309cc55354bcc2370c8360eec2dc9ce298d2ef8a -size 828029 diff --git a/.cursor/rules/roblox/en-us/assets/matchmaking/CustomConfiguration_List.png b/.cursor/rules/roblox/en-us/assets/matchmaking/CustomConfiguration_List.png deleted file mode 100644 index b8a29e8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/matchmaking/CustomConfiguration_List.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bf4f27833d0352bc7434a60a0b6be467384684c72c9fa64a0ac589cf8acca08 -size 79622 diff --git a/.cursor/rules/roblox/en-us/assets/matchmaking/Custom_Matchmaking.png b/.cursor/rules/roblox/en-us/assets/matchmaking/Custom_Matchmaking.png deleted file mode 100644 index ff3bb6eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/matchmaking/Custom_Matchmaking.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d54f5b791d07ab8f6ddb2b73273d89efb3c947c7b8dcce7e1a004875a89523dd -size 385387 diff --git a/.cursor/rules/roblox/en-us/assets/matchmaking/Default_Matchmaking.png b/.cursor/rules/roblox/en-us/assets/matchmaking/Default_Matchmaking.png deleted file mode 100644 index 14a70c94..00000000 --- a/.cursor/rules/roblox/en-us/assets/matchmaking/Default_Matchmaking.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8fff94e71ba1b1fcd2d0132f8348740a5bf9896e3cab03eb91821c7ea9f1f43 -size 343426 diff --git a/.cursor/rules/roblox/en-us/assets/matchmaking/MatchmakingAnalytics.png b/.cursor/rules/roblox/en-us/assets/matchmaking/MatchmakingAnalytics.png deleted file mode 100644 index 5ed4cf99..00000000 --- a/.cursor/rules/roblox/en-us/assets/matchmaking/MatchmakingAnalytics.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f5b69691ff79e0290f9b92a45c20f342690e50a2089bee0be5f20cc036e8c92 -size 56952 diff --git a/.cursor/rules/roblox/en-us/assets/matchmaking/Matchmaking_Analytics_Chart.png b/.cursor/rules/roblox/en-us/assets/matchmaking/Matchmaking_Analytics_Chart.png deleted file mode 100644 index 75628b40..00000000 --- a/.cursor/rules/roblox/en-us/assets/matchmaking/Matchmaking_Analytics_Chart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e189a8748c218df86c20bd52ffc6c6aec0b27d58aee911d757b045bdddaf490 -size 98907 diff --git a/.cursor/rules/roblox/en-us/assets/matchmaking/Matchmaking_Simulation.png b/.cursor/rules/roblox/en-us/assets/matchmaking/Matchmaking_Simulation.png deleted file mode 100644 index ae45b18a..00000000 --- a/.cursor/rules/roblox/en-us/assets/matchmaking/Matchmaking_Simulation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1924a3d7fbb73bf91a419815a536c5c51b7f5450e13ba0cf7da64b46aa50e5f9 -size 158066 diff --git a/.cursor/rules/roblox/en-us/assets/matchmaking/Player_Attribute.png b/.cursor/rules/roblox/en-us/assets/matchmaking/Player_Attribute.png deleted file mode 100644 index 01ac247f..00000000 --- a/.cursor/rules/roblox/en-us/assets/matchmaking/Player_Attribute.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:867b901c5a1dadcfe1b4660229e826fffeb1cab73615838f583f0d0d930374db -size 141383 diff --git a/.cursor/rules/roblox/en-us/assets/matchmaking/Preview_Custom_Signal.png b/.cursor/rules/roblox/en-us/assets/matchmaking/Preview_Custom_Signal.png deleted file mode 100644 index 020accc1..00000000 --- a/.cursor/rules/roblox/en-us/assets/matchmaking/Preview_Custom_Signal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8219886fc0a7e82982bf3003b41f359eb15981c1efd6cd58687b068e22c6a6ac -size 50469 diff --git a/.cursor/rules/roblox/en-us/assets/matchmaking/Server_Attribute.png b/.cursor/rules/roblox/en-us/assets/matchmaking/Server_Attribute.png deleted file mode 100644 index c590781a..00000000 --- a/.cursor/rules/roblox/en-us/assets/matchmaking/Server_Attribute.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:749055d420302ccb4bbe3223a8cc1ebc85dc169d6dc6e1d7a40a547cef3c2e1c -size 87058 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Arrow-High.png b/.cursor/rules/roblox/en-us/assets/misc/Arrow-High.png deleted file mode 100644 index 2b41fafd..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Arrow-High.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1f7cab571e1cae327d4589dd3c72d4ec6ff62d0e165afb8965e4e7da8ab9b7b -size 776 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Higher.png b/.cursor/rules/roblox/en-us/assets/misc/Arrow-Higher.png deleted file mode 100644 index b2ffc634..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Higher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6c3ec5e3effaaf3bb6447bcb9b52fe6e3d4e7ced361deabc77de0ae60296db2 -size 865 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Highest.png b/.cursor/rules/roblox/en-us/assets/misc/Arrow-Highest.png deleted file mode 100644 index b2abd9f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Highest.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b3f2f4e66ef439d6d258196208886a1124dfa10080e42e1bd3cfcf575d7cca7 -size 918 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Low.png b/.cursor/rules/roblox/en-us/assets/misc/Arrow-Low.png deleted file mode 100644 index 89882026..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Low.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cd4b3c9bd318cceafd56ebad208828d95d0d6a9d7fb8040e44a2e9f7e6930db -size 876 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Lower.png b/.cursor/rules/roblox/en-us/assets/misc/Arrow-Lower.png deleted file mode 100644 index 342f3b18..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Lower.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2667dd3ff5430b62cf88c778a234cb7be24d51e37962c090bf0361909b354dd -size 1090 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Lowest.png b/.cursor/rules/roblox/en-us/assets/misc/Arrow-Lowest.png deleted file mode 100644 index 79de794c..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Lowest.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cdd5e216e125e1bc5c2bd57940b7a65f58bd1d516cc66a366c4f3a8ae35536a -size 1155 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Neutral.png b/.cursor/rules/roblox/en-us/assets/misc/Arrow-Neutral.png deleted file mode 100644 index f07cacea..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Arrow-Neutral.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17b1b81cf78b0ab49f3ed8ab2aaf11cb58c3c5d3aae938e26fe26007d63a43e9 -size 1169 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Audio-Error-Popup.png b/.cursor/rules/roblox/en-us/assets/misc/Audio-Error-Popup.png deleted file mode 100644 index e60ab2a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Audio-Error-Popup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95652d59c3e8ac25b27a5548e57a4a64a8bebef4cf05f7b779e108d421ea4c8d -size 128273 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-A.png b/.cursor/rules/roblox/en-us/assets/misc/Box-Label-A.png deleted file mode 100644 index c06297d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f27c97658800d196f31861a732a22a876793713265903909b1d867addacd1b33 -size 1123 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-B.png b/.cursor/rules/roblox/en-us/assets/misc/Box-Label-B.png deleted file mode 100644 index 5a1e8616..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a6ad454f8f7ac7ce62d6ac5e20e9e361d1c644afff8a2079f907dddaf1330cc -size 1060 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-C.png b/.cursor/rules/roblox/en-us/assets/misc/Box-Label-C.png deleted file mode 100644 index 5e0562cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db3bbefb02925c130ad6b433fdc25e2850d35250774d851375f4ce0e7b6a3a0f -size 1204 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-D.png b/.cursor/rules/roblox/en-us/assets/misc/Box-Label-D.png deleted file mode 100644 index 9ebd846d..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08807d2233fdfaf5b33f91c77d0e12aa7e04d05ca2ee1f752b502a90dfdff6f2 -size 1031 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-E.png b/.cursor/rules/roblox/en-us/assets/misc/Box-Label-E.png deleted file mode 100644 index 5b715e79..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cd1176153a98c8998b859a521e7de69ab6a895e59bb4ab2201389ff2ad286fb -size 807 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-F.png b/.cursor/rules/roblox/en-us/assets/misc/Box-Label-F.png deleted file mode 100644 index d89bc7b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-F.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cea699f15b15cb33a3d37b1f87560b0597422ae31d972c52b2de82cbec51d4c -size 810 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-G.png b/.cursor/rules/roblox/en-us/assets/misc/Box-Label-G.png deleted file mode 100644 index f7a3012c..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Box-Label-G.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e625acd444228e5efcebd9db691d5697d5923888764d7d2a2a607d5adfeece9 -size 3051 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Data-Share-Dialog.png b/.cursor/rules/roblox/en-us/assets/misc/Data-Share-Dialog.png deleted file mode 100644 index 793b9a6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Data-Share-Dialog.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75ccd96a21a8586b146ccc85435f8aa52a014807b11dddc42a4802f2e13e4396 -size 99155 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Busy.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Busy.png deleted file mode 100644 index 41ee17e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Busy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:539f14f19db153a201b7fa6303a1e6004bb23c50070bdda8570a08024de651de -size 1013 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Crosshair.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Crosshair.png deleted file mode 100644 index 75093650..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Crosshair.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95a0d5a5a19346a9baff771a2f490b64fc6da8f1a84c033cb9c2c92cac3e17f2 -size 124 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Forbidden.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Forbidden.png deleted file mode 100644 index 75d13ea3..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Forbidden.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:503a0298e5f2a7394d5c6b569d1b1c26f5c37ff7831d1fc62639d138ddb78c21 -size 804 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-GrabbingHand.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-GrabbingHand.png deleted file mode 100644 index dd76407b..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-GrabbingHand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0aa67b71dab117d32e74699c0681c2d61a4779f038ea437ebc376951df391609 -size 982 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-IBeam.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-IBeam.png deleted file mode 100644 index fd504d68..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-IBeam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0cd313f15b5a71dbad90df2c48016894e1de9ccecbf56705090c528a4534642 -size 534 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-OpenHand.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-OpenHand.png deleted file mode 100644 index 63765fa3..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-OpenHand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc2773e7738f40555fdaa5b26ee8e8575c7ee08a5ef3cc8d6ffdbffc114d16e2 -size 992 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Pointer.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Pointer.png deleted file mode 100644 index fa19fa4c..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Pointer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a592db992920dd187289c1c37614649c4cc06bc1ddd6738e712fbca23aa867b0 -size 499 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-PointingHand.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-PointingHand.png deleted file mode 100644 index 2373ae05..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-PointingHand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93e6d0c3738a907deb05d1efdc70ea7119f2a204320d62f411fca6bbc3d8a113 -size 1083 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeAll.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeAll.png deleted file mode 100644 index 3e0dd97b..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeAll.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d94919ca21096c7779c77bca9626b154abb73aa171cc316dd3c67ab2adb9071 -size 430 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeEW.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeEW.png deleted file mode 100644 index 2d834307..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeEW.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:997aa375962d6cb57b52c130f155bebfb876636a7cd49d1416b4cb9a74a823e8 -size 321 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNESW.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNESW.png deleted file mode 100644 index efbb6249..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNESW.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e39bb4a13523a525b15a8b45a44cb95e7fdc637a9cb89c342c11eeab8ab8a3a6 -size 391 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNS.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNS.png deleted file mode 100644 index efc67058..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNS.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0454c54e0cd578ab448cd3d4c99656bcd39159f32112c55a3c441172a5bdc6d1 -size 291 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNWSE.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNWSE.png deleted file mode 100644 index 3a0aa584..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeNWSE.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9985a0c3e8c26de34fe4e9c26b2f7f2900a0887c28740ecbd61e9fe002faecd3 -size 392 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeSplitH.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeSplitH.png deleted file mode 100644 index a1a2cfee..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeSplitH.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72f2791c509ba384b139d7136aab593fa3964440af79350c644b8b2a01bfc24d -size 349 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeSplitV.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeSplitV.png deleted file mode 100644 index 84e7698b..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-ResizeSplitV.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6dfbf6e79e8ba55d6d703f826c28fc4c0ab84256172b81a6c59e6e8e4cbbc53f -size 311 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Wait.png b/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Wait.png deleted file mode 100644 index 067ce7e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Mouse-Icon-Wait.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1899793f94821296206349a280db30e7835454f33999fb7f0c726d2bc577a51c -size 951 diff --git a/.cursor/rules/roblox/en-us/assets/misc/SA-Icon-Laser-Tag.jpg b/.cursor/rules/roblox/en-us/assets/misc/SA-Icon-Laser-Tag.jpg deleted file mode 100644 index 567167bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/SA-Icon-Laser-Tag.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00b22a4a7c2224736944e58e13948b8389ba2f8ced3aa0c9d04f26d9d0f55317 -size 204300 diff --git a/.cursor/rules/roblox/en-us/assets/misc/SA-Icon-Racing.jpg b/.cursor/rules/roblox/en-us/assets/misc/SA-Icon-Racing.jpg deleted file mode 100644 index c26dd2e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/SA-Icon-Racing.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:312a037e5b01c8911d695ebc8c09ee5880a007e6d1336289903c448fc529edea -size 188431 diff --git a/.cursor/rules/roblox/en-us/assets/misc/SA-Icon-Soccer.jpg b/.cursor/rules/roblox/en-us/assets/misc/SA-Icon-Soccer.jpg deleted file mode 100644 index 3cef0e73..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/SA-Icon-Soccer.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0de3ff75a9bdd61e29241b0c5309e4a553d0aa0a3247597d316d4a8ca7f13e4 -size 247035 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Todays-Picks-Home.png b/.cursor/rules/roblox/en-us/assets/misc/Todays-Picks-Home.png deleted file mode 100644 index 567f122f..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Todays-Picks-Home.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb7c940febfd562e19b3902288c117b4b6d260745d772d51799698a3ad9cee09 -size 1386107 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Todays-Picks-Marketplace.png b/.cursor/rules/roblox/en-us/assets/misc/Todays-Picks-Marketplace.png deleted file mode 100644 index a6262811..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Todays-Picks-Marketplace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fa87484a1d27297da82c4f878ece9ba41d0d368d073a0a9d0576e72ec2e535d -size 715725 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Webhooks-Bot-Workflow.png b/.cursor/rules/roblox/en-us/assets/misc/Webhooks-Bot-Workflow.png deleted file mode 100644 index 75092a28..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Webhooks-Bot-Workflow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f247b2c6d82b85abc8b1ef81c6f3a844decd12c7e7693a7e1e80229b3e33bde -size 21309 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Webhooks-Example-Message-Body.png b/.cursor/rules/roblox/en-us/assets/misc/Webhooks-Example-Message-Body.png deleted file mode 100644 index a072bf0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Webhooks-Example-Message-Body.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c573fc65c4d1b9005ac539f80b5d1a02616d138b9b5adcb98619612d5f77c47a -size 66385 diff --git a/.cursor/rules/roblox/en-us/assets/misc/Webhooks-Sample-Notification.png b/.cursor/rules/roblox/en-us/assets/misc/Webhooks-Sample-Notification.png deleted file mode 100644 index ed32700b..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/Webhooks-Sample-Notification.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87b13a372b8bd713a3d628bd56bae5204d58bacb933186767245b446a27b29d0 -size 76268 diff --git a/.cursor/rules/roblox/en-us/assets/misc/blog_evergreen.png b/.cursor/rules/roblox/en-us/assets/misc/blog_evergreen.png deleted file mode 100644 index 40df0b53..00000000 --- a/.cursor/rules/roblox/en-us/assets/misc/blog_evergreen.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dccb4e0a428d74b52971e55fa0fcdc30ba8f5d5c72ad1e1672a5c3623b370cae -size 2519568 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Front-Face-Pointing-A.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Front-Face-Pointing-A.png deleted file mode 100644 index 985d81bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Front-Face-Pointing-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c9f26f20e6582f7c7663e4935128647af4d670043a6e67ea2a9c9cc9b22422f -size 264052 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Front-Face-Pointing-B.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Front-Face-Pointing-B.png deleted file mode 100644 index e6be5100..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Front-Face-Pointing-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0fe3eb7e36978a5e4df5f4e47e07bfc8417f92a1621e11445783d00f8444d6b -size 275676 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Lerp-A.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Lerp-A.png deleted file mode 100644 index 0ad126c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Lerp-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7722f842ac7bcc9b344dd71384d8ec4b350e55eaf0be88645eaa07118cb20f5 -size 324745 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Lerp-B.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Lerp-B.png deleted file mode 100644 index cdc467ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Lerp-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a7269f88e89b2c4be33c9274b308720a4e9146daf81f21e40d29c31aba3016a -size 317574 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Offset-A.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Offset-A.png deleted file mode 100644 index d359e7e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Offset-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:615624326d2b9e2dcd5a131115193108eb8a145ef873fa9c7293aaa207243df9 -size 261596 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Offset-B.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Offset-B.png deleted file mode 100644 index 3883f6fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Offset-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e31f1cdaf2159da34e0262db3ea914de816dd7911fd87f56f6bb732953a09a56 -size 314989 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Relative-Position-A.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Relative-Position-A.png deleted file mode 100644 index 8dfaa4cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Relative-Position-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b1967598a2146e8f538e2ba8fc89d16a99aecb9c3ff6b53bf722e0a141aef41 -size 255163 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Relative-Position-B.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Relative-Position-B.png deleted file mode 100644 index 4d604dbf..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Other-Part-Relative-Position-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd8be3c661b0a8ec5a40d1f88d44980963f14776550532293b087890eca248af -size 320442 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Offset-A.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Offset-A.png deleted file mode 100644 index bdfa48e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Offset-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2631cd436cede2993eb8f28b0d5e82ce9ca91eb0c1cce757b6149a3c4d070561 -size 293093 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Offset-B.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Offset-B.png deleted file mode 100644 index 5f8c0154..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Offset-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b3ba317e664eb91e6fc99e1ce50763929bc3434f6d79f9511cb97a1ab97d172 -size 304901 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Rotate-A.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Rotate-A.png deleted file mode 100644 index d1069243..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Rotate-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe9d98b698fefaa99ca47a87c8647efd65a96ac881514629c74c21a8e3d5d151 -size 250341 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Rotate-B.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Rotate-B.png deleted file mode 100644 index e6007e4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Self-Rotate-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fe99e410a815706bbdcd2d23be4f4c444e2b5f0f3853261bf80ef819038d7bf -size 255595 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Position-A.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Position-A.png deleted file mode 100644 index c4a195af..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Position-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8ad3e409f97a3d8c8f1c52bde2bd3b318f172e3d23b89c43b38297417a1b990 -size 237741 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Position-B.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Position-B.png deleted file mode 100644 index cb5eca20..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Position-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98bc66dd64382893d5d6338777cafd8b323beedffa1fc9816b7c2d1a0c675fad -size 259486 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Rotation-A.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Rotation-A.png deleted file mode 100644 index 7f594cc1..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Rotation-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81aa52fdac4f9132419612e9fef6e2237b51a221ec3cb568bc9115bd8b5b43aa -size 235118 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Rotation-B.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Rotation-B.png deleted file mode 100644 index 0134dbce..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Strict-Rotation-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44a4159aad7685360e17ad273f71f69741bfbe8e092ad01e46b8ca99399d93c7 -size 218868 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Top-Face-Pointing-A.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Top-Face-Pointing-A.png deleted file mode 100644 index 03b2443d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Top-Face-Pointing-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f06f21853c8b4c01dc8579413b65532245309c12d7508ad1738d3fb2f3553546 -size 300549 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Top-Face-Pointing-B.png b/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Top-Face-Pointing-B.png deleted file mode 100644 index e00ca4f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/cframes/CFrame-Top-Face-Pointing-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e57df7b71464947922b86d081b804f730cf938e27be949ed718153dc4160a5c3 -size 288998 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Explorer-MaterialVariant-Instances.png b/.cursor/rules/roblox/en-us/assets/modeling/materials/Explorer-MaterialVariant-Instances.png deleted file mode 100644 index 92e3f2af..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Explorer-MaterialVariant-Instances.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:703c5ef93b70dad4a1bfeb6e8c982064a2cb33001b903af45910a9ba2b166756 -size 20750 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1A.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1A.jpg deleted file mode 100644 index d241b5a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96db8a4bfce6e0471e914650888a6757c20509283b5bae9c701473b378c78b04 -size 30072 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1B.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1B.jpg deleted file mode 100644 index de2f5b1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faac88e57b04c8ccbba5ede531cee141d4186e3d183e0f9a4609afa33b4c90a4 -size 34705 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1C.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1C.jpg deleted file mode 100644 index dda0e044..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ac5ea62ffa444b238c1e4b7d8437e17a983a980929d3b349c6fc3b1bee54ce1 -size 23415 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1D.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1D.jpg deleted file mode 100644 index ad6463b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-1D.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:700df833a200f66f1562f1d6a830367c649d44d292fdf417365b66842e17ea82 -size 37352 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2A.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2A.jpg deleted file mode 100644 index da68abf2..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a0cce84ad2768ff8f77cfa73c3e9192f376d12522c7f21d28b58f69278a9e6c -size 34192 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2B.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2B.jpg deleted file mode 100644 index 1c53fb57..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa4ad1a10e83c685ac70a602a1dfe59dcf6c9a74570800ad1e7f6b34f9b7ad08 -size 47471 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2C.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2C.jpg deleted file mode 100644 index 73af8dbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23c78a5f35f6c7b41c575f7515b6a4362941026a7a27c67e69c639da0625fd70 -size 35712 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2D.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2D.jpg deleted file mode 100644 index 02f2881a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-2D.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e212f22fb42071098b5a94d3ebcbe6209941eff17169a7642543aa56ea011846 -size 48054 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3A.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3A.jpg deleted file mode 100644 index 3fa6f7bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4ad4a7239125a29f86fe43ec4b067aa4e2eca51591575f7247609e708612e8c -size 43518 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3B.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3B.jpg deleted file mode 100644 index 1c711775..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1caae3ec59b06661bd2107361ed80753915c78ffefe4ca61c2fe876464d4196e -size 52235 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3C.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3C.jpg deleted file mode 100644 index 4253df50..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f74726fe016fe03283f019d140e948ae4c8022cb2beb3dfe0cf03307a1d9845b -size 41819 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3D.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3D.jpg deleted file mode 100644 index b7172c17..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-3D.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2913876961b429e3c5fe04798ffd96def714721ed7b820f5e9af45bb0adef1df -size 43341 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4A.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4A.jpg deleted file mode 100644 index 274991af..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67c1598b1c480ac368362bce1c2351d8bd3fa0fc499693708605ba4dacdbbe3d -size 52809 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4B.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4B.jpg deleted file mode 100644 index 2a5348d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bae64842b0595349d9329fca33ba7db3cae834dbcd8c6959a14a3a5ee3e64556 -size 28399 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4C.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4C.jpg deleted file mode 100644 index b4b85b0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b14a459495b16ec6a81b269951d0bde5721ee14efa0f9ae49f0fe63102c857fc -size 39853 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4D.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4D.jpg deleted file mode 100644 index 9750e94f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Example-4D.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42249c65733d0f9e273167d8c149f1b263dc217d12d2a97ad4e2fe50820b0518 -size 39720 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Expanded-Options.png b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Expanded-Options.png deleted file mode 100644 index 14319770..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Expanded-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2494f637dcdbc3b5a699c3efe1e0293c58d13adbbd4cf4250634004e9d82ec4e -size 98019 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Preview-On-Part.jpg b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Preview-On-Part.jpg deleted file mode 100644 index 7acd0822..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Preview-On-Part.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a1ec6ecd532ad21e115aa9ea8ed3deddc47c366f5984234238c3304842ccfdd -size 228682 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Preview.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Preview.mp4 deleted file mode 100644 index f13b5c68..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Material-Generator-Preview.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc1af435012b5322c129d6f57aeced81fec5e073740a742404e641bfbcab5c4a -size 4992139 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Material-And-MaterialVariant.png b/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Material-And-MaterialVariant.png deleted file mode 100644 index 8140da7e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Material-And-MaterialVariant.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c28529a5cc8c3a9e43d9102a77c7e01a355f09fc8d295e581281896343368596 -size 20391 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Part-CustomPhysicalProperties.png b/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Part-CustomPhysicalProperties.png deleted file mode 100644 index 2b388a93..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Part-CustomPhysicalProperties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c2b70bf28cb4b6ef654a52ca01ab08d246c00ea6c0f51b83d8b01058f28fbb6 -size 29799 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Physical-Overridden.png b/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Physical-Overridden.png deleted file mode 100644 index 07555b91..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-Physical-Overridden.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1932e591c73e7c8a641aa662e855f6ca370794a4bdfb3ae94fc7ebd3829f9eec -size 35287 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-View-Override.png b/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-View-Override.png deleted file mode 100644 index caad94cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/materials/Properties-View-Override.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bcfc4cc840af3bdcb6f2d6c9901db92ea8930e8a28ec2a9990354ed37e497314 -size 29111 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/3d-Import-Queue.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/3d-Import-Queue.png deleted file mode 100644 index 87ce0437..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/3d-Import-Queue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c62222fefdf0ed13ae9f49954c4470d70370662ae8f1b805a8f96aee98ecd74b -size 30353 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/3d-Importer-Panels.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/3d-Importer-Panels.png deleted file mode 100644 index c34fc638..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/3d-Importer-Panels.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd07b555b0d323fa07d9a8812c6716a340cccb9a9ebc71ba11d63e0b8f0ad791 -size 150078 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Base-Mesh-In-Marketplace.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Base-Mesh-In-Marketplace.png deleted file mode 100644 index 1980b1ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Base-Mesh-In-Marketplace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:662938ce60a9a165e5ae503bc04e3e202608428e13cae49a11f2a16825c28ea4 -size 46650 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Beyond-The-Dark-Example.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Beyond-The-Dark-Example.png deleted file mode 100644 index ab38eb83..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Beyond-The-Dark-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ee3611f672ad2a15c34ab1be46d9b6cb961ef0ade037decdb0f7f53c64b44ad -size 337108 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Blender-Scale-Examples.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Blender-Scale-Examples.png deleted file mode 100644 index 28d23017..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Blender-Scale-Examples.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54664ae02b5a04edcb154cf2f0344ed365ead4dd9d065d5d646c7198e692524a -size 385300 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Collar-Attachment-1.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Collar-Attachment-1.png deleted file mode 100644 index ac6429bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Collar-Attachment-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19b83f95ea3af840e2c216e074eb809c2a56cb31a54079beabcbd4ec9bd5002d -size 390475 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Collar-Attachment-2.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Collar-Attachment-2.png deleted file mode 100644 index 0d79f88a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Collar-Attachment-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fe4570f6e646dc4e20a611f955d8f6678c09389bf83880c9c0d9bc875fd2461 -size 378396 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Grip_Attachments.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Grip_Attachments.png deleted file mode 100644 index d221399a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Grip_Attachments.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6934bad0dde52665ef6473f25dc66b46a1c57129c738eab28d017147f5847f61 -size 92829 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Mesh-SurfaceAppearance.jpg b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Mesh-SurfaceAppearance.jpg deleted file mode 100644 index c63cee5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Mesh-SurfaceAppearance.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3b2c2b4375cd16f6f0d1125f8e6603e074a535750b0af515f19e4642a0136ef -size 217374 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Mesh-Textured.jpg b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Mesh-Textured.jpg deleted file mode 100644 index 766ac948..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Mesh-Textured.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:334d8232741db3237c0bea4d492006fecc05d8add4ce7d0d2227256de15ec89a -size 133640 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Modeling-Requirements-Caps.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Modeling-Requirements-Caps.png deleted file mode 100644 index f689ee3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Modeling-Requirements-Caps.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aab10199633efabdb7631cf42ffc70b28a150d565342c9cf41715dd322e908e3 -size 175614 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Mystery-of-Duvall-Example.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Mystery-of-Duvall-Example.png deleted file mode 100644 index 3f693b2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Mystery-of-Duvall-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5cde331c47548441857dbb157b0a7b8344787bc9c64e5f609045a46de35eed6 -size 377108 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Properties-TextureID.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Properties-TextureID.png deleted file mode 100644 index 1ff7c716..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Properties-TextureID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f2efd3a4c859194d7a176805952cdf674234475fa176c30f18513ece3b70caf -size 9943 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Reimport-menu.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Reimport-menu.png deleted file mode 100644 index 6695f74c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Reimport-menu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c38c544e436fbd1df4f05cda2ab251eda023eeef9190fa16a178d3ef973ccac -size 98117 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-High.jpg b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-High.jpg deleted file mode 100644 index 72ce4cc3..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-High.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17fa13005a2d7505488d32ef446513b392d2c3fc656ca1402be5073ef64d57cd -size 123276 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-Low.jpg b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-Low.jpg deleted file mode 100644 index 12a61b92..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-Low.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac4e4740f4774f2cdc8e2ffcc89e1d0134505ee3b53e61d3854b204198fb2154 -size 122099 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-Medium.jpg b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-Medium.jpg deleted file mode 100644 index 1b7cd8d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Render-Fidelity-Medium.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51d45344e53df6dfb5bdc1c094ce67ca04e0ea905bffdd98980801522f0fe30c -size 124827 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Warning-Mouse-Over.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Warning-Mouse-Over.png deleted file mode 100644 index 238622ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Warning-Mouse-Over.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81ca22906f7eb9f2aec76ec6eef56c2a02c0620a457dbc58b590d8a457ef0a81 -size 13966 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Warning-Settings-Panel.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/Warning-Settings-Panel.png deleted file mode 100644 index 1f11a03a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/Warning-Settings-Panel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ad2289db1a683c08143e3fd7461ffdf24fd1fc0481959e035e201cf164637ab -size 14752 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Compositor-Example-Optimized.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Compositor-Example-Optimized.png deleted file mode 100644 index 2076aec5..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Compositor-Example-Optimized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:214361f0cd244bf84de7dab0b21e7bfdf8175cbb3e0c5d7d5ef1fe72cb84b492 -size 298811 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Compositor-Example-Poor.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Compositor-Example-Poor.png deleted file mode 100644 index b555a8aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Compositor-Example-Poor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:542fffb643dd0c79d7b8dfe1c53be202db8367ebde77cda7382cd88d433dc775 -size 299779 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Beige.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Beige.png deleted file mode 100644 index c95c857a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Beige.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6ab6139e14b2aec490755d919d7d4ca8017b1d590abd486031e862635a5d059 -size 274565 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Blue.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Blue.png deleted file mode 100644 index 98b691d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Blue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d32834626b6f6f84a1831d0f5a3aaf9efdaa49729b1fa1b471c47c8708ebfaed -size 245628 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Brown.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Brown.png deleted file mode 100644 index ae3ec8b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Brown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af88f0844cf0c8a8b6675cc83a36e3768e0fb333d324bcaf0e8193f6e52f170e -size 185733 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Pink.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Pink.png deleted file mode 100644 index 6c3b1137..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Pink.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b18c46777f5d9f060d7bfa4f8952533f4d79d0277395d3877dc33c0508525021 -size 275622 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Transparent.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Transparent.png deleted file mode 100644 index 32b61899..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/Face-Tone-Transparent.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7de625eb95cb334a69b073a8bbe28a176d82db53c976ebb359e958684e99e4b5 -size 521799 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Island-Optimized.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Island-Optimized.png deleted file mode 100644 index cf338f24..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Island-Optimized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1116aea2adb7b251cf4ccafbb93108cbb4b0cf46906d9726f5e30b7d4a44122 -size 620065 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Island-Poor.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Island-Poor.png deleted file mode 100644 index c65f54bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Island-Poor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15e67445218900ebd253a0f16f8df5d46e4746c27207aa565b14c69ba4432c11 -size 624645 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Layout-Optimized.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Layout-Optimized.png deleted file mode 100644 index 320beaae..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Layout-Optimized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9aefe749b14c5f271acfdedf0cef7913849411b2b4a7a55d0e20ba6001e31c50 -size 318351 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Layout-Poor.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Layout-Poor.png deleted file mode 100644 index 532c4d5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV-Layout-Poor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:621af69cb70eef8c42e591e9e92aa494d28ff05f8545b7d3ca54789b800cb5e2 -size 429995 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_1024.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_1024.png deleted file mode 100644 index 6a0c144f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_1024.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80bd263cf62218ec0c98d9d2b00cb7871ed97560c8f677c69341283ddc294020 -size 5805 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_256.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_256.png deleted file mode 100644 index efca8c47..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_256.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b6d7998529ea11f7a972c432bf8a3e5fcd0c25d3108ef247a62f2a5ab39fe86 -size 3062 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_512.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_512.png deleted file mode 100644 index 975aea66..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/mesh-requirements/UV_Grid_512.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bcc6eddc389e65a0c5e8251275b10363269d8a4e9c6fc188896edfc8d3847d64 -size 3806 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Body_Cage_Templates.zip b/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Body_Cage_Templates.zip deleted file mode 100644 index 9fa53e1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Body_Cage_Templates.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:220e3ef25af770b97f46f4b4efbe11d88607e3a2883fa8e11b3db9f065c2a749 -size 5835588 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip b/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip deleted file mode 100644 index 861492e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Clothing_Cage_Templates.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a23dc3dbbfa4a2fe72383a4f59a6abd1f701aabcecad0072e91809ac6742e4b -size 5770539 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Combined_Templates.zip b/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Combined_Templates.zip deleted file mode 100644 index d44d9896..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Combined_Templates.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14bb469916d34cb68abc75b4c08eed54f826e4ba8af6e4bc4808fbeb3250d3bc -size 6084730 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip b/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip deleted file mode 100644 index 481a9a1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/Rig_and_Attachments_Templates.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e96e8483143716b49369e8692f2c2c2c7ae0d3a3d936b58cf3b5dae73148ff7b -size 5373974 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-base-model.fbx b/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-base-model.fbx deleted file mode 100644 index af447512..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-base-model.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba86cad31b12c399321e5894163a2d9313eadd40766dccf5c4ce1b0357ed01e9 -size 2747788 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-rigged-r15.blend b/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-rigged-r15.blend deleted file mode 100644 index f7cdfe12..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-rigged-r15.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50b7e71f86cdb269d40f3a244d57385d581ead2ffb1b52e6d080376ba8331105 -size 5278816 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-skinned-s15.blend b/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-skinned-s15.blend deleted file mode 100644 index ebd3fece..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/lola-skinned-s15.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73ad3e25086e15c907d5bc01b4ecc09869dcb6960ce6982102d0fbc5bfe639d9 -size 5336472 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/shoebot-base-model.fbx b/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/shoebot-base-model.fbx deleted file mode 100644 index cffca2a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/shoebot-base-model.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6869726d2b4f0408899001340348daa8d8ceb93d2a7db546ecfb2c84f0e4e72c -size 321980 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/shoebot-rigged-model.fbx b/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/shoebot-rigged-model.fbx deleted file mode 100644 index 9008cc39..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/reference-files/shoebot-rigged-model.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce58c39049007cc1f76c378169873bc1674776d82f5700b6b7c037dc0463248c -size 334316 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/1-resizing-base-model.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/1-resizing-base-model.mp4 deleted file mode 100644 index ea72c9c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/1-resizing-base-model.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bee752a5df29acac05c703cb5e56dca1f5cb22c9b8c10edcf214bca87d9d413 -size 7584240 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/2-bone-visualization.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/2-bone-visualization.mp4 deleted file mode 100644 index 4955802c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/2-bone-visualization.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23682e7a12605beaef23605243f0727829f6a3e431517afe00ffe86d2cdd05b6 -size 3083351 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/3-x-axis-mirror.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/3-x-axis-mirror.mp4 deleted file mode 100644 index c3341d28..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/3-x-axis-mirror.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:686c6cc32914b1967794e6ee121d9ead87c6628cd1312c60fa25a79b0900e2cc -size 7251505 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/4-repositioning-bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/4-repositioning-bones.mp4 deleted file mode 100644 index 0a66e63c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/4-repositioning-bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04a19bd885c191f9fa107b688e0540e43bd28d61002b4f96b4c560ee2f5269f3 -size 29853341 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/5-inspect-bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/5-inspect-bones.mp4 deleted file mode 100644 index f258abf9..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/5-inspect-bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c768688766547e2466947b8400488e425208645167f511fae0f993ac92f2160f -size 3823960 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/6-parenting-bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/6-parenting-bones.mp4 deleted file mode 100644 index 43ceb25b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/6-parenting-bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97325665525ba69cf9fb878c68fb456ab7019ea3e36d1d17da076122905d2e0d -size 5922393 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/7-assign-influence-head.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/7-assign-influence-head.mp4 deleted file mode 100644 index 7d537f27..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/7-assign-influence-head.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7e399693fb5a51916ef34c5322089bb84f30a46d3d518f7812ec494494b6096 -size 8926562 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/8-assign-influence.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/8-assign-influence.mp4 deleted file mode 100644 index 9a20e73c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/8-assign-influence.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77e64c002042b9e8538cf5bbd60675fc80efdee8b747e6a3df12fac766ea15bb -size 11952567 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/9-test-bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/9-test-bones.mp4 deleted file mode 100644 index 51436d99..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-humanoid/9-test-bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:829e26fc217db97db63f0ad3d1242bcb596e055c00f8aa9316edf26225de79a7 -size 16503320 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/1-setting-up-blender.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/1-setting-up-blender.mp4 deleted file mode 100644 index 9d764fb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/1-setting-up-blender.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee083e879c27f4e7f438d25c84aaaf4af94a86bcb20baff933695b2b41f76f4c -size 5843512 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/2-adding-armature.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/2-adding-armature.mp4 deleted file mode 100644 index aaf67a2f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/2-adding-armature.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c935f223d8b689416eda2179d0711cd3348ea77fbf95ab163c1a471902f962e2 -size 6599652 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.1-positioning-bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.1-positioning-bones.mp4 deleted file mode 100644 index bbcab235..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.1-positioning-bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95787d7fb70c267c71fd27773404e89c459290f00ae552504d0c80783de01d78 -size 4252147 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.2-positioning-bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.2-positioning-bones.mp4 deleted file mode 100644 index 3e9380b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.2-positioning-bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6713f5d7f4532e82439aeee97fc23a7d5e3c6ba515ee6368309bbd23aba03dc2 -size 7729956 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.3-positioning-bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.3-positioning-bones.mp4 deleted file mode 100644 index 5e40553c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/3.3-positioning-bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ccb65078efa50e891cabe7dee848b0bdee7a8801617f910528e1a682c3701a5 -size 4721434 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/4-rename-bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/4-rename-bones.mp4 deleted file mode 100644 index 7ced14dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/4-rename-bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9749fab2c7e38f02e5397b7b0861f99c31ab2420b3db143fc8bc1e3d26c76e2d -size 6425574 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/5-parenting-armature.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/5-parenting-armature.mp4 deleted file mode 100644 index 3a9fb57f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/5-parenting-armature.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bd57eacd27e8969b4109fc65a0ec6bf7a4acb7c34a0220881f6bf5457cad441 -size 6202541 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.1-assigning-vertices.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.1-assigning-vertices.mp4 deleted file mode 100644 index 72871968..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.1-assigning-vertices.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d6f2e425a415eff86bd8f16ff27b492fdda1661d992f565b56719d34492884f -size 5355662 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.2-assigning-vertices.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.2-assigning-vertices.mp4 deleted file mode 100644 index c267ecc6..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.2-assigning-vertices.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:634e11a84dca82f2be059a075483deff0b570877bd1dd5a5d716befee8fc36b6 -size 9012278 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.3-assigning-vertices.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.3-assigning-vertices.mp4 deleted file mode 100644 index 3c30a12e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/6.3-assigning-vertices.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acdaddbd3e662eb979b4e0f69f6550b1fbb08cacbf5bb7f9131a1c90a1b8d4fd -size 4894044 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/7-testing.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/7-testing.mp4 deleted file mode 100644 index 4df02f5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/7-testing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29b16c3e6fbf82b0fbda62d44044e7dac4daca61df7dbc2c06944029f2fe3246 -size 14268165 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/rigging-r1-imported.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/rigging-r1-imported.png deleted file mode 100644 index 6de07ed5..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/rigging-simple/rigging-r1-imported.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2458d4e4aca37a462e600ecb7e91ccd6b386b20480f0c865d5fa984a42fc6a6a -size 1275393 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/1-bone-visualizations.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/1-bone-visualizations.mp4 deleted file mode 100644 index ab6602af..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/1-bone-visualizations.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9847ef3b1c5a48789852ba20446cda94eb56a333a18c9c7d1baeb7f1ef3b329a -size 2680367 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/10-weight-paint-lower-arm.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/10-weight-paint-lower-arm.mp4 deleted file mode 100644 index ae65f34b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/10-weight-paint-lower-arm.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2c68387ca78950cbd85c6900b3feba9d614a6deeb5b58152db99dc98faa6988 -size 11094392 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/11-switch-to-upper-arm.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/11-switch-to-upper-arm.mp4 deleted file mode 100644 index 650cb618..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/11-switch-to-upper-arm.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94dbcadfa180da8670724c5df21cc924da6945178eb9fe958830559df3eca471 -size 5957284 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/12-weight-paint-upper-arm.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/12-weight-paint-upper-arm.mp4 deleted file mode 100644 index 175136d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/12-weight-paint-upper-arm.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4750537644ba84c610d03af825a09861743ce383e5e5fae680bf8e0141517a8 -size 15483085 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/13-switch-to-upper-torso.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/13-switch-to-upper-torso.mp4 deleted file mode 100644 index 616ed90c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/13-switch-to-upper-torso.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbf6a4a65a86ed1db39204c223711e26cfa58bd298f0612edbafa52ed60045aa -size 3792259 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/14-weight-paint-upper-torso.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/14-weight-paint-upper-torso.mp4 deleted file mode 100644 index 376656c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/14-weight-paint-upper-torso.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca30bb776bca9a6a0132a075fd4cfa773efd5dbd3bf7beab39cf454aefa105cf -size 19622546 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/2-auto-normalize.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/2-auto-normalize.mp4 deleted file mode 100644 index ed4aaa0c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/2-auto-normalize.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee66cd9e556423eb0dd6a5a0938b108ceb932da4d6e2c7875888309eb77c0185 -size 6366806 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/3-select-head.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/3-select-head.mp4 deleted file mode 100644 index c96a8fd1..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/3-select-head.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cbb31bc4f82bd3120bd784e849fb7ad1e349b304cab06f64dc63a9f90b300d9 -size 5632609 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/4-weight-paint-head.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/4-weight-paint-head.mp4 deleted file mode 100644 index 3371afe7..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/4-weight-paint-head.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14ef9347c00054d6bcb1ca659fde700d8f5b64c3f37368d9ed3105a5b645e39c -size 33074578 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/5-test-head.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/5-test-head.mp4 deleted file mode 100644 index de8dae2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/5-test-head.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d3ab218148ca3b7255ba8a0780347b02c17bab241d021e8b24856cb8ec2453f -size 7134427 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/6-select-hand-and-test.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/6-select-hand-and-test.mp4 deleted file mode 100644 index 2a3a7fa5..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/6-select-hand-and-test.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba6665bd0b3ef31f932383d740b82cdce9877c3614008870739d4b0daf7319b3 -size 7108186 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/7-weight-paint-hand.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/7-weight-paint-hand.mp4 deleted file mode 100644 index f6ced71f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/7-weight-paint-hand.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f14a2e9a3503f980c23a6d9ac57e2e361966837a29c3323737af3404843647c -size 10584515 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/8-test-hand.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/8-test-hand.mp4 deleted file mode 100644 index 49563edd..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/8-test-hand.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8e59c412995d40212c226d4e5f5be26ab7b9257c72d185d08c149c0845de3ec -size 3954150 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/9-switch-to-lower-arm.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/9-switch-to-lower-arm.mp4 deleted file mode 100644 index 1628b9f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/9-switch-to-lower-arm.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:072b30d3417bc47ba29d5ffabe19764bcf408f113eea0303b962334717cbf502 -size 7029420 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/Candywrap-Example.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/Candywrap-Example.png deleted file mode 100644 index fdeb38f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/Candywrap-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c710cc2e1f9d8efc354c494bf4f685433fdbe916e3c444711409a3f5ca6be0fd -size 80897 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/autonormalize-example.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/autonormalize-example.mp4 deleted file mode 100644 index b751e261..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/autonormalize-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad9dbd71989dd3aae97e31cafe7695ad3763a332ad18a04aabb13e06d2136256 -size 2846174 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/autonormalize-example2.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/autonormalize-example2.mp4 deleted file mode 100644 index 99244177..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/autonormalize-example2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0019d40f259747abd5bf0bf40eac41383ad69b16678d25c946000440d9c0353 -size 1477050 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/head-example-headbone-selected.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/head-example-headbone-selected.png deleted file mode 100644 index 42354551..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/head-example-headbone-selected.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:961ade00e78874fe1ce5277c20288d4c3aa96854e00ab69a587d0f8daa9b86cf -size 418967 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/head-example-uppertorso-selected.png b/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/head-example-uppertorso-selected.png deleted file mode 100644 index e0dd23a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/meshes/skinning-humanoid/head-example-uppertorso-selected.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38fe13a15c660b7df7050c4209fa344406d4bfc4589bfa704cc286ed933a9092 -size 400815 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-generation/Behaviors.rbxm b/.cursor/rules/roblox/en-us/assets/modeling/model-generation/Behaviors.rbxm deleted file mode 100644 index e45630ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-generation/Behaviors.rbxm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd462c906657998f7a9f1f8181d6517171c010f9979b0b992fcc1c049b26569e -size 154422 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-generation/Green-Dragon-Car-Driving.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/model-generation/Green-Dragon-Car-Driving.mp4 deleted file mode 100644 index 36bc286d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-generation/Green-Dragon-Car-Driving.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21340c6ab106501a1e8503cbe110e279be714826ebac4413e9341e1c8672d018 -size 9624930 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-generation/Green-Dragon-Car.jpg b/.cursor/rules/roblox/en-us/assets/modeling/model-generation/Green-Dragon-Car.jpg deleted file mode 100644 index ca25a10e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-generation/Green-Dragon-Car.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e053efda2a6ff818419a06677eb6117bdc0728e615fa38b1200d6cd0187118b6 -size 259343 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Actual.jpg b/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Actual.jpg deleted file mode 100644 index 1d4fd50b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Actual.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51af26555e28350a13ebb5bbda6ed8efacafe74583d785956c7b35a9ec2a632f -size 107600 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Imposter.jpg b/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Imposter.jpg deleted file mode 100644 index 1de7fc01..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Imposter.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:745c4b6e941f8f8ba8462a31a577f019ad5f3685e1d3b70dbfe344facf2a0117 -size 18861 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Original.jpg b/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Original.jpg deleted file mode 100644 index 115aac57..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Original.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e27a1ebdaa750c0052eb9b7dcb247cc9916158c026c28363e35c545553755ff -size 27633 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Slim.jpg b/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Slim.jpg deleted file mode 100644 index 87744549..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-Slim.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a036d97c01b6abcd7b2ae7c8e47357476e512063ebbf2901ad542bc13043d30e -size 26578 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-StreamingMesh.jpg b/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-StreamingMesh.jpg deleted file mode 100644 index f2fb80b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/LevelOfDetail-StreamingMesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55e46237595c7ad0c0e7862b50f10bd7d4c6efdbb7587608e568e6fb24c8d1f8 -size 77564 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Example-3D.jpg b/.cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Example-3D.jpg deleted file mode 100644 index 92a8cba0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Example-3D.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b68b35efffacabe62d1f96137db8de2120c125d6a2d086e92c47c405d906f2d -size 150812 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Example-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Example-Hierarchy.png deleted file mode 100644 index 11ee76ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Example-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1106dfecc0bf3aeae9bd3352894efb6a46e03023088805301e73c8f8f1e57059 -size 114829 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Group-Simple.png b/.cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Group-Simple.png deleted file mode 100644 index adc4fdbe..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/model-objects/Model-Group-Simple.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5004f990a2508936a09e99412a58956beb937f7238c9a6e1c144293055b79d23 -size 33500 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Block.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Block.png deleted file mode 100644 index 9c7622d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Block.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de41fb7fba1592211fd6b34bd3e70ac3125ac495c13088f1568842615fe8db0a -size 188047 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Corner-Wedge.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Corner-Wedge.png deleted file mode 100644 index 86eab48d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Corner-Wedge.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ee873236b446e11582a9b6d4acbff039f7bb9d5b97b0107a2fe31af0ec607b9 -size 391513 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Cylinder.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Cylinder.png deleted file mode 100644 index 72b1744d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Cylinder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:669245b8248c644a8d6912ca4cefb367546ad29fd79ce0ff4acf62d45f410091 -size 188650 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Sphere.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Sphere.png deleted file mode 100644 index 168ff6b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Sphere.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e06918c9a7d5c4f28b3d5c003f27b8b941cb975082de6583c86770d977a4e29 -size 218202 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Wedge.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Wedge.png deleted file mode 100644 index 38187a9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Basic-Part-Wedge.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e44c41441e7a01a026c48fdc8a833f569bb362d1372ff742e0e80980bd7dddd4 -size 199428 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Material-Neon.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Material-Neon.png deleted file mode 100644 index e8663145..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Material-Neon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6d4a2e7a7ab9d8f13e8cd195b0d01636c7da364581842f458ffabc36586bb79 -size 288325 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Material-SmoothPlastic.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Material-SmoothPlastic.png deleted file mode 100644 index e342d5a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Material-SmoothPlastic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e71149971add8462c9ab823f3a33bf369bc2d44b8aadd0c35a47e66709758f5 -size 164666 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Mesh-Example.jpg b/.cursor/rules/roblox/en-us/assets/modeling/parts/Mesh-Example.jpg deleted file mode 100644 index 13d606e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Mesh-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bd4f179e5b6bc5d85851623fdeabdca1e132f42e9a2cac6e2dc75e8f54b35ff -size 101782 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Move-Local-Orientation.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Move-Local-Orientation.png deleted file mode 100644 index fd05598d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Move-Local-Orientation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6ca3344c81197c2f5e1f1fe2f51854b0a969ded5e1866b1af1d831563de24ae -size 298106 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Move-World-Orientation.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Move-World-Orientation.png deleted file mode 100644 index a1778a30..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Move-World-Orientation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0dab02ee0050f3a625f2573b4890a5c1e2e36bf1141c2c260582687732d1cc46 -size 294879 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Part-Example-CSG.jpg b/.cursor/rules/roblox/en-us/assets/modeling/parts/Part-Example-CSG.jpg deleted file mode 100644 index adb834f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Part-Example-CSG.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12030691028c495e1e93a21150c40ad5ca09d7435b078824c5d0e939aa6f8d2f -size 88816 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Cursor-Drag-Snap.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Cursor-Drag-Snap.png deleted file mode 100644 index 4c72eddf..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Cursor-Drag-Snap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:759a30b1b619b79de5f65b0388f770dae413b7b82985e0fb928397e7507d7d33 -size 359497 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Cursor-Drag-T-R.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Cursor-Drag-T-R.png deleted file mode 100644 index b40f858c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Cursor-Drag-T-R.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:531835a8d10ababec75397057451a03159d7e94f38d5643659a263ead5c52d01 -size 349992 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Indicator.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Indicator.png deleted file mode 100644 index f9093b08..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Indicator.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fa266186f8d0f8dc344c478a95522a1582b79d59ba1f6df18eccc6d1c984c41 -size 351593 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Pivot-Snap.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Pivot-Snap.png deleted file mode 100644 index 5ab2136f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Pivot-Snap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5801e9cb0aaf751099b7b15186be83d7324f377ad8bddcc9a170a0dc72ef3bb -size 366632 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Ruler-Snap.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Ruler-Snap.png deleted file mode 100644 index 4ed41f5a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-Ruler-Snap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a829ce9f07bdb2668c8b4c6b1d715d6aa23557adfa3af1f37e5b007d1e2bf6c2 -size 324267 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-SM.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-SM.png deleted file mode 100644 index ade9008f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move-SM.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3b0c62f73a076233e254c1f268caf4614a66977e3ca5f3961b99939e250b0fe -size 223953 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move.png deleted file mode 100644 index d610544b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Move.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d8ca3c475fec6c5693bc41f40601d41fadc4c98f7cbacc3206c2d3d43fd6df2 -size 191883 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Rotate-SM.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Rotate-SM.png deleted file mode 100644 index a3b5bc3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Rotate-SM.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e3584fd7c8b6d4f3e791f96e728bd6e7823cc8908374fbfc4c9173f76ffd315 -size 245922 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Rotate.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Rotate.png deleted file mode 100644 index 54d9b578..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Rotate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c79967d99f1e5196b996436b516dc5c43a74dafef0bb8d4606a4124bdd33ae5f -size 242129 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Scale-SM.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Scale-SM.png deleted file mode 100644 index 58e3f9f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Scale-SM.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2d83d3e1fac2d809a3f911b52bfcbf6e3d1de272fc3807360930a01357c2bee -size 201342 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Scale.png b/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Scale.png deleted file mode 100644 index 02f1b854..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/parts/Transform-Scale.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e2a41389c77e8160ea4235bbe2f85ce867e7de5efabe0b8e206ae4ce7a74317 -size 173725 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Adding-Armature.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Adding-Armature.mp4 deleted file mode 100644 index 3a01fb77..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Adding-Armature.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09b68d3367056c8c827fdefb0631ea688a6b0141df79264e2aff1ef4ba304b0f -size 778745 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Animation-Editor-Add-Tracks.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Animation-Editor-Add-Tracks.png deleted file mode 100644 index 729acdc0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Animation-Editor-Add-Tracks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25eddd59e0116afcfbd90a854d68b73707998e887ba3a08f1db730ba343bd92e -size 24410 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-1.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-1.png deleted file mode 100644 index 4cd52d85..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62a434597924b5f02991cc9b58de9897ef81f26a11553c613d437fde925a39be -size 86297 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-2.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-2.png deleted file mode 100644 index 82cc9800..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e937d7f25f8a9e8ec935a2fa2326200d007838f4b4a86038434b9706b3f6c50 -size 14241 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-3.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-3.png deleted file mode 100644 index 9c45cedc..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c70833aa396a17d608f74611dc88161fb9861ef089bafd106a221a047c9a6acb -size 21700 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-4.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-4.png deleted file mode 100644 index f743c61d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:427fa3593e95b16ddc1f8420d1d90a882b4fcfd592e17e314f6231b670e5a913 -size 11412 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-5.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-5.png deleted file mode 100644 index f8dc6294..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Export-Settings-5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e47f1cb482cb8621778b009073e15ede07d0f2db7d3bb61e7a5eface7ac1f71a -size 27146 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Scene-Units-Icon.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Scene-Units-Icon.png deleted file mode 100644 index 11268f5b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Scene-Units-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61a45a53009bf40de566e5dbdf8d5816399c3b78a417a797e7662ec434e6a3b8 -size 47924 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Scene-Units-Settings.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Scene-Units-Settings.png deleted file mode 100644 index 8bde06fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Blender-Scene-Units-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b29203b383945b1195f491c0d5413a7aee696264eebe1940bd60b6e2cda56003 -size 311042 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Bone-In-Front.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Bone-In-Front.mp4 deleted file mode 100644 index e58b3f9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Bone-In-Front.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d3eef0a7bd67a63162603521f731c269df1bd09c6676d0680d6444c20428160 -size 609637 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Bone-Visualization.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Bone-Visualization.png deleted file mode 100644 index 3661302e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Bone-Visualization.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b4fe45bbba6b382d708cf46c75df116cc4928cdb694b999b16af53f4e4bb65d -size 63579 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Brush-Settings.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Brush-Settings.png deleted file mode 100644 index f09f133a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Brush-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2571728967c31327a8366e560c95f95a1bebf92b95004927c3c6fd036253184 -size 18066 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Clothing-Data-Model.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Clothing-Data-Model.png deleted file mode 100644 index e3b94f03..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Clothing-Data-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f31c9a864e6bf1a6887635f3a3865d00400cdc72dba3fa099e8207ac2730ad7 -size 16807 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/CreatureModel.fbx b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/CreatureModel.fbx deleted file mode 100644 index 649c025a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/CreatureModel.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e549fc365f75523685459a6b28b56fbea3721f3147f7983d21050e6797277a0 -size 4825184 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Enabling-Autonormalize.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Enabling-Autonormalize.mp4 deleted file mode 100644 index 44682ffc..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Enabling-Autonormalize.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20165756b97229b8b94f4f913fb32baff08ed20a6dc46b24493ea3cb92a76b87 -size 1262428 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Extrude-Last-Bone.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Extrude-Last-Bone.mp4 deleted file mode 100644 index 27744d91..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Extrude-Last-Bone.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:084471771696831815a6d428a099a72ffc2a3ef51647801aa05ffd0fc131c483 -size 1801190 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Extrude-Second-Bone.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Extrude-Second-Bone.mp4 deleted file mode 100644 index 89babc8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Extrude-Second-Bone.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df1bc3db72228365e613201b1784c24d94eb7fff0e1bc45cf2a1e8a2bf89aaba -size 1539063 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Head-Rigid-Example.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Head-Rigid-Example.mp4 deleted file mode 100644 index a4029604..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Head-Rigid-Example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3fd87c414b742a9a4a2c87a65ed758b9d5f80a6a150bea1f9a9505e42122381 -size 2799134 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Head-Skinned-Example.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Head-Skinned-Example.mp4 deleted file mode 100644 index d191c50a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Head-Skinned-Example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:469be641e036bea3b8a0a9b548fbf2b28fe1ee86436d8874a4a41289bb78ca3a -size 2264177 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Import-Model.jpg b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Import-Model.jpg deleted file mode 100644 index 42abe7cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Import-Model.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3089d1339517247136163bbd61319675842726fb8331741fc9814716f1cd20ec -size 187483 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Lola.fbx b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Lola.fbx deleted file mode 100644 index 7fcb523e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Lola.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a55f4df2002daec171db29cf562d7038d829716ac0d91e2a7dd4a2f8006cf4f6 -size 3745948 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleLeafTree.fbx b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleLeafTree.fbx deleted file mode 100644 index cccd34f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleLeafTree.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2dada4b3d018feaa5799d6898100f785864f751f62fb1a684eceadb22e3cd620 -size 14297196 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleLeafTree_S3.zip b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleLeafTree_S3.zip deleted file mode 100644 index 879dfd9d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleLeafTree_S3.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21047ab33692fd62100c68f9e74f0b92e1753accf398b05d5dfc176ea897c007 -size 9399196 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleTreeS1.blend b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleTreeS1.blend deleted file mode 100644 index d11d15a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/MapleTreeS1.blend +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:350c45f25e97c2fdcab50fe546cbcf5de37f09d19b43d0d46336bd1885c41131 -size 21235852 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Bottom-Bone.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Bottom-Bone.mp4 deleted file mode 100644 index c9c55f46..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Bottom-Bone.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62328f5c64cf5c434fbe459798b7a8e45671b23a1f7853df6f6a858950b694e5 -size 4436784 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Middle-Bone.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Middle-Bone.mp4 deleted file mode 100644 index 50745fc0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Middle-Bone.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fdb58e717e1fe00d359c5741ea836f9bb61f924da0596ed06a5914da329c556f -size 10587109 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Top-Bone.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Top-Bone.mp4 deleted file mode 100644 index b686f596..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Paint-Top-Bone.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebc2e268fb389dd9520f6ef3b7fa367edd03e9a6df672fca0d8a35973e1c2cc7 -size 4452237 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Parenting-Armature.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Parenting-Armature.mp4 deleted file mode 100644 index 8a0adb79..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Parenting-Armature.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c020914abe6b646cc881ee59e51ebe7a8599e3ecd3a58bfc82a91e3d432e3d5e -size 1773434 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Position-First-Bone.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Position-First-Bone.mp4 deleted file mode 100644 index f079d2ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Position-First-Bone.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2eeafa4f8328050a6d86f17a7131bc973f622c50c3460d8dbcdcb1e97023d939 -size 2473551 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Renaming-Bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Renaming-Bones.mp4 deleted file mode 100644 index d0ba3c60..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Renaming-Bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9243654e4b695c27b6d12bcaade4a457ff2d73396be6ec83bcc697927fec5850 -size 2352815 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Bone-Visualization.jpg b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Bone-Visualization.jpg deleted file mode 100644 index 8095ae30..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Bone-Visualization.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15fd48bbc753b4e87dee86c523a7eae2c6681e64d1490b791480c94436400493 -size 147020 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Constraint-Details.jpg b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Constraint-Details.jpg deleted file mode 100644 index f84c8f48..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Constraint-Details.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0dd04bb7ab394505067a88260cd78e400f33539d893498801bbe4b9671062336 -size 142658 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Hierarchy-Blender.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Hierarchy-Blender.png deleted file mode 100644 index 54ebb711..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Hierarchy-Blender.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6758b59e9c2737c67afc3b5972a9ecbc3d95cda10af60c53eeac9f0993757ce -size 171133 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Hierarchy-Maya.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Hierarchy-Maya.png deleted file mode 100644 index 140cae21..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Rig-Hierarchy-Maya.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86bca1bab719474b36722395f8c13a661696210fbc0399ae72737ab5296895fc -size 71154 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Setting-Projected-Brush.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Setting-Projected-Brush.mp4 deleted file mode 100644 index f780a659..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Setting-Projected-Brush.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7ffc46191741783b80fc08cce5058d1cd7c2b727d982ebef56f71808ba8636a -size 2251315 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Shoe-Data-Model.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Shoe-Data-Model.png deleted file mode 100644 index cdea4778..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Shoe-Data-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbb9f68e5017d140126c9d54458a1c17e934f695d131ca3e40739b2155566d5e -size 25924 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Stick-Visualization.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Stick-Visualization.mp4 deleted file mode 100644 index e0c7759b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Stick-Visualization.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76c3b3bc05b535380061fa7f9fc966b542b7dc3736c07d7ba7f2021d41145c4b -size 815377 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Test-Bones.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Test-Bones.mp4 deleted file mode 100644 index b44c0dba..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Test-Bones.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80ab02f295b25b272ee1bedd8d01aae7544ba6e15dbb2895612c23993eb4c2f2 -size 5208423 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Test-Bottom-Bone.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Test-Bottom-Bone.mp4 deleted file mode 100644 index c91a5fd7..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Test-Bottom-Bone.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22dc5c8f96dc1756d70deda82786417af3c9b24cde03a86e133359750cfd52f9 -size 3562634 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-AE.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-AE.mp4 deleted file mode 100644 index d03e0f61..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-AE.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0958f34996a7132d1e39dab02c163035af2e284655310c8cc0b265af37742990 -size 1505634 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-Default.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-Default.mp4 deleted file mode 100644 index 8e4712ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-Default.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd6b9335ce5cab00e5a938860c7eb1e011b195a7f2ce1ead71079204f4de373d -size 1558640 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-Skinned.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-Skinned.mp4 deleted file mode 100644 index 2e9bd96b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Transform-Demo-Skinned.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c99affad13579c87c13ed63581807671ad89384155ac0a7abc4c259c56cb7aca -size 1553267 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Weight-Painting-Example-Gradient.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Weight-Painting-Example-Gradient.mp4 deleted file mode 100644 index 1c40332a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/Weight-Painting-Example-Gradient.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa77e3691dc6b18cda1ece678579f25f238f877167d919ae444d11bfb21e0ad4 -size 3035603 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/1_Hide-Armature.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/1_Hide-Armature.mp4 deleted file mode 100644 index 90fb98d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/1_Hide-Armature.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55b7218a6040e6116e9398241ecbe02e1d6ddc40a2500faf694c4d9011b0dbd0 -size 1845931 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/2_Set-Armature-Test.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/2_Set-Armature-Test.mp4 deleted file mode 100644 index edd4d48a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/2_Set-Armature-Test.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b31a3c220a81a344120d979d1b50e8e81de0e035e983f02a268a5eb6b2c4919 -size 7543496 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/3_Fix-Skinning-Example.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/3_Fix-Skinning-Example.mp4 deleted file mode 100644 index da4ed370..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/3_Fix-Skinning-Example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bdac0b5d11949aec69e0cf6513b1795e8285efef62e0681301b07945dcbfb5f -size 22581348 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Blender-Preferences.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Blender-Preferences.png deleted file mode 100644 index dad5b5a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Blender-Preferences.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85646084fa44145b9a132e551f10bc5237da857be6b7b30f2ae3e10989b3f5b7 -size 62104 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Calisthenics-Tool-Addon.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Calisthenics-Tool-Addon.png deleted file mode 100644 index 1f9d8b92..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Calisthenics-Tool-Addon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:caa0c21bc34cf91c1900eddb46024d1bf00b65e9c66bde720732ecabc3e0ae6a -size 142502 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Calisthenics-Tool-Open.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Calisthenics-Tool-Open.png deleted file mode 100644 index f1cb655c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Calisthenics-Tool-Open.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de0b6fcf23021aa6d925fdd79b1fb8b1967e2faae378af464e9724764b513a53 -size 24432 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/CalisthenicsTool.zip b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/CalisthenicsTool.zip deleted file mode 100644 index 50617724..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/CalisthenicsTool.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7ca2737d4387524fb5a9361d9f227c685b1adb1e6c046c6944d4e1e78985d46 -size 6791379 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Exporting-Model.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Exporting-Model.png deleted file mode 100644 index 40ac270f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Exporting-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6152fa04257ccf5492f3e26905b99b7702bed349d549c7edb0e43dd01b5071a8 -size 26243 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Fish-Character-No-FACS.fbx b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Fish-Character-No-FACS.fbx deleted file mode 100644 index 38e11586..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Fish-Character-No-FACS.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ceda28262020c3e0c4933aaa12f2bf646e6c78d59a67271ed64b7a869f915b4c -size 1852652 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Movement-Reference.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Movement-Reference.mp4 deleted file mode 100644 index 74f57642..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Movement-Reference.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9745ede96db4dfd63f6c8cb7b2a06fa81c11f1dc51c02ddb040aa3f9ba2d6b60 -size 2867056 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Normal-Reference.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Normal-Reference.png deleted file mode 100644 index 613e9949..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Normal-Reference.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb3eec718294dc576a939bd02bc905b1dff3896209eeb8e39b83e866e541c04e -size 419280 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Running-Reference.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Running-Reference.mp4 deleted file mode 100644 index 171c7a69..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Running-Reference.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c74c72059de7ae0e1ac22c880f59478e3b2d94d74d4e05f503f52932714efe2 -size 384018 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Slender-Reference.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Slender-Reference.png deleted file mode 100644 index 085f81ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Slender-Reference.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba22b3c05a26cdc81db16c016bad6356035f3c9ae5b7e201340a1bddea432480 -size 419871 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Toolbar-Slider.png b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Toolbar-Slider.png deleted file mode 100644 index adc7fa8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Toolbar-Slider.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbea9c11aabff12e9950447abb0fb14cb565fd02d78ae5503f3d5ae67ad6f4ca -size 25351 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Walking-Reference.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Walking-Reference.mp4 deleted file mode 100644 index cbaba4ff..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/skinned-meshes/calisthenic-tool/Walking-Reference.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f6573441d633e1f1e4c8bac317a95b6f70240a1d7f7c00f07722989adb40b6a -size 376043 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/CSG-SmoothingAngle-0.jpg b/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/CSG-SmoothingAngle-0.jpg deleted file mode 100644 index 07c6225e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/CSG-SmoothingAngle-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f658b385460074d977e376c713e0e0bf1d09ade7f7105f58c1182aeb92a18ac -size 65836 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/CSG-SmoothingAngle-50.jpg b/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/CSG-SmoothingAngle-50.jpg deleted file mode 100644 index c262642f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/CSG-SmoothingAngle-50.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2433858bfa15f52b6f19f5ebf81efc15493aa9ba2f9d4ede5c6555cd49735863 -size 64240 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Intersect-Result.jpg b/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Intersect-Result.jpg deleted file mode 100644 index 1a375f84..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Intersect-Result.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ddea91222a90d47fece1f4e88ef4d38e95e3d7387821e91181a8b02ac1cba75 -size 151404 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Negate-Result.jpg b/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Negate-Result.jpg deleted file mode 100644 index 85e2dcb3..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Negate-Result.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8497398ae9023652cfd895bc26b52f432695872eb3b7d3cbcb77a658942c69d6 -size 162250 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Negated-Part-To-Union.jpg b/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Negated-Part-To-Union.jpg deleted file mode 100644 index 019adb2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Negated-Part-To-Union.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0c2395d115c862ba2236fb29848b2ca5218d31d40175f3a3070b06236c339e7 -size 180139 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Intersect.jpg b/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Intersect.jpg deleted file mode 100644 index ebe01783..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Intersect.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af50fb06e9c2b74154d7eb347e3dbfe48325a88edeb636fcee64d6b2382dcd07 -size 178214 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Subtract.jpg b/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Subtract.jpg deleted file mode 100644 index e93b7db7..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Subtract.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b530e4db48033f3ede7b541671905bd37ae8bc30755fe3abdce14336b408da6 -size 165992 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Union.jpg b/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Union.jpg deleted file mode 100644 index 60c7f602..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Separate-Parts-To-Union.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec2852267a4bd63b2cbf830170203a0ee9510d0eefa82daea3f6accf554c8d22 -size 181306 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Union-Result.jpg b/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Union-Result.jpg deleted file mode 100644 index fbbf9570..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/solid-modeling/Union-Result.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:220f09dcb40af080544fa3b09bd22a76d5f589f69d3fa32ac03add3b963c0e6c -size 164329 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/010_SilkSatin.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/010_SilkSatin.png deleted file mode 100644 index 8b6445cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/010_SilkSatin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9592f66ccf587b7e2bcbfce1e2555bc2512fa0a1d7e8655407ce8041af0dba3f -size 138853 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/011_VelvetSuede.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/011_VelvetSuede.png deleted file mode 100644 index 40fa22e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/011_VelvetSuede.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8c97f8c664a8c348822eca3859c4ccf4a266c078cc3731f95a2a7b8c0175fce -size 260203 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/012_GlossyLeather.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/012_GlossyLeather.png deleted file mode 100644 index d913b472..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/012_GlossyLeather.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96aa658962398eb90fb602fea5e777394e8a68c30e010515dbc536a4838d5b90 -size 205437 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/013_WornLeather.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/013_WornLeather.png deleted file mode 100644 index 7c60c920..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/013_WornLeather.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16d12e8c60772b7ab33a9f7b71beb30bde3656332032ba8e6b5577cc60c3f242 -size 228133 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/014_Fur.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/014_Fur.png deleted file mode 100644 index 96cb4073..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/014_Fur.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9653afe1c4bc2c21e02e43c4ef1511e08cb1781e26cfc3959d40da8344deba95 -size 207743 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/015_Scales.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/015_Scales.png deleted file mode 100644 index 14460bf0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/015_Scales.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94eec19294a5f528327d260f8eddf6c2357d8886a8e30168fea278451d354371 -size 255083 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/016_Bone.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/016_Bone.png deleted file mode 100644 index 608560a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/016_Bone.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b9df5ad2b91fdc860574ee9c0c46d07497b9ce3ebedea09412eeab548d275de -size 617152 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/017_Skin.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/017_Skin.png deleted file mode 100644 index 27b89ef0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/017_Skin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:679658bcbb67eea0b21d4a54f345644a116dd34942827d08268f97e4a3a6bd59 -size 164366 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/018_Wax.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/018_Wax.png deleted file mode 100644 index fb79047c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/018_Wax.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:218f6e68de4f4e2c02ea91f02bb0540d731ee997c484fd7f41235a067684dd7c -size 526502 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/019_Marble.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/019_Marble.png deleted file mode 100644 index 185b88bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/019_Marble.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58658ad589ae1bc6bf8cf8d453be0c9227bb147a9c803c7fa95b3498b8bc2d4c -size 249778 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/01_GlossyPlastic.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/01_GlossyPlastic.png deleted file mode 100644 index 3f2cb73d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/01_GlossyPlastic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d18fe34e5d0f183436bc2725bf415a4a26ee2f96830c71cbb7296f3cda8f3fb -size 171465 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/020_Jade.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/020_Jade.png deleted file mode 100644 index f6cc6e90..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/020_Jade.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca9bcac68842b726d42e2dd7d4149d04a1c5eb0786327c9145b7462f2dd772da -size 205999 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/021_PaintedMetal.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/021_PaintedMetal.png deleted file mode 100644 index c2854b0c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/021_PaintedMetal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0024884c69da0ae9d820c657f136014fa3ba2400d986a950f59dbd0f06cf4c5 -size 162878 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/022_PureMetals.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/022_PureMetals.png deleted file mode 100644 index cadc895f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/022_PureMetals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f02c7cb866527278a505ed46ae84f12a159e8f030ffee054e3ec646317d9bcee -size 137783 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/023_WornMetals.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/023_WornMetals.png deleted file mode 100644 index b1aec859..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/023_WornMetals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cda32fb0bc7e619de8c3c9f165fe5e4724b684153946b62e4a7006f15ea057f9 -size 186921 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/024_GlassMirror.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/024_GlassMirror.png deleted file mode 100644 index 9f127ded..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/024_GlassMirror.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:070127c21394583fa0eea6e2e3c50181dd0d86f470af61839bd722485eda9ad3 -size 208081 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/02_MattePlastic.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/02_MattePlastic.png deleted file mode 100644 index 70980b0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/02_MattePlastic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1518de13a86bb1cc3b64f4797f2786cd81e6e2ce67e4ce9f03d3126e3677f732 -size 111191 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/03_Rubber.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/03_Rubber.png deleted file mode 100644 index eca9f7a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/03_Rubber.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd586d52d468030fa823dd166a1005e9914a18fa9fa1a71373071e4ec4132648 -size 148106 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/04_Latex.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/04_Latex.png deleted file mode 100644 index 943fd2c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/04_Latex.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e686d54f9a1d62ec4343be95f86a6c047853bd6562e5bfdaec97d9d3669c37e -size 155878 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/05_GlossyWood.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/05_GlossyWood.png deleted file mode 100644 index 2d3b2a75..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/05_GlossyWood.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7c4b31df65964a6dea3bc466c66ffe0355f961fceb19c6fa8e2b4d07229a4f3 -size 204372 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/06_WornWood.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/06_WornWood.png deleted file mode 100644 index 4ea70744..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/06_WornWood.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e019db903f93fa99336fe2114f14cf245baf5bfc31f3daff0eb781c43bdcedab -size 216165 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/07_CottonCanvasDenim.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/07_CottonCanvasDenim.png deleted file mode 100644 index 1c7b1f9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/07_CottonCanvasDenim.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41a3df563044afaf919e7e6f7a43e8449c34139fd9744a93caf5aa9d8b05a603 -size 197704 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/08_PolyesterNylon.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/08_PolyesterNylon.png deleted file mode 100644 index d98fc385..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/08_PolyesterNylon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a50a0e05191312d68cce8fabd16e68a31214ed2a528da65dc9d1e5653ad6c746 -size 275313 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/09_WoolLinen.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/09_WoolLinen.png deleted file mode 100644 index f39adb0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/09_WoolLinen.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb7fa780eee4d3f3bca7dee67b828bc54bc8821baa320b67b8ad9d83c9a283d1 -size 209934 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Custom-Skin-Tone-Example.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Custom-Skin-Tone-Example.png deleted file mode 100644 index c31bcdcb..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Custom-Skin-Tone-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b12f627cb251e1887f701a0b00bc8e0307ca33c5701094f59ab77b15350a1b0b -size 1796534 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Custom-Skin-Tone-Map.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Custom-Skin-Tone-Map.png deleted file mode 100644 index fce76cda..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Custom-Skin-Tone-Map.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc6941c2cef507799283616fc4053245752d4369b4e6fe726bbb4504279e4fdc -size 499962 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Denim-Jacket-Sp.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Denim-Jacket-Sp.png deleted file mode 100644 index dec77623..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Denim-Jacket-Sp.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4976cbf1a866770e2bc3af40e1a7718097527ab8a3e1b2dc34a04829a36772ce -size 166978 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Denim-Jacket-St.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Denim-Jacket-St.png deleted file mode 100644 index ca6b704c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Denim-Jacket-St.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46160de194ac07f82c0501b3391a1b3a068ddbb30f20cf6d89b1157824cf04e1 -size 163153 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Gold-Puffy-Jacket-Sp.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Gold-Puffy-Jacket-Sp.png deleted file mode 100644 index 8147897b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Gold-Puffy-Jacket-Sp.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1ce8d275173f3f5c35562c9c3410fe7832f61fa19a0d73d562e15257becc870 -size 193417 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Gold-Puffy-Jacket-St.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Gold-Puffy-Jacket-St.png deleted file mode 100644 index 6eddc92c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Gold-Puffy-Jacket-St.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28b6485330da4f135237a77df663c3a0a127b9b968561878f4b67b105af33c14 -size 206314 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Green-Jacket-Sp.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Green-Jacket-Sp.png deleted file mode 100644 index 55f4ec62..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Green-Jacket-Sp.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a972fcafddb8445388ffd2a54131dd9b4017f71d96f00c20c8734c2eea42031 -size 139252 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Green-Jacket-St.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Green-Jacket-St.png deleted file mode 100644 index 76b75b1e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Green-Jacket-St.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38b8e0315a063321e06eeadf88cad4b19b3b2e2903cf1ee0b3c7ca78fde80e17 -size 130721 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Layered-Clothing-Example-2.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Layered-Clothing-Example-2.jpg deleted file mode 100644 index 9b91329a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Layered-Clothing-Example-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc3e7d65922108529ca4b2eb690211389df87859c3051e5babd41206c1dfb68c -size 247402 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Layered-Clothing-Example.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Layered-Clothing-Example.png deleted file mode 100644 index 86c11bc3..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Layered-Clothing-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf6ddb0a6d4a4382a7be677e2d7a77b2cb06fae4ae80aa752c2e440e04f93a66 -size 727585 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Leather-Jacket-Sp.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Leather-Jacket-Sp.png deleted file mode 100644 index 84f2dd9d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Leather-Jacket-Sp.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4864fc2be28d8a423b20dd18247c583eb687c14b22fb089dfbd301c6315e6dae -size 136106 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Leather-Jacket-St.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Leather-Jacket-St.png deleted file mode 100644 index 065cd716..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Leather-Jacket-St.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e0840162eec7ead35115bd4825036df35da6ae61fd411e44bc1b1ea6ba42580 -size 138576 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-0.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-0.png deleted file mode 100644 index 00246332..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58dde3f9891ce3cd2279f6b8ba45cf861c94e3446a96d5fc5de1e3e490c86ee0 -size 147874 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-1.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-1.png deleted file mode 100644 index 507a0bf1..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b774332dd1eaa7a9196a5024bbd1a8a08bb292503e6be5d8c5e20738a0955fb2 -size 159711 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-Half.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-Half.png deleted file mode 100644 index 06e0cf7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Metalness-Half.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fa9ce1269ec9a453085f3019c3bb957cd6673e72b463e48b99299512909c164 -size 159942 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-0.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-0.png deleted file mode 100644 index ab715465..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87ab7d379713a40e6eb41d97789f07a00e10da63275dd3116ad9c356c03acd7e -size 103517 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-1.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-1.png deleted file mode 100644 index e67972dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b9d33fcba2572e8569a2c2ac525917582b1474a3cecd02bf5fb46a8f3b3a88f -size 225453 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Half.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Half.png deleted file mode 100644 index c537e5d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Half.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6cc48688b75363649b5ebeeacee27a7f317695b0fabd9e2d4b7ef736b610428 -size 197183 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-0.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-0.png deleted file mode 100644 index ecb301ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28ca5e228eae2e03d44616bd42cbc835a321097a945bceb50988c9157dc34e7e -size 15934 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-1.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-1.png deleted file mode 100644 index 0e4801c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45969b3d80aec3814a760b5f0eea11204b8e093cf967b0e4046ae474eeb62482 -size 305398 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-Half.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-Half.png deleted file mode 100644 index 23eecc8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Normal-Map-Half.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a80eb487e463400b4f740722e5ef6491713ea09469f906e32930290a27bbb89 -size 258897 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-0.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-0.png deleted file mode 100644 index 16ea68aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f9a3b4e1e2043b208551016e273e0e4c1ca62a74aa6f62507a1245030919610 -size 269385 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-1.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-1.png deleted file mode 100644 index 6327e39a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77fc8025062787b4aea55babe01b2a2d4817e2a4640d252c13a44d8031682659 -size 324225 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-Half.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-Half.png deleted file mode 100644 index 4f07a1a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Opacity-Half.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4dacb2a9970393583280d9d038deb1bbaf40ebc93608c7254cc71db81054c346 -size 320566 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-0.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-0.png deleted file mode 100644 index a7ec0d23..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ef97edda97d144ac92db1ea080f40ed4ce045686cc4c31e2357a9158f13c600 -size 318230 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-1.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-1.png deleted file mode 100644 index ad09a254..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37e7dfa6ea5619b0aabdf26e9d392f5ab8a99e48094c38e8ea17afcbf643e26f -size 357408 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-Half.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-Half.png deleted file mode 100644 index 734b6b83..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/OpacityTexture-Half.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8930c19da1caa11b1410c2633bc2e11155acd34dcd0485743902def8b64e9bec -size 426710 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-0.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-0.png deleted file mode 100644 index c1fa3fab..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83ce7ec176b42b2516b2db429cc30588bb40fe9eb1234a0d91e4f9459e5bea7b -size 157734 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-1.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-1.png deleted file mode 100644 index 164a55d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59950390c7b7984681a5cab21edcc8e865dd511237fbba41fa6d9cac9d7a98aa -size 96692 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-Half.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-Half.png deleted file mode 100644 index 91f97241..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-Half.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c4494887e5b953f09feb8bd07b7b73bc60eca03f84b1ad4dd346948720103a2 -size 103382 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-Metalness-Matrix.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-Metalness-Matrix.png deleted file mode 100644 index 853a155c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Roughness-Metalness-Matrix.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76375bdcfab83539aac70d56991658d1f5e3d45462309cc4c72ecbb664189ddb -size 4948256 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-ColorMap.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-ColorMap.png deleted file mode 100644 index 6341dcb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-ColorMap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9afbef2818254365c78943d9150f8f9c7899d9279470a473639778a644a76d01 -size 7245 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-Overlay.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-Overlay.jpg deleted file mode 100644 index 4a8e8c8a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-Overlay.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20485f6db0d15c3dcfc0e89dff794aa511f150bb05fe9e208225e6687fd54eb8 -size 128125 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-TintMask.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-TintMask.jpg deleted file mode 100644 index 5dc92732..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-TintMask.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cc9b0a4d3ff7d6a51f50c2e8ed60697295f43bcf4714e6627372264936ef81b -size 151231 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-Transparency.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-Transparency.jpg deleted file mode 100644 index c1399b85..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Gradient-Transparency.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20f06293682e17efc44badb444b50efbca685fec8c30b60658a513b3a0ed2c87 -size 155663 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Overlay.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Overlay.jpg deleted file mode 100644 index 01721945..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-Overlay.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:192a65b83fd14910d392bbcea2c72f294b3a716d04200cacd72904a5a1360e17 -size 125878 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks-Albedo.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks-Albedo.jpg deleted file mode 100644 index 88f7aa9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks-Albedo.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c90f647db1ab6e7e2caa837fdf0cd582e7dcf7a92c5b0db7c9a6bb0a97f4efc -size 218376 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks-Alpha.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks-Alpha.jpg deleted file mode 100644 index e030fbac..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks-Alpha.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fe63b0f488e5d0d7416667038fc16cbdfa703f1e53844ca1e1901c04d1ccc03 -size 194535 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks.jpg deleted file mode 100644 index bb976a22..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-AlphaMode-TintMask-Bricks.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e023036c4e802b742eba82fa3e5491cf7a39e9bc9317f87bd60d6b6b7d8b3c1b -size 261517 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap-After.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap-After.jpg deleted file mode 100644 index 467f65c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap-After.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:219d8dbabf56eb49c3339fd4eddc7242db7f3573e7abc8ad666c178ce101e388 -size 123289 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap-Before.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap-Before.jpg deleted file mode 100644 index 727cb6ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap-Before.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15237ed8079b83fb36ecbc2991435190b377e4989421348655a1e21a3280869f -size 67112 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap.jpg deleted file mode 100644 index a8ece2cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-ColorMap.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99736bd13c92cd68a7bb81bc417419c8e130f950be8e7a0ad50c9cd51d764fc3 -size 216583 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Example-1.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Example-1.jpg deleted file mode 100644 index 986ada1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Example-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36efc4b20e9c54304a2943f556340325331c3b129e70060fa9f303416b13a01e -size 226046 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Example-3.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Example-3.jpg deleted file mode 100644 index f0e111d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Example-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5dedd5a39a9eb7bdba85066a347aa0da3145e788051b494e11410478e33cdbd6 -size 227195 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap-After.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap-After.jpg deleted file mode 100644 index 7da41677..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap-After.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d84ddf1f0b9bf75e924e3ec02bc852148c2eb2abfe569bc45a41b38a0c9b2ebb -size 129617 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap-Before.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap-Before.jpg deleted file mode 100644 index 8ce5ef80..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap-Before.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4a3ee5ceb6253c1a11aecbaacc648bf66c2203d99b95c47ffe6a0b7e3d34396 -size 81542 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap.jpg deleted file mode 100644 index b867f9f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-MetalnessMap.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07b31e88be3723bf734e33ed53ca3804d1124f1b8249e4a908fe063d0d8ab298 -size 152815 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap-After.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap-After.jpg deleted file mode 100644 index ae9a5f2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap-After.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59145e990e3595447a085e6c4d9b992181104324d4582c32a5ed31b5e5a35d65 -size 130252 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap-Before.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap-Before.jpg deleted file mode 100644 index 9cb33507..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap-Before.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac2979b4fa6e861d421d5b8b81f281a710af25b26b22dbef460314565fcc8a27 -size 96449 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap.jpg deleted file mode 100644 index d6274683..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-NormalMap.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd7c55dc2226dac2fc63bd84c6324b4af11105ee6df07558a830133904ae5dc6 -size 192303 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-After.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-After.jpg deleted file mode 100644 index 9f0f432e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-After.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38d66b8622b26a10f3165b6376cede8bef4d642e295ab39e1317ba4fd1555e8f -size 207939 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-Before.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-Before.jpg deleted file mode 100644 index d741ff67..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-Before.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c47b9a886f16e9a2fab955c09b162a9b834132ea51d539764b83545bd99a029 -size 176093 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-ColorMap.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-ColorMap.jpg deleted file mode 100644 index f9b2dc88..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-Opaque-ColorMap.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9084b7c51326b59ea314aa6a7d05b1081f2cb3bd3a8bf146956e08af5e8ae19 -size 120982 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap-After.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap-After.jpg deleted file mode 100644 index 00cad5a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap-After.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d70515e06642d973c77b2f96539f7e4fe15a1474c18604780e7311d2ea50fbf -size 92656 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap-Before.jpg b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap-Before.jpg deleted file mode 100644 index 398994b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap-Before.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:730a35c5c7c27fac25e9117553be4026992c054321e5734d6532e7a1bcae1160 -size 77928 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap.png deleted file mode 100644 index 1f8ca3c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/SurfaceAppearance-RoughnessMap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55dfab1d086d31cdc3a6e01d60a4bf792e81bbc2800fbe3e4bb56fd37fc75ed4 -size 77378 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-Green.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-Green.png deleted file mode 100644 index 43981994..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-Green.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7649f03aaf2d61f8afb331fc1b0e6d628aaef3d07a6ae2608db2a5c4f0d8755b -size 817708 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-None.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-None.png deleted file mode 100644 index 5d16dccc..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-None.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e85d1a946c7e2cbd7a2d06097b3dcde1ef78bb06d7a43ad2872ba5b5f7f33a48 -size 835730 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-Red.png b/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-Red.png deleted file mode 100644 index 2d033854..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/surface-appearance/Tinting-Red.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c784ba242f239fc4f633c687b5ed191afba50a7958c2466132861e2afc5bf6b -size 795521 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Custom-Colors-Fantasy.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Custom-Colors-Fantasy.jpg deleted file mode 100644 index e2977179..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Custom-Colors-Fantasy.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37969f22affe60a3c2084c8e8f56e5ea679d313151f7c67c400178c6776b090a -size 186449 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Custom-Colors-Tundra.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Custom-Colors-Tundra.jpg deleted file mode 100644 index 0e369195..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Custom-Colors-Tundra.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:470ef682b0974e5a339a360fe5866f196009136f4801c53424a8d1f78802fa76 -size 239235 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Air.png b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Air.png deleted file mode 100644 index 4ad79be8..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Air.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b51a2e686eccc4523e64ef15af33908f3ea4ba32432dc560b5a923ccd29bca0 -size 6146 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Asphalt.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Asphalt.jpg deleted file mode 100644 index 6de2e988..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Asphalt.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c939e9a26c030e8efa5c0d125d07bb9b3bcc5ea84f9b4664c5536b9d351a429d -size 111148 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Basalt.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Basalt.jpg deleted file mode 100644 index e789d3f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Basalt.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7f4893e93e8501a8186319490e1531c449a599916e04a306040b73c059e9eac -size 96903 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Brick.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Brick.jpg deleted file mode 100644 index 140c6799..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Brick.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6d135f1362336610cbf84855d9135be2c0eedfa2fe77c2d8bdeeeef018ad5eb -size 98555 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Cobblestone.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Cobblestone.jpg deleted file mode 100644 index c31d07d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Cobblestone.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84e3268156de98f3e09b1b05b9c5ac3f4f281efaad3614fa91778d5be3144187 -size 107332 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Concrete.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Concrete.jpg deleted file mode 100644 index 4ebab083..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Concrete.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:860884d88cf4c13b7c35806f8b76bf169e6c17c8610fe392364d74a229270582 -size 41404 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Cracked-Lava.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Cracked-Lava.jpg deleted file mode 100644 index 35e205f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Cracked-Lava.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c354d06715db2ba616a5bdd2cf98c9ecf032a4f42b40579c43a3ecd45b1e1527 -size 103053 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Glacier.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Glacier.jpg deleted file mode 100644 index d329660f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Glacier.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b173ad87a5ea536a290394ea4d065eacab61b555cd53485bcedd5f7877182c6 -size 59434 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Grass.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Grass.jpg deleted file mode 100644 index 2b0b179f..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Grass.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65b81e766e9d14f7597febff3eb750ee55e0ea2ab4bb75b1b2d15ec1cc3f0ef9 -size 110022 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Ground.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Ground.jpg deleted file mode 100644 index 8e486c50..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Ground.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8be92c3837b4c9acc77b88171c95d66ee9b952501152adb2754d4e5007e50951 -size 107997 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Ice.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Ice.jpg deleted file mode 100644 index 0ee3c6df..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Ice.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f70b9f76f59929e63ce9d228d1efc8e743a9e90e258c4aa1d0d1a29a03dcb40 -size 54849 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Leafy-Grass.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Leafy-Grass.jpg deleted file mode 100644 index 111d760e..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Leafy-Grass.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0af5c3bd5b01bd75be6e3f36c1b0373813bce5cabb958894a888caf23b5897a -size 115844 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Limestone.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Limestone.jpg deleted file mode 100644 index e55e5268..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Limestone.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c03dbe5c152b7589eec16acc1207e032752aff4449d61bb2198cabc0d6d84636 -size 64374 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Mud.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Mud.jpg deleted file mode 100644 index a50f6356..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Mud.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d4e043609cc8fd02171678c06c69b249fa73aea446dd3446fa8b01ae590ef58 -size 104154 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Pavement.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Pavement.jpg deleted file mode 100644 index 54140ac0..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Pavement.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f439fe1ee055c0991bada6f2804f41f956a8b3c058c3b538b7fdbe49c7e6f069 -size 84098 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Rock.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Rock.jpg deleted file mode 100644 index 6fe56176..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Rock.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a544a06b0a789ab5af007d35eaf82c72e2ed00ce450f40add8a60ac92a10d898 -size 104636 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Salt.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Salt.jpg deleted file mode 100644 index 0de5a0ff..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Salt.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19313d41f3007beca7c2395410a15f95b5afc5b93358dd1b1313d891d4a09389 -size 65619 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Sand.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Sand.jpg deleted file mode 100644 index 8302f465..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Sand.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ef26c70810af65108901432c2908be3a2c2d550dcb01ad8636e7cd56b94136e -size 52596 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Sandstone.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Sandstone.jpg deleted file mode 100644 index a64c3749..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Sandstone.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbd1ec44897eb8e2e09dea999c29c62ab75e4a49e411ee9f5a8e393995c5b576 -size 80961 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Slate.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Slate.jpg deleted file mode 100644 index 87503602..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Slate.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f99de4e795617d35daf9681ea821dcb78f6d5bbe9dc5277344ef4160d07869ab -size 57491 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Snow.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Snow.jpg deleted file mode 100644 index de29b4cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Snow.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9116c0ec4b069305584a17803cabcd2e9814f67569ead0749498cbc14a21552e -size 59630 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Water.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Water.jpg deleted file mode 100644 index acd2f6dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Water.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:215689f44668a959649a78b5ec861b760a565063038e482dc620c1cf4bc78d82 -size 36269 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Wood-Planks.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Wood-Planks.jpg deleted file mode 100644 index 5774f907..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Material-Wood-Planks.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fde56985d6aebb6e1c38631211807f27052d8499901cb4dfe51aee13cca0e9e -size 80014 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/RobloxColorMapIndex.png b/.cursor/rules/roblox/en-us/assets/modeling/terrain/RobloxColorMapIndex.png deleted file mode 100644 index 180e708b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/RobloxColorMapIndex.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:243eac51c6fdd7c5d712d1a3e5ca90df198e77d6098c67235fc52e5d1b9fabba -size 181791 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Showcase.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Showcase.jpg deleted file mode 100644 index 721071fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Showcase.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a431776f11e66740d7f8e09708b2b9b5807e63eaa76388527daae0966c4e1e1 -size 189127 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Colormap-Result.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Colormap-Result.jpg deleted file mode 100644 index 4a989224..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Colormap-Result.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72005c0a36e04e6cc05d904cd366ab052869e76ecbd58e603996548ebf1db9bf -size 128440 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Colormap.png b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Colormap.png deleted file mode 100644 index 4a597683..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Colormap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:deb74dd56dbff04c5aacb565e8f6c6edef76d66967a63c95e467dc732c9b3e0f -size 17692 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-GrassLength.jpg b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-GrassLength.jpg deleted file mode 100644 index ce15f000..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-GrassLength.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39f79c123f5a3535aa165a6b2970bcfff504813fb3229075f40e0ea58a84dac5 -size 258171 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Heightmap.png b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Heightmap.png deleted file mode 100644 index 4f7f20a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Terrain-Heightmap.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d7af8249b0caaa8b97fb91a9a29db087ad938472b73951fe7dc207104f3b0cf -size 220362 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Water-Appearance.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/terrain/Water-Appearance.mp4 deleted file mode 100644 index fecaedcf..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/terrain/Water-Appearance.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e6d14f2e618cecf383fb0772008d4b4ee7a2332a7ce9405400b54b7a1c56eea -size 4597544 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Animated-Textures.mp4 b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Animated-Textures.mp4 deleted file mode 100644 index 4ab451d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Animated-Textures.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eab3ec12e4764d55bc2ff3c3657e57ce87f108570f469d0423d7c771ffdae23f -size 2157448 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Add-Image-Texture.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Add-Image-Texture.png deleted file mode 100644 index 633f24a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Add-Image-Texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f668cd0d6708d2db5ceb0096755e3e66d01473e672fee900c1c800c98c81f08 -size 48011 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Add-Normal.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Add-Normal.png deleted file mode 100644 index e0cc49ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Add-Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32eee42921610a4d39ad53d5e70040cd6dc659393aa8ca247e8d8aa859adfbfb -size 27629 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Create-New-Material.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Create-New-Material.png deleted file mode 100644 index fa56d74c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Create-New-Material.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac6fd51fe96f837e5176b58544fe4308e8b019ebbd98b5b03672398d215dad19 -size 18350 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Image-Texture-No-Assignment.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Image-Texture-No-Assignment.png deleted file mode 100644 index 89f57158..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Image-Texture-No-Assignment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df77e2d991c3857980cebe4ee992452eacb282aea94c3956b675273ad63ec85b -size 21809 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Material-Check.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Material-Check.png deleted file mode 100644 index 7068f8d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Material-Check.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a52292886506117da9ff7bd8379b5f04a2d76824e124cfaa9563f81e7bdd76f2 -size 59043 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Shading-Tab.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Shading-Tab.png deleted file mode 100644 index 24c62f24..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Blender-Shading-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a30fd9070e6b3416fba7f9f600637c55bd9ad57d7c234432b910a66f38b6812 -size 17910 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-On-Surface.jpg b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-On-Surface.jpg deleted file mode 100644 index fe00211d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-On-Surface.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a40d0e80d05b57216f28e669801f610eaaea177f73745629844c32ed2e83dc15 -size 158983 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-Texture-Sample-1.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-Texture-Sample-1.png deleted file mode 100644 index 09ebacb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-Texture-Sample-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ae60a616d894951c243e74209f548127b3ff2b8b1d5839f02fd1ebad398f247 -size 13187 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-Texture-Sample-2.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-Texture-Sample-2.png deleted file mode 100644 index aa814209..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Decal-Texture-Sample-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d1a80688ae61cd481947d0cd10a038e1e7efcae98d5872492d3269cd805d254 -size 12530 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Assign-Material.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Assign-Material.png deleted file mode 100644 index 14160c86..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Assign-Material.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a590fdaa4aa1a18f784e936c63f389a4a3e0562d5aba6d30cb459911f3513182 -size 26497 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Bump-2D.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Bump-2D.png deleted file mode 100644 index 117b525b..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Bump-2D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:728f445820d156aef6f268e91dcd2e8203f538f6cbc3b18a327b88a64a192a6b -size 30220 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Connect-Nodes.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Connect-Nodes.png deleted file mode 100644 index d0018d3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Connect-Nodes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:589a8a8ff0a2210a4791c60c92f7bc24c3f4b3a5188cbbc003971898f6a3caa4 -size 320377 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Create-Surface.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Create-Surface.png deleted file mode 100644 index e2463c9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Create-Surface.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8ede27bebc1659dc9917654cad7769640e96d8766460c3e6c816980606436aa -size 47102 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Tangent-Space-Normals.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Tangent-Space-Normals.png deleted file mode 100644 index 54345b74..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Maya-Tangent-Space-Normals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:531b67e4ab7c1c95747e952bb0ce5174b36b26deddca5690b63740f2ba7f4285 -size 30955 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Orientation-Indicator.jpg b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Orientation-Indicator.jpg deleted file mode 100644 index 8d628afa..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Orientation-Indicator.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d19280dccd063e866188eebca8f012b1e55add28618f212fea938d6fb5bf75c -size 194382 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Color3-255-0-100.jpg b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Color3-255-0-100.jpg deleted file mode 100644 index 8c555e8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Color3-255-0-100.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31a00c42775736167237996e95cce35eb4cd70bb4fa564dd6c7cd7da304b710b -size 183932 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Example-Grafitti04.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Example-Grafitti04.png deleted file mode 100644 index c9133b2d..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Example-Grafitti04.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8e019026f69ffea29455628d3f3bf90a5088e3374917fa298fa83f98a363d8b -size 264889 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Face-Front.jpg b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Face-Front.jpg deleted file mode 100644 index a47d8d9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Face-Front.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f292d0c2c48db4f3b65fccb485920dd91e343cb3bec069a945a58bb3341029e5 -size 120291 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Face-Top.jpg b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Face-Top.jpg deleted file mode 100644 index 7fb45a29..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Face-Top.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12b09521d6c1159cd05546246bdc03c1a7a1e4e61627c22586bcbd2b12f7b55b -size 118682 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-On-Surface.jpg b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-On-Surface.jpg deleted file mode 100644 index 1825db54..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-On-Surface.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd484c65bdb210f89601a8a604d0b3b6f6d60cd8efb322554cf7d2b752f9cbd9 -size 202468 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Offset-1.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Offset-1.png deleted file mode 100644 index ef25c37c..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Offset-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02a2637d164f986ee7456163b2801e9dc17cee345f99271949f817a5646f836f -size 38477 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Offset-2.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Offset-2.png deleted file mode 100644 index ac5b2464..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Offset-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69b2f0ac9de107fdccd30572b3357451c92ed8adf128ed666b95e304298fba16 -size 40381 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Scale-1.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Scale-1.png deleted file mode 100644 index a9856ded..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Scale-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aea856d481825dbd0584477592db1f808f01c5c997bc2da9e3e2e0c1b999c9a2 -size 40334 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Scale-2.png b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Scale-2.png deleted file mode 100644 index a4cab209..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Sample-Scale-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad4a111581b450ea87d844bc1743d02bce525d3cf7ce220ec89f30e7cc75f234 -size 39435 diff --git a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Transparency-0.4.jpg b/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Transparency-0.4.jpg deleted file mode 100644 index 0cf46263..00000000 --- a/.cursor/rules/roblox/en-us/assets/modeling/textures-decals/Texture-Transparency-0.4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:647df2b6cb6a81f5260e178e1c54156c4938b493b5db7bf2cf2e3e6451e98c75 -size 175553 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/avatar-creation-tokens/Avatar-Creation-Token-Copy-ID.png b/.cursor/rules/roblox/en-us/assets/monetization/avatar-creation-tokens/Avatar-Creation-Token-Copy-ID.png deleted file mode 100644 index 6ed726d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/avatar-creation-tokens/Avatar-Creation-Token-Copy-ID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0f7245c7992961a06eca95272d6961fa5b5efa41ab534df5f969d4cf20d3ceb -size 51544 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/avatar-creation-tokens/Avatar-Creation-Token-Prices.png b/.cursor/rules/roblox/en-us/assets/monetization/avatar-creation-tokens/Avatar-Creation-Token-Prices.png deleted file mode 100644 index 45e07245..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/avatar-creation-tokens/Avatar-Creation-Token-Prices.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79b6e8f09b0de8f3277ac9dddf5b57cfedb8d8c5873614bf8d3ff9a56b2e1d10 -size 71529 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/Avatar-Items-Enable.png b/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/Avatar-Items-Enable.png deleted file mode 100644 index 4f02f8fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/Avatar-Items-Enable.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d235db26e51341ad708f858a8da59dfa0c4d400801678f71e9a8a94f4a89381 -size 96903 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/Linked-Avatar-Items-Example.png b/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/Linked-Avatar-Items-Example.png deleted file mode 100644 index c5bbdf8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/Linked-Avatar-Items-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5f390f8eb7b7118e799611230e2dfb7298c9e43f485f567726eef99f4270784 -size 226932 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-item-analytics-3.png b/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-item-analytics-3.png deleted file mode 100644 index 2ad432ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-item-analytics-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fb7aa83dfbdde74bfc2e9f473fdbcc5e265a72596be90849ab3ca2967821c22 -size 379711 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-items-analytics-2.png b/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-items-analytics-2.png deleted file mode 100644 index d7041679..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-items-analytics-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d130cc2374aad2dc25d4b840871d612df4b071a1fe3fec21a25ade7fe37f34ac -size 370948 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-items-analytics.png b/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-items-analytics.png deleted file mode 100644 index 0c429238..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/avatar-items/avatar-items-analytics.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2a4cf2454836f02f25fb914243f7e599a8e025c621181a7fcd701d30c5e0b44 -size 284162 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-ID.png b/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-ID.png deleted file mode 100644 index 81e1205f..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-ID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6f00ce8275dbdce0958a540311072da9591f2e0b62afa94f06ffb4f7ae110fa -size 26016 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Metafield-Example.png b/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Metafield-Example.png deleted file mode 100644 index 2362bcb1..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Metafield-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:deaccd107d0f19cf35cb768a08bbc025473956275af8dc8e60cc7eb2374c36b1 -size 56579 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-PDP-Diagram.png b/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-PDP-Diagram.png deleted file mode 100644 index a2db417e..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-PDP-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5427a52b2ca82de002aadc14d19fc52abc60ee5779f1d83a4c4fd2a5ac0a352a -size 670659 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Put-On-Sale.png b/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Put-On-Sale.png deleted file mode 100644 index eaf021ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Put-On-Sale.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16f2f547ee59850fc4702cc811d50f5f942db6c14489d2418d32b814d9b2f4ea -size 12277 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Virtual-Benefits.png b/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Virtual-Benefits.png deleted file mode 100644 index 1509e94e..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/commerce-products/Commerce-Product-Virtual-Benefits.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6291a17b051d34f3fcb5d64f3bead392b98717fe3a85abae2ac6a80e5ce71d29 -size 109315 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/creator-rewards/dashboard.png b/.cursor/rules/roblox/en-us/assets/monetization/creator-rewards/dashboard.png deleted file mode 100644 index 022258b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/creator-rewards/dashboard.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac5fba5f10f02a361315c41cdf866df6da24388f8515c810d0a93ac3e02f1f98 -size 149643 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/creator-rewards/share-links.png b/.cursor/rules/roblox/en-us/assets/monetization/creator-rewards/share-links.png deleted file mode 100644 index 32bb7599..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/creator-rewards/share-links.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2b12b585375bcd586edf03feeab46429e5419535e7bd264f51a1efb57ed5e39 -size 75586 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/Buy-Product-Example.jpg b/.cursor/rules/roblox/en-us/assets/monetization/developer-products/Buy-Product-Example.jpg deleted file mode 100644 index 325efd3b..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/Buy-Product-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1fe7e3556c28e14f29b799b3d21984e6248c8ef6c2fbc8edf0510af446955a3 -size 221483 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/RankedItems.png b/.cursor/rules/roblox/en-us/assets/monetization/developer-products/RankedItems.png deleted file mode 100644 index 9766f3ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/RankedItems.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9e6921ca73e3187f1994b8c02e51ff38ca622f471c7733f6d385cbfb22805a4 -size 2352629 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/StoreTopPicks.png b/.cursor/rules/roblox/en-us/assets/monetization/developer-products/StoreTopPicks.png deleted file mode 100644 index ec36246b..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/StoreTopPicks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1aabf6ffdf73908733e843f7295a1ba006e6f33c388c462cfa18ec61476f53e2 -size 1371270 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/developer-products-analytics-2.png b/.cursor/rules/roblox/en-us/assets/monetization/developer-products/developer-products-analytics-2.png deleted file mode 100644 index 1d525995..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/developer-products-analytics-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:301938dff26ec9b6bd6b7a4930135d1c449b0d1c6b7a63698a319e775a82f8ea -size 582971 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/developer-products-analytics.png b/.cursor/rules/roblox/en-us/assets/monetization/developer-products/developer-products-analytics.png deleted file mode 100644 index 4d24fb6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/developer-products/developer-products-analytics.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5e616b72d98afc2c0319338bd3839cd48c680795d541335486c2da2478af3bd -size 249640 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/earning/Average-Cash-Payouts.png b/.cursor/rules/roblox/en-us/assets/monetization/earning/Average-Cash-Payouts.png deleted file mode 100644 index 64c3d80f..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/earning/Average-Cash-Payouts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:698f5e4de697bce91edcb149cc834c016fed5d1ab6aacc7164eef795c020171e -size 103406 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/earning/Earning-Flowchart.png b/.cursor/rules/roblox/en-us/assets/monetization/earning/Earning-Flowchart.png deleted file mode 100644 index 0ab5e001..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/earning/Earning-Flowchart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f79d3326d29ba24d43c66b86a28c1eb873095e492ee28fb18aba44ee84a64f78 -size 70605 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/earning/Economy-Stats-Creator-Earnings.png b/.cursor/rules/roblox/en-us/assets/monetization/earning/Economy-Stats-Creator-Earnings.png deleted file mode 100644 index 685576de..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/earning/Economy-Stats-Creator-Earnings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01d39c1635a43af8927b9820f87e12136c4f97ea0f3503fbfd23381e615f59c2 -size 37075 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/earning/Economy-Stats-DAU.png b/.cursor/rules/roblox/en-us/assets/monetization/earning/Economy-Stats-DAU.png deleted file mode 100644 index 51e9f639..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/earning/Economy-Stats-DAU.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afa916bc7d5e115c6288c2622d117957acc2b4acf380d814a323b5841e90eca4 -size 36071 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/earning/Monetization-Growth-CAGR.png b/.cursor/rules/roblox/en-us/assets/monetization/earning/Monetization-Growth-CAGR.png deleted file mode 100644 index 88869fd9..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/earning/Monetization-Growth-CAGR.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d88d8d80ce251427a6feb6c614350fc1ed5e8ee2c2a67c119d955b4ebdd4929 -size 45369 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/earning/Percentages-Clothes-Accessories.png b/.cursor/rules/roblox/en-us/assets/monetization/earning/Percentages-Clothes-Accessories.png deleted file mode 100644 index c818305e..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/earning/Percentages-Clothes-Accessories.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1eb2817b2a6265fefe11098818158bb750d2440131313848ab0631a59594a98d -size 29622 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/earning/Percentages-Reselling-Limiteds.png b/.cursor/rules/roblox/en-us/assets/monetization/earning/Percentages-Reselling-Limiteds.png deleted file mode 100644 index 471748f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/earning/Percentages-Reselling-Limiteds.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61b1249264a7ad8a463e6035b76c5757940a0368e66c5395f84ce3c5a2400c94 -size 34308 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/earning/Virtual-Items-Odds.png b/.cursor/rules/roblox/en-us/assets/monetization/earning/Virtual-Items-Odds.png deleted file mode 100644 index db3f0804..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/earning/Virtual-Items-Odds.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f80ed4e81a146f92f7e1e27432f5564c999b803c59aa440286387f9c4764e367 -size 193221 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/Modal-Example.jpg b/.cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/Modal-Example.jpg deleted file mode 100644 index 8f127b78..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/Modal-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:740740c94da4306e23bb21c6bd4845e410702a77074749ac6e42e425fcef099b -size 224908 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/Premium-Banner.jpg b/.cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/Premium-Banner.jpg deleted file mode 100644 index 345b13b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/Premium-Banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a40e770455701a965f42d89ad0b287a7d7482048039e8b78bcea26c7a2bf21bf -size 236707 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/engagement-based-payouts-2.png b/.cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/engagement-based-payouts-2.png deleted file mode 100644 index f2307efd..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/engagement-based-payouts/engagement-based-payouts-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f334738c56a5c42f025c78b50e25e97a20891d237c4fa824089640f78cdc7e3 -size 551441 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Active.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Active.jpg deleted file mode 100644 index cb939935..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Active.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b17edef434f76fcb6d255ae71e3b750799c9e4a8666513c12b3b11316adc3dac -size 278747 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Inactive.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Inactive.jpg deleted file mode 100644 index 579a556d..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Inactive.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e12445edf1b1734c1333317535cd390b296e27c97e1b54423ff3147b6e65f1ad -size 246479 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Invalid.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Invalid.jpg deleted file mode 100644 index 2143ae35..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Invalid.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a833ccb72dcae93a3fc32367ec5f7cbe3f0f64dbac5f533b8c118680a87b8cc -size 248082 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Sample.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Sample.jpg deleted file mode 100644 index 10c237fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ImageAds-Sample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdc1bf3afe29712b52a6e636713a1d8fa5f210eec2a25fb05868a67e575c0cf0 -size 347517 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Inserting-ImageAd.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Inserting-ImageAd.jpg deleted file mode 100644 index e465a5f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Inserting-ImageAd.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f24caa799ec7378f90e0ac24186a951b384973e767e78e648f40e66250046d65 -size 195785 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Inserting-PortalAd.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Inserting-PortalAd.jpg deleted file mode 100644 index 56aa129b..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Inserting-PortalAd.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bf5b80fb05fec36f0c136215e4f3b60d01f79c55e0ebc6676425e8bf8769ee8 -size 182182 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-ImageAd.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-ImageAd.jpg deleted file mode 100644 index 71d3be10..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-ImageAd.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66cb855e6e3e8bd78719a5f5854f325fe5b0d985a71ca0626b23ddbb8f0ddaed -size 211885 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-PortalAd.mp4 b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-PortalAd.mp4 deleted file mode 100644 index 2f4f75a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-PortalAd.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:baae64795a7f3e43a84b3432cd45243e756ee4f5d51be9048264cc54575419c6 -size 4614528 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserA.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserA.jpg deleted file mode 100644 index 72c9efe6..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserA.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2407b0ece5911cf1d719caab73af7e0e9dd9646ffd2fc340404a9e107de440ab -size 223330 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserB.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserB.jpg deleted file mode 100644 index 1a19222c..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserB.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfecd604e819b7c305c049cdaeedf209e9911592bdf4e422659595782d0b698c -size 215386 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserC.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserC.jpg deleted file mode 100644 index dd532754..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Overview-UserC.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b12339fdef565091c0e498140765d27b19b3c90997fa2df95f66f27dd30eabfd -size 184335 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Portal-Ads-BasePortal.png b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Portal-Ads-BasePortal.png deleted file mode 100644 index 3bc20c4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Portal-Ads-BasePortal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a404da51ab8d0e90aa028eeedbb61a31312d67ee295dc6a58003d738785fad3 -size 16319 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Portal-Ads-Decorative.png b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Portal-Ads-Decorative.png deleted file mode 100644 index d1aa25a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/Portal-Ads-Decorative.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cc166ef0b8dbcea44b0655b84c24afd08443dce2f069785338aef4a51d22b99 -size 17617 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Active.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Active.jpg deleted file mode 100644 index 7e48646e..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Active.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:504410214d5cf132e6ab03935730d22856c4b47e751462a58fcd18cad7297fc4 -size 240282 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Inactive.png b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Inactive.png deleted file mode 100644 index e44dbc59..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Inactive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9eccd89a6fa55b50c25f8498bcf2b0accb3be9eea1ca7dc572ee54812bedffac -size 1311811 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Invalid.png b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Invalid.png deleted file mode 100644 index 22f3338d..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Invalid.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7f8220544d279e504bb32f549bbec0f09448a509f0aa9456af37cd5e0ebb11a -size 1292786 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Sample1.png b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Sample1.png deleted file mode 100644 index bc0ec425..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Sample1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c462d64c5ccbe221c031162b1ef4ee301714dd233a186546c79d8616129324e5 -size 1213230 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Sample2.jpg b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Sample2.jpg deleted file mode 100644 index 51acd3c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/PortalAds-Sample2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa03b59faf00a7dd6eaeff9b1cd9240fd4588a438daf42afe1c67570802faf27 -size 222148 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ViewingMetrics-Graph.png b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ViewingMetrics-Graph.png deleted file mode 100644 index 1029e7a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/ViewingMetrics-Graph.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:195c6019eef09060bcf8eb91bf2063a73f880fe915e943c0439533a12aa09dfb -size 79517 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/immersive-ads-eligibility.png b/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/immersive-ads-eligibility.png deleted file mode 100644 index 7b187aa9..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/immersive-ads/immersive-ads-eligibility.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d01a3f1e23b537581679fdfade63d344bf2f1d80c77a442e3b1e8814cfce0b1 -size 320187 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/paid-access/Buy-Access-Example.png b/.cursor/rules/roblox/en-us/assets/monetization/paid-access/Buy-Access-Example.png deleted file mode 100644 index e3af3ea4..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/paid-access/Buy-Access-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e84daccb3aef2ae4abf2bf93da6131d98ea83653e3d8a6b6893bbde536e97a06 -size 129360 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/Circular-Trimming-Bad.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/Circular-Trimming-Bad.png deleted file mode 100644 index 46642777..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/Circular-Trimming-Bad.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e375b88373961af2c6713c1785518f7685bef045cc7aac3dcd1df5df167894b -size 202782 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/Circular-Trimming-Good.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/Circular-Trimming-Good.png deleted file mode 100644 index b5f691f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/Circular-Trimming-Good.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:787a6b490067fbbc4251a88d3aaca53ce3e1422adccf6fc8b0287c5add70a44d -size 210711 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/Configure-For-Sale-Toggle.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/Configure-For-Sale-Toggle.png deleted file mode 100644 index 67c69fed..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/Configure-For-Sale-Toggle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e709d1c46a880b464c66bb81a9eaf7cc273615a7bfbbbdaad9b2ac5619101a5 -size 9216 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/Configure-Sales-Button.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/Configure-Sales-Button.png deleted file mode 100644 index 0c4f8e7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/Configure-Sales-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bcc551fc15a10f088dc65bf9c5b31a78fa176bffc1c835c8ffabfe3c9194a15 -size 21195 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/Configure-Set-Price.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/Configure-Set-Price.png deleted file mode 100644 index 8d1f36b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/Configure-Set-Price.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55dee0b406f6ae081cfd7445b6de95612f1015e2f1e02fad56c7c97787a7b6fb -size 19670 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/Open-In-New-Tab.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/Open-In-New-Tab.png deleted file mode 100644 index 3acbbb34..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/Open-In-New-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00c1652520ea7e569fa041403a287680dc80e6c53a04d9e93d18fb39bbeb31e5 -size 28773 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/PromotedPass.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/PromotedPass.png deleted file mode 100644 index 105b42c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/PromotedPass.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed182db3be7d0df42e10f9c64b38b0720747ba41bc390bf5a5938de8152091ca -size 248508 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/PromotedPass2.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/PromotedPass2.png deleted file mode 100644 index a505bea2..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/PromotedPass2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab038b08eaca894c0a1e23661797c3416778d5d1a6ee0fe29bd78bcd70880646 -size 391009 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/passes-analytics-2.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/passes-analytics-2.png deleted file mode 100644 index 50fd71e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/passes-analytics-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eba1875696f3e6d8a4505933817fad2ee95671271055ae62314678ec76300bf7 -size 363980 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/passes-analytics.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/passes-analytics.png deleted file mode 100644 index d562782f..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/passes-analytics.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae2015a77625936c170215918fb9fa1599cdcb4556be6f00224edd4fc2453cf1 -size 436170 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/passes/passes-sample.png b/.cursor/rules/roblox/en-us/assets/monetization/passes/passes-sample.png deleted file mode 100644 index de337adc..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/passes/passes-sample.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aba8337ffd0681da924554b3f640b608e9f997b62d3f9db112dbf54b89a2d708 -size 326735 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/price-optimization/Price-Optimization-Example.png b/.cursor/rules/roblox/en-us/assets/monetization/price-optimization/Price-Optimization-Example.png deleted file mode 100644 index a1f79815..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/price-optimization/Price-Optimization-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46c62502317bfac6d3c7505cf64b4d88843ac1c4aa0262c7a2ad03a456010c11 -size 157343 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/private-servers/Example-Purchase-Dialog.png b/.cursor/rules/roblox/en-us/assets/monetization/private-servers/Example-Purchase-Dialog.png deleted file mode 100644 index 66609b43..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/private-servers/Example-Purchase-Dialog.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61b3a2638aa4e6371ca33da40860d16d23c9f86b69bbd6ceca6bb0a3155a06c4 -size 135850 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/LikelySpenders.png b/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/LikelySpenders.png deleted file mode 100644 index 5a4d688d..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/LikelySpenders.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f8056991f5dd247e5168f8b2ca9fa1573ccc18b6435da386535df2a2da65aa6 -size 103948 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/OpportunityCalculator.png b/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/OpportunityCalculator.png deleted file mode 100644 index 629b78e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/OpportunityCalculator.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:324b9646b4534cd312f278b9c3221b2edf525dfcdff4e193ebf1c695a9b97a8f -size 175594 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/Placements.png b/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/Placements.png deleted file mode 100644 index 779e469a..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/Placements.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2c9cf26c52a6a1136a7edc8fb7fd784a95edb400e7e40a84cd49f8121614d1a -size 74253 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/RVAAnalytics.png b/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/RVAAnalytics.png deleted file mode 100644 index 36e48e59..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/rewarded-video-ads/RVAAnalytics.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d52719e6f607c5e05e2f1c8d4ae573ab24512fcbe808db493c2a86a572962767 -size 274306 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/Example-Subscriptions.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/Example-Subscriptions.png deleted file mode 100644 index 12dffca8..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/Example-Subscriptions.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c02e27b61bcca9720bf7add62e4ca5fddd12906617fcdf2b170463c2f825992b -size 339930 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-1.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-1.png deleted file mode 100644 index 4102fc76..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc5b6c59aeb6d5fb9907d47ae69e75bc093c82d416f2a4cb6277056d3e50fe5d -size 29971 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-2.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-2.png deleted file mode 100644 index 2d32043f..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c29ec8e3dd288299699d9c098d6c9a17aaf2a7b9743c2ade8babe90aa30731c -size 40020 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-3.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-3.png deleted file mode 100644 index 6ed13724..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6788591251d591a85967b05556b9a51455ded7fef0778b7fddbe9c800f7d1b21 -size 37756 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-4.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-4.png deleted file mode 100644 index 9741b522..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89e77cea79d0da8e0c472c8acd5c393d0d627c39bf36325486130a2cf0bcb485 -size 274816 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-activate.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-activate.png deleted file mode 100644 index 6e3b4a73..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-activate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dae366b0b56b02d4b9988db834a2a31ba1242dde4433a38eaa13bc498049db7a -size 169980 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-analytics-2.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-analytics-2.png deleted file mode 100644 index a15aafce..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-analytics-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b8ebf90bc8b51e854deaabb799394a4f7ac6a1d732128cbf45470234ce3e0bd -size 27581 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-analytics.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-analytics.png deleted file mode 100644 index e6081b5a..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-analytics.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93bd020c2968b22cbbab06dc7fb0ac6a9c298aec8589181ff61b043aeb02757c -size 334322 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-my-transaction.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-my-transaction.png deleted file mode 100644 index 34c4955b..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-my-transaction.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a905d92a00d346753ac886d3716b268521c893d08e2c18fccb2eeaf2a01f554 -size 259670 diff --git a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-pay-out.png b/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-pay-out.png deleted file mode 100644 index 91585c5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/monetization/subscriptions/subscriptions-pay-out.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cbde9948739b80a6962cb768c163916ac55dda97a1086d817072893b96b0700 -size 128575 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Analytics-Itemized.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Analytics-Itemized.png deleted file mode 100644 index 45cb7141..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Analytics-Itemized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6483ebf6bd041b98fcbea05d9cda4fad7a168015698f60949700130cc630f3c1 -size 63917 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Analytics-Summary.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Analytics-Summary.png deleted file mode 100644 index c61c5730..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Analytics-Summary.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf5e94c1ec25c712621a9c0d530f8ca84d9beb8d2a18cbe2bdb6d3213d4b73bb -size 33563 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-A.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-A.png deleted file mode 100644 index 3b08185b..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8736ff503e49998b8da2fb67446fa2663477f456c7581612d0eadd11c86b7164 -size 40314 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-B.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-B.png deleted file mode 100644 index 98257c46..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fecb656780c268784c8a7f0c433dc44db76dce6b2fb978e0f8ad2e8f3d58134 -size 33562 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-C.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-C.png deleted file mode 100644 index 6419a91a..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf6ca5fb9e1f19d622aa995467bcc7aee7234acc13593d6fd2a09cff9e5f6e1a -size 41074 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-D.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-D.png deleted file mode 100644 index 894f29e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79e8634ddbeb4189bb02ff11bef1dbcc48c2ae825b72b99f1c6f4143d9b51fc6 -size 35315 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-E.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-E.png deleted file mode 100644 index f2028064..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec067fb61c7ee3933bad8165e8584022371e80d86509e89b0b5c751621d8e8c6 -size 33969 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-F.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-F.png deleted file mode 100644 index eaa1ddd2..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Example-Notification-F.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e424eb831fb41fb5198b574bb662226143499c7bf8313528d08dfbd72c5f150 -size 44808 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Move-Package.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Move-Package.png deleted file mode 100644 index 34c3d320..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Move-Package.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01f85dd9beec7eb1285dd0cf0e19464f1543b1ce0e6243a8aecba9a63051204c -size 36614 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Notification-Stream.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Notification-Stream.png deleted file mode 100644 index 96722397..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Notification-Stream.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46002f62d298ea71382aeaa7f27f48a1092411835aed764db6e6e64b23e8268d -size 179439 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Toolbox-Package.png b/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Toolbox-Package.png deleted file mode 100644 index 99e9618a..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/experience-notifications/Toolbox-Package.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bc9c919c4da3a10be21ab9174339f821f76cad66227068ac25677011a4e234f -size 7436 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/guides/datastore-perms.png b/.cursor/rules/roblox/en-us/assets/open-cloud/guides/datastore-perms.png deleted file mode 100644 index 7c10e981..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/guides/datastore-perms.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89199d4d4d183a003a31aeaca58503cee21fa64b946169cdc447aa3bb728cfe3 -size 93173 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/instance-api-beta.png b/.cursor/rules/roblox/en-us/assets/open-cloud/instance-api-beta.png deleted file mode 100644 index b8e6bffd..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/instance-api-beta.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:229c74a02dec31384bfeee64051b9ac46a9f2808f258b2b49ef65cb8c875308c -size 49446 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/instance-api.png b/.cursor/rules/roblox/en-us/assets/open-cloud/instance-api.png deleted file mode 100644 index 0eee16ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/instance-api.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:954f9e3e66fd9b138f79fa54ba50dede3b647bb9b0dcaf0121b8b4bc61d4babc -size 150517 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/open-cloud-nodejs-sample-oauth2-main.zip b/.cursor/rules/roblox/en-us/assets/open-cloud/open-cloud-nodejs-sample-oauth2-main.zip deleted file mode 100644 index ba3cdc9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/open-cloud-nodejs-sample-oauth2-main.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57a348b357dc52e70b5f070ef0b5b056e03429e8e82c0b59d493154e274a5424 -size 12734 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/open-cloud-potion-shop-demo.ods b/.cursor/rules/roblox/en-us/assets/open-cloud/open-cloud-potion-shop-demo.ods deleted file mode 100644 index 5676c80a..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/open-cloud-potion-shop-demo.ods +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd7381706dcde54e37a3294747a7552447b98b596dd5038ef86545174d5a2f44 -size 12407 diff --git a/.cursor/rules/roblox/en-us/assets/open-cloud/protocol-flow.png b/.cursor/rules/roblox/en-us/assets/open-cloud/protocol-flow.png deleted file mode 100644 index cd694d41..00000000 --- a/.cursor/rules/roblox/en-us/assets/open-cloud/protocol-flow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b8a1dbf8556ca0abe4e1872252e1469e838172e14a1f71c3d7f03eef595c8f4 -size 67482 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.drawio b/.cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.drawio deleted file mode 100644 index 5ab54df1..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.drawio +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25d2ad6de4ca51c5be822e52cd87cf52cdb41a6b421d442723d75ca63747674e -size 185977 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.png b/.cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.png deleted file mode 100644 index b15ed731..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5551e6de6411710b8a5b9ffd3106d162ddcf0e280085d9b77d5f3763f87f24c -size 69303 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.svg b/.cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.svg deleted file mode 100644 index 3706a73b..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/Perf-Flow.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31303ed8e1b2efe9c04605b5e6f2ed74fe9d861044e4b6d00029258b58080d57 -size 50400 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/chicken-rocket.jpg b/.cursor/rules/roblox/en-us/assets/optimization/chicken-rocket.jpg deleted file mode 100644 index 19f46ca4..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/chicken-rocket.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7e278fc5222eb4374f6ce7cec62d859ada82decd43dae67f80079e1786fcc0e -size 215388 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/RaycastSpam.rbxl b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/RaycastSpam.rbxl deleted file mode 100644 index d5825391..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/RaycastSpam.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8bea29d1076f78235415588d90fa26e86a4aecce1b5fb4dcfc556b7eeed4a6a -size 841789 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/custom-profile.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/custom-profile.png deleted file mode 100644 index 13d77f5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/custom-profile.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:137981f645ad7782522f0a07c1091634b091257efe533f5dd5c8d3a4f36a7650 -size 154873 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-counter.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-counter.png deleted file mode 100644 index cc18ef6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-counter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97979726c8de1c03c8c594a276ea350fd1b3e0866d799284091049df9d3d8ee3 -size 31778 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-counters-mode.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-counters-mode.png deleted file mode 100644 index 0157d54c..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-counters-mode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98eeb1cd8cbd35a797d3534d917324f4d1c2aa266675f905f5a4e8b4a7d9ceb4 -size 63291 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-detailed.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-detailed.png deleted file mode 100644 index 05b896f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-detailed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d85117b6e7ae8945ef1c940dd8f9b246a0dcc07c5106fc4d841907bab552543f -size 592386 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame-diff.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame-diff.png deleted file mode 100644 index 7258a6ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame-diff.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b2e85b52fe83a591feafccc6b1399ebe5717716f64f65b55dd1253877ffbcf2 -size 150955 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame-diff2.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame-diff2.png deleted file mode 100644 index 16344162..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame-diff2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8544c446e0acefd0ceddb8d664cf563db3984dc398b0e1050c31e902178ce819 -size 159885 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame.png deleted file mode 100644 index 06309ea7..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-flame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2177ecc82a3dd4a71fbb1a7cbab0beacfde687237c08f750aaa71c1c076f33d5 -size 116695 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-frame.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-frame.png deleted file mode 100644 index 973523ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-frame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b05433bc9a46ecc7ba3f694534c2f0e4aae6592cac5b0f2e3e85e660c22f41c7 -size 59057 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-frames.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-frames.png deleted file mode 100644 index f4db0d7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-frames.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64d92a1a04caa6b2ab23d0ebc2164ac7023a1ef383c44133067662c1b8fc7934 -size 58863 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-graph.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-graph.png deleted file mode 100644 index 46eda007..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-graph.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32d83d0f109aa6e9c3cfe0ea0c49e572c53f641b328051d2d9290600ff32828b -size 45827 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-group.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-group.png deleted file mode 100644 index c0bf5ce1..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-group.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd3117d599035d30345103a977867507b980bb37f9275804416f3a287ae9e558 -size 420251 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-groups-mode.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-groups-mode.png deleted file mode 100644 index d747b9e0..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-groups-mode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bae246971d2b49dfde7de16c4d949c512c0292c06fabb4bc461d7700c9a638c -size 156316 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-mobile.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-mobile.png deleted file mode 100644 index ad55709a..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-mobile.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:987b4363b9b263fdf0837625153b287e31b215a7339174542321d444ca75ca07 -size 656448 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-asset.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-asset.png deleted file mode 100644 index 48af4547..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-asset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:222ff55f46df64dba02c68011153da88a0e0d106cbf860a4dee338d0c038bcaf -size 61971 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-events.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-events.png deleted file mode 100644 index a9447c73..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-events.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2017f32a7da50dd882223609a6c70212f618039c609ee0164ef87231ffef149a -size 84231 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-extra.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-extra.png deleted file mode 100644 index 7a5efed4..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network-extra.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96b200aa178e71acf57ec22d1860d3163bcd1f0298fdd0185a7c9da740d9bb6a -size 62231 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network.png deleted file mode 100644 index e597a1f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-network.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8eaf5a8042a2b2cd2223fa43dbbccbe9d2881bf1d3106389bd80c7a7c9c3788b -size 67203 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-panning.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-panning.png deleted file mode 100644 index 0a4a1c15..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-panning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6c35c1da043d99af8ed014c2023c42d2deba3cd9836bd17f47c7bfacb88ed6c -size 365848 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-save-to-file.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-save-to-file.png deleted file mode 100644 index 92edcfa5..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-save-to-file.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f545ec26ca51db099cb7653bc2d349e6a582cb578d596e4a18dd2619278581fa -size 96218 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-server.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-server.png deleted file mode 100644 index 72174745..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-server.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2406a9f008aae906506b38b6fcf4dfb22e2bceb97d1e21e1588ef79d351965e3 -size 139617 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-spike.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-spike.png deleted file mode 100644 index 1a30a384..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-spike.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73cf0d5fbeabdb3b976ea28d8e58d6131699a65d915596b80ebe6834a6d6dcfe -size 325173 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-studio-flame.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-studio-flame.png deleted file mode 100644 index ca928054..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-studio-flame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15bf4b9986334565cf08b9e187ddfafafebeea27a0a8e7e91e7cc0f3e2f4583e -size 369751 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-threads-mode.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-threads-mode.png deleted file mode 100644 index 15bc7dd9..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-threads-mode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:804ef10d2caedb6fbf759364fdbec6f6b7009e0dcba3d42da775e9fcf5bde91c -size 102177 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-timeline.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-timeline.png deleted file mode 100644 index ee62b9f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-timeline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:feec7e8810f93c435e88540252c0e25d8d9a18726f9e161eb5d504502652d2d6 -size 247717 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-timers-mode.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-timers-mode.png deleted file mode 100644 index e1f8c6ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-timers-mode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8a0d6ae3fc517cd8c88cc7337671d26de054a185aa81facb89c041b74fc0cea -size 200795 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-bar-graph.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-bar-graph.png deleted file mode 100644 index d425f6d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-bar-graph.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cb6a9ac3d143c6f6c610e8b106748195dd926c9afa8955b0e7cfd97ae3f3b16 -size 260576 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-explorer-filter.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-explorer-filter.png deleted file mode 100644 index 441a7a3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-explorer-filter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d319dbc17ab2e7d219332498742495694c4b1d3799ffd2cec6ea1f20c800e61b -size 26642 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-framerate.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-framerate.png deleted file mode 100644 index 425a9f6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-framerate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c98ed381b3469e64856b57af559bd463e83f816d96bd7232bdbd1accd774ccb -size 876339 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-framerate2.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-framerate2.png deleted file mode 100644 index c68c82d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-framerate2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6ff00011f5768803851724e70a41fc41f2ac203549e43d7fa4a35a3f2198213 -size 890380 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-localscript.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-localscript.png deleted file mode 100644 index 11668f9b..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-localscript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:729e68a053580140a23056914ca42704eba0702ce042af7b48d77fa6719eb352 -size 500083 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-raycast-label.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-raycast-label.png deleted file mode 100644 index 8ccf8dca..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-raycast-label.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d323ad0c2535dc595f7c9f479b2e74b0f9f0e0261cd33125c10b7872d4f6dd0 -size 529135 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-spam.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-spam.png deleted file mode 100644 index 46de64c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-spam.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf458cf3488ab7e27fe599a30359a2c28f0ef3d8c85da1b6216be892cee50da1 -size 551014 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-stepped.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-stepped.png deleted file mode 100644 index 6128a6b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-tut-stepped.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87bca0715986ce83591cd18f6c5c05a8f23c8aad6de26d3615fe64cc58a8256c -size 640809 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-xray.png b/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-xray.png deleted file mode 100644 index 5659e37d..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/microprofiler/micro-xray.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e0af7e29fc658aa919f9b53b1b031a033c5789c357cd403c6df77a843a6826e -size 88332 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/perf-hud.png b/.cursor/rules/roblox/en-us/assets/optimization/perf-hud.png deleted file mode 100644 index 064b5751..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/perf-hud.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da94a2d7094fe5e4625912eb8d908495bf36138d7a8ed81c838aa3e0bebab01e -size 1937114 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Default.svg b/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Default.svg deleted file mode 100644 index 69645505..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Default.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8845d455603df72c61996b6ab17173647bfb2823e4cfda8b4a61c05a7bc57ec2 -size 87155 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Character.svg b/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Character.svg deleted file mode 100644 index 2b3a6feb..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Character.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a73e4ca881e4cfff4f35308c05c31cea5c9881b2f9df6194dba1556755fe7a77 -size 167244 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Non-Spatial.svg b/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Non-Spatial.svg deleted file mode 100644 index bf787462..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Non-Spatial.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16e1b45a188afb4b48e2f5e7a2d91e3c7876f3b22c4daf95529754aae20f0606 -size 104975 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Spatial.svg b/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Spatial.svg deleted file mode 100644 index 903ab9a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Model-Stream-In-Improved-Spatial.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a279052960cf35ff6088e684782db7bf26a6c40daeccbbdd4e2e8bf2fbc9153 -size 85470 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/streaming/ModelStreamingMode-Atomic.svg b/.cursor/rules/roblox/en-us/assets/optimization/streaming/ModelStreamingMode-Atomic.svg deleted file mode 100644 index 52ae2470..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/streaming/ModelStreamingMode-Atomic.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca095ff07d5b7d7443a396e1ef811e14b93633c4aa715b3bd158dae00ac3a89c -size 144495 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/streaming/ModelStreamingMode-Persistent.svg b/.cursor/rules/roblox/en-us/assets/optimization/streaming/ModelStreamingMode-Persistent.svg deleted file mode 100644 index 556055f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/streaming/ModelStreamingMode-Persistent.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a597b84edaad0fea784c5aa8c7ab0f4c2da8a7276e5d8df6f9994c34ea83a6d9 -size 195268 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Technical-Behavior.svg b/.cursor/rules/roblox/en-us/assets/optimization/streaming/Technical-Behavior.svg deleted file mode 100644 index 3975db49..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/streaming/Technical-Behavior.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35999d1b8869361adbeb745c87a20cf3b1ba4547669a610fade7b1cfa359b466 -size 168456 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/task-scheduler/scheduler-priority.png b/.cursor/rules/roblox/en-us/assets/optimization/task-scheduler/scheduler-priority.png deleted file mode 100644 index ba02979a..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/task-scheduler/scheduler-priority.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad22a4abca777ffc0ea3fdca1152440e7d82a6b78f73dde46faf52e29ba98043 -size 196277 diff --git a/.cursor/rules/roblox/en-us/assets/optimization/task-scheduler/task-scheduler.png b/.cursor/rules/roblox/en-us/assets/optimization/task-scheduler/task-scheduler.png deleted file mode 100644 index 68a4fc74..00000000 --- a/.cursor/rules/roblox/en-us/assets/optimization/task-scheduler/task-scheduler.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59618ee86b3b810386db42bb7887589f276a7b76727717aa2f56cc47ba5da86a -size 379290 diff --git a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping-Microprofiler-A.png b/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping-Microprofiler-A.png deleted file mode 100644 index 9fd4e718..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping-Microprofiler-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a306e07c4a1b1c33fb8dd0377cbe203c4ac85f637ef2c6c9e1a6b6da8d0d6fa -size 77954 diff --git a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping-Microprofiler-B.png b/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping-Microprofiler-B.png deleted file mode 100644 index e5bedfd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping-Microprofiler-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bda70d3aae39506dfe8750002d9c7b1a534738363e151d0a15e950fff9416465 -size 70553 diff --git a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping.mp4 b/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping.mp4 deleted file mode 100644 index f6a90211..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Adaptive-Timestepping.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18fedda8dbf8e188f4d93ad2d6c4b87d74ebbda3ebcd442fb7621b8a0f6c274c -size 5116510 diff --git a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Diagram-Labels.png b/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Diagram-Labels.png deleted file mode 100644 index 47198dcf..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Diagram-Labels.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc6fc9e160d4212e60406efd775f79601cdf4bb4fb6a238b9bc92f5bdd2a3110 -size 21534 diff --git a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/PhysicsSteppingMethod-Adaptive.png b/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/PhysicsSteppingMethod-Adaptive.png deleted file mode 100644 index 77dc1221..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/PhysicsSteppingMethod-Adaptive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6af96a1c9cfcbe2cc34b7369985bfb505ae4489b0edd002d3708d1920f7f7c7 -size 22927 diff --git a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Settings-Are-Timesteps-Shown.png b/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Settings-Are-Timesteps-Shown.png deleted file mode 100644 index 31ce830a..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/adaptive-timestepping/Settings-Are-Timesteps-Shown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:081342be2c468722eb5e422f958fa2eddfa36ee7caad87cd65d65d45d7f04e86 -size 13147 diff --git a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-1.png b/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-1.png deleted file mode 100644 index a345c7d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38bbe817499406b380cf40acd8099d9ea01370e9c6e4a38db92cc11108fb6939 -size 117542 diff --git a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-2.png b/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-2.png deleted file mode 100644 index 2393e829..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec3b4187e52044ea55300b5afaef05d4fe2207eee620d5c16efb674205df3fb0 -size 126879 diff --git a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-3.png b/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-3.png deleted file mode 100644 index 9153da00..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Anchor-Diagram-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:716cccd23e470a517c37ecdb8675b8a22c56b9b627b75a3d8b90ffacba2c4a79 -size 130132 diff --git a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Avatar.png b/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Avatar.png deleted file mode 100644 index 2573bcc5..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Avatar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ac6403994eda97ef4eb66fd02d1dcfd7cd85d7c436f11cfda8ef074fbc2b5e0 -size 101335 diff --git a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Block.png b/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Block.png deleted file mode 100644 index 63949a56..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Block.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:443347047ab3dbfe00884027d92b96f587228dab4991af251bfa65a7ad58fc02 -size 139038 diff --git a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Ship.png b/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Ship.png deleted file mode 100644 index 34abcc37..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Assembly-Example-Ship.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:469ab3367f5fa773b49672180b7b2c4e477cff83b71ff4715ad70bd25b14c316 -size 271328 diff --git a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Sleep-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/assemblies/Sleep-Demo.mp4 deleted file mode 100644 index 39bcbe8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/assemblies/Sleep-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d820d7f971fc07be920aaf918b4e74b13efe14e3f48c6f41b5a563fc4d014af2 -size 1612028 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-ControllerManager.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-ControllerManager.png deleted file mode 100644 index 9ac3ad9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-ControllerManager.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4779bb17752ac91bef8a5665364e434a70f08a3a1fedfcfa0112bf832ec1a3b7 -size 28314 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-Controllers.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-Controllers.png deleted file mode 100644 index a0108c09..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-Controllers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4aefd4da4bcf0e16c22c084cd0d5eca3c786caf541a771801c66d98dc318a49f -size 24639 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-Core-Setup.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-Core-Setup.png deleted file mode 100644 index f4807515..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-Core-Setup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7503e8de93f1b8db8ed279d281ee6c4eafbdfd3c42c2288c1ae893d3867d172d -size 9524 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-RootPart-ClimbSensor.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-RootPart-ClimbSensor.png deleted file mode 100644 index 22dec3b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-RootPart-ClimbSensor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc8ba7ae75f40aa1054b29ea3db7eaab7d8515e780d471e643e2f6293d2feb0a -size 16309 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-RootPart-GroundSensor.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-RootPart-GroundSensor.png deleted file mode 100644 index 507a4efc..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Explorer-RootPart-GroundSensor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:049d269ca875b5e293ca64f40d88f5dc850de792a09c6faeb3c3c37c6998d0ba -size 16495 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Linking-References.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Linking-References.png deleted file mode 100644 index 06c9c708..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Linking-References.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e82e47777653c567e1ba1fb2acaaf8a7341c22ab97c0034b6d03f8394d477e2 -size 105404 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-ClimbSensor.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-ClimbSensor.png deleted file mode 100644 index d4d1eed1..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-ClimbSensor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f132a315380b019b0fefb25e0b4a6159796c7d17c479eebaafcd3cd0e5968c76 -size 20269 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-GroundController.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-GroundController.png deleted file mode 100644 index 4d6346ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-GroundController.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44c1f2500f18ea9f1bf14c146d63f903bf9b3723c133c2674737c765f66a6690 -size 55821 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-GroundSensor.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-GroundSensor.png deleted file mode 100644 index 1bdeb64f..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-GroundSensor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4aab0bb0738105a86c682d3f6106c78a820694510c220647045f6b59ac50ae83 -size 20926 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-Testing-ControllerManager.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-Testing-ControllerManager.png deleted file mode 100644 index e9dd3604..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-Testing-ControllerManager.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7ef1b043a0881408223c472d1a8efc0c8f82dd722d6389865bfe6b04604a4f1 -size 40860 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-Testing-GroundController.png b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-Testing-GroundController.png deleted file mode 100644 index c73077e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Properties-Testing-GroundController.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:540fbba6cf9a8c39066615b9c2e5bcdb3617c560f9da7202acdd670a3d0b6821 -size 42677 diff --git a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Testing-Labeled.jpg b/.cursor/rules/roblox/en-us/assets/physics/character-controller/Testing-Labeled.jpg deleted file mode 100644 index a19268b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/character-controller/Testing-Labeled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:419a0c6f408a1a45fd7a4dce70ec056fe6d50b9dcf126c0211a3850c63f23b6e -size 161207 diff --git a/.cursor/rules/roblox/en-us/assets/physics/collisions/BasePart-CollisionGroup.png b/.cursor/rules/roblox/en-us/assets/physics/collisions/BasePart-CollisionGroup.png deleted file mode 100644 index 38f2580d..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/collisions/BasePart-CollisionGroup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a148914eaffb9cc495e82503692129c710d6b629c11f5101d6ee9c56037a6de -size 10898 diff --git a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Box.jpg b/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Box.jpg deleted file mode 100644 index 4887dd28..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Box.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9573eb781dcc9dacd0988cac13566212584c3d43e7e9f480df585bff54c3459d -size 82627 diff --git a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Default.jpg b/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Default.jpg deleted file mode 100644 index 4ea82a15..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:638dd2b78ba42f47ac0882de570f5719a72665bd62dc8263d682628a0d49d20e -size 88757 diff --git a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Hull.jpg b/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Hull.jpg deleted file mode 100644 index 0b0fb2dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Hull.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2545b25e686ad9d606c328d5d3a48324d14768e0248e42d95c8c6f9125067824 -size 62400 diff --git a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-MeshPart.jpg b/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-MeshPart.jpg deleted file mode 100644 index f0b6386d..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-MeshPart.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:798ab8a1d1218a23aa3c4946887032d7c8a763147d041285be42a76822253778 -size 91007 diff --git a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Precise.jpg b/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Precise.jpg deleted file mode 100644 index 7e41083b..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Fidelity-Precise.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:662ac56ffd72bc4f51cdf8832b27a8645cb6c93de8abfce1d1be0cc37ddaa89a -size 117341 diff --git a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Groups.mp4 b/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Groups.mp4 deleted file mode 100644 index 88f690b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/collisions/Collision-Groups.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b109d7961cce0c5e1546a6d0bb3823a19a2ee6fa86fcce0712e801b97afa762 -size 5744042 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-AlignType.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-AlignType.mp4 deleted file mode 100644 index 45bebcea..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-AlignType.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e513e39d96822e66c3fe244e007598748f93c97935be7e52042991fc08cccbee -size 2611787 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-Demo.mp4 deleted file mode 100644 index 6fe5427b..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:330bd3b467d10e3e34d15f39d5998eac18b33c503dcaa4aa44ab259706129e35 -size 2182967 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-RigidityEnabled.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-RigidityEnabled.mp4 deleted file mode 100644 index c3e50631..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignOrientation-RigidityEnabled.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:174e9f04557d08cf029a1e37ef0458e299bb733aef2d9feb590a0b0ffa64d0be -size 2420977 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignPosition-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignPosition-Demo.mp4 deleted file mode 100644 index 32e439ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignPosition-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b1dd6cd61d3235363abd42e675341e5b42f2bfa5fff22edffdbf4fa0052facf -size 2203263 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignPosition-ReactionForceEnabled.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignPosition-ReactionForceEnabled.mp4 deleted file mode 100644 index fd785f23..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AlignPosition-ReactionForceEnabled.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ef0359b130a8526cd3cf392e26160afa2be69a2206f7238313ab90fa9b72f89 -size 2621444 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-Demo.mp4 deleted file mode 100644 index ea83986f..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fd6c28be84b97f40ce3c3534a4cd0c49f9d0e96b3b2e1c5aabb6341226ceb1b -size 2400482 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-RelativeTo-Attachment1.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-RelativeTo-Attachment1.mp4 deleted file mode 100644 index ccda1c3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-RelativeTo-Attachment1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f76667f0ebb79b789ad202ace1d1613a8593cb679baff997f022df884b37a4e -size 4380563 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-RelativeTo-World.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-RelativeTo-World.mp4 deleted file mode 100644 index cceac630..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AngularVelocity-RelativeTo-World.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15ea7571f995205d3c3f0e6cc3c746259d49ef8bc3332bb2cd602638e6654ad3 -size 4721715 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-Demo.mp4 deleted file mode 100644 index 505a41f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3eb2fe7964c8b5d07d055a4dcbf777c153020787623d604a00d96d578b9831f -size 2023529 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-IsKinematic.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-IsKinematic.mp4 deleted file mode 100644 index 838214d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-IsKinematic.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d108ca2ff0e99dd882551f519141c2150ac4859872779574a99aeec858af7001 -size 3278127 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-Transform.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-Transform.mp4 deleted file mode 100644 index 56ec7785..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/AnimationConstraint-Transform.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:088dcca05844079c82a2166f27138659b6bc9059e3f227ee994936706ac7fef3 -size 1662204 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Demo.mp4 deleted file mode 100644 index 18f18351..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8d8026eab69003f0c77ee09bc64fb0f346ce400b30663e6c0bba468ddca2ce5 -size 2386795 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Limits-Tilt.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Limits-Tilt.mp4 deleted file mode 100644 index 4b910788..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Limits-Tilt.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c27938037a8804590118d1e7702b0de9b0ecff322c23e7eb99bb3b5adcf0895 -size 2477896 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Limits-Twist.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Limits-Twist.mp4 deleted file mode 100644 index a282d2e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/BallSocket-Limits-Twist.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48eb94241539bce1f9a9c1ccfd5b2f3b8ea6e297573aa25f48dd69797dffffd0 -size 2584327 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Constraint-AlignPosition-Labeled.jpg b/.cursor/rules/roblox/en-us/assets/physics/constraints/Constraint-AlignPosition-Labeled.jpg deleted file mode 100644 index 602d7485..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Constraint-AlignPosition-Labeled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93aa10473f970155b07c1047017093030bade20481f500c85fae1ad5b87a1ec3 -size 138701 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Constraint-AngularVelocity-Labeled.jpg b/.cursor/rules/roblox/en-us/assets/physics/constraints/Constraint-AngularVelocity-Labeled.jpg deleted file mode 100644 index 76d32743..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Constraint-AngularVelocity-Labeled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73b7a2bb4a065d1532be01f43350bdbc5d26da8f078992b76399d4a1dfcefc3b -size 138499 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Creation-Diagram.jpg b/.cursor/rules/roblox/en-us/assets/physics/constraints/Creation-Diagram.jpg deleted file mode 100644 index ab77bbdd..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Creation-Diagram.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c54ca3942815107a5af77868afca11f76298aea7a5bcf05fb7dd5a82ef3094f -size 167580 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Demo.mp4 deleted file mode 100644 index b543bada..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37bb6cc440a58aabaa24ca5139e387d0d36cf86e3136533db1a8aab760ec8c6f -size 3012280 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-InclinationAngle-30.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-InclinationAngle-30.mp4 deleted file mode 100644 index 33672556..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-InclinationAngle-30.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:684cbec658b4bfa4debf85b88ae404d24ddd65c91d9f28ea9bcbed773aedecfe -size 1174765 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-InclinationAngle-90.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-InclinationAngle-90.mp4 deleted file mode 100644 index f4e7c61c..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-InclinationAngle-90.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75d98697f83c8d56df9c5350c2e8a3f5bbbd2a0fb23a162c1070e7ca6394040b -size 1124009 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Limits-Angular.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Limits-Angular.mp4 deleted file mode 100644 index cdf792a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Limits-Angular.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bb8154d347dcaa14949910eb52a3782dce49deb60b0006ceeeb28a5c808b781 -size 1808058 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Limits-Linear.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Limits-Linear.mp4 deleted file mode 100644 index a674e60a..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Cylindrical-Limits-Linear.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42bef04ad49c1d54852eba85644c357217ade6567f1148548768e5d05c9d35ee -size 1553130 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-ActuatorType-Motor.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-ActuatorType-Motor.mp4 deleted file mode 100644 index d61cce46..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-ActuatorType-Motor.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a333f36b5ff9ea1af045c84f411ebb7c20802cb92ab54e65895e9f6be0291a0 -size 1625941 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-ActuatorType-Servo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-ActuatorType-Servo.mp4 deleted file mode 100644 index 8653bed7..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-ActuatorType-Servo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0610b66a87a403a44768209283b1a5b48b627855746600ae0588584ee9ee1c77 -size 1199247 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-Demo.mp4 deleted file mode 100644 index d58a0db5..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Hinge-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c974095662d3c788adac1835b6e1d4a61f6b917a88561d4dbbd2815520478143 -size 1788514 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ApplyAtCenterOfMass-False.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ApplyAtCenterOfMass-False.mp4 deleted file mode 100644 index 35937444..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ApplyAtCenterOfMass-False.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9eac14de77c186b1f7563a324cebe692a254a248114228b4fe86f4effd7add5 -size 3513711 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ApplyAtCenterOfMass-True.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ApplyAtCenterOfMass-True.mp4 deleted file mode 100644 index 9658d564..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ApplyAtCenterOfMass-True.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2e737161b7dc061c350cc4f78b92689e64809f6467dd87d460998fe6bb9ad6a -size 3296113 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-Demo.mp4 deleted file mode 100644 index e37098ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2591442ef3b138b461de4f34c9c2648773aedd650e911d2857fa2c6877f5dec -size 2556526 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-InverseSquareLaw-False.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-InverseSquareLaw-False.mp4 deleted file mode 100644 index 8d898df9..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-InverseSquareLaw-False.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:948c2c4e103c84fea2542f851ca0eb1acd41a920310d54262a628c2c890d0cd7 -size 3988955 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-InverseSquareLaw-True.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-InverseSquareLaw-True.mp4 deleted file mode 100644 index fdef0bca..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-InverseSquareLaw-True.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:730cc96ccbc7dc44a244e2594b861d7b41dec4e503fa44c2b27e0128714b177f -size 3232201 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ReactionForceEnabled-False.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ReactionForceEnabled-False.mp4 deleted file mode 100644 index 639d26be..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ReactionForceEnabled-False.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b083d47c5bad93fe0c7a2d6f9a4b4c475cb958990a546c78ad7d2ae97811455d -size 2068585 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ReactionForceEnabled-True.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ReactionForceEnabled-True.mp4 deleted file mode 100644 index f2b6eaec..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LineForce-ReactionForceEnabled-True.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12a1ea654e8ffa96f3a17abf7908a04df1bf277bb66be69b86317bcf95d89e6b -size 4755008 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Demo.mp4 deleted file mode 100644 index 7e7bad73..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f45be7d35d5f08a04db2a185a936feecb48f56590bb502c39aaa3ca03b37e893 -size 2276163 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Link-Attachment0-1.png b/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Link-Attachment0-1.png deleted file mode 100644 index 646d5dbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Link-Attachment0-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47e7214ec0272a0c3643c7228c2c698d96caa78eeb8306f766407cb6ff6f5556 -size 32194 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Link-Attachment0-2.png b/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Link-Attachment0-2.png deleted file mode 100644 index 168ecb9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-Link-Attachment0-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80fe1fac7b99a57e8fd14f2d8ee78fc0ed17560a9019dd5a9342e387f29bc6ba -size 27910 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-RelativeTo-Attachment0.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-RelativeTo-Attachment0.mp4 deleted file mode 100644 index 2344acdb..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-RelativeTo-Attachment0.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:742a99f57d979bb4d1c2dcee5e549467f1729fb262804285aac5fc3d02451dd8 -size 1382356 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-RelativeTo-World.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-RelativeTo-World.mp4 deleted file mode 100644 index 3f2497a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/LinearVelocity-RelativeTo-World.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fdb7b5f36dc189cf81d504e7361983744b780037422ba503494c97563b6131b3 -size 910007 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Attachment0-1.jpg b/.cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Attachment0-1.jpg deleted file mode 100644 index 7431f87f..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Attachment0-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18d980c16a2a1221e2e4ef228d6562a742adf564ccdf01124e59c1ccc0797a16 -size 143455 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Attachment0-2.jpg b/.cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Attachment0-2.jpg deleted file mode 100644 index 95ef5d28..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Attachment0-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:192017c587301ffe84f822a083b84fd5076310422ed53363f6cafc5d098c2301 -size 163299 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Demo.mp4 deleted file mode 100644 index 4bcaa2fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Plane-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3eaf88f0d7af102106aef8bb855485b16eb9ad8adb8d8edc60ecc124cd8e2a36 -size 5130835 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-ActuatorType-Motor.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-ActuatorType-Motor.mp4 deleted file mode 100644 index 3ca5578b..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-ActuatorType-Motor.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d50d3b4778458876148177d9a2a049e7b727d5a79e99bec443f6d8f81467f30 -size 1304421 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-ActuatorType-Servo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-ActuatorType-Servo.mp4 deleted file mode 100644 index cd169e90..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-ActuatorType-Servo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a23412dc599b41b0190be7d301aeac2282ac41ec43d6c0663edef80e26c1826e -size 1189077 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-Demo.mp4 deleted file mode 100644 index 78bc7be8..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Prismatic-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bae9028599d0e1882877a93406af667a4a5dbd4bebef428161fba50f60089c3 -size 2575010 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Rod-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Rod-Demo.mp4 deleted file mode 100644 index 9d4bf654..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Rod-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0a00abef76f76699e1a2e728b77659ea0fe4f3ff6f1a794d184813f2f892416 -size 2360374 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Rope-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Rope-Demo.mp4 deleted file mode 100644 index b354df75..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Rope-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aba6a83e126d63c4ddedad8cfd035f348482cc8d4213782208132b73b553beb7 -size 2658253 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Demo.mp4 deleted file mode 100644 index af9504a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:243c4be203e5529a47c86124b51472b34aadea356ce2520cdbec76d141a237cf -size 2496040 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Stiffness-25.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Stiffness-25.mp4 deleted file mode 100644 index 936e219f..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Stiffness-25.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45ced019d742b8da9066b181fd82f75193905cdf604f462505167834df09adc5 -size 1415545 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Stiffness-500.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Stiffness-500.mp4 deleted file mode 100644 index 13942c5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Spring-Stiffness-500.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0780fada9aaf6231ea7f80076076329c06eb0abb0b758acc48b68a571d519b39 -size 1804859 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/SpringConstraint-Link-Attachment0-1.png b/.cursor/rules/roblox/en-us/assets/physics/constraints/SpringConstraint-Link-Attachment0-1.png deleted file mode 100644 index adb411f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/SpringConstraint-Link-Attachment0-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20893ef2061b7d3557d83e4befac78e294cc195210c77f528855a80fc551c44b -size 32375 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/SpringConstraint-Link-Attachment0-2.png b/.cursor/rules/roblox/en-us/assets/physics/constraints/SpringConstraint-Link-Attachment0-2.png deleted file mode 100644 index 71f78817..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/SpringConstraint-Link-Attachment0-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71b95db08fb839e730b53e4fc7d2aac06843181b5e3aa26f9fdfde7ec0d1a6c7 -size 34769 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Torque-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Torque-Demo.mp4 deleted file mode 100644 index 16a664c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Torque-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a021c9919218981a08257e55d0e257679176df871326e9c30a66d80d6a1f764 -size 2278213 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Torque-RelativeTo-Attachment0.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Torque-RelativeTo-Attachment0.mp4 deleted file mode 100644 index 26813bd3..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Torque-RelativeTo-Attachment0.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7a087a645fe7b08f15cabefe254ec2f470559e23637592ced6ad270e86eadc5 -size 7752685 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Torque-RelativeTo-World.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Torque-RelativeTo-World.mp4 deleted file mode 100644 index bf4197e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Torque-RelativeTo-World.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:913bd1d2c72c662e365f39e710b608b4aed6db9d0fdee20944b051fad38c6ed1 -size 7251701 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Damping-0.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Damping-0.mp4 deleted file mode 100644 index 9481d7e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Damping-0.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca46d96facfa138ca6cfbe933f9bda52d6c7f51c4abbf9b92de7105122c749b9 -size 1699882 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Damping-50.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Damping-50.mp4 deleted file mode 100644 index b1afb4be..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Damping-50.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8b2d5da680b9aade93898a7f29bc38712294b473bd47072c9d9dc6ad55d6666 -size 904687 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Demo.mp4 deleted file mode 100644 index 5ce6ae84..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/TorsionSpring-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da24437669c157c21309fe3020ead53ba09f28880b785a2afbdc1f873686d46c -size 2269335 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Attachments-Correct.jpg b/.cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Attachments-Correct.jpg deleted file mode 100644 index 5c3ffb2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Attachments-Correct.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa7ed07c6ca680bfdb6d7704a95bbc12588040ea4f9014c87048bf0d889f8a5b -size 84357 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Attachments-Incorrect.jpg b/.cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Attachments-Incorrect.jpg deleted file mode 100644 index c78a5f63..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Attachments-Incorrect.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb38fff65b321cb4f4a8b1173974b20953436515b561fc0cac75415253777913 -size 79489 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Demo.mp4 deleted file mode 100644 index e89d5660..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/Universal-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b73fbfad4bdaab2c6ab7240a1f2c3e5fee3cfb420ddae93d80d1d8d9a9c77a23 -size 3524616 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-ApplyAtCenterOfMass-False.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-ApplyAtCenterOfMass-False.mp4 deleted file mode 100644 index b445e4cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-ApplyAtCenterOfMass-False.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f85776d3ebd8f72a6185d41fd041c4b6da988856ea3cdf022698325dabb09e52 -size 2982322 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-ApplyAtCenterOfMass-True.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-ApplyAtCenterOfMass-True.mp4 deleted file mode 100644 index 14a8cfac..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-ApplyAtCenterOfMass-True.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:178963813cdeed619076af92db5ff4ade8b8189d46eeb74f6496a712be22bb44 -size 2498941 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-Demo.mp4 deleted file mode 100644 index b69c7dc0..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de5d71722c2e9924621d36d697190205c033d3cec1feea4690be9fba5b49e773 -size 1357586 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-RelativeTo-Attachment0.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-RelativeTo-Attachment0.mp4 deleted file mode 100644 index de55a2ff..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-RelativeTo-Attachment0.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a221617fb53a7c892b7d7b88a6a6452388af879b098733f15f1eb97d488a858 -size 3580640 diff --git a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-RelativeTo-World.mp4 b/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-RelativeTo-World.mp4 deleted file mode 100644 index b0dca33a..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/constraints/VectorForce-RelativeTo-World.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa31a143dba41705fe24b706ca64420358671295194d03892f97e1fb3c363fb9 -size 3253229 diff --git a/.cursor/rules/roblox/en-us/assets/physics/network-ownership/Visualization-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/physics/network-ownership/Visualization-Demo.mp4 deleted file mode 100644 index 0711f298..00000000 --- a/.cursor/rules/roblox/en-us/assets/physics/network-ownership/Visualization-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7a7ce085253861c5ab818ed8274d0d8599cfe4fae0e4d61431ad32a88468aab -size 5010189 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Advanced-Bubble.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Advanced-Bubble.png deleted file mode 100644 index 05e41cb6..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Advanced-Bubble.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a036d05dfa5717252985742577acdec9278f310806cb57156ca837204bc2c4df -size 10514 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-NPC.jpg b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-NPC.jpg deleted file mode 100644 index c92e89f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-NPC.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97a0ee9901d73ebc5890b7e7cea17c1be01e648dc9838cdcc62c468d12fef17c -size 285009 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Rich-Text.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Rich-Text.png deleted file mode 100644 index 5e74fd13..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Rich-Text.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57a899321bbe61f7e81efa814bd380154d6a5e8780e4c99776b9cf0bef76e67e -size 187275 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-System.jpg b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-System.jpg deleted file mode 100644 index e14b9f57..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-System.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa6e1299c4b1381e859cf78ff41acefde78cba62742f510c2a936db1e755624e -size 262960 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Tag-VIP.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Tag-VIP.png deleted file mode 100644 index d02d48e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Tag-VIP.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cdf514224b6f0ee22385041acee91810b814092e79b001aa207f0102e3cbdc5 -size 187139 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-User-Name-Colored.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-User-Name-Colored.png deleted file mode 100644 index 5f989cb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-User-Name-Colored.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c1d57aaa7efa102d6b27f0b4043c15f4723a75612d63d2ab05a3d1daa8bc368 -size 184356 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-User-Name-Gradient.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-User-Name-Gradient.png deleted file mode 100644 index 44fd42bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-User-Name-Gradient.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f24fd111a63ee454a3dea9b90a9a21a57f0393f26e490b0717a7cc813bb1f26 -size 187308 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Window-Components.jpg b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Window-Components.jpg deleted file mode 100644 index c4603ea1..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Window-Components.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27f64f466f61cc700b23ca8e72f3dde5d9da448452ff4431830f3746370d3f02 -size 306853 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Workflow.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Workflow.png deleted file mode 100644 index 2ccd57a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Chat-Workflow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d8710636ab31c6d37af1dc02a8820d70ba7affb7a06150f2d025ccd9b3ca0f3 -size 478200 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Low-Health-Bubble.mp4 b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Low-Health-Bubble.mp4 deleted file mode 100644 index ea87d722..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Low-Health-Bubble.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8bea09b665fc353d947203caa4445b6eea2b8d84140c7f457a25c6a6bc8b3ff -size 846273 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Player-Conversation-Bubbles.mp4 b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Player-Conversation-Bubbles.mp4 deleted file mode 100644 index 82dee5aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Player-Conversation-Bubbles.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30030794163cbab339b2a812797c7981d2d08ec57cd93ec4e0a2cd64be78c8b9 -size 7581166 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Text-Custom-Command.mp4 b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Text-Custom-Command.mp4 deleted file mode 100644 index fb9527b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/Text-Custom-Command.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6faa303624dd33286ab611dfd66e2f70b2f434e425738a4541fe0b6fca1ae0a9 -size 7853155 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChat-Group-Tag.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChat-Group-Tag.png deleted file mode 100644 index d69c1b64..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChat-Group-Tag.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de5cf441ab540a4b0404c524e6990bcb745bbf008a90e15d3e292c20fb857719 -size 80687 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatCommand-Aliases.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatCommand-Aliases.png deleted file mode 100644 index f8f02d20..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatCommand-Aliases.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9cc6d8f1bb2ebb900204d433c0585296b663a6ed623a212fda324d481ce2f84 -size 52271 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-BubbleChatConfiguration-Enabled.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-BubbleChatConfiguration-Enabled.png deleted file mode 100644 index c26eda87..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-BubbleChatConfiguration-Enabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e548efaeadc48b8e8c63d3ef6ea4ef52f8fa3210d4c068cc658cc430647e8d41 -size 53906 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-BubbleChatConfiguration.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-BubbleChatConfiguration.png deleted file mode 100644 index 40360a80..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-BubbleChatConfiguration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a66225e5860ea6427058aa56d2f3f4121c8dbce849a832ab5e444898de3404ee -size 41260 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-Callbacks.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-Callbacks.png deleted file mode 100644 index 83d7b953..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-Callbacks.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a05e039ca36fbf279ab2976a5aac945ed9e9dd3e5244849b8ba460db00690ef -size 121062 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-Configuration-Objects.png b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-Configuration-Objects.png deleted file mode 100644 index d4cadeed..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/TextChatService-Configuration-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b103928a9fe7845896c48acb98f33f114d23cea8da7ab151c2d90308ca2da90d -size 223174 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/VIP-Bubble.mp4 b/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/VIP-Bubble.mp4 deleted file mode 100644 index cf95c8f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-text-chat/VIP-Bubble.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:975a52e04793a73d53f9ff2c1e658567a318d4ad3871985281b82bf565128fb0 -size 1100854 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Grip-Correct.jpg b/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Grip-Correct.jpg deleted file mode 100644 index 27b0fe12..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Grip-Correct.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c65c368503eb58c827fcf333cb22cc5c874d55e77f75b444bf5394651d1f5053 -size 139426 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Grip-Incorrect.jpg b/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Grip-Incorrect.jpg deleted file mode 100644 index 57bb71c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Grip-Incorrect.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40a54096140c6cb62fb4aa00796ed6fe06b1b99bf724359675d6e4bfa9341a01 -size 139610 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Handle-Example.jpg b/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Handle-Example.jpg deleted file mode 100644 index 4bd9c3be..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Handle-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d92ab0e630ec95defdf1a71c2b942cb004fd7e4f4900e73bb2e175ded13b283c -size 173633 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Inventory-Non-Physical.jpg b/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Inventory-Non-Physical.jpg deleted file mode 100644 index 0d500c9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Inventory-Non-Physical.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a0efb29229fbedda375ad4d6474b52a0eb5d6377311c45dc3e59a02c6d135da -size 354891 diff --git a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Inventory.jpg b/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Inventory.jpg deleted file mode 100644 index 5b89fff3..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/in-experience-tools/Tool-Inventory.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df659ed27854a4e4e09f09e354653da4836a932585b10d096e5de23ddde90a47 -size 252369 diff --git a/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboard-On-Screen.jpg b/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboard-On-Screen.jpg deleted file mode 100644 index c1ac2220..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboard-On-Screen.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81f8b0976bd97e29a06fb2aa252fab87121650609e2c0303dbfdfac710f4cab5 -size 371816 diff --git a/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboard-Stat-Name.png b/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboard-Stat-Name.png deleted file mode 100644 index fa416229..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboard-Stat-Name.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a70326cc89ddc9741d8d3a67853caeedd75e3ce7e4eae20f79e152f02e556d7c -size 128214 diff --git a/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboards-Insert-Script.png b/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboards-Insert-Script.png deleted file mode 100644 index 0f7190dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboards-Insert-Script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abc0d2bd7d27c36a77d70b9952ca5b2dd2552d9cd2eb376d99d83ce438b18a78 -size 18965 diff --git a/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboards-Multiple-Players.png b/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboards-Multiple-Players.png deleted file mode 100644 index 63bf1673..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/leaderboard/Leaderboards-Multiple-Players.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cdbed209fd993ff7f531872f9bb7b15a4e2681f625c81a9350c5131ee0a5355 -size 119479 diff --git a/.cursor/rules/roblox/en-us/assets/players/teleport-access-control.png b/.cursor/rules/roblox/en-us/assets/players/teleport-access-control.png deleted file mode 100644 index c700ab22..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/teleport-access-control.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0350827c07a2f93e51d30447e9ab244bac092d966aabd193cfcee421c18c3c31 -size 52376 diff --git a/.cursor/rules/roblox/en-us/assets/players/voice-chat/In-Experience-Example.jpg b/.cursor/rules/roblox/en-us/assets/players/voice-chat/In-Experience-Example.jpg deleted file mode 100644 index 9a7aa205..00000000 --- a/.cursor/rules/roblox/en-us/assets/players/voice-chat/In-Experience-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52eaea4b1dc237cd998f184c6095743fade75e570866d9b18300c1734056a653 -size 256729 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Credits.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Credits.png deleted file mode 100644 index dbf5a57e..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Credits.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebd7ee49e4665f2c2f96d99f875441b1c6c577144874215b2d436e7c8a9eac3b -size 75202 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Placement.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Placement.png deleted file mode 100644 index 38eb2dbf..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Placement.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7a41b8eb63160cbaf9d911f5ff3b88d0067b723c8bec0108df9d1d51a8e311d -size 118324 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Bidding.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Bidding.png deleted file mode 100644 index e83ee480..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Bidding.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:211702fe1121946800c8ec8c99a64f4e4fd1bb4ec32111c9d40648fccc048dba -size 123327 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Gender-Ages-Devices.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Gender-Ages-Devices.png deleted file mode 100644 index 0e8bf4aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Gender-Ages-Devices.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73b93365570614c50a5a5d2867a0f75abdd8ed56a9d1396d9c24fe7908014b4e -size 53895 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Locations.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Locations.png deleted file mode 100644 index cf03dd6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Locations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9b16ef0f5695970ba7d0d8e9b6e925e95a9d2b196ddfc2386dc380a1008d081 -size 11632 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Name-Next.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Name-Next.png deleted file mode 100644 index 91da1c8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Set-Name-Next.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48045947004717229f682f0620c2a71069357400ec18dea4cdd745a7dfb1c69b -size 23136 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Upload-Widget.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Upload-Widget.png deleted file mode 100644 index d32f2644..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Ad-Upload-Widget.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d165f41c1b7e2bdd5746e50ce4e759a179f046998e50b4c2838a2ad048f2e798 -size 16162 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerMetricCards.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerMetricCards.png deleted file mode 100644 index b9490a08..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerMetricCards.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50e93e4560b50cfd3893b0f83c97f4e345a94f61edcd16c4a099a3802cf72d4a -size 51111 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerReporting.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerReporting.png deleted file mode 100644 index da2607e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerReporting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9988e31afb61e5917f898d822eaf0ebfa351c27bbf6b1e1c7068934611cdbf81 -size 264422 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerReportingTable.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerReportingTable.png deleted file mode 100644 index 8014a14f..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsManagerReportingTable.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9783a81f75dc1a62fb5ce5169a20ece6b6be37578603f35556f58c9eb830e08b -size 275221 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsOverview.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsOverview.png deleted file mode 100644 index cbf56636..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/AdsOverview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:514e6f9fdef03931af11523b1ed0718009f8d77d1032fff344922614a2ea2ba0 -size 60039 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Brand-Suitability.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Brand-Suitability.png deleted file mode 100644 index 70283317..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Brand-Suitability.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95a4ab3cfa7b501906771e0ea85b627dc7e7fd46d3fb1f331bf10708e644377c -size 222754 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Budget-Schedule.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Budget-Schedule.png deleted file mode 100644 index 1b487b65..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Budget-Schedule.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6227ef4f9b607fbe80265eb1c122c2cc25bbb0602dc5ec7bfc57be2031bf8732 -size 17744 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Create.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Create.png deleted file mode 100644 index d1fc21b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Create.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a6fd91bd1dd1fcc416f1913f065cc9e4b34a0d464c44eaf579ba94efba3b243 -size 54259 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Name-Next.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Name-Next.png deleted file mode 100644 index b48d9cce..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Name-Next.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14215c1814af0fbc285a4dd44ac220a243eec5b4e4a7882bb8941a8708abc004 -size 21410 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Objective.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Objective.png deleted file mode 100644 index 11248cd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Objective.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25fb53b0859de58781cec8678247f4bfb3d85d129103b80926b9d0f2928da1e8 -size 85745 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Set-End-Date.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Set-End-Date.png deleted file mode 100644 index 1855789f..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Campaign-Set-End-Date.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f5920463070be5d9110a247e34a1813dcd8b84e911cab9b2e3477ba0e901425 -size 12246 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Create-Ad-Account.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Create-Ad-Account.png deleted file mode 100644 index 34e34d7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Create-Ad-Account.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cab70b3f63c66285e4b69f24a894aa7ca0ebb90239e22ab17ac0d89221e8e7f7 -size 21663 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/EnableRewardedVideoAdsToggle.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/EnableRewardedVideoAdsToggle.png deleted file mode 100644 index f41b8b1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/EnableRewardedVideoAdsToggle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e66bad5ec8963646686da6ab431fa56fc5cb0d0b3d4a13c4955bb66ae1b39b6b -size 182217 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Image-Ad-Preview.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Image-Ad-Preview.png deleted file mode 100644 index 901d5d85..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Image-Ad-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4b75f549f4e0a9f214c2159977f89e69587f52313da985d31120fb16b5ab0e1 -size 3760663 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Live-Preview-Experience.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Live-Preview-Experience.png deleted file mode 100644 index 517de232..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Live-Preview-Experience.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24940f12be72fb23ce76c9fedb91644535320824a0ba637def45a6f6251e13b2 -size 8865227 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Menu-Payment-Settings.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Menu-Payment-Settings.png deleted file mode 100644 index 2897f6f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Menu-Payment-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1de35658471aac603a7f8042a190daff4a497216d46f1b422d1be69958a4ec3 -size 22229 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Payment-Activity-1.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Payment-Activity-1.png deleted file mode 100644 index f90bffad..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Payment-Activity-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a89184f7e4b95564b0ada1ac3ffb58fe9fc1bb260b5f89021b32978e9d2ac00 -size 91679 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Portal Ad Preview.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Portal Ad Preview.png deleted file mode 100644 index ac268109..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Portal Ad Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15944fd29f276da9e69d9ae8c8c2debe7bedfa800c06d9062c83968f17ed2743 -size 3065502 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Portal-Ad-Destination-Experience.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Portal-Ad-Destination-Experience.png deleted file mode 100644 index 918ba9b6..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Portal-Ad-Destination-Experience.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9a03727056c4e663d1574da4183867d9ea514fbf60331954c8b0a7fafadd099 -size 5303 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Ad-Sets.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Ad-Sets.png deleted file mode 100644 index c180966c..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Ad-Sets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d38e631ece4a635e6ac270ea33e018c917faefcc09b2108b681be3b93df5efad -size 39716 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Ads.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Ads.png deleted file mode 100644 index 2b143981..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Ads.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0dda6c9f82d3fc13c6d6dc6592c3f6a344ff4358cf9c452f5ed027f73ac32fd4 -size 37552 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Campaigns.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Campaigns.png deleted file mode 100644 index 02d3bd1b..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Reports-Campaigns.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:217450d70f11f3e4fc6840644cd96906c85a300ccca1b8b2f7f996a8b8b9d316 -size 39497 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign-Ad-Set.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign-Ad-Set.png deleted file mode 100644 index 488c8fed..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign-Ad-Set.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9b32bca4b44430fcdb23719edf1fe66b975da23171722e807fa6c0bed6f9952 -size 47457 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign-Ad.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign-Ad.png deleted file mode 100644 index 22378598..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign-Ad.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e3c6cd4a81bf4206c2c1028ad595b0f80a4ed5f1a9f271c83f0720a0ae3f701 -size 233314 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign.png deleted file mode 100644 index 69e3be54..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Review-Campaign.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5d75aad16aa6a649f26074c2098a21e13f06166a054360814f443c173813ce5 -size 30540 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Sponsored-Experience.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Sponsored-Experience.png deleted file mode 100644 index 05f125a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/Sponsored-Experience.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d020e561c517111c682b9459100de9ce484e1f55d302d36a32c1eae5e3a42e27 -size 1666755 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/campaign-payment-method.png b/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/campaign-payment-method.png deleted file mode 100644 index 15dd5db5..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/ads-manager/campaign-payment-method.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb2ace0737d665396e9eec5bb2657660418fba27d84493011259254b58a81a8e -size 17532 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Dedicated-Event-Page-Copy-URL.png b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Dedicated-Event-Page-Copy-URL.png deleted file mode 100644 index dc2ee663..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Dedicated-Event-Page-Copy-URL.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:091cd9fb923e863b15a616ee78e13b212b905fe07b2fd9987c18cf2789f24179 -size 119069 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Dedicated-Event-Page-Live.jpg b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Dedicated-Event-Page-Live.jpg deleted file mode 100644 index 523e743d..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Dedicated-Event-Page-Live.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92cd6552fe928a3058f2bf81ee4fd49105e9d661c3d99040c113e7b173411bcd -size 349645 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Experience-Page-Promotion.png b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Experience-Page-Promotion.png deleted file mode 100644 index 42f405bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Experience-Page-Promotion.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b54ece5b5eb282d8266b388ff382215f70d3fa8e468b8c7184d24dbc52aff435 -size 184573 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-About-Tab.jpg b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-About-Tab.jpg deleted file mode 100644 index 65208dac..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-About-Tab.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4706801e1aac3178e2a80f6b1d5f72651df9d3fe6f9012da3921b8177ce8e17 -size 307856 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-Events-Tab.jpg b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-Events-Tab.jpg deleted file mode 100644 index b856dd13..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-Events-Tab.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41e5484b5e0a7025484e40b40df7ed74ad0bd56de4696033551957b2dcd50e71 -size 255644 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-Feature-Event.jpg b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-Feature-Event.jpg deleted file mode 100644 index 7c22bd88..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Group-Page-Feature-Event.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a70ef1bbad3d48dd8c000ebc4a8c59111118c24ce0686ea9acf5e6f25fd0cb4 -size 216167 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Lock-Screen.jpg b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Lock-Screen.jpg deleted file mode 100644 index 9e5f00f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Lock-Screen.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:256bd3ae1e696176b4f67247158233b8c1993ac74896b5a345ccdf7fb3fc4f20 -size 210230 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Roblox-App.png b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Roblox-App.png deleted file mode 100644 index 97e3f425..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Roblox-App.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fe36cb1243448643d82418f438ddb2e765a557529db12e1bfa3c3d494069988 -size 40876 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Update.png b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Update.png deleted file mode 100644 index b7390aa1..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/Notification-Update.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6d4d1d1a393c89d8a3e1f42d4068a249243f58f2de46978f426b37bf817932b -size 69379 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/off-platform-featuring.png b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/off-platform-featuring.png deleted file mode 100644 index 082b22d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/off-platform-featuring.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c96ac425d0af811776d6878412cd9e36a6ea76b5b5597bbc1ab6ed0daa102b17 -size 1040646 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/submit-for-featuring.png b/.cursor/rules/roblox/en-us/assets/promotion/experience-events/submit-for-featuring.png deleted file mode 100644 index f5f19384..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/experience-events/submit-for-featuring.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6745a6970321c1f29b7f4baaf60589f17a4de6ac8243b581464caefcfabe25a -size 91480 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-App-Notification-Stream.png b/.cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-App-Notification-Stream.png deleted file mode 100644 index 6b54c21f..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-App-Notification-Stream.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:227b9381bfffa7a21efc9442ad6330684900673d6ed8c8c12b7d156c1b5b9b50 -size 40035 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-From-Experience.png b/.cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-From-Experience.png deleted file mode 100644 index 9a23e763..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-From-Experience.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:517f85fe1919f2a4dce4e41ab7a69c215ef3bce253efd6a2c8c1b82494d76df4 -size 103714 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-Phone-Lock-Screen.png b/.cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-Phone-Lock-Screen.png deleted file mode 100644 index 85869c32..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/invite-prompts/Invite-Phone-Lock-Screen.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:efbd9a19f1fa5840ebf82b6d39430251574b213d0a849d60e7feee0a15fc38b4 -size 105778 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/BadContent.jpg b/.cursor/rules/roblox/en-us/assets/promotion/misc/BadContent.jpg deleted file mode 100644 index 86be5a32..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/BadContent.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faf582c70eb8d7c505cabf429ded9413256eab6c36f3f0d48e8550855161c1dc -size 453778 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/BadDisclosure.jpg b/.cursor/rules/roblox/en-us/assets/promotion/misc/BadDisclosure.jpg deleted file mode 100644 index 4641328f..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/BadDisclosure.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f767e39a292ec83e6e8266b870e073136a7de18769dd74cef53ecd46b26be99 -size 449927 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Banner-Ad-Example.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Banner-Ad-Example.png deleted file mode 100644 index 0dbe9341..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Banner-Ad-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfbbddc3afe1180d0d186340ce2fa13593f8cb3e155ba691536f9a72e3eaa37b -size 451318 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Guidelines-Example.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Guidelines-Example.png deleted file mode 100644 index f3f2c200..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Guidelines-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97ae32e339572f605a25e99b6090580fc64f5c51097ce558f959ec8dc0d0b67e -size 541691 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Mobile-Enable-Notifications.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Mobile-Enable-Notifications.png deleted file mode 100644 index 780f2684..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Mobile-Enable-Notifications.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dee2703b06f033faeb3ba384d9b44fa03f7234e95391415b09518317d0c8ca12 -size 220970 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Mobile-Share.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Mobile-Share.png deleted file mode 100644 index afc0d522..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Mobile-Share.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:423fbb9c3709be5d1cc4920fb6b9a3da8f9689d6bf1e729104bce561aa917b97 -size 172689 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Page-Enable-Notifications.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Page-Enable-Notifications.png deleted file mode 100644 index c5a168ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experience-Page-Enable-Notifications.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5dc890eec0e021820658920305c8c545ca9ad092ccb5dcaa09ac6bbda5657fc3 -size 142592 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experiences-Sorted-View.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Experiences-Sorted-View.png deleted file mode 100644 index 99041407..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Experiences-Sorted-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c9e015694c685ea69272b329015c62021d2274bebeae766f2315053922850db -size 182361 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/GoodContent.jpg b/.cursor/rules/roblox/en-us/assets/promotion/misc/GoodContent.jpg deleted file mode 100644 index 9c274f59..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/GoodContent.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5aba190fe76be11219372e71756965d35d507c621c9e8dae32c9e3783791acd -size 451191 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/GoodDisclosure.jpg b/.cursor/rules/roblox/en-us/assets/promotion/misc/GoodDisclosure.jpg deleted file mode 100644 index d32cddcc..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/GoodDisclosure.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f3a6c790718a49ea48c437220f7e28a601d76ef232fa513fa9ff48d777a0757 -size 453561 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/In-Experience-Enable-Notifications.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/In-Experience-Enable-Notifications.png deleted file mode 100644 index 1646fff3..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/In-Experience-Enable-Notifications.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7d128949c6fc157aaaa422286e88b02493de85536352c0b7f4fc46b0650ca35 -size 329720 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Model-Tab-Material-Manager.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Model-Tab-Material-Manager.png deleted file mode 100644 index bf93fb14..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Model-Tab-Material-Manager.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe1f65da7fc8a41340827fc17d8f6f54db78c2849bf37f494348d26cbb9e9381 -size 25248 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-Blocky.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-Blocky.png deleted file mode 100644 index 8cc72757..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-Blocky.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e74ffc6fff41569a11f79454cb356895986d91d99dd8f10daa66eb2549c7e6 -size 1644403 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-BloodyEyes.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-BloodyEyes.png deleted file mode 100644 index 6d66fa75..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-BloodyEyes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c7078c07b1cb618b0a04d9cfbed6adf8792072667676f40a00c9843a410abf9 -size 1072182 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-NoFlesh.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-NoFlesh.png deleted file mode 100644 index 09e87447..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/ModerateFear-NoFlesh.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25f1d3ac439fd608a14db1db5829d160b91044f66061cbe10579a0075beb78cf -size 849471 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Social-Links-Example.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Social-Links-Example.png deleted file mode 100644 index 4a63bc15..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Social-Links-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6976c1789dc5e25313c8c04703314fc5ddd65ea1d86b11fe89cc25312139bb55 -size 225283 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Sponsored-Items.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Sponsored-Items.png deleted file mode 100644 index 9cb0fe1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Sponsored-Items.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d76dd512cb47dfe1de6c64d0dadf47e5a348768e80c345107cf3e7f5f3723ae -size 186216 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/Updates-Listing.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/Updates-Listing.png deleted file mode 100644 index c8730e03..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/Updates-Listing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc2189a2215402ce49e25904adc2c43acce5aeb04bc1dda61131391c265fb8e6 -size 35173 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/User-Ad-Templates.png b/.cursor/rules/roblox/en-us/assets/promotion/misc/User-Ad-Templates.png deleted file mode 100644 index 85668038..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/User-Ad-Templates.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff0a4f677549003735b03a16e4593a716d3151dd3f87342440731311a8a86f54 -size 33024 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/User-Safety-O13.jpg b/.cursor/rules/roblox/en-us/assets/promotion/misc/User-Safety-O13.jpg deleted file mode 100644 index c1d147d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/User-Safety-O13.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8cf44d580eb2bd7497fd537d1bbb8478bf79050d57d584eb15727039b93271e9 -size 387394 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/misc/User-Safety-U13.jpg b/.cursor/rules/roblox/en-us/assets/promotion/misc/User-Safety-U13.jpg deleted file mode 100644 index 1dd7299b..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/misc/User-Safety-U13.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c3c7a804085ff9cd40e171276a64ff5a2acab1bc3baf082a7d6d4d22a3c93bb -size 369654 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Flow-Referral-System.mp4 b/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Flow-Referral-System.mp4 deleted file mode 100644 index 36e586d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Flow-Referral-System.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee6ab9ab04b6d799010cdfd7cefbcb04c0a45c09078a72175452ae03b574e873 -size 2674030 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Flow.gif b/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Flow.gif deleted file mode 100644 index f05445dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Flow.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7729e88fbad81ddc16ee81e557b39a24f6b3bead988d34dcf58c1ffc20ccff14 -size 23523837 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Friends.png b/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Friends.png deleted file mode 100644 index 872dcb87..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invite-Friends.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12bd76996600c73d5ad12b40c506a3eec8e3bc0d68245f00da4ef6fc67d7099b -size 1118838 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invitee-Flow-Referral-System.mp4 b/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invitee-Flow-Referral-System.mp4 deleted file mode 100644 index a72932f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Invitee-Flow-Referral-System.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9b4a262a6c992942280f348f433cb6f0435ea887cfda4478daaf5c627a04ec5 -size 1369957 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Reward-Details.gif b/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Reward-Details.gif deleted file mode 100644 index b3981f9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Reward-Details.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e22604376d46741b18fefbe89dc28f09a18f4ddc08b8b721a11aefda0eb2d3e -size 10292527 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Reward-Details.mp4 b/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Reward-Details.mp4 deleted file mode 100644 index b357378a..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/referral-system/Reward-Details.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef45cfd37c402603ae77ace5a32cf07b9a23f9b091e9e903d23ded848791940a -size 1212742 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Ad-Set-Search.png b/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Ad-Set-Search.png deleted file mode 100644 index 5c728ec2..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Ad-Set-Search.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a62c89ba30445498f9a5644fe7664bc2b101746f5093d78dbca3714eea57835a -size 216279 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Edit-Ad-Creative.png b/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Edit-Ad-Creative.png deleted file mode 100644 index 7fdd7b34..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Edit-Ad-Creative.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bb47650890bde395498973eefaf6e7a00702881cb161c92d69c5c54e4f1ef411 -size 53448 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Edit-Ad-Name.png b/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Edit-Ad-Name.png deleted file mode 100644 index f59f54f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Edit-Ad-Name.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4b755395879863ee29604f38aa0a6f016848cf9007817b6178045c2f866e5ba -size 356735 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Keyword-Bidding.png b/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Keyword-Bidding.png deleted file mode 100644 index c380619f..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Keyword-Bidding.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c1641f1857730a895c513d2e958458b96ea50d366a035a20d954bb828a7556d -size 68207 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-1.png b/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-1.png deleted file mode 100644 index 13fad06c..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f02479018fb0f58c1af1f7b6156fd0718498afce10e1b29b1d26ffe3e6681ee -size 482213 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-2.png b/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-2.png deleted file mode 100644 index 08158002..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a029bd87657de5865979f17b39fdfc72918c75459c5380f0879c6c8369d50a14 -size 963485 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-3.png b/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-3.png deleted file mode 100644 index 67d737e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Search-Example-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de29bcec3a4e3d2820167cb2c2c2cbd1c2671ff300fff6544c90af2a044838bb -size 803365 diff --git a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Select-Keywords.png b/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Select-Keywords.png deleted file mode 100644 index 39283bfb..00000000 --- a/.cursor/rules/roblox/en-us/assets/promotion/search-ads/Select-Keywords.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18f1ad5d185fb3b1df87f0f4953c331299d9b11873d4de443c36539624f80855 -size 41183 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/Description-Peek-Mobile.png b/.cursor/rules/roblox/en-us/assets/publishing/Description-Peek-Mobile.png deleted file mode 100644 index f6dfc54d..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/Description-Peek-Mobile.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5677994ef3a274f1ca21ac5ce3b93c8c45d9361f0c9e449befca594486acc59a -size 139902 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/Google-Game-Search-Result.png b/.cursor/rules/roblox/en-us/assets/publishing/Google-Game-Search-Result.png deleted file mode 100644 index 8a138c01..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/Google-Game-Search-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ea8521c60c628a0cdc2b55104cebe00c8adec71e8a64f94b2718b6396a3e9aa -size 63684 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Audio-Volume.mp4 b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Audio-Volume.mp4 deleted file mode 100644 index 6f1fc9f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Audio-Volume.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53e49a4c767ea76b214eeb8901b64a91ddbf22b4a08d28bb6a06e960a674d57f -size 11261523 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Contrast-High.png b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Contrast-High.png deleted file mode 100644 index 06887d8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Contrast-High.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6520164dd99d6da07ba660fe58be96171bf225cecae026baf3cc39e34275442f -size 188814 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Contrast-Low.png b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Contrast-Low.png deleted file mode 100644 index 5a4af14e..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Contrast-Low.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f95601ba710de11f2b125c17facbb41eda0d6a9e8fad589a45fe95f68ed1ef2 -size 187089 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Grayscale.jpg b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Grayscale.jpg deleted file mode 100644 index 28db4073..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Grayscale.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fc989a4d5d83d194b13a84aac5460cd24b850675c71239ea047a9e5b6f94f60 -size 64146 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Normal.jpg b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Normal.jpg deleted file mode 100644 index 0419ab3c..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Normal.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00f4a34a1c168203249cc56601918c9a651cb8d5948ec3425844061a782e4cfc -size 80583 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Symbols-Grayscale.jpg b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Symbols-Grayscale.jpg deleted file mode 100644 index b02eefb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Symbols-Grayscale.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f97fa27c50a17cd2ce456881f0f24846033c3a2f3e76d4219e9546d526d3680 -size 80056 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Symbols-Normal.jpg b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Symbols-Normal.jpg deleted file mode 100644 index 6c46e83e..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Color-Symbols-Normal.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e308794b814e728a480accc5fedbba39c15950d86d36fa48ffc606c7e5c1b6b5 -size 112365 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Default.png b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Default.png deleted file mode 100644 index 2240d82c..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Default.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35eeb67e16b5c482e9e2250377985df0a5eff5f3c89b05f298e9a804495dce2d -size 121598 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Full.png b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Full.png deleted file mode 100644 index f4cb0d74..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Full.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35ca181e53b99201b6f4c35360e4cdc9c6735576feba5683655ec49b911066f5 -size 105026 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Half.png b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Half.png deleted file mode 100644 index 88c07b0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Half.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6aef630da3e9a3e0d09175a65e5653dcd4115178db94ba2dee9c259af708ddcd -size 114835 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Labels.png b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Labels.png deleted file mode 100644 index 0dc94426..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Preferred-Transparency-Labels.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:507ea96ce985f64eb9ce2593a476c4be3b94436a3b33755c0e4dc7988eef0626 -size 144036 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Sound-Reliance.mp4 b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Sound-Reliance.mp4 deleted file mode 100644 index 6f19fc7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Sound-Reliance.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9ea32dae55bb1a17b184ac48dfd814cfb1a0d77b6c51b84d134ebdeb6d5845d -size 4784559 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-LG-Blur.jpg b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-LG-Blur.jpg deleted file mode 100644 index 7eea4e94..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-LG-Blur.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd1a7714b6c7f95a680836fd2b6a1547413cd227433462aefcc42234b5c0fc6e -size 176805 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-LG.jpg b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-LG.jpg deleted file mode 100644 index 1bb9f085..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-LG.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e0f0398e55cd539993796dab439f6ee5593dd2e71345fd68cca35de9e34a073 -size 261194 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-SM-Blur.jpg b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-SM-Blur.jpg deleted file mode 100644 index 7e0c350e..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-SM-Blur.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cb05f85f8e7e34a77866c2f2bacc3722f0a20b0b158f55c7f9d04a93f8f9364 -size 115953 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-SM.jpg b/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-SM.jpg deleted file mode 100644 index f4fe1c25..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/accessibility/Text-Size-SM.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:775c022bcdaae02b9de77e8b55acadb635e71cbca6ca5723cfc9b5a6d249ff89 -size 264661 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Account-Settings.png b/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Account-Settings.png deleted file mode 100644 index ba898898..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Account-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee4f1bba237c09ac867335e65321fb1591905bb9c28621413670c144fd1927b9 -size 38522 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Add-Phone.png b/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Add-Phone.png deleted file mode 100644 index bd08584d..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Add-Phone.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0d5c7a2b7936bd590e7dca07c51849a7b640e34b8987907c8d405a7a382a1ab -size 37042 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Phone-Verified.png b/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Phone-Verified.png deleted file mode 100644 index d2b49260..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Phone-Verified.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e95bde8f7641eeb1e7f3e15232f69476af9836a0a2326491a65f40d9be5572e8 -size 33510 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-Birthday.png b/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-Birthday.png deleted file mode 100644 index 55a8a618..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-Birthday.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9e218e6463fa8f517c823b76caf00c6f59302086463ab4ff628cd7a92779eb8 -size 64937 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-My-Age.png b/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-My-Age.png deleted file mode 100644 index f29883c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-My-Age.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d284adefbdbd5077106e90b81c194f2328daf59ab9642993c5f46c6fd4eda086 -size 25500 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-Phone-Dialog.png b/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-Phone-Dialog.png deleted file mode 100644 index 3c2d400e..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-Phone-Dialog.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c403215e0e3f8cc07afd68f4f3c1d2fc90c6a4b4ba23114785b71d05911e2dd -size 45650 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-With-ID.png b/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-With-ID.png deleted file mode 100644 index e3acef83..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/account-verification/Verify-With-ID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ceaae4f9972b075ea0931416bdf621ce0c3d9ff1c2f7fc22a2504594cbc90061 -size 149189 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/badges/Badge-Experience-Page.png b/.cursor/rules/roblox/en-us/assets/publishing/badges/Badge-Experience-Page.png deleted file mode 100644 index 121b6d7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/badges/Badge-Experience-Page.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8d70dda5ce21c9c890fe39fcc9999c82db1a091a7f9c546150ecd4c48986563 -size 115554 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/badges/Badges-Inventory.png b/.cursor/rules/roblox/en-us/assets/publishing/badges/Badges-Inventory.png deleted file mode 100644 index f8a48c73..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/badges/Badges-Inventory.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f997076345a93d0eb7ef1128f7f53b8f8c8b480de66b1b2a6f15333d55b70b5 -size 350363 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/badges/Circular-Trimming-Bad.png b/.cursor/rules/roblox/en-us/assets/publishing/badges/Circular-Trimming-Bad.png deleted file mode 100644 index 025c4a8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/badges/Circular-Trimming-Bad.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:725fc5f26ce748abdb375f6c78651e6c79d67a1bfdc4e97a092d7b013b7e4bea -size 102688 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/badges/Circular-Trimming-Good.png b/.cursor/rules/roblox/en-us/assets/publishing/badges/Circular-Trimming-Good.png deleted file mode 100644 index 52de74cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/badges/Circular-Trimming-Good.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41aee2612c0a8aa4d9b262d9f640861b2a88bc74ebde3409f521b2443311f1d0 -size 97495 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/badges/Reorder-Button.png b/.cursor/rules/roblox/en-us/assets/publishing/badges/Reorder-Button.png deleted file mode 100644 index 853af7be..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/badges/Reorder-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a779f86ea158d4d6604420759ce951c158189b3b839f6a3bdea80b9be95bb185 -size 7561 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/badges/Reordering.png b/.cursor/rules/roblox/en-us/assets/publishing/badges/Reordering.png deleted file mode 100644 index a38205f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/badges/Reordering.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fef7297f465d2a55e907fd9aaaf0375e66de744b3b36da64a039da70ce98de93 -size 109176 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/console/10ft-Experience.png b/.cursor/rules/roblox/en-us/assets/publishing/console/10ft-Experience.png deleted file mode 100644 index d47c75a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/console/10ft-Experience.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65edb22524fcbaaecd2cf09a0b9d995467bb8a0d4b9188287eaa62d39ef89791 -size 73345 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/console/Haptic-Feedback.png b/.cursor/rules/roblox/en-us/assets/publishing/console/Haptic-Feedback.png deleted file mode 100644 index 93f3d7c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/console/Haptic-Feedback.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a883a141380f90ce08dda98a4925b88d2b650f078a7eed32b3ef54f7ba204adb -size 188607 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/console/Progressive-Disclosure.png b/.cursor/rules/roblox/en-us/assets/publishing/console/Progressive-Disclosure.png deleted file mode 100644 index dd2fec02..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/console/Progressive-Disclosure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10ee2aab70eb048af1adc427ed3e782d8572cd56e782b5575e2524ae90241165 -size 132714 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/console/TV-Safe-Area.png b/.cursor/rules/roblox/en-us/assets/publishing/console/TV-Safe-Area.png deleted file mode 100644 index 887c60ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/console/TV-Safe-Area.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48546ac09b71eb16847e2e7717340b02c5ea948bcb203afd6dfdc41daedca505 -size 24913 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/console/UI-Navigation.png b/.cursor/rules/roblox/en-us/assets/publishing/console/UI-Navigation.png deleted file mode 100644 index 1b6cad30..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/console/UI-Navigation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84bd25638ece8f828fc537f13b15ea8a4c53efd5c5b1c4dffd4b61ae7602e311 -size 91742 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonA-PS.png b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonA-PS.png deleted file mode 100644 index 885f65bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonA-PS.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db682dab96c7adc7d78a9ff711587fbe80ef27fc17f808ccc35b21592353dcea -size 3281 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonA-Xbox.png b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonA-Xbox.png deleted file mode 100644 index 123c3e42..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonA-Xbox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f26b70d81486a80d2f95ad6208a4178b80e4382a177fffc0fce450314e54778e -size 3345 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonX-PS.png b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonX-PS.png deleted file mode 100644 index 17510498..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonX-PS.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:191dbf53a683a4041f6e0276579d0d4979a10be034a0d2d8c2c848ce245f0138 -size 2646 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonX-Xbox.png b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonX-Xbox.png deleted file mode 100644 index ae4bd1a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/ButtonX-Xbox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7dfc069fe10cf7bba08bb730bbb0854cb8eea751bf10d08159afa43317b65707 -size 3401 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Large.jpg b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Large.jpg deleted file mode 100644 index 10b03b8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Large.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:270e32bdba3c84ad5e7c8281d66958c77e07312b09503bab498b6610d906dcaf -size 299433 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Medium.jpg b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Medium.jpg deleted file mode 100644 index 5f5769e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Medium.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e91c5c5aec12452461eea42e311677b0e81cc4630ba6ddf9c2401f120d9b609c -size 273963 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Small.jpg b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Small.jpg deleted file mode 100644 index 3801f1b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Dynamic-Sizing-Small.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:946610eb4642855259fcdad2dd4776720546f290efb892fffe2935418036e85c -size 228433 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Input-Actions-Jump.png b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Input-Actions-Jump.png deleted file mode 100644 index ea5eb8c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Input-Actions-Jump.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c8ad721c45ea9ac8ed6030e4447ee28a99ba285364ad1e8efc8c00eb60a2318 -size 449380 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Gamepad.jpg b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Gamepad.jpg deleted file mode 100644 index 8b44e936..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Gamepad.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8be711c75a50ae538c3d52376bbfad389095276253d2e85236d708f775f1e886 -size 335583 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Keyboard.jpg b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Keyboard.jpg deleted file mode 100644 index 35f61164..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Keyboard.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3946048263be8549bab717bc28bc6eebe7203a6e04ee275336099a72fb633dda -size 336172 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Touch.jpg b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Touch.jpg deleted file mode 100644 index 9d3b2626..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Inventory-Selection-Touch.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7687d066bea8be92f190d7c9e8f64c70cc52a5b3a1334f60a589a806d79e711a -size 338201 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Position-Scale.jpg b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Position-Scale.jpg deleted file mode 100644 index 20053ec8..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Position-Scale.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b300c85248ac61ec566d41a92ea2df4eb8716e848134afa8fa0199e8e2ca71f -size 314878 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Responsive-Layout-Landscape.jpg b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Responsive-Layout-Landscape.jpg deleted file mode 100644 index 449fd32e..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Responsive-Layout-Landscape.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a75ef9b710f33128ff363d876fd76d5cbfa398a19a96657bbb8035ab61f7f21e -size 297585 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Responsive-Layout-Portrait.jpg b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Responsive-Layout-Portrait.jpg deleted file mode 100644 index 575850a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Responsive-Layout-Portrait.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b4ab4fabe82e1df3d72b59f72d39a3323df7bc054d28f64803ca8be78fc794e -size 156162 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Screen-Size-Themes.png b/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Screen-Size-Themes.png deleted file mode 100644 index 16a08d90..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/cross-platform/Screen-Size-Themes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d45d398a342775fa92f9c65f6ea6f3e4aa7059a5eeb995a1ad185b8594eb35d7 -size 136575 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Genre-Example.png b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Genre-Example.png deleted file mode 100644 index 49a28a17..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Genre-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:778b3135121be3254976e95f783d902d904e15d7da20f5be4ebb151386ea7287 -size 25451 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Action.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Action.jpg deleted file mode 100644 index 03ce627f..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Action.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3f28bba47d83fa324c6dd3de98aa105bd15dc2f4f71f20623f1d3cde8d66eb7 -size 145074 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Camping.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Camping.jpg deleted file mode 100644 index 6a0598ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Camping.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fa1f546344d93c42b43a594a6af416c1a3cb15e1f12ce088129e00a343ef2e0 -size 43752 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-A.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-A.jpg deleted file mode 100644 index d2696abf..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfc2c4ed55e528bdec1e05fedd487a5328ea4e13db7908b178170ea93be9f977 -size 76748 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-B.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-B.jpg deleted file mode 100644 index adeb6b84..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:495716649c3cf1d8b3548f80c4d201936e530cc55224ae26d679421948f096bc -size 58478 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-C.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-C.jpg deleted file mode 100644 index 5c3db148..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Colorization-C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9736c3bb96bc633eec157421a72ba0ca3043ac9f39f833f86feb2cbef390792 -size 72843 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Default.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Default.jpg deleted file mode 100644 index e57014c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99c2228275e136e16b636dffd769600a7f8672ac1aaa74faba3eb59f92ddb6a8 -size 124841 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-High-Res.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-High-Res.jpg deleted file mode 100644 index 147980e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-High-Res.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:534cec35d6eeea350e2c81a0683bf4b0d4d4d990b500c29511d08a64eaa6c0a7 -size 1698271 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Low-Res.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Low-Res.jpg deleted file mode 100644 index ddd1c0a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Low-Res.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a691d5f5be632dfd73dbeb06c7b893b5beff539f7ad05426eb9ea655f258869 -size 102594 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Not-Square.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Not-Square.jpg deleted file mode 100644 index c36770ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Not-Square.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c61e157ad402107000f05681e1fe75bc31cc2f9ee49bb988190cc0faa81679d -size 103306 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Ocean.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Ocean.jpg deleted file mode 100644 index 5f3dde4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Ocean.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f23488ac32aabc5fb95540c2193c0afa88d5d1a68adc46f60af41efdbdfeea8c -size 68964 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Theme-Park-Symbol.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Theme-Park-Symbol.jpg deleted file mode 100644 index 34dd6599..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Theme-Park-Symbol.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d4a4830a0ff654098e78236eef7083de8d018488010cb68a823827a7e2f51a4 -size 149622 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Theme-Park.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Theme-Park.jpg deleted file mode 100644 index fd5ff7cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Icon-Theme-Park.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01d9b161c2f71f0d6af8b1cabfc8c43df10e671c81b144b1477ce597bbc69dc5 -size 71358 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-High-Res.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-High-Res.jpg deleted file mode 100644 index aa0374db..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-High-Res.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7fb17af82e54c2a19f92c6eb25473b666bc805b662ccdccf83263f1d7b1b5ab3 -size 284548 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Home-Page-Tab.png b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Home-Page-Tab.png deleted file mode 100644 index 642e2d28..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Home-Page-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:607ad3d62b63e24c12fe3b7851e5dea0f7ffc013b4e895951756e23e25e4c967 -size 129173 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Impressions-Graph.png b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Impressions-Graph.png deleted file mode 100644 index b69613dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Impressions-Graph.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15ba33a966a7ca3b486d4fabc4a07a9c4e7c9c40999183a7d3ecd63f2a609a3f -size 51965 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Not-16-9.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Not-16-9.jpg deleted file mode 100644 index 4844c7aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Not-16-9.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85bb391a2e378443d9844ac1701ea08156e8019f6cc23e0b3b2ac237146eae0d -size 292234 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Theme-Comical.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Theme-Comical.jpg deleted file mode 100644 index 14bcd59e..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Theme-Comical.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de19d9e3bdd0f477110be96e77a8afca2b9e2141c71ef6796a1136b889afb794 -size 239750 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Theme-Horror.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Theme-Horror.jpg deleted file mode 100644 index b318bbea..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Theme-Horror.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74aa6555f90355ce4d5927ac6827894b1a0cae8823f864719c4c867369cc3ebf -size 256578 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Unclear.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Unclear.jpg deleted file mode 100644 index 8635fdbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Unclear.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c31280b20eefc10eecd6d66936f731c5a7cca338c46fe66e51fd71f9b3a777af -size 220526 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Urban-Rush.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Urban-Rush.jpg deleted file mode 100644 index 10f506cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Urban-Rush.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b04b0fd600c36edb4435b50ac246da7339cbc6bd908ccdd2e98407bcd91f471 -size 258781 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Video-Accurate.mp4 b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Video-Accurate.mp4 deleted file mode 100644 index 53bb4144..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Video-Accurate.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3916af20ec855f99b9ac0d26310f4618ec0e5d3d76420a61308f904d03ff8654 -size 13968615 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Video-Inaccurate.mp4 b/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Video-Inaccurate.mp4 deleted file mode 100644 index 5853b43d..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experience-metadata/Thumbnail-Video-Inaccurate.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71846be8b93f5a3a76965e826859399d42f1fc0d2464c8903af5958f4293065a -size 9198626 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Edit-Place-In-Studio.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Edit-Place-In-Studio.jpg deleted file mode 100644 index 6c30bc8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Edit-Place-In-Studio.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bfffe0cb2231e2eb00f9dcd62c3d90da888ce2f467e9d426336ba65b5baf7bf -size 241732 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Experience-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Experience-Hierarchy.png deleted file mode 100644 index a2d7a54c..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Experience-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82db875e1c1820d384037a7c10f8aa90fc53751322031de667aa7ce9401e1b1f -size 483296 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Experience-Page-Example.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Experience-Page-Example.jpg deleted file mode 100644 index c59579e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Experience-Page-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4af6299ebcdb689b1d7f4d270dc62b6ef4ab5c5c10165bdca64fc77681992637 -size 406601 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Maturity-Label-Strong-Language.jpg b/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Maturity-Label-Strong-Language.jpg deleted file mode 100644 index 08e5a4c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Maturity-Label-Strong-Language.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddc222e4e6ba9b3b3fc70e57be3f829f4762db991cd0a0f0f319bdd697835349 -size 247656 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Publish-Window-Select-Start-Place.png b/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Publish-Window-Select-Start-Place.png deleted file mode 100644 index 12df2b44..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/experiences-places-assets/Publish-Window-Select-Start-Place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f1f953e641a5d4f74a1c5f9aeec0983682cf30114dd249eb9a38d43f53fb19d -size 96888 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Dropdown.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Dropdown.png deleted file mode 100644 index 47d4d10a..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Dropdown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3d47d4486ac6ed01f8fd090b2a0aedbb3b6463a9590556a1e1bc970f97bdc19 -size 34464 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page-Limited.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page-Limited.png deleted file mode 100644 index 42913083..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page-Limited.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:364c4dd76b96862e6fb2cfa048b312ff6beea98a0b7eededd65f4f2e2dd84491 -size 171707 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page-Sale.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page-Sale.png deleted file mode 100644 index dc65bb8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page-Sale.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7075df1ce238b517fa5c929c16502825602b6c5e5c6224edd943d8fa39bd06a1 -size 164742 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page.png deleted file mode 100644 index 2e0d1f07..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Asset-Configure-Page.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48b176a23df1809204e87eceb8975007b05e3395cfc95e559bef605ed08b7988 -size 191151 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Catalog-Example.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Catalog-Example.png deleted file mode 100644 index 59e41e63..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Catalog-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5af95bdfa6ff48a337aa9a277ffd6192b08a58d9e09a6c074765631aadb3244 -size 249824 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Creation-Page.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Creation-Page.png deleted file mode 100644 index 375cb11a..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Creation-Page.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ad495c1a30ced2e2a185fde989ed16acc1ccf638b19c29d9b476d33f15845a1 -size 112826 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Enable-Third-Party-Sales.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Enable-Third-Party-Sales.png deleted file mode 100644 index 08791449..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Enable-Third-Party-Sales.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0183c0f02ad733523c19bf6f8cdab84fdd41c472ed579a7cedfdcfd5234857d0 -size 22541 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Error-Example.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Error-Example.png deleted file mode 100644 index 407f1f97..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Error-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0199a3b7fa78ec15cfc009176ca3c3fb85dca6976b9eadda44224338638c3eed -size 11866 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Item-Attributes.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Item-Attributes.png deleted file mode 100644 index c87008f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Item-Attributes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b7a6a01155d773477c3ec3577bbf7463ed1ff52782bb212ceb1898df2bcd326 -size 45774 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Manage-Item-Page.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Manage-Item-Page.png deleted file mode 100644 index 0eeeebbb..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Manage-Item-Page.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70fdd1fc264ba6105a625fcac1244a1f826e8fe3d2aaaa7a151e0bb769013079 -size 65930 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Mannequin-Example.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Mannequin-Example.png deleted file mode 100644 index fbf2d608..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Mannequin-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31286a610bc7501b6d93db624feb1cfc782807fa69de9988878b51b5033ac0bf -size 198460 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Mannequin-Explorer.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Mannequin-Explorer.png deleted file mode 100644 index 7f0d01cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Mannequin-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5c88a869c1fc2c246131992862a6c979854ef4c92df7f032189096d7dd4faa5 -size 34435 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Pricing-Settings.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Pricing-Settings.png deleted file mode 100644 index 3c11cfc3..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Pricing-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fd441cb0d701390cbc448a69107918bc9101a9a9893965f717daff5ec2b3a39 -size 61679 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Body.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Body.png deleted file mode 100644 index 8c4aee02..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Body.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0605c03f83a1bf1c660362cf5400f6e217fdc99bf4d8a691abe61757511873dc -size 131063 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Clothes.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Clothes.png deleted file mode 100644 index af394048..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Clothes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e58fafee1877e74337fee7d0ff9c0fe31d8583e6972b51be65f03c2455cac99c -size 65667 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Item.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Item.png deleted file mode 100644 index 4c35464d..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Publishing-Item.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:279124fab213e25893cef162e6663587a135acb70ea2bd06b11098bc9dea5aab -size 17209 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/ReplicatedStorage-Settings.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/ReplicatedStorage-Settings.png deleted file mode 100644 index dbb11534..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/ReplicatedStorage-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26f3bd79a118e166926cdbd0b387b8c83accc53090491d31787d8c07dc288e31 -size 10909 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Sale-Location.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Sale-Location.png deleted file mode 100644 index f09cd737..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Sale-Location.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e6936cf5ed70f50b79e9325b31ade7f563f95305b5517a4bada0c70846c5111 -size 13980 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Sale-Toggle.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Sale-Toggle.png deleted file mode 100644 index f9bff2f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Sale-Toggle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2f332dad22d89c7acea0da84a4f77c79d92c30c34fbae8c15276b7e0996f696 -size 60906 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/ServerScriptStorage-Readme.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/ServerScriptStorage-Readme.png deleted file mode 100644 index cf22f235..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/ServerScriptStorage-Readme.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6700e9e9bae4408d78ba7eea91b6d43e26448ae40d813aaca894b2c9fbdfa5b1 -size 8574 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Configuration-Example.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Configuration-Example.png deleted file mode 100644 index f91b85a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Configuration-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:218d60385a4d9a263fd680573260d76f90cf8d9292df6a3b80e255883c73ce16 -size 16410 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Example-A.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Example-A.png deleted file mode 100644 index bfec6dce..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Example-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c59c3ead2bc3d967af30e020a4dfd541d77ef42b8a21c5163916507e474dcbdc -size 24855 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Example-B.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Example-B.png deleted file mode 100644 index 4cde2c61..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Thumbnail-Example-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b57ae14a99f8a3d7bb11ece058efb0f8a054203fb32e6aa457f7442870db3b7b -size 11449 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Bulk-A.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Bulk-A.png deleted file mode 100644 index e9256c6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Bulk-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9fad20a7b321d98119fbb9ef7e1d026993d861274788407220f1e1ed33af345 -size 107640 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Bulk-B.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Bulk-B.png deleted file mode 100644 index 1e46e00a..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Bulk-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03509d1ddf8ae09e3aec8edfd5b385a09e1d5c5908f81da26582a1f2a1cedcfc -size 32339 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Mobile-Marketplace.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Mobile-Marketplace.png deleted file mode 100644 index 72115cca..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Mobile-Marketplace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a284a2d6ef727f788cc258ce965b09f3923a165cb74d5992267524551999847c -size 107638 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Per-Item.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Per-Item.png deleted file mode 100644 index 4d2c8052..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Timed-Options-Per-Item.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46b4962e6aa9e61129fd9e5cad812d3165e23825063c5b38d493d70b55bf5203 -size 137385 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Transaction-Report.png b/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Transaction-Report.png deleted file mode 100644 index 8921f000..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/marketplace/Transaction-Report.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8da8d1ea8854aac6a58c7127659411978d14fdaea63f6cb39e79836e66f0efe8 -size 118296 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/safety/Abuse-Reports-Per-Category.png b/.cursor/rules/roblox/en-us/assets/publishing/safety/Abuse-Reports-Per-Category.png deleted file mode 100644 index f351363b..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/safety/Abuse-Reports-Per-Category.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2050e879c8c3bb0c5916396aa7a57a82df5f96a81ac157db7962cf6f80e2f996 -size 96611 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/safety/Automated-Insights.png b/.cursor/rules/roblox/en-us/assets/publishing/safety/Automated-Insights.png deleted file mode 100644 index ec69ffda..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/safety/Automated-Insights.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bfb1aa444ca3054b47d2c16e782d09d516556e1b48ff982864698707dcf521f -size 14764 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/safety/Filter-by-channel.png b/.cursor/rules/roblox/en-us/assets/publishing/safety/Filter-by-channel.png deleted file mode 100644 index b2f45684..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/safety/Filter-by-channel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bed9a36fd9c935d6c20a162060cd893c864d26807c3213709755da26466da5d2 -size 18088 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/safety/Submitters-Per-Hours.png b/.cursor/rules/roblox/en-us/assets/publishing/safety/Submitters-Per-Hours.png deleted file mode 100644 index 467e97d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/safety/Submitters-Per-Hours.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17cf3868db60fc2c255dfd5d67a4a987c2be762c2f2e79b69923591985180db4 -size 42189 diff --git a/.cursor/rules/roblox/en-us/assets/publishing/vr/Auto-Quality-Mode.png b/.cursor/rules/roblox/en-us/assets/publishing/vr/Auto-Quality-Mode.png deleted file mode 100644 index bb70568a..00000000 --- a/.cursor/rules/roblox/en-us/assets/publishing/vr/Auto-Quality-Mode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67c1b913c7c624e821187d7ad2ea04f43e3dc539f56cab5a414fa0dce1d7a38f -size 25534 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-Building-View.jpeg b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-Building-View.jpeg deleted file mode 100644 index 9392c468..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-Building-View.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5df8dd10ac8990e1f043db2496cf9be2db87f1ad3c9259d5cc2d968e4d199f45 -size 226543 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-New-Tile-1.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-New-Tile-1.png deleted file mode 100644 index 50118f40..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-New-Tile-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1840a0e1bb98f3befc75a6e0411f3fba4f22780767b850229c12ddaaf79a165 -size 60684 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-New-Tile-2.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-New-Tile-2.png deleted file mode 100644 index fc4241d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Battle-Royale-New-Tile-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d76ce7cbebfced3f3a701506c3878d642c6885967c4f8f134c53c4c36028e73 -size 69097 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Octant-Cube.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Octant-Cube.png deleted file mode 100644 index 6c1f78c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/building-system/Octant-Cube.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eecf852ccdf6c94730944b12cc9ebd4692389ad069d34722026daeccd6f292c4 -size 109853 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-AM-Select-Places-1.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-AM-Select-Places-1.png deleted file mode 100644 index ffde5efd..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-AM-Select-Places-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:955f0139ea9f401ae81ae6e748408a562c6e7da0b7f2b48ff7665bba4c2a0a1a -size 25564 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Edit-Place.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Edit-Place.png deleted file mode 100644 index 9fc01ae4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Edit-Place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1184936ecf6a29eede5dcff90075b17e21258a57b032c27bf8571504f13b42e7 -size 33548 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Gameplay-Close.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Gameplay-Close.png deleted file mode 100644 index e901e6db..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Gameplay-Close.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78511fb10daf6d540533b205934242d234646123604d808dac3f4aba5c035718 -size 119761 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Close.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Close.png deleted file mode 100644 index 3de66697..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Close.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:167098c00b43850c20984f3c9cb9bd8a986f906cb2134b3496a1aab3e499f5bd -size 111737 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Copy-ID.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Copy-ID.png deleted file mode 100644 index 2a801630..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Copy-ID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4773947a74cc71400ad5df89e4f67c64d031b3dc5372f9949cf8166ec49183c -size 44804 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Set-Name.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Set-Name.png deleted file mode 100644 index e50a20b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-Set-Name.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab59acbab937f5cfaad7ae3004a1e9dac4108c1c52855cb51f2385efd492f8d4 -size 8546 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-View.jpeg b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-View.jpeg deleted file mode 100644 index 5b304f15..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Lobby-View.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe25a13639af2ceb930825325607bbf999dfeea2ed79c5a3f3f6bd0d65582ea0 -size 230078 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-MainConfiguration.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-MainConfiguration.png deleted file mode 100644 index e699144e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-MainConfiguration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a43251dc5d8288bd12798dfc1c65281e7e5dcef71c12fa781ca3e2e91e059ce -size 46390 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-Names.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-Names.png deleted file mode 100644 index b2254abb..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-Names.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08fcb4178f457b1c3c661dbc54d894e3645665946bd10fc960d2d67d1b1ae9d8 -size 34558 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-Overwrite.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-Overwrite.png deleted file mode 100644 index 80bc427d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Battle-Royale-Place-Overwrite.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db36ce6f834a3c0bd1eb014883213d61889785755b698a3fa42ff92246dd37ce -size 83031 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Place-Server-Fill-Maximum.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Place-Server-Fill-Maximum.png deleted file mode 100644 index 1b4967cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Place-Server-Fill-Maximum.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e5b793fc8f4b2b164547111dd54158166944a13d088cd09042daba90a6654c3 -size 17982 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Publish-Update-Existing.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Publish-Update-Existing.png deleted file mode 100644 index baf48ad8..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Publish-Update-Existing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75d822e5dec5d214ef13f99961d668a1baa04ef876152b19d2a53fa36274aab3 -size 12051 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Publish-Window-Create-New-Game.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Publish-Window-Create-New-Game.png deleted file mode 100644 index 356961bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/Publish-Window-Create-New-Game.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e19f57068bc09964a1c9e9f91f671dc8168004836e02966e1e6bcd550237633 -size 12545 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/RobloxBattleRoyale.zip b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/RobloxBattleRoyale.zip deleted file mode 100644 index ef5ecc50..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/installation-and-setup/RobloxBattleRoyale.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1d4569e25aeaf330f6762cb7943a8711654c88c5364d48166977e535c2c1a59 -size 15364674 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/introduction/Battle-Royale-Slide-B.jpeg b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/introduction/Battle-Royale-Slide-B.jpeg deleted file mode 100644 index 9bd07f9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/introduction/Battle-Royale-Slide-B.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46347a8d06f20e590898d10305e590c82cc72bcc552e1b896e136caabd199c54 -size 104491 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/minimap-system/Battle-Royale-Minimap-Objects.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/minimap-system/Battle-Royale-Minimap-Objects.png deleted file mode 100644 index b552b948..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/minimap-system/Battle-Royale-Minimap-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3f67446ba7c0f68d8404c4f48e9898d1802ac7786c7602a0f6e1c3fe90170fd -size 54328 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/minimap-system/Battle-Royale-Minimap.jpeg b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/minimap-system/Battle-Royale-Minimap.jpeg deleted file mode 100644 index 2e042901..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/minimap-system/Battle-Royale-Minimap.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05753a272c559127a5cac65a417d4791132403ff37e7c13d1b9520b6943f107b -size 212254 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Common.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Common.png deleted file mode 100644 index 65f9f062..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Common.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b878f490f7f32775e439929be0391d77fcb602275d389b9b0ab43af803350600 -size 26646 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Epic.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Epic.png deleted file mode 100644 index daafff07..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Epic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4dfec6d1583cd32e7e003bfc2b9b0241c5398037069a4740f20927e1c8cd278d -size 23117 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Legendary.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Legendary.png deleted file mode 100644 index 5ebc9cd7..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Legendary.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfe54150b061cc638a4058d458b597818e596acd383aad2318e44c029d6f9176 -size 23689 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Rare.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Rare.png deleted file mode 100644 index de8b9998..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Rare.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c3e74e60c6da9cda45ac05eda3181d307cc69bc6d32b7d36d40d602e089e121 -size 26217 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Special.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Special.png deleted file mode 100644 index bf207ffa..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Special.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b191eb2a5e901f135b0ee05e85b9c242c39680c81563a97e0330a90c759f6ea5 -size 23217 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Uncommon.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Uncommon.png deleted file mode 100644 index 4cb0e97a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Item-Uncommon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ded4c1b432d3bbcb416e0a370b3f8f1721003f32851a671da97028f3ac7303ee -size 23286 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-New-Pickup.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-New-Pickup.png deleted file mode 100644 index 58f32bfd..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-New-Pickup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d3207294f89c17ec4e808df30baa71ca4d49dd41fd991ccba01071bd4b49553 -size 13948 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-New-Weapon.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-New-Weapon.png deleted file mode 100644 index 0935b57d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-New-Weapon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9027aeef40d69a8a61db55c02d8a8f48b2c5dd7a7b5b69036e27952d8de6f92d -size 12626 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-PickupSpawners.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-PickupSpawners.png deleted file mode 100644 index 9d676a01..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-PickupSpawners.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:656d104189edc27022d9222889a30adf842c46970e67fdb55eb473bcdd7c555b -size 16614 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Pickups.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Pickups.png deleted file mode 100644 index e571d796..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Pickups.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cff97777d337d320ee579c6a20f553b0f33c69652f8106da0edfefbf3f4f665 -size 12861 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Weapon-Pickup.jpg b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Weapon-Pickup.jpg deleted file mode 100644 index f9350e11..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Weapon-Pickup.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26480551cd48c5a895be6266a0b0d4c699105f1c4d7a935508d88204509d0030 -size 142761 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Weapons.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Weapons.png deleted file mode 100644 index a90dcb60..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/pickup-system/Battle-Royale-Weapons.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f51ee544fc978c823aa02c1f3b8a0d719ed98e897b3a73f83e0198b7d4a976f3 -size 12160 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Battle-Royale-Lobby-Open-Place-1.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Battle-Royale-Lobby-Open-Place-1.png deleted file mode 100644 index 163c10c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Battle-Royale-Lobby-Open-Place-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f53331509f6c47eb0dc4b792bda9af92405dc85a3180fbf3c68688745e85e853 -size 173910 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Battle-Royale-Lobby-Open-Place-2.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Battle-Royale-Lobby-Open-Place-2.png deleted file mode 100644 index 95c6a671..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Battle-Royale-Lobby-Open-Place-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20a6fd27fcd5e74525597fa7f9ff264a7e964921b5fc404b110365c5946fc282 -size 75871 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Studio-Recent-Games.png b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Studio-Recent-Games.png deleted file mode 100644 index fc069938..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/running-the-game/Studio-Recent-Games.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:868c20bfb4b0739d46a06ecbef39df8e30c1d04d75e8d775d896c494b609fbae -size 10323 diff --git a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/the-storm/Battle-Royale-Storm.jpeg b/.cursor/rules/roblox/en-us/assets/resources/battle-royale/the-storm/Battle-Royale-Storm.jpeg deleted file mode 100644 index 689c2bbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/battle-royale/the-storm/Battle-Royale-Storm.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de86f6b20c584b26482e17ec28aa7a3b9839ec7ea9c30d62ed87d83f75643a73 -size 193600 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/btd-banner.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/btd-banner.png deleted file mode 100644 index 2368abae..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/btd-banner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e9bfcd2016ead29e731bb4702c1d489978816303f745213326c9f79f3c35388 -size 810839 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture-Overview.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture-Overview.jpeg deleted file mode 100644 index 67a3c981..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture-Overview.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ced290917ad01bd5da549902d33af4094a92501ab13096dc48f27463fe533a64 -size 325524 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_1.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_1.jpeg deleted file mode 100644 index 016c1941..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2262d7ff0a8f9e063b4b10c9c27d7e88022f983db893b4da25a5b23e189319e2 -size 115646 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_2.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_2.jpeg deleted file mode 100644 index 7dde72b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7ac8528c653125d3509a0b63ff67ae21ee52abc37a110c99109270f3a7a4ffd -size 119323 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_3.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_3.jpeg deleted file mode 100644 index a249f0fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_3.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc1b0344e3e8b554745527329feb797715544398efa4a6be554150dc3b6f9611 -size 166473 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_4.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_4.jpeg deleted file mode 100644 index 50f8e152..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_4.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:704900dbcc47191d6a7b4bed5780a12dbb01713b63c54231af6204e4e590dd28 -size 214094 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_5.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_5.png deleted file mode 100644 index fa95a7b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c5b2f5a4de5d3ccb97a39a659daa12030fed43cc9f826a06e93476ea99ea411 -size 736438 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_6.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_6.png deleted file mode 100644 index d4977dd2..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8db33c654409e9b5d715ebc3686a73cb18009715fc09ac70b4fe8f1a16d72751 -size 1837442 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_7.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_7.png deleted file mode 100644 index 65cf059e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_7.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6b3326699e46d53f13af4a78422499b420684a7967bafd04a8b7dd0943df775 -size 1833147 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_8.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_8.png deleted file mode 100644 index 50e03e81..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Architecture_Example_8.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:841f210b11389465cf8b6e5aefdfbd07b4c191f3dd9d3001e952db84c77656fb -size 981046 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Modular_Trim_Sheet.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Modular_Trim_Sheet.png deleted file mode 100644 index ab951494..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Modular_Trim_Sheet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f9066c48d7c6bddfecdb3f2c48d0e784a36689461f35425ce094739dc01dd57 -size 904001 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_1.png deleted file mode 100644 index 54544641..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dea1e0d933945ccba8fa6cef10f1abfd5499cafea2fd4e35e78032073b0cac65 -size 147878 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_2.png deleted file mode 100644 index 3a1255b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82289c8cf6b0512f42cd223969bbaa993220f0aedf4c9b40d6eb29d204228761 -size 29608 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_3.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_3.png deleted file mode 100644 index 328a910f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9450fea84abb7116dcff5217da030e81c918a7a3fee778a11a9e482788f18901 -size 116241 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_4.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_4.png deleted file mode 100644 index 7d7f5530..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/PBR_Example_4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:851576847a1ab40fd4bfa5f2f7380a77d7b8ab7cddb1d1f9c44b3a847abfd565 -size 31754 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Packages_Example_1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Packages_Example_1.png deleted file mode 100644 index 70b2e859..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Packages_Example_1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b97ce60ea4b581d9f86aa67236e7c3031eb5585630a5a26dac7827b572a356a -size 59800 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Packages_Example_2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Packages_Example_2.png deleted file mode 100644 index 1c034e5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Packages_Example_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15a5741d8836d2b22e045b391075b32931c7a49370d5a2cd47e5926b62235399 -size 792060 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Surface_Appearance_Example_1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Surface_Appearance_Example_1.png deleted file mode 100644 index cf25257a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Surface_Appearance_Example_1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fd4e264bb2df5eb0a70901e2e8068fa8d691e9923bc87e422a486304205d056 -size 1682206 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Surface_Appearance_Example_2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Surface_Appearance_Example_2.png deleted file mode 100644 index fb4ea45b..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Surface_Appearance_Example_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ba7d18cfa45344360c97bd26f36512a5fef8fdafc018c02bb8ab8bb7ec8d063 -size 107140 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Example.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Example.png deleted file mode 100644 index 44db3d05..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae334ab4dbbd94edf7d60a2f01b1d6ec482c5c7337f21386a94e2000f8acf0f0 -size 40428 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Example_2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Example_2.png deleted file mode 100644 index e43028d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Example_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f02309f86a0f39fc2d40e1d39dfb7543b21fe00dc7d94998e67b2fd537b368ef -size 606221 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Final_1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Final_1.png deleted file mode 100644 index 736aa257..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Final_1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0fa4bfcf30929d2a862f921992f43a121e6dc098fe5ebf24412302a75dd4bec -size 317701 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Final_2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Final_2.png deleted file mode 100644 index 5532b13e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/building-architecture/Trim_Sheet_Final_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e180edda842eab775fc16c4a324851ef6058d631e42ca67e47f3c1e47e799b92 -size 825784 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Animation-Example.gif b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Animation-Example.gif deleted file mode 100644 index 7859dc6c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Animation-Example.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a0168458b091b11f32a2ca669e9a1e098e1bfbbdedc4f470402e299825468fc -size 3042616 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Animation-Import-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Animation-Import-2.png deleted file mode 100644 index 5182bace..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Animation-Import-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b725594ecc478d8b95132a7309a22792a098ca37def6b66cfa5e7c7d1d255a1a -size 342912 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Bad_Skinning_Example.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Bad_Skinning_Example.png deleted file mode 100644 index 53f35021..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Bad_Skinning_Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:791aabf79a1d95619bf0cf4e86de441f63861d29c04e4a0153f3383e2590fd05 -size 54267 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature-Eyes.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature-Eyes.jpeg deleted file mode 100644 index f104f9e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature-Eyes.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ccdb38c6d5bd3acb690fb841aedbd119081bf2c296293a4e7fc9f911c2d13e7 -size 228918 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature-In-Maya.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature-In-Maya.png deleted file mode 100644 index d380cbeb..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature-In-Maya.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7c8d590ba391e21fc9f241d5d216f3be0c7072f99a744426099e841d034ad58 -size 212314 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature_Banner.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature_Banner.png deleted file mode 100644 index dee128bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature_Banner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0610fffdd34abbbcf496b92106ed4e070d8dd95b95555832d7d2a59539c8f1f -size 733730 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature_Front.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature_Front.png deleted file mode 100644 index 9c866188..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Creature_Front.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78eb8c3ef685cdc329a4945cdf36d6bc4e30379af9aa28e2df3cc5dd82a449ca -size 76326 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Custom-Import-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Custom-Import-2.png deleted file mode 100644 index 2634599a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Custom-Import-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d771d694d2e07a5e16bf6e8e7c6bd01d5afe9e95703d7397780766bcd6e19a98 -size 484774 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Final-Result.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Final-Result.png deleted file mode 100644 index 786c8841..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Final-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70291ff3fedee52c30f89cc3851a4424693d852c24f49287398c60fcd69779ff -size 1053938 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Glowing-Creature.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Glowing-Creature.png deleted file mode 100644 index b4bedca6..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Glowing-Creature.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d46d0d7ff0763ef1a50d66f8453ef67ad8cbc66f6ac884a12f193a0b341b99d -size 264177 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/In-Studio-VFX.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/In-Studio-VFX.jpeg deleted file mode 100644 index ad575404..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/In-Studio-VFX.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2aa704825d9a1cf831b768651f26405353ddf61b930f696db6aa2dcf67fa0386 -size 187875 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Light-Emission.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Light-Emission.jpeg deleted file mode 100644 index efa06c47..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Light-Emission.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a177a226c4394db5c3ef2d4a621cf246d69ae5dee88e83e7de455ac40db81da0 -size 248815 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Particle-Emitter.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Particle-Emitter.jpeg deleted file mode 100644 index c223aa35..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Particle-Emitter.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:594eebc6cae66e0d38a710fac8b3067b61e13f9368edb85de85ab48429f4c9cd -size 193145 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Rigging_Neutral_1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Rigging_Neutral_1.png deleted file mode 100644 index 42520a91..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Rigging_Neutral_1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:093bddce15277f4a33ed2f2a28071bf97cc790b391194408165883774127a14f -size 70481 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Rigging_Neutral_2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Rigging_Neutral_2.png deleted file mode 100644 index 381693d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Rigging_Neutral_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5aa6c0205a41eafd55c91757b9a679ac050acbe9af7076aa88b2757968c80586 -size 145011 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Script-Example.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Script-Example.jpeg deleted file mode 100644 index 3c3405e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Script-Example.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c41bb91980e9b77813942f4564c88aeefd3dac03e662f9f3191d1addb331273 -size 138542 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Smooth_Skinning_Example.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Smooth_Skinning_Example.png deleted file mode 100644 index 244de54f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Smooth_Skinning_Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20eb2a0c0d521b0fb2f09af9ef2ad9fb4d6e1077f9fb387dcb4a014bda280a01 -size 52857 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Spotlights.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Spotlights.png deleted file mode 100644 index 8c56bf07..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Spotlights.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ab0c887c1be50276a2dfaccef44d86af7ccc2f59059396df78b613144d7eca5 -size 887382 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Surface-Appearance-Transparency.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Surface-Appearance-Transparency.jpeg deleted file mode 100644 index cdaca289..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Surface-Appearance-Transparency.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5dbc7046f0b87920531815b430d92a64ec7db6a28a53a3fabe143fcc3a040771 -size 178623 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Surface-Appearance.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Surface-Appearance.png deleted file mode 100644 index 77b9783a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Surface-Appearance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af67c90c2cad413a45085e988183a953ef6e3870b299395275629e0c7a760f0a -size 528966 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-1.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-1.jpeg deleted file mode 100644 index 16c347d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6d19058e61ded7916f03073a26805bc286c5ec0a9942309d955688c6d711bab -size 241792 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-2.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-2.jpeg deleted file mode 100644 index e1109790..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72bfbcc76a2e9394be15d49a0f3737adf6b401118cc89d2f0085b902b0bc0ad8 -size 390643 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-3.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-3.jpeg deleted file mode 100644 index d6b061f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-3.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:435254935f9655da41a7f7592b21b8221d973863aa8205b12d6722a859ac7f84 -size 271697 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-4.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-4.jpeg deleted file mode 100644 index 15ad817f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/custom-characters/Texture-Map-4.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ced50ea8a0ff93ac7df6529012c908b593511be458dcc01664dc3b21bd2af6e9 -size 328205 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessories-In-Explorer.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessories-In-Explorer.png deleted file mode 100644 index cca888ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessories-In-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fca1268aa7b0e45331082ceb07ab2b8fae9cbaf0e1d39ea88dea5957297f72c -size 50824 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments-2.png deleted file mode 100644 index 808e3eb4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:172759461686483d09366ed57ac054c62faff911638ae5250daf232cb31cbc62 -size 595805 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments-3.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments-3.png deleted file mode 100644 index 084e2ebd..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c18314877988773f5366398edde842e33691b963c42408223035b16b3309b021 -size 674604 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments.png deleted file mode 100644 index 46436c5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Fitting-Tool-Adjustments.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39d549ca0f4e1962d8d912bafef287997f459afc3e3f44ec8719242f358add27 -size 664945 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Tool-Mannequin.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Tool-Mannequin.png deleted file mode 100644 index 19c86559..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Accessory-Tool-Mannequin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f1747ea236ed4ed1604a80e536c68a121ab8cc17a7ff0a6dbeddb50392f3c90 -size 578224 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Adding-Surface-Appearance-2.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Adding-Surface-Appearance-2.jpeg deleted file mode 100644 index 42033c0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Adding-Surface-Appearance-2.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18d3777148a33067464a620d4690deeaa1099fce985f622b5d46697bc7df9afc -size 175985 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Adding-Surface-Appearance.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Adding-Surface-Appearance.jpeg deleted file mode 100644 index 9ded3281..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Adding-Surface-Appearance.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afc2b5ee831e5a5034eabcb6236b187243b5a75bb94c313effc4072d9e29f04c -size 205925 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-1.png deleted file mode 100644 index a51500d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d688290cdec3c704207d5553fc1c78fd5416e400f84838627c5459b6bfbb662 -size 61654 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-2.png deleted file mode 100644 index 26d055bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89e357b935bf2b673c012812e74722909404f65bc09f6707a1f94f0d0311be44 -size 20051 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-3.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-3.png deleted file mode 100644 index 4ecaeaba..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fca93fe25f287a13f6d8ab411dcbebea61a95a470addc09db7d67cdd10ce1147 -size 59877 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-4.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-4.png deleted file mode 100644 index 4a45a55f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd8996914a7067b45b9f96e26f68eb2405b98de0c96fcd973c01485269573e96 -size 33212 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-5.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-5.png deleted file mode 100644 index 89ccb3ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04f739e8b07f937abdaecee4825bce8f049c55a763bdb1bf0cb8f7b59a9994de -size 27384 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-6.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-6.png deleted file mode 100644 index 19ba5b43..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Body-Cage-Example-6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:563a62e9cbd9d90bfa3eca0f2169bbcbde8c59e983f2259ef913875a86901484 -size 29978 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Caging-With-Gloves.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Caging-With-Gloves.png deleted file mode 100644 index c861fa80..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Caging-With-Gloves.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bf47deaeb362bc5ccaa1150f96e851d3a0a685f6cdbd6de6529ffe872221bd8 -size 46794 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-And-Suit-Overview.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-And-Suit-Overview.png deleted file mode 100644 index 12603e36..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-And-Suit-Overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbe4ce9724946eb5df2639e88ac887b9545a843c9d3984c1f527c9bb66ad483c -size 497954 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-Model-Exploded.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-Model-Exploded.png deleted file mode 100644 index b6697692..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-Model-Exploded.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:141f7f7964ebe1ac778b56ff7e0ca6106237d5cf9a269e4559ba976acf3f1cba -size 24071 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-Model.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-Model.png deleted file mode 100644 index 99520a45..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Character-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0311e48d6b9f68b873a8a219351de526e1e68aa34d95f9c60553c9f23bb550bc -size 28607 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Design-Example-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Design-Example-1.png deleted file mode 100644 index 389078e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Design-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b82aac031b5aaf246b97dfa5a3d642dcdbecf2e399e6624772bf68c6af1a345d -size 71610 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Design-Example-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Design-Example-2.png deleted file mode 100644 index 57764723..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Design-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d763d53e51e0452f46826b6224b4c048fc1b41f01167b8d1ee852459a05b0595 -size 189700 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Outer-Cage.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Outer-Cage.png deleted file mode 100644 index 6e3e84f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Outer-Cage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1de212acf4b20f3c6c94d70d9a2eb40d0923266b0ea8b2b016d1074c4615e62 -size 155334 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Posing.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Posing.png deleted file mode 100644 index 2e303cea..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Clothing-Posing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f25239cba94c33b7f98fb76784019e7dffb622612e6858ae4a65a368305ed220 -size 30179 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Custom-Character-Example.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Custom-Character-Example.png deleted file mode 100644 index b64cb149..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Custom-Character-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0e825b8844aab40b6eb529c6ac980f031200d474f5420e9bcbb913be01eb650 -size 975917 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Glass-Surface-Example.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Glass-Surface-Example.png deleted file mode 100644 index 810cf739..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Glass-Surface-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5122cc8176bc4f6e30fe0154a00cc67d7aa62c37ce7b63fe5d3f2300da24d6a7 -size 802328 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Attachments.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Attachments.jpeg deleted file mode 100644 index 5a651a43..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Attachments.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2fe8a22f3ec9e59fed2b525f8238b7db12db58c93e4141ba771bc2eff895c10 -size 169374 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Equipped-Final.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Equipped-Final.png deleted file mode 100644 index 53108016..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Equipped-Final.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0285e954d6e421007342442cec07062b089a31f78f458e7854ba1cd2fda01a6a -size 981961 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Silhouette.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Silhouette.png deleted file mode 100644 index 450ab35d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Silhouette.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45995c306ddebf7c5f1214989532f57c02cf058c93e5524473be53906b26a2d0 -size 305696 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Texture-Map.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Texture-Map.png deleted file mode 100644 index 49718f52..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Helmet-Texture-Map.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3428e7287baccfa5bf20629fb608fe6d72fc16b08552cd6632091569b3a24882 -size 111519 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Importing-Helmet-Mesh.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Importing-Helmet-Mesh.jpeg deleted file mode 100644 index d7702481..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Importing-Helmet-Mesh.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2119957855f4ab7a04cdcf35af8994d0ba26385629b504f2741bad88d6da1975 -size 166147 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Layerable-Suit-Comparison.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Layerable-Suit-Comparison.png deleted file mode 100644 index 8b70bee0..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Layerable-Suit-Comparison.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8780a57c8616eba342a784c93b495903cb207ce3d80b255b94344a51d905a9d -size 547371 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Motion-Test.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Motion-Test.png deleted file mode 100644 index 0038dac7..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Motion-Test.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2e37da4864ecba37f3887e3aefba658292e85969d64f64543085c26c87144d8 -size 5607 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Replacing-Hands-And-Feet.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Replacing-Hands-And-Feet.png deleted file mode 100644 index 482f11e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Replacing-Hands-And-Feet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e5f74ca91e7bdf13940eda9203ab334e76b397abab83d6b3741d9f4751d4773 -size 292504 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Seams-Example-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Seams-Example-1.png deleted file mode 100644 index 7ca75598..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Seams-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:613a463f2fb00a7e1fe69a5cdeafe5c7ce08cc8827082303cc24f4ab14f8290e -size 42261 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Seams-Example-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Seams-Example-2.png deleted file mode 100644 index 609e2e9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Seams-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d99a626c7cc124a51afa9fc11f3e91b77925db285a9cab9a432f05bd5eacd387 -size 31257 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Shoulder-Seams-Example-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Shoulder-Seams-Example-1.png deleted file mode 100644 index dadff347..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Shoulder-Seams-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33152bc34bb075c1b73d8527992d2f184fd1be99f36dee45ed889b7f096c0c50 -size 41059 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Shoulder-Seams-Example-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Shoulder-Seams-Example-2.png deleted file mode 100644 index e0632da2..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Shoulder-Seams-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ecf8508020a3aef6983b3e3d5828adb7a34533294c4843b93f454d48618d02ee -size 41173 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Silhouette-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Silhouette-1.png deleted file mode 100644 index 4b9e8765..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Silhouette-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a25ad307174e95db2809bbab8896ff1a753c33e9612ee1746060fca8d978f2f -size 1623 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Silhouette-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Silhouette-2.png deleted file mode 100644 index ca202e6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Silhouette-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcc1af0a7f8903073db8fbdcd9a4fd0c5c9a0c04f14daf3187c04fbd58f29f49 -size 33174 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-1.png deleted file mode 100644 index 1efe8432..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b24a07291703a40f0ecb9e359285b26f2c4f66a9b065a4043d1e6ff0e94920b6 -size 2744709 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-2.png deleted file mode 100644 index 9bf65b15..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f6749450a53853127e4d144688ed4ba9a781e9950acdd1bd7fece108b7121c9 -size 2680020 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-3.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-3.png deleted file mode 100644 index d5c23593..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skin-Tone-Maps-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0359a784d6f2b5d19791dccd503c737becdfe4e6ec6ae7af9421597b793be9e6 -size 2831574 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-1.png deleted file mode 100644 index 6c6880fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f29c2821322308b98d1bb27be5cb2670fd3e89a20f4a6c7b03e5d766fc08b47e -size 73798 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-2.png deleted file mode 100644 index cf01769c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ce5eed775aa4433141c8d91e83d2235de10b3ca5f3a100a1c9758fb6a66836f -size 87407 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-3.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-3.png deleted file mode 100644 index cd9821cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1dd4cc09d6a546b4bf0827f18a890a73234b888c9f994b78ab3ae081f4dff959 -size 103131 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-4.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-4.png deleted file mode 100644 index 1d58b2f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Influence-Example-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7e6ba936b70447e97040ff6d8c779948e1b2597322f710262bc9f9ce4e77a3a -size 100919 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Movement.gif b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Movement.gif deleted file mode 100644 index b275e93c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Skinning-Movement.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6a7b0775c735e1aefa1ad38db84691c7853ea29392f9092697f2ab7af99b8fb -size 6583536 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Lighting-Test-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Lighting-Test-2.png deleted file mode 100644 index a2f7eb5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Lighting-Test-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d6efd34eb4df1e5d5f0e67675689be9feee3a049e0c753722ed3c85201dfef3 -size 173748 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Lighting-Test.gif b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Lighting-Test.gif deleted file mode 100644 index 643ca75c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Lighting-Test.gif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:259e0415a5104705ceb0431caf3f4af548f757ebdacabae3bd9859b696a56fac -size 7772966 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-1.png deleted file mode 100644 index 1601dede..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edca20b4db9246e405ee266bc70e0b494134ff6afb7a84b16d9175a902db0eeb -size 262717 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-2.png deleted file mode 100644 index 75aac861..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ba6933799b13071ae5fb3cdf162e483b335d1ff74393956f691e9d1af61c676 -size 10665 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-3.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-3.png deleted file mode 100644 index 131ebc8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8f89be6cdbc2eee081cdf006e79d0bd3ce534a85f75f8b4ae3e15ef38298f29 -size 92609 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-4.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-4.png deleted file mode 100644 index 91ee4207..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Suit-Texturing-Example-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:547fee2415f36fa1e31abe1acd4603821c2f7c15ff47d384bccc754ad6328257 -size 514661 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Texture-Comparisons.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Texture-Comparisons.png deleted file mode 100644 index 3f9d7476..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Texture-Comparisons.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96f21c4a7c6e528f118bdcc0f17b28626c56c246e9df212d14e43e91f96b8c73 -size 408845 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Texturing-Showcase.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Texturing-Showcase.png deleted file mode 100644 index 716b9602..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Texturing-Showcase.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab8f769594a70eea1c30bd2ab3bacacc57b5ca8b289ea5eb4ab9b4646c0d41bb -size 670818 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-1.png deleted file mode 100644 index 54544641..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dea1e0d933945ccba8fa6cef10f1abfd5499cafea2fd4e35e78032073b0cac65 -size 147878 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-2.png deleted file mode 100644 index 3a1255b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82289c8cf6b0512f42cd223969bbaa993220f0aedf4c9b40d6eb29d204228761 -size 29608 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-3.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-3.png deleted file mode 100644 index 328a910f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9450fea84abb7116dcff5217da030e81c918a7a3fee778a11a9e482788f18901 -size 116241 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-4.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-4.png deleted file mode 100644 index 7d7f5530..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Trim-Map-Texture-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:851576847a1ab40fd4bfa5f2f7380a77d7b8ab7cddb1d1f9c44b3a847abfd565 -size 31754 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Diagram.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Diagram.png deleted file mode 100644 index 2cdd923e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:407706431444029f8164b32fcbc1660c28178e2673dededa478df124fab941c1 -size 258830 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-1.png deleted file mode 100644 index c51a2e50..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8b9c3c167bf89922c8c485d11571186d467f821fc1d12539396e468abdf0281 -size 3930874 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-2.png deleted file mode 100644 index f73c4335..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74e83fd82f43991a7ebb12a3b8690969c739c5ab680d45a499ce58166c21d1b3 -size 24026 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-3.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-3.png deleted file mode 100644 index 5625c9e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7b238c78ef6c9c7433007b96b1c7d18aea86c276a17d93869d8970e384aefc1 -size 584048 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-4.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-4.png deleted file mode 100644 index 605d5e47..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/UV-Maps-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ea387d273acc7ded579b25885261fc53cba66673fe0a00756279f70a27b94a9 -size 1252803 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Unique-Characters.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Unique-Characters.png deleted file mode 100644 index 97197c75..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Unique-Characters.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44bef3b5c84b338f3231cc1ea98c184bae09789c7e1f38f83cf623daf4e2b6e3 -size 448083 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Vertex-Influence-Example-1.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Vertex-Influence-Example-1.png deleted file mode 100644 index af67a264..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Vertex-Influence-Example-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52ba1c4a74d02e0ac2a6cbb7c48d399bd4d253fd448bac42cbf93b1dc1ef3c56 -size 74354 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Vertex-Influence-Example-2.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Vertex-Influence-Example-2.png deleted file mode 100644 index 8b402a33..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/layered-clothing/Vertex-Influence-Example-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de0d6f54146a6fe1be78e313ad7afb52aaef9a58a28eb40bcc14d67a3e8fab98 -size 18409 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/In-Explorer-Sound.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/In-Explorer-Sound.png deleted file mode 100644 index 9f1c11f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/In-Explorer-Sound.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29c5552eccae5c2d7370932bae72845ab20e75f5d480995fbe18a375461e0227 -size 34446 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/In-Studio-Sound.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/In-Studio-Sound.jpeg deleted file mode 100644 index 9681f8f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/In-Studio-Sound.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9adbcf44919634014ff8b35ddd574a5dd9fa1f41c065435fb6a7d1ce857ae938 -size 150732 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Banner.jpeg b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Banner.jpeg deleted file mode 100644 index 3d349051..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Banner.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf15bc11186c8e67a610f1534d8f573945b26ef7fe7340768e5f7cbc1c3f9937 -size 389694 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Properties.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Properties.png deleted file mode 100644 index 89b1fd65..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:975c597b95cae882b750a8063a7d1067ea753ce731ebed43b570d85df010f1bd -size 15833 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Structure-Properties.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Structure-Properties.png deleted file mode 100644 index 952b9e2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Structure-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b0d75194a71f5ee5264ccc03efd6f529668319e1a8922e553e7c996414e3191 -size 64124 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Structure.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Structure.png deleted file mode 100644 index 1b8e089c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/sound-design/Sound-Structure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e08b0e2f6a9cd4e1ed5c25df10dfc34eb7749fec6aab46e16a0d79c8582d9407 -size 65887 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Final-UI.mp4 b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Final-UI.mp4 deleted file mode 100644 index 9154b523..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Final-UI.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef9040051fbab06da7ea63ea5973a7bebd237b6eaed865c375d4fe226d256418 -size 4948722 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Light-Properties.mp4 b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Light-Properties.mp4 deleted file mode 100644 index 96ea1bc9..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Light-Properties.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70bf667119fc6322d0a9da89a0315553e7189f43e19a651fc8552905b87983f8 -size 2406495 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Parallax-Example.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Parallax-Example.png deleted file mode 100644 index 2cd57950..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Parallax-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5215828ab0b4ebe4ab14bd5a231e6d1a11ff73a415ea662e7bc42a4a20e440ef -size 2017828 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Proximity-Prompt.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Proximity-Prompt.png deleted file mode 100644 index 8388df50..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/Proximity-Prompt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d61f114fe00487b6a33a346334798d5069803f15d0d80490c380e830fe1f3054 -size 28152 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/StarterGui-Adornee.mp4 b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/StarterGui-Adornee.mp4 deleted file mode 100644 index e9c1be8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/StarterGui-Adornee.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23900ce9a51a01b32048879af70b1009a7e38a3b2f64df7649029e9fd7aed971 -size 806175 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UI-Export.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UI-Export.png deleted file mode 100644 index 486cf6fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UI-Export.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45bda9de9094746ea90dd02fbb4678bb2c619c0c6f9eab553e9f1056c3af3e7e -size 424555 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UI-Mock.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UI-Mock.png deleted file mode 100644 index 415d4d9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UI-Mock.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9abafd7b8fe6e91c3a45848aceb54c8c4b5c6df5e86989bec0707efd653b82fc -size 2375044 diff --git a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UITweenModule.png b/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UITweenModule.png deleted file mode 100644 index 603ff218..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/beyond-the-dark/user-interface/UITweenModule.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c97f749057ed11775bf9cc3065076d000e35bb8416df45f551b1030503eed99 -size 8557 diff --git a/.cursor/rules/roblox/en-us/assets/resources/city-people-cars/CPC-Slide-D.jpeg b/.cursor/rules/roblox/en-us/assets/resources/city-people-cars/CPC-Slide-D.jpeg deleted file mode 100644 index 8096176f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/city-people-cars/CPC-Slide-D.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:279fdb77fcc810460ce06c3112cc6df5ce3fda0ba833d3b0ad3d539d52c5916d -size 147889 diff --git a/.cursor/rules/roblox/en-us/assets/resources/city-people-cars/CityPeopleCars.rbxl b/.cursor/rules/roblox/en-us/assets/resources/city-people-cars/CityPeopleCars.rbxl deleted file mode 100644 index e2386205..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/city-people-cars/CityPeopleCars.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0b22678948c24d65250ed6b9b725b06415fd83235b97083029235982db10aa3 -size 36873933 diff --git a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Intro copy.png b/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Intro copy.png deleted file mode 100644 index 3cec5ee5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Intro copy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9764e9c7d39f08b405f57b75846a746fa666487dda842396b97bc8b75e74c0e9 -size 461438 diff --git a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Intro.png b/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Intro.png deleted file mode 100644 index 835f8c41..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93137960ab112b88d89412a9886148a06c80ba4d7fbb4388c9e5991a7d9086e3 -size 459936 diff --git a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Small.png b/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Small.png deleted file mode 100644 index 3cec5ee5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Bundles/Bundles-Small.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9764e9c7d39f08b405f57b75846a746fa666487dda842396b97bc8b75e74c0e9 -size 461438 diff --git a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Missions/Missions-Condensed.png b/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Missions/Missions-Condensed.png deleted file mode 100644 index c2a23efd..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Missions/Missions-Condensed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:701323c87721760f8127a9b8d10e21196017f477bfc24630520581f47c171b44 -size 152789 diff --git a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Missions/Missions-Intro.png b/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Missions/Missions-Intro.png deleted file mode 100644 index 4ba37421..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Missions/Missions-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9310861cd5250de4a235b9181003cd8ad566f519f68cf86aaac3a1d16b20beca -size 718482 diff --git a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Season-Passes/Season-Passes-Intro.png b/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Season-Passes/Season-Passes-Intro.png deleted file mode 100644 index 1a9b41df..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/Season-Passes/Season-Passes-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50b1bf1d29865aaa20f807e116a4a18ae186e618b7c33366122df7389df54b69 -size 275791 diff --git a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/engagement/rewards-annotated.png b/.cursor/rules/roblox/en-us/assets/resources/feature-packages/engagement/rewards-annotated.png deleted file mode 100644 index 2ccdc5fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/engagement/rewards-annotated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4eed76b523728e21f65825eac87fe4c0a66d9945463b153f5e6084b8e432cf7b -size 714480 diff --git a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/engagement/rewards.jpg b/.cursor/rules/roblox/en-us/assets/resources/feature-packages/engagement/rewards.jpg deleted file mode 100644 index 8550ce5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/feature-packages/engagement/rewards.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68e9281d3440232e16bddc3085227f5a774532d14967f3f4acc3316dcd2d4c3b -size 117038 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/armillary-asset.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/armillary-asset.png deleted file mode 100644 index 23239f88..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/armillary-asset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3088dfe75a4ace91cd755ef01fd2e8d02ff366df8eaa9ca7849a5dbed78f97b -size 978847 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/armillary-model-package.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/armillary-model-package.png deleted file mode 100644 index f0b528bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/armillary-model-package.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0c27bc95040b5d073fadf7ba47135901eeb73dc55808cdf317567d9b04c1a29 -size 86399 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/asset-storage-place.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/asset-storage-place.png deleted file mode 100644 index 43099b0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/asset-storage-place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e4f237077aad61e7ed837655308f0bd752f0a6c31e82d8d12c55089c195df27 -size 1074360 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/assigning-textures-crow.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/assigning-textures-crow.png deleted file mode 100644 index 2d946e91..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/assigning-textures-crow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:690ef622d6c4e9f123cc776ffd48f75fb82092f147114cd70bd4ad69cbe97017 -size 1651745 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-attic.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-attic.png deleted file mode 100644 index 9e88608f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-attic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbf23190f96207aa9a1798cfaa50ce5ce6b72ab4c2c3b2c312ae4b505bcc917f -size 48326 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-dining.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-dining.png deleted file mode 100644 index 203f66ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-dining.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62105a7d0e236c83a290ee241b72b6223e52926d1b7261a6d874c46e17a5a42d -size 74715 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-foyer.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-foyer.png deleted file mode 100644 index cdfcaf91..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-foyer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19d41dfc8f80f24046ef3fdac91212916cf8314b2d7a357b11c1aa419a1e9a35 -size 61132 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-second-floor.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-second-floor.png deleted file mode 100644 index b7156fde..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-second-floor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0a33662c7c0faf03db55eb6ef97bd3e75f809b3555d1699d40533068f96bb4b -size 74434 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-whole-house.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-whole-house.png deleted file mode 100644 index 8a99dc35..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/blueprint-whole-house.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11a7b960af257c7e8746ef1763b9b3e66ab0a9392ef9745db37c2ea2b964d547 -size 123485 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/convert-to-package-dialog.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/convert-to-package-dialog.png deleted file mode 100644 index f8dcf77c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/convert-to-package-dialog.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1dc26eb50fe49843054ec2c2d7876cd71c0218788d9922e78838f70301b3d04 -size 36479 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/crow-cleaned-up.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/crow-cleaned-up.png deleted file mode 100644 index 1b116d99..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/crow-cleaned-up.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d53b93344a7ee395bc6141483e68a6d6eab7fdf9ac9ca5f6920a4f45e9302839 -size 746884 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/crow-notes.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/crow-notes.png deleted file mode 100644 index c417b93a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/crow-notes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d136e3acfcbba6e08aa71a1cd2e1cb4c9638c0d86aff0741c4546f0fabb152b -size 1065000 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/decimation-crow.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/decimation-crow.png deleted file mode 100644 index c86e134c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/decimation-crow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:069f53910ab75c242a81433b4c5268faf45784704b88a21e0a7cafd498141e58 -size 356529 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/decimation-settings.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/decimation-settings.png deleted file mode 100644 index 9a683767..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/decimation-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b19c69d79818d5a8e2a05d2401719e3ef1c4a44398ea2d19cc2f28ea9763840c -size 22607 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/earliest-version-toolbox-house.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/earliest-version-toolbox-house.png deleted file mode 100644 index 4da24109..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/earliest-version-toolbox-house.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f73a59f3cc26125f14a6460b143c7863dc18ce37edbd21907a3810c71c96830 -size 969897 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-concept-approach-house.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-concept-approach-house.png deleted file mode 100644 index a245b4c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-concept-approach-house.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40a0453184dad278cdf67d8419ae8055a01ef1bdc147bfd29d5836a24b317607 -size 434923 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-draft-playable-area.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-draft-playable-area.png deleted file mode 100644 index 149794f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-draft-playable-area.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:783bdb236d001098e46240bb397f136cee136d9f334b772847dae459ba9a8842 -size 1200412 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-shot-driveway-approach.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-shot-driveway-approach.png deleted file mode 100644 index ade9de80..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/early-shot-driveway-approach.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bff0fb5b8f8d194a5dee7f7c737332dac4575bd0cd8eee417f55bc210e7a12ec -size 1356916 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-candle-asset.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-candle-asset.png deleted file mode 100644 index 04bed0e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-candle-asset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9dc648b153caaa1d8456146ce163b0267b8cd040065d89c308c1c6219d3e449f -size 1482786 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-content-versions.jpeg b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-content-versions.jpeg deleted file mode 100644 index 82f8b1df..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-content-versions.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e94c4d517d48d81909ab03f63f07e7e80ff147d064dec676ff61a7d28a445d7 -size 241488 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-crow-asset.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-crow-asset.png deleted file mode 100644 index 7c5ca418..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-crow-asset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:953396bd8802ae9201132f28e70aa578ff32d9dd8e02d796cfb80572750185ca -size 1278841 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-foyer.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-foyer.png deleted file mode 100644 index 7e54af56..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/final-foyer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e02708d3a3816681d4caa516b3011fbba0bdd06146ebcdfe8795e1fc8a0b50b7 -size 1090436 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/freeform-settings.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/freeform-settings.png deleted file mode 100644 index 6eab2ed1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/freeform-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:579efce00c893353f5cdf95fed3ae53d75c8d93a4d5c18bb63274537e0064fb3 -size 20943 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/furniture-spreadsheet.jpeg b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/furniture-spreadsheet.jpeg deleted file mode 100644 index 7d4d8aba..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/furniture-spreadsheet.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb03647c5d2ab87cf5fa48d787b91869ffe9919daa370e72a8869973f275fa6b -size 294934 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-boxed-versions.jpeg b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-boxed-versions.jpeg deleted file mode 100644 index b5af3104..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-boxed-versions.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6a405885c96154fcce506d9cbfbabaf2a74b580c505728743875df5b89c0ef8 -size 145413 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-front.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-front.png deleted file mode 100644 index a5b972f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-front.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7fa76bc0764e9cac474fa791c7aa53572c3b4a535228a48965256a574c44b8fc -size 22412 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-side.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-side.png deleted file mode 100644 index 54439b4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-side.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6406537a26eab7e770d2ba1241e2b6dd1264beb9b609c1632a1d8d9f4fe7068d -size 63112 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-top-down.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-top-down.png deleted file mode 100644 index 41e85dbf..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/gray-mesh-top-down.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d216e06587b08ad8b59189587cdaac2f5946cb37f537e836cd3575cfeb2e76af -size 16692 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/hand-draw-crow.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/hand-draw-crow.png deleted file mode 100644 index b3e6211f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/hand-draw-crow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a16d68998207068a1a3824f95a30669c6acaeae8b5320c0a33b4657e60652ac3 -size 597732 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/metal-surface-appearance-package.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/metal-surface-appearance-package.png deleted file mode 100644 index ca551821..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/metal-surface-appearance-package.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1a80236c9c4a21a5216f896373cac3db5ef6e342470cb441afe0db934db4667 -size 92653 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-automated-uvs.jpeg b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-automated-uvs.jpeg deleted file mode 100644 index d1acd256..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-automated-uvs.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3df0c5cec402c56defcab5b75a2481ba227bfc9c2d2177c04dfecabaa8467ad -size 356978 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-candle.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-candle.png deleted file mode 100644 index 2bd7a460..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-candle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbd297e1f7a379787ad735d74804fe4eaa621dae43a4c7d43caf15d0f8f7b767 -size 2057584 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-crow.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-crow.png deleted file mode 100644 index 6218bc90..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/original-scan-crow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6c5f00feea525234d83b666d3fc6da5d9e6f1b38fe4fd7ab108f644860e9c73 -size 2029394 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/overlapping-crow.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/overlapping-crow.png deleted file mode 100644 index 28a7aeec..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/overlapping-crow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48b790c83be00d1bb9cb93b02d6d9ad16d6baf252b05bf727106d053cad3af41 -size 445827 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/overview.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/overview.png deleted file mode 100644 index bb78b8a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2d97289b8d063bf9cce9e13ac271e166e4a38138010d9c83825df21fe858299 -size 1289220 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-corrupt-state.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-corrupt-state.png deleted file mode 100644 index 13ca1832..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-corrupt-state.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ee4297f954c3b4a398b16635da2d7bf2f4c84220153ab85da07f5985dd6e77b -size 1548358 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-entire-bedroom.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-entire-bedroom.png deleted file mode 100644 index d3356616..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-entire-bedroom.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3214b6866bc4570951b1159f798ba2223e3e589a9e645ac631114d527fbc92b -size 804719 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-normal-state.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-normal-state.png deleted file mode 100644 index 7b024fd0..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/package-normal-state.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fb6092d7fd490f3ebb6b31d2bae65fbcf521a7e046cfb37e0be67019957e283 -size 1268856 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/pbr-textures-1.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/pbr-textures-1.png deleted file mode 100644 index 45552f3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/pbr-textures-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4920c1524e289734214833e6d2793b2fda2233026a8457ade6ca1a53f262bf32 -size 731512 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/pbr-textures-2.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/pbr-textures-2.png deleted file mode 100644 index 5ba001b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/pbr-textures-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f475532a070ebadada949e6d71e6fe44fb8e47debad3da66c73e0dc955113529 -size 935101 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/retopologized-candle.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/retopologized-candle.png deleted file mode 100644 index af3a2a66..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/retopologized-candle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3b558bd4281eea2b93fc0009043d8c5bb0f1bc67927ad5165f2f17d2b511fb8 -size 1676507 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/retopologized-crow.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/retopologized-crow.png deleted file mode 100644 index 3dd43a41..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/retopologized-crow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96164cdcfbefd317318bc9f1cce99ced6237527b165d6ec234112957f4ec83f5 -size 1699429 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-final.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-final.png deleted file mode 100644 index 83ee8168..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-final.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbc19cf8a18084d9dbd2c2014e3435e7415794dc92235b6f69a51167e503a079 -size 332920 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-inside.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-inside.png deleted file mode 100644 index f2769f62..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-inside.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd3f39f33e3171c84516f70d1848dce1605a603d8283a8d6c1aec8637bf6481a -size 287133 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-outside.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-outside.png deleted file mode 100644 index 2fcc1a0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scale-outside.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8c6cf95b3bbe411c24003b92fe2e84bf61809461f0cb3941c7167f5b535b265 -size 253687 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-candle-final.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-candle-final.png deleted file mode 100644 index 2bd7a460..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-candle-final.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbd297e1f7a379787ad735d74804fe4eaa621dae43a4c7d43caf15d0f8f7b767 -size 2057584 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-crow-final.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-crow-final.png deleted file mode 100644 index 6218bc90..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-crow-final.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6c5f00feea525234d83b666d3fc6da5d9e6f1b38fe4fd7ab108f644860e9c73 -size 2029394 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-texture-1.jpeg b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-texture-1.jpeg deleted file mode 100644 index 70b42843..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-texture-1.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6752764901f4571a8dcaf96c0755684719e7197dc8585d2066b6d18bffa02f5 -size 537303 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-texture-2.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-texture-2.png deleted file mode 100644 index 14f5ff32..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/scan-data-texture-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1d4162edfcd5308f4120caaeabcd736ca55b7313e395cb89f9c46a89926662d -size 2728833 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-1.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-1.png deleted file mode 100644 index 90355c47..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90cbb16f2bdd302f0c9b3f106448dbf89cf6f81e12c44bfa23c103610f67715e -size 1247950 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-2.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-2.png deleted file mode 100644 index b09e6cc0..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47199dada7e4258189062316316c41e7813b4fb5eace87e074968ad26721f553 -size 150104 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-3.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-3.png deleted file mode 100644 index 339ef02f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4796ea395dcefbb0ff2f908e1e497d2083fb4c175362a420e1d3da480babbb6 -size 577305 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-4.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-4.png deleted file mode 100644 index f5c44315..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/texture-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e90b698587123aadc6047250f678f67fb4b6c1a5c39c43a9840dfade0e943ffb -size 478562 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/zremesher-crow.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/zremesher-crow.png deleted file mode 100644 index 793d8543..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/zremesher-crow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53eca7e6aa6c4ea6cd8327af9e3c0b72a022dc5b8e0081273401b4a836065b37 -size 357492 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/zremesher-settings.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/zremesher-settings.png deleted file mode 100644 index 6ecb2176..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/constructing-the-house/zremesher-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb7418124b09289fefcff0e039aa572ffce61d12af8bce9646ad2a7c9c16bbab -size 18456 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/audio-volume.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/audio-volume.png deleted file mode 100644 index 3f4ecad8..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/audio-volume.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:737ab4f83a41cee35069f500c3100ad1b0d31e428fe1473f2463f9d5fff28dc4 -size 1085698 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/car-part-volume.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/car-part-volume.png deleted file mode 100644 index d7d63fff..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/car-part-volume.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1730e84d317c5094506bfdbbba102739c65e44987bd1f03007f705c61f9ead6 -size 790111 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/compressorsoundeffect-properties.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/compressorsoundeffect-properties.png deleted file mode 100644 index 54330deb..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/compressorsoundeffect-properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3bc53c8d800c1c04f698fc79b3a5097cea074acb2c658b007805ecd22c3a04a -size 6129 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/exterior-audio-hierarchy.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/exterior-audio-hierarchy.png deleted file mode 100644 index a86d1ee8..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/exterior-audio-hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c84e75cb7f57269ede255b8deded05668907616f99bc67447d0633d0d00f2a4 -size 25178 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/main-audio-mixer.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/main-audio-mixer.png deleted file mode 100644 index ebf09ffa..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/main-audio-mixer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1efb353d84cc57128a2b9c90f116113877def11b481345d7315722ed75db1f9e -size 61854 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/overview.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/overview.png deleted file mode 100644 index 1e2cb9c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce7de795ef6696fe4fc25ca72df1f3bd653f8e2a6daa444b39d6ef954742a6e6 -size 1871769 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/sound-emitters-hierarchy.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/sound-emitters-hierarchy.png deleted file mode 100644 index e9c260fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/sound-emitters-hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c1ec1b093c0f1fae30161b088502ccd16fc14320394c56ea08ae77a4bd4b15c -size 16536 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/volumetric-audio-emitter-greenhouse.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/volumetric-audio-emitter-greenhouse.png deleted file mode 100644 index 8e2c8a5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/volumetric-audio-emitter-greenhouse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e6ac2ad5d80e5b93d8c5c5852b372e24fae8550a40febebe0332e9730e4e8f7 -size 802921 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/volumetric-audio-immersive.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/volumetric-audio-immersive.png deleted file mode 100644 index d494fa7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/designing-dark-soundscapes/volumetric-audio-immersive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb238f16b8ec0fccccae250b4f4d9b7b27cbf2e31cb79a8f2d0a071467bf0bda -size 1154510 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/animated-trees.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/animated-trees.png deleted file mode 100644 index 55567670..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/animated-trees.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3513f445a9ef4ea87f7e33b56a2c0d1d1997820f5d6e45b517e2efb9a0dbc2b -size 2039695 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/base-piece.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/base-piece.png deleted file mode 100644 index cd499f56..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/base-piece.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:568ffc637010382769d2efde6e51e8fdf3ae0c2804e8e33cf2c656a1846d7def -size 402639 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/beechwood-joint-animation.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/beechwood-joint-animation.png deleted file mode 100644 index a691d919..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/beechwood-joint-animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d88b706fb360394f7dd9e2e96ffdb941f4d98995cf3f325196e8f3b41a3e3c44 -size 260610 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-billboard.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-billboard.png deleted file mode 100644 index 5d0be727..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-billboard.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45c94177fcf4f1f004fd9a4a2d8ad6a4a4d3e8b1c0464b971ec2d3650435e5f3 -size 163858 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-shading.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-shading.png deleted file mode 100644 index 56807dbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-shading.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e38eb1bbec74ad434470563570d2d6c69b59b8edb077351c717d11501b87c3c -size 1211044 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-texture-on-parts.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-texture-on-parts.png deleted file mode 100644 index 04342073..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/cloud-texture-on-parts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:377786e15d6e8b8c57c5e12bd9e500d5c1fbdfb0b77516bf22e184029a87a555 -size 1028279 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/collision-fidelity-treehouse.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/collision-fidelity-treehouse.png deleted file mode 100644 index 4ba03138..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/collision-fidelity-treehouse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2962f1ac61f9a385384b55c6dbce105b4175d04288e7101e6f30af991d4eacea -size 1676640 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/debris-volumes.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/debris-volumes.png deleted file mode 100644 index ef223a01..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/debris-volumes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c076c212ca149dfeeb67789e8b9dd3afa06ef3e2e7ee8feed930dc08207044b -size 1585847 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/eye-of-the-storm-1.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/eye-of-the-storm-1.png deleted file mode 100644 index 6d86c215..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/eye-of-the-storm-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df2047c67bae3bb84fa74862e0312a91f90c491c5361e6e7358b7ec1b8e8156e -size 714594 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/eye-of-the-storm-2.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/eye-of-the-storm-2.png deleted file mode 100644 index c2dd1607..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/eye-of-the-storm-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88f61a78381c64fae31d2a374d0118077866a16fa4b3e35bf3a0475b0c8983d0 -size 921495 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/false-wall.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/false-wall.png deleted file mode 100644 index a064faea..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/false-wall.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6d22f75975fb48f7256035fb142670c3f93268dab8ac97e0da49af2db403378 -size 672577 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/fog-particle-volume.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/fog-particle-volume.png deleted file mode 100644 index 3300a332..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/fog-particle-volume.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22be56e3b1c5832a0e34f628de02a30907f67ffb476596084835bf8ea111ecdb -size 1581100 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/fog-particle.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/fog-particle.png deleted file mode 100644 index 3fe16fdc..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/fog-particle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa40a2df1fab8c20553c7672e54e84e3b29b19a30ec26fd17e03054d702fab40 -size 287146 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/forest-pack.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/forest-pack.png deleted file mode 100644 index 233741e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/forest-pack.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5bf955efc6b7e2d41786e206b8a8def42c5929cf5a58bcacbc14abba39b7c879 -size 1931515 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/friends-spinning.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/friends-spinning.png deleted file mode 100644 index aff00747..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/friends-spinning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edcbf7f60059840c2ebb4c92d6e544b2969945c269a00c316be5f6a12dabf6ec -size 1729412 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/high-poly-sculpt.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/high-poly-sculpt.png deleted file mode 100644 index b9046105..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/high-poly-sculpt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e923d3c2d41a3dee20544d40abea5a73447490bbc769b3b37c63123ae83d88bc -size 406097 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/hingeconstraint-properties.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/hingeconstraint-properties.png deleted file mode 100644 index d9795144..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/hingeconstraint-properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:928c8f9feef33f36bc02fc726f4ae6db0b77e27b1831ecbae59f76786e516c69 -size 67350 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/illusion-image.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/illusion-image.png deleted file mode 100644 index 96390d31..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/illusion-image.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e9d0d43eee6fc919533cb5c18f452baa188a945d27f4f2ed80a6b84c18ee6ed -size 999767 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/layered-cloud-meshes.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/layered-cloud-meshes.png deleted file mode 100644 index a5e76fda..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/layered-cloud-meshes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30ee7d7a6fda000f6d21b83a46162636434e0d5c6d902cd3e53b4aa45271edd0 -size 615968 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/leaf-particle.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/leaf-particle.png deleted file mode 100644 index 68a26dea..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/leaf-particle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a4babeac6384fb21007d8f799de6650be31561d87486eba2b5e66b762f009aa -size 77111 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/lightning-bolt-photoshop-settings.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/lightning-bolt-photoshop-settings.png deleted file mode 100644 index 4401150c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/lightning-bolt-photoshop-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c99c140c3ba6e6521249cabfe93cfcbe66636f37cfb49b31bce0e0587844505 -size 3773 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/lightning-bolts.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/lightning-bolts.png deleted file mode 100644 index 1e1ae201..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/lightning-bolts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e995027c5dabdcd01a47d4addbe1d541b262fc77a111cdd38ed9f76e61d28791 -size 26186 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/low-poly-mesh-with-normal-info.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/low-poly-mesh-with-normal-info.png deleted file mode 100644 index 82e01ad9..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/low-poly-mesh-with-normal-info.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:903279248dd149f46cd3b8302cb811e07941f9e097a3b330288173c81a4682bb -size 499952 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/low-poly-mesh.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/low-poly-mesh.png deleted file mode 100644 index 34548902..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/low-poly-mesh.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:903dda380f5d2317a7c0e93bba42c3c27c45910cb5adb8efa9b81f1bdf8c2a85 -size 444839 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/main-vortex-settings.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/main-vortex-settings.png deleted file mode 100644 index 3894066d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/main-vortex-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24dd61ae072760882c8025adb75144f11a7bf377441797540e40b0500471b566 -size 3946 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/movement-example.mp4 b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/movement-example.mp4 deleted file mode 100644 index 021ecdb1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/movement-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b04a8a3a0068e68231ddf652f5b62e33c3f5c09f19b5def05284825d6a2c7625 -size 9748940 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/obstacle-course.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/obstacle-course.png deleted file mode 100644 index 6c117f96..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/obstacle-course.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a56f2fcfc0e0649a14f08ad444eb04fbf6964f0457afc38d8af670fef92ac335 -size 2121797 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/pantry-corrupt-state.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/pantry-corrupt-state.png deleted file mode 100644 index 0185ad07..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/pantry-corrupt-state.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08db9eb7fd502419067a0a4a64a879b26004b3dce031def11b4cb8a7dea7d5b9 -size 1049966 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/pantry-movement.mp4 b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/pantry-movement.mp4 deleted file mode 100644 index b0d6be3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/pantry-movement.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83d5d95d9c8ebd896584c3365001de58cffb6ebba338f368e237cabe2de24600 -size 11420768 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/part-volumes.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/part-volumes.png deleted file mode 100644 index 558ec166..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/part-volumes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:405d7934f0f3f552268209d1337e9f7cbcc85735a0bdde12aca622b96f730148 -size 1046427 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/particle-emitter-properties.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/particle-emitter-properties.png deleted file mode 100644 index d908cbe5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/particle-emitter-properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7d3e5ecac3e17d2db350a96d0cf6d50c49d0da8dd632449ffdd86cad2932ce2 -size 30378 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/particle-emitter-settings.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/particle-emitter-settings.png deleted file mode 100644 index 2fc6bd04..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/particle-emitter-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20579045260e6f02a662eb669dceae782ca75a64b8cbcb220ef775d043c3f956 -size 27737 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/redwood-tree-animation.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/redwood-tree-animation.png deleted file mode 100644 index 587b7495..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/redwood-tree-animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:661eac67cb3e0c639e7c00e89e2542a282f8036b67147b3ad4e86b6b3f504264 -size 1673949 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/show-decomposition-geometry-disabled.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/show-decomposition-geometry-disabled.png deleted file mode 100644 index 6ddce213..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/show-decomposition-geometry-disabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7c22a647c1a0abc4abe3f5bad87fb970246c505eff0edee4fea3e69aa77383e -size 1918432 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/show-decomposition-geometry-enabled.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/show-decomposition-geometry-enabled.png deleted file mode 100644 index 93aacfbd..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/show-decomposition-geometry-enabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3353362dfb49b719a63f20ec3b59f22581b25d3edb618f24826bd49a6167f96 -size 1282255 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/single-cloud-mesh.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/single-cloud-mesh.png deleted file mode 100644 index 4db3e605..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/single-cloud-mesh.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a35b175ca28956ae5af541a6aaffd99c7d6056188d70e9226d1afad90b160b26 -size 727847 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/son-puzzle.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/son-puzzle.png deleted file mode 100644 index 13ca1832..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/son-puzzle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ee4297f954c3b4a398b16635da2d7bf2f4c84220153ab85da07f5985dd6e77b -size 1548358 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/spinning-elements.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/spinning-elements.png deleted file mode 100644 index ce177fc5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/spinning-elements.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea3d87399e666b6c2c94dacb5ddb381289734a8abdd866097f3725d9b210220e -size 1822187 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/squash-20.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/squash-20.png deleted file mode 100644 index 85f0ef16..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/squash-20.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6e3e1aeecce0dc00952e567cceacae1b28feea5ed5fc9fdec4bdbe1522980b6 -size 539957 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/squash-3.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/squash-3.png deleted file mode 100644 index 90ded381..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/squash-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:597aff25b71f47f8ad4de926a0f8d1bf783a1a142424cbfe7b0f94bdb330385f -size 340011 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-1.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-1.png deleted file mode 100644 index 2f61a21c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:980f4397db8fd52a847bbfde306061aade39db0a42fc3dc7788f8d776ec5cbda -size 252298 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-2.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-2.png deleted file mode 100644 index 7640f550..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:078534d45c0d7783a66e0c6e72f74a4aa429667101fd6fc05d4131758ab46851 -size 1259589 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-3.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-3.png deleted file mode 100644 index 4c5ef1fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:494cd5dbfc9d61d3da7bcc7f5b6b5ee325b9213ee540f2cb9ee45d72f346600f -size 1506235 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-4.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-4.png deleted file mode 100644 index 295bf0f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/storm-iteration-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:920d0cd584162e2330e0e5dfec5f2567442fcbf4f6941076484e8b1b78b4d3d9 -size 2506970 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/target-closed.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/target-closed.png deleted file mode 100644 index c98305ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/target-closed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f0b50b90bc937de2fa848c506572279516a2773f6c0cac123e262e23b9ff8d6 -size 1291735 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-animation-import.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-animation-import.png deleted file mode 100644 index 536ef86d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-animation-import.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9dcdce68c46cd298c0e248b2ce0109f4ebff20d7530416c725da97972d1665c -size 827937 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-hierarchy.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-hierarchy.png deleted file mode 100644 index 85fe80da..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff05a06651bf8085dbae2d560a9936b0832f1879032123a081594d9350fc8521 -size 1257461 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-joints.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-joints.png deleted file mode 100644 index 6b2a9e4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/tree-joints.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1eb32413bdcfd98179d43e3c86ec26d484dc9c5bc5bb89457b0c8a466c51ed1 -size 364075 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/treehouse-mesh.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/treehouse-mesh.png deleted file mode 100644 index a986b162..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/treehouse-mesh.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d24d4f2206b738e96ef9cd7115e4baea9f0a62a5b0795045fb8fe52507d809bf -size 2655854 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/treehouse-texture.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/treehouse-texture.png deleted file mode 100644 index e9efe14c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/treehouse-texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eca1cdf6dcb46780bfb95b773c0474e4e7d9663188f6302bf0c8ea6d26a1ba3a -size 1614334 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/unanchored-platform.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/unanchored-platform.png deleted file mode 100644 index 3cf3fb38..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/unanchored-platform.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:502f8afccce07fd7e084f485564cb47cc36a994afcec614209edeae807fc7ab6 -size 411853 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/vertex-painting.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/vertex-painting.png deleted file mode 100644 index 7583801d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/vertex-painting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbaceada53d6911ac5dc5c0a1738c946d2529e4500a3db5621a7dec3590390e0 -size 79734 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/yellow-part-volume.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/yellow-part-volume.png deleted file mode 100644 index d9f8ef3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/developing-a-moving-world/yellow-part-volume.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:631c0bfbbab790aa3931fe307b1fdfbb87ce54abd16dc7f2b8acc398922a0b06 -size 955913 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-interrupt.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-interrupt.png deleted file mode 100644 index 77f22b80..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-interrupt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c72fa0f8daf4aa709e2e3e895a088123c34259540ecc26de26b33e1cdc46cff7 -size 1432995 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-purple.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-purple.png deleted file mode 100644 index 9b180c91..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-purple.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f93b42f27b71fc9539d27f34f1bb28157ce694aeb43ebe8d16ffa3e6da4824a -size 1226510 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-white.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-white.png deleted file mode 100644 index 72c39317..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-white.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:178f441d786b7116c692212ae2e2dcc67fe6bad5aa4398534afd401a42ffebc1 -size 1720165 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-yellow.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-yellow.png deleted file mode 100644 index 30f53b73..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/announcements-yellow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc272e6acd3778d4001a87dfa3205e7de612ac2afb55b5f1905d220ddaaf98a6 -size 1256109 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/barn-owl-thought-bubbles.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/barn-owl-thought-bubbles.png deleted file mode 100644 index 5099e847..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/barn-owl-thought-bubbles.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f15cb8cef37900fe66827e4de31f801f67d8a98e17a0eee32acc0cf1e9f423c -size 1004036 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/blank-textlabel.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/blank-textlabel.png deleted file mode 100644 index aea7034b..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/blank-textlabel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc3b17a6c3bb976280e5a2b0bd0726643d26441999a091ce42cf750c619b201e -size 1241358 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/chalkboard.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/chalkboard.png deleted file mode 100644 index d271e46b..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/chalkboard.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ae96012a1e74486d41dd1cbbbcab2299d75f2d8c2a1c03e6ff7ac5e137a416d -size 1024516 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/dog-statue-lore.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/dog-statue-lore.png deleted file mode 100644 index 2951e5c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/dog-statue-lore.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32a25abc7162a2cedade84650da5680f54189256ed3efc9c7dad5609169f573a -size 1170352 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/dog-statue.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/dog-statue.png deleted file mode 100644 index d4e32f4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/dog-statue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ad39c56d00e7c85d0c1c3d46a56885911419ce6f0703e79ed3705a5c401a9cc -size 1202343 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/example-script.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/example-script.png deleted file mode 100644 index 5b722a05..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/example-script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bce440ccb5489b262d5008d0a56c370fad98ca35877eeaa364b9e8e962fd41e -size 26325 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/grandfather-room.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/grandfather-room.png deleted file mode 100644 index a8acfb71..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/grandfather-room.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13d3a18fb2ac837614261e09f526dc9f03fb98915faa1f866d30306091406fee -size 930229 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/jacob-photo-album.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/jacob-photo-album.png deleted file mode 100644 index e5332a87..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/jacob-photo-album.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b84191280f63d2858698cfe180f5fed9e23cd4e51bb7b248bfd66e1abbda795 -size 200454 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-1.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-1.png deleted file mode 100644 index 94629722..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2db71614f593a42c03b5e82887bdac436de3661e24c282ebdf34bfba4cf48f4b -size 307586 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-2.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-2.png deleted file mode 100644 index d6507bd3..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:61429432aef2a3e260e10d586cc1c46da9672f52aca0c69bad8a0271a76db245 -size 287172 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-3.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-3.png deleted file mode 100644 index 25aec369..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10d147ff3c9759ff38544214946d24919148add25b85fe9e7fa90a21fff44ff4 -size 334600 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-4.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-4.png deleted file mode 100644 index 371a14f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5e31d20813e68d2b406048c3a58127672256693a8098771e47f654a9d102ae7 -size 327735 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-template.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-template.png deleted file mode 100644 index 2663bc5a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/lore-template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7cb752040c7533165f3fae38fcf9975eb71963197eeb5f1f3bad0e6069a1dbd -size 693170 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overlay-back-button.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overlay-back-button.png deleted file mode 100644 index 5bbd32d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overlay-back-button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6718f83b4c2a30f9168dd5874400181cb4947a6e5a13d82bc4f96c650554626b -size 31300 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-announcement.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-announcement.png deleted file mode 100644 index 9c1529ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-announcement.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:382dc46e6f31013567ce7d9b2e684c76d07f1de752405f2be57db1b5292a2edf -size 1642927 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-thought-bubble.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-thought-bubble.png deleted file mode 100644 index 5099e847..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-thought-bubble.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f15cb8cef37900fe66827e4de31f801f67d8a98e17a0eee32acc0cf1e9f423c -size 1004036 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-visual-cues.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-visual-cues.png deleted file mode 100644 index 3e0552bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/overview-visual-cues.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d68360098edd3fc1ad8b3e6c380822d312529461ef048c85b4337a80fca5024 -size 1156185 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/power-line.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/power-line.png deleted file mode 100644 index ed226b92..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/power-line.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c81f271e18957819eafd5f4ec611c033eeb732701d7820e9734a86477a4e6433 -size 1591541 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/richtext-thought-bubble.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/richtext-thought-bubble.png deleted file mode 100644 index 522bbadb..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/richtext-thought-bubble.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fe80b919f8168de430d2f24a13141c28927649c528fb10d4c2cf2db59fd6f55 -size 1419841 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/storynote-object.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/storynote-object.png deleted file mode 100644 index 1bce513c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/immersive-narrative/storynote-object.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba9c8f593d945d20cd3ed6ddac05a77c41b642f8daebb073ab05c1418d4ae0b5 -size 1037365 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/1-1-texture.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/1-1-texture.png deleted file mode 100644 index ae4e5b64..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/1-1-texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ae917b56f3e5775b79b1b0ebbe2fa486b972fbcee77cc8bebeedaa3564824b8 -size 413830 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/after-override.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/after-override.png deleted file mode 100644 index 367afa75..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/after-override.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:325a434563f5e0b9acf92242e2c4f31e00eed5c354fec2067de75a1155cd96df -size 5108852 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/alpha-merge-substance-designer.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/alpha-merge-substance-designer.png deleted file mode 100644 index af48d5f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/alpha-merge-substance-designer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1be2d6cb1e64e45c9e215022d6a8c2366e9f1ee55bb726ee1051037c97e192e6 -size 560567 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/backyard-terrain-materials.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/backyard-terrain-materials.png deleted file mode 100644 index 197924c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/backyard-terrain-materials.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3484b712fb5442fa5470d638df71113f4c2b34ba40532ecadd6fac44d8ca065 -size 1915320 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/backyard-wet-material-variants.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/backyard-wet-material-variants.png deleted file mode 100644 index 1cac1ebc..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/backyard-wet-material-variants.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35449ce07974cc655dd4edac1ed63efc7827040141b87681ff6fcd288eab380a -size 1478330 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/basecolor-rgb.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/basecolor-rgb.png deleted file mode 100644 index 5e851269..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/basecolor-rgb.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51c42bc5e55063189dc244f8139512acc21c864ad8f3b9487c2873fd2ea6f541 -size 1104440 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/before-override.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/before-override.png deleted file mode 100644 index 936bdd8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/before-override.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7bf410e3730554b4acd1dcf4dd79219e86e5996ebc63699043a98547bf98a68 -size 4675064 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/cleaner-texture.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/cleaner-texture.png deleted file mode 100644 index 5ed2a0fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/cleaner-texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e819dc2a1b57d2df5a18bf9b6af8f29869abf496ea5982536659253138bed079 -size 1419342 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/couch-surface-appearance-set.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/couch-surface-appearance-set.png deleted file mode 100644 index a5864467..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/couch-surface-appearance-set.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:797f23c3f8f84fa406d7eba359dbdc933657ce18e11a9b0b1675c13edf127d04 -size 1766924 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/craftsman-reference-images.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/craftsman-reference-images.png deleted file mode 100644 index 6bbc3cc4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/craftsman-reference-images.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a6e9a06e481689895938e3ba78a56fbec6a1ebdb059142608dbd88c5d527fc7 -size 2271166 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/edit-variant-dialog.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/edit-variant-dialog.png deleted file mode 100644 index 2b914550..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/edit-variant-dialog.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14d7c8662c4b5f44006f5a7ed7e6c6f83acb1817ee2a78466947e3e837777df0 -size 1093577 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/final-alpha.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/final-alpha.png deleted file mode 100644 index 13669cb7..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/final-alpha.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:309de5078305d55a95f49ad3660fdfbcad5887f72e009d3407f4ad68b800730d -size 806776 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/final-surface-on-couch.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/final-surface-on-couch.png deleted file mode 100644 index 670e5e70..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/final-surface-on-couch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81cdc1c678c82666b0fe0ef307b39f10047bb7823d9bc1789f43b658eb830db6 -size 1949084 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/furniture-set-stain.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/furniture-set-stain.png deleted file mode 100644 index 2d2f1782..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/furniture-set-stain.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:516a42cff874d04b3bbd1ff81adf98215ad67e71f73a8316b1a72df317414616 -size 1617844 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/height-map.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/height-map.png deleted file mode 100644 index ed653a0b..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/height-map.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f049743b3c9f52816a00100de16289e56abaf8d867b3954b50fcc4c9e027d975 -size 777323 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/leather-couch-settings.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/leather-couch-settings.png deleted file mode 100644 index 9abe1e95..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/leather-couch-settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:950dc3044b75b2dd278db4139b8f409e96ae53dbe0fdae5ae83419d0aea576e2 -size 70509 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/leather-trim-texture-set.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/leather-trim-texture-set.png deleted file mode 100644 index 157e18ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/leather-trim-texture-set.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b0932596493edc44e89663bb066406a287d4dd60bcf3a283ace1825a876a5be -size 1088447 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/material-variant-overrides.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/material-variant-overrides.png deleted file mode 100644 index 689da99f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/material-variant-overrides.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9862dfefb4c70f7b07b01a1d6576ff020d3849e79acb8434bc44b6a7890b6df8 -size 2351150 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/mesh-in-foreground.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/mesh-in-foreground.png deleted file mode 100644 index 76bdef43..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/mesh-in-foreground.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c816d22967d0b9c7ef51969acecaa8a165dacb58ebc013036066f443069b1e7 -size 2345780 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/only-colormap-and-mesh-color.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/only-colormap-and-mesh-color.png deleted file mode 100644 index 6ee43ba3..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/only-colormap-and-mesh-color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abc4e1d8798dd3a9e2268779342c1514875a604da21e55274b498d7907a8160e -size 819737 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/overview.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/overview.png deleted file mode 100644 index bb78b8a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2d97289b8d063bf9cce9e13ac271e166e4a38138010d9c83825df21fe858299 -size 1289220 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/rgba-in-combination.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/rgba-in-combination.png deleted file mode 100644 index 94a1329e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/rgba-in-combination.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ef8a54eaba91d0ce10c7b501d010c518c78c229bbb7fa7dba0b7335e0794e68 -size 981905 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/scratches-and-wear-mask.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/scratches-and-wear-mask.png deleted file mode 100644 index 04360a8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/scratches-and-wear-mask.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f37ce5c99eda473b41c96a74327fae5f747c3cb7827b5823d46a940cb89506e8 -size 1183275 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/set-override.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/set-override.png deleted file mode 100644 index 86050f8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/set-override.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:efb3798eaebe90564477ad69550bcb58c055a958cb6c663ad0c6d37c18f8163b -size 476770 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/tiling-texture.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/tiling-texture.png deleted file mode 100644 index dfa9240f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/tiling-texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9fdacf9b0889ca1a5091bf27e81d913be3784473478ac5d8aeb78fc2b18e659c -size 1197721 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/too-much-detail-texture.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/too-much-detail-texture.png deleted file mode 100644 index 2daf62ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/too-much-detail-texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3db7512199640114354a82d13dee1065d47a9d86d58d9024f5a524f94f0d3f6e -size 1574960 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/transform-2d-node.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/transform-2d-node.png deleted file mode 100644 index d29f9adc..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/transform-2d-node.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81e4677f83ce485e03991969f142fe465ea24b32b7d1ca83a5cde3efbb5316d7 -size 616819 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/trim-texture.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/trim-texture.png deleted file mode 100644 index 90355c47..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/trim-texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90cbb16f2bdd302f0c9b3f106448dbf89cf6f81e12c44bfa23c103610f67715e -size 1247950 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-asset-place.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-asset-place.png deleted file mode 100644 index 088da399..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-asset-place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26f7ac353a18d39588e3647fdf080f334107d6d0f9808a97f097b3f9bbf96e27 -size 1977080 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-assets-in-place.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-assets-in-place.png deleted file mode 100644 index 97f1503e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-assets-in-place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b1fe61a813a8edb74c783ac3200acea267b69c85ddf327fda33a6fbbe80febe -size 1535467 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-texture-set.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-texture-set.png deleted file mode 100644 index aeeb88a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/materializing-the-world/wood-trim-texture-set.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:80c4f17a2b3e3d5717b52a4b084256d8408f53cd11e26bdd7a7120876605a151 -size 666775 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/overview/overview.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/overview/overview.png deleted file mode 100644 index 122e76ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/overview/overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b7330a263e2717ff9084193d41148bdf84d3bf2451b686f6a9bb1ee75d584ad -size 1781189 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/1024-max-distance.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/1024-max-distance.png deleted file mode 100644 index 9793d768..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/1024-max-distance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d28aa386ad2092528b0dff8a384bc493ab4a88c4691ca2750cbcee87d98d917 -size 1840754 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/64-max-distance.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/64-max-distance.png deleted file mode 100644 index d987f753..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/64-max-distance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:426dfdc5c630959d95f628fb977d649d6c041ea69c0b25011bb466c9b39ddfb9 -size 1539566 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/content-streaming.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/content-streaming.png deleted file mode 100644 index d93ed862..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/content-streaming.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78216c4fb7463c17e2ff5eaf4a0987dc518d5b4685604f8113e18c301aa9908e -size 1458277 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/perspective-house.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/perspective-house.png deleted file mode 100644 index 122e76ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/perspective-house.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b7330a263e2717ff9084193d41148bdf84d3bf2451b686f6a9bb1ee75d584ad -size 1781189 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/perspective-treelines.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/perspective-treelines.png deleted file mode 100644 index 3c78caf1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/perspective-treelines.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:198f240b53e2eb867dc38d81d41e5d3689b65ce9bb088e3db889b18fe2332ed5 -size 1491767 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/winding-path.png b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/winding-path.png deleted file mode 100644 index 947d09b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/streaming-in-immersion/winding-path.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc7321015b95fd85f1693d3ab37124f89a7161e52a687171add44531c1816842 -size 1316858 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/cutscene.mp4 b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/cutscene.mp4 deleted file mode 100644 index 44155459..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/cutscene.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bd3520700f6bcc3b0fa30c3786d24fbeaa2037c790db9ca1f460e96d30f5618 -size 15948931 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/interpolation.mp4 b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/interpolation.mp4 deleted file mode 100644 index cdfa241a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/interpolation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4dca769116a271eacb6eb3175e720cbff9642d905311728fd9dfc05e20f578b9 -size 6939862 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/key-grabbing-system.jpg b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/key-grabbing-system.jpg deleted file mode 100644 index da170482..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/key-grabbing-system.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:832a05a4bc93e20f4a658f82ffb43f1dde31e3ed28e21eba4d594eeca2e4055f -size 676761 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/respawning-players.mp4 b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/respawning-players.mp4 deleted file mode 100644 index b288a88d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/respawning-players.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65a1c01ae3b448f80c580064699eec00a6c341a4171dd60865bc3f25a153fff7 -size 8998718 diff --git a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/simple-lobby.jpg b/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/simple-lobby.jpg deleted file mode 100644 index e5754bd2..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/mystery-of-duvall-drive/technical-overview/simple-lobby.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e77e307b3020c34ce9610d12fbb38505cbeac5340e98cfe65afaed605df39b87 -size 363140 diff --git a/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-NP-C-9000-Robots.jpeg b/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-NP-C-9000-Robots.jpeg deleted file mode 100644 index fbad887b..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-NP-C-9000-Robots.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f22b904b7cc6aae01af82eeec7571e17e28f489153d51f2d651a2ba351a1aa6f -size 69728 diff --git a/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-RO-01-Robots.jpeg b/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-RO-01-Robots.jpeg deleted file mode 100644 index bbe92f4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-RO-01-Robots.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c43ae39415fc98aab2e85f142abfacd7af9b623ccba6021325297d499bd4f187 -size 48324 diff --git a/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-Soldiers.jpeg b/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-Soldiers.jpeg deleted file mode 100644 index 3a327784..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-Soldiers.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f2d2a2484887e7f75cd8d8895f8986b35a3ed240790199c61edeebc4d27fbe9 -size 74031 diff --git a/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-Zombie.jpeg b/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-Zombie.jpeg deleted file mode 100644 index 50621b89..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/npc-kit/Endorsed-NPC-Zombie.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db70ac04e0b1c33e36f8d1057d0ebad00a195476a33d8b5327a21653c796b73a -size 44141 diff --git a/.cursor/rules/roblox/en-us/assets/resources/plant/Architecture-Systems.png b/.cursor/rules/roblox/en-us/assets/resources/plant/Architecture-Systems.png deleted file mode 100644 index 1d4b9e20..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/plant/Architecture-Systems.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dba158dbeb50b6df63e8cc9472bb8c349751bc0ab683bc9e4b44473125af6305 -size 31389 diff --git a/.cursor/rules/roblox/en-us/assets/resources/plant/Architecture-UI.png b/.cursor/rules/roblox/en-us/assets/resources/plant/Architecture-UI.png deleted file mode 100644 index 911b9d0c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/plant/Architecture-UI.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3c320f4dc1d4fc20a2edab20cb6db4e0f8c8ca84f0614c6ea8a8463bb9531c2 -size 45900 diff --git a/.cursor/rules/roblox/en-us/assets/resources/plant/Project-Banner.jpg b/.cursor/rules/roblox/en-us/assets/resources/plant/Project-Banner.jpg deleted file mode 100644 index 42c304b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/plant/Project-Banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79fa7f5009d13345806fdb51d1cb2dd68e53e27e08f76863109d0e3c3623f501 -size 199824 diff --git a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-Cinematic.jpg b/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-Cinematic.jpg deleted file mode 100644 index 8781a3d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-Cinematic.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79bebc880d5f7789649947faad829324d10146bbde81e42cb91f0637451944eb -size 120379 diff --git a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-PiP.jpg b/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-PiP.jpg deleted file mode 100644 index 2144b927..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-PiP.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce9949eb1fb9220f8a64bc4396b0b3815991e667a4cd8def575257c1e05f2632 -size 113359 diff --git a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-Switcher.png b/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-Switcher.png deleted file mode 100644 index 0047849e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Camera-Mode-Switcher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d9f8d83262a7602183bf8a758e055d35c809843d1c21a74b4b5ce81cb43958a -size 94043 diff --git a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/CanSendCallingInviteAsync.mp4 b/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/CanSendCallingInviteAsync.mp4 deleted file mode 100644 index 9579796f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/CanSendCallingInviteAsync.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31c32319b1230419ff3e99fee17e2c848d0534006abd816dd16e205eb26489ff -size 460907 diff --git a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Emote-Bar.jpg b/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Emote-Bar.jpg deleted file mode 100644 index 78f1bbd1..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Emote-Bar.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a423db9a721c13b3bbb0fe33cc9bc1f92cd99e75bbc6e35861dea1c3762e566 -size 116553 diff --git a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Environment-Switcher.png b/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Environment-Switcher.png deleted file mode 100644 index 35c78efc..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/Environment-Switcher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb75cf5e6d9986e1cc80d0362e3fc7a23e477561be2b78be85eda7a2de29d50d -size 211436 diff --git a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/GetDeviceCameraCFrame.mp4 b/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/GetDeviceCameraCFrame.mp4 deleted file mode 100644 index 1dbee54f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/GetDeviceCameraCFrame.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3007813205667144c7b2b64ef0ea6e8337aa3188599e3c01f222466929fadb7 -size 3973134 diff --git a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/PromptPhoneBook.mp4 b/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/PromptPhoneBook.mp4 deleted file mode 100644 index 03680c5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/PromptPhoneBook.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4e2c97e7414912936ead596e87ba7cf92916db9ba9a348b183f8877c417bcf7 -size 686829 diff --git a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/ShowHideSelfView.mp4 b/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/ShowHideSelfView.mp4 deleted file mode 100644 index 17096792..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/roblox-connect/ShowHideSelfView.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b84bd733be421a438aebbd95290e4a9e04962ca50c0b3406825c130d70fd539a -size 5343203 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Baseplate-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Baseplate-Template.png deleted file mode 100644 index 3048e659..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Baseplate-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78bc016c9f608395c507299e1bf51ed34a09dc78cd266c47b341be6c28f2a9a0 -size 195645 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/CTF-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/CTF-Template.png deleted file mode 100644 index 92b71361..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/CTF-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9f517984ad12b9b065608a91126cdbbcb1fcc5093211f2ac232018d3c04a8f7 -size 3930239 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Castle-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Castle-Template.png deleted file mode 100644 index 5ebe384d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Castle-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:028557e008c29b22a737a3c271602af41cde8d38026ae1f2492f71f999c6983c -size 5253864 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Classic-Baseplate-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Classic-Baseplate-Template.png deleted file mode 100644 index 8db5a201..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Classic-Baseplate-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39d96b28d3c8d9f8ebc6414829169e03475ecea4626357992c084ddc84ab3ae9 -size 3492153 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Classic-Racing-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Classic-Racing-Template.png deleted file mode 100644 index 110fe99a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Classic-Racing-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd73fbca2c0f7566309b17fe8ae9e1f3269c0b3820ada9bfa20ec42a5263fdad -size 3477681 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Combat-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Combat-Template.png deleted file mode 100644 index 6d80c972..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Combat-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d8812c3c857143ef08e36cda29342e300b0fec452d3059d4e81027620ff93fc -size 4999254 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Concert-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Concert-Template.png deleted file mode 100644 index 73a2faed..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Concert-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:309eca3927bb1aa796da4a54e19f56e1574b331773fe5f3b1eb695ccef8f969a -size 3662138 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/FFA-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/FFA-Template.png deleted file mode 100644 index 86736f24..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/FFA-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef79bef9cdcb3164873a2f71eca1bd1ba3a47796d30e1d274234eed9087a368e -size 2940731 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/FPS-System-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/FPS-System-Template.png deleted file mode 100644 index 7738d05c..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/FPS-System-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79a14111e469d7b5e7eee47ea76ab323efabd17223559beae5662059bfbc226e -size 18448 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Flat-Terrain-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Flat-Terrain-Template.png deleted file mode 100644 index 806771ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Flat-Terrain-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d67d2da9f55533ef740a6a5b609f8eafd716da1b96d9659bc3ec908f2d74695 -size 4758237 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Homestore-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Homestore-Template.png deleted file mode 100644 index 9e9ef36d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Homestore-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bdc98c30e427fff307155f0503e3c7960fe2ec7c40c6c3f229e77b2cb7f3c9e -size 629527 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Laser-Tag-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Laser-Tag-Template.png deleted file mode 100644 index d7f23b64..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Laser-Tag-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d47f5a7e5267f0323122ce70e89f54a8ccebe828369375b3e4016a7f24f08cf3 -size 90862 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Line-Runner-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Line-Runner-Template.png deleted file mode 100644 index 495b324e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Line-Runner-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a4000ea4a2d55b55fc46826f1d02228c6f5cac2cb2c34992856bc9b59f0e1da -size 2841724 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/MIS-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/MIS-Template.png deleted file mode 100644 index 70361230..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/MIS-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28836925ed02bc93a6c1a3721cefa437f9298b6dd8f4e99fcd39b6d38247b1b1 -size 3865838 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/MOW-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/MOW-Template.png deleted file mode 100644 index 20b515c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/MOW-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e19e7d369963f4875a84fc3093f323522fa09bf35cf18dde371710f4163db8b7 -size 3738897 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Obby-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Obby-Template.png deleted file mode 100644 index 36bc020f..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Obby-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7fdbe903ef4fd83e9dba1e43bd1c205c2328a70eae7d401fc73bcf01f32e2feb -size 1703257 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Pirate-Island-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Pirate-Island-Template.png deleted file mode 100644 index 424e242a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Pirate-Island-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:067bd2accc7f9c46b681dcd0547822373493bb2a4dfe86d4e4ec72dbe3f2aa98 -size 3710799 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Platformer-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Platformer-Template.png deleted file mode 100644 index 68ff26e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Platformer-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0f29e6f9713d01b32bd5613aac1d41aaf962fc777026d1f2dfab8a8236c3a1a -size 2611090 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Racing-Template-2.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Racing-Template-2.png deleted file mode 100644 index dd839f2b..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Racing-Template-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd7ec235ff294fb9b9304370a18fc8bacb2c4935716711237658195ef4aebb5c -size 223627 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Racing-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Racing-Template.png deleted file mode 100644 index 387f2e73..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Racing-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54463b99287483e3c62c85f2a71d38bb16f8cc83dc613f7e320adfce2f89db41 -size 95244 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Starting-Place-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Starting-Place-Template.png deleted file mode 100644 index 25358790..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Starting-Place-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:302e0d717557d737c0783931cb4757c6b57b8f8b21623ffc59dd8e93925e93a5 -size 4648264 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Suburban-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Suburban-Template.png deleted file mode 100644 index bf7c06b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Suburban-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6023dd983293fe9587d611d8424e74697fa72c7a1f7d1b0237565f8510b79ed -size 4202451 diff --git a/.cursor/rules/roblox/en-us/assets/resources/templates/Village-Template.png b/.cursor/rules/roblox/en-us/assets/resources/templates/Village-Template.png deleted file mode 100644 index dfffe012..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/templates/Village-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00d11ff8390039757e16f57546a14f7a2579d3f05ad2564678b4e9852eb8dfea -size 5206154 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-AR.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-AR.jpeg deleted file mode 100644 index 404d3737..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-AR.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1f10c72de471c372256e6796e4ec136025d49631fab0fb2b38500291b43c56e -size 41237 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Crossbow.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Crossbow.jpeg deleted file mode 100644 index 12e4d358..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Crossbow.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09f5bf8788d9f9f6bdfb9af31eedb26239ec20d7ed480c17460975bca041696c -size 49041 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Grenade-Launcher.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Grenade-Launcher.jpeg deleted file mode 100644 index defa2ec5..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Grenade-Launcher.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33cc325a8a1bc0e0afb5e5fe91eb7be26b71eab5392215773a6a04d53c752ec0 -size 39854 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Pistol.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Pistol.jpeg deleted file mode 100644 index 340bc0d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Pistol.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a45e49776ef2a9b625ffe6b192901b9df1eacf08ac657512a9b700785834e50 -size 31530 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Railgun.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Railgun.jpeg deleted file mode 100644 index 1d5c9bd7..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Railgun.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43ba82111ce5e8de7dca8a773de0d653446d8fedb725ce496272f303262699fd -size 37972 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Rocket-Launcher.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Rocket-Launcher.jpeg deleted file mode 100644 index 44ccc9bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Rocket-Launcher.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd41dcbace430acc740623d70ca99a104a33408939992dce31bdb1efafbffd7c -size 36542 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Shotgun.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Shotgun.jpeg deleted file mode 100644 index ba4b401e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Shotgun.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d07bda2be18c3539e48bd3967eb58adebd04348ad9fef98c12d106224f854e04 -size 42745 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Sniper-Rifle.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Sniper-Rifle.jpeg deleted file mode 100644 index c5405f60..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Sniper-Rifle.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c30934b0b69b22934ef018a346c390439fca3bd8815a21ec1614f2fa533b3132 -size 31934 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Submachine-Gun.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Submachine-Gun.jpeg deleted file mode 100644 index 03490886..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapon-Submachine-Gun.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a97c801d1eb74cb48d7e89ec6f01cdb997ec9da54c87ec888b951598dbdeff24 -size 40649 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapons-Banner.jpeg b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapons-Banner.jpeg deleted file mode 100644 index 4c248214..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Endorsed-Weapons-Banner.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bd877326e219b065a66615d086279971de8d7eea8ec2dfe3d154db28ed9022a -size 179158 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Move-WeaponsSystem-Folder.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Move-WeaponsSystem-Folder.png deleted file mode 100644 index e282020e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Move-WeaponsSystem-Folder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fdcd54daab6f468920769ec3ac981308c131a2d718c350cf9a5e21cc8ea963c4 -size 53581 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Sprint-Zoom-Configurations.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Sprint-Zoom-Configurations.png deleted file mode 100644 index 7190f37a..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Sprint-Zoom-Configurations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a8702904981113244eace0d8b18241ee2198500361b1888f8995e4a712fa764 -size 26711 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-BulletHole.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-BulletHole.png deleted file mode 100644 index 9ad88a4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-BulletHole.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:774c4c17d45e0c7e454d8170ae408f4224a7555d76a6c18c771cef497c98c1e1 -size 29870 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children-Grenade-Launcher.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children-Grenade-Launcher.png deleted file mode 100644 index 44aa88b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children-Grenade-Launcher.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a120387651b9772e3737ec85a225ab07d84a18d924bde33000ae4307a1bc412 -size 26756 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children-Railgun.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children-Railgun.png deleted file mode 100644 index 5b23573e..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children-Railgun.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d87e227f2ebdbfc608f51768eb4c93bdaaca96b945559a24db33e6146f194fdf -size 25202 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children.png deleted file mode 100644 index 53ba9446..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Configuration-Children.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8d54213f782a3c963e05e74ed583d13a875c27fa026eea16d97e4b0291517d8 -size 24467 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-BaseParts.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-BaseParts.png deleted file mode 100644 index 644c9afa..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-BaseParts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d55a619fc355f4a683620ec2cd16a35b93a260a361faf4eccb1c4ddbb8210bf -size 21508 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants-Crossbow.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants-Crossbow.png deleted file mode 100644 index 4e86f518..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants-Crossbow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00abb9ff8630cb7a5ab7b5854e823545db158865abf3968c1052533b63e9a5dd -size 29554 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants-Railgun.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants-Railgun.png deleted file mode 100644 index 9fb92316..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants-Railgun.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b14294922f6eae91fb6f01f57af5d40d4ac889b8cda5e28b7bf6514d8839a338 -size 25571 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants.png deleted file mode 100644 index 2d1c5829..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-Model-Descendants.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99fc1cb78752645627b323ce01bbed397e830540144b9bf31e07691751bd2103 -size 21572 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-MuzzleParticles.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-MuzzleParticles.png deleted file mode 100644 index 9f016755..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/Weapon-MuzzleParticles.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a952eb07074fb286a8fe1595b5efdbd576a9bc5ab4cd8835f90a7e2f4c168581 -size 29991 diff --git a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/WeaponsSystem-Structure.png b/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/WeaponsSystem-Structure.png deleted file mode 100644 index ff0c48aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/resources/weapons-kit/WeaponsSystem-Structure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4d8f8bb4746ba249a8640542214566e216670da40b7801a44eb6de954c74fd6 -size 46955 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Client-Script-Containers.png b/.cursor/rules/roblox/en-us/assets/scripting/client-server/Client-Script-Containers.png deleted file mode 100644 index 151321d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Client-Script-Containers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa630603921c15420e924bb51faf6d13de724da386ce30d924dc4dddd5124a98 -size 145649 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Client-Server-Model.png b/.cursor/rules/roblox/en-us/assets/scripting/client-server/Client-Server-Model.png deleted file mode 100644 index a03da612..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Client-Server-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec20d1d3d898d0874e1f5669c824aee1ce8b833685157389f86b749a5759d8aa -size 320924 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Data-Model-Mapping.png b/.cursor/rules/roblox/en-us/assets/scripting/client-server/Data-Model-Mapping.png deleted file mode 100644 index c3283cc4..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Data-Model-Mapping.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebe00b894128294823fe01c7183f49a8ea234fb3a25a7d3a9f90ca7d966a9ba0 -size 170156 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Client-Server-Client.png b/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Client-Server-Client.png deleted file mode 100644 index b2da2816..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Client-Server-Client.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae50557dc90bc7a66a2b3ee18c55132a5c0e510f4b2be8926a965d03a8e16ff5 -size 76679 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Client-Server.png b/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Client-Server.png deleted file mode 100644 index a0803fc7..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Client-Server.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13821188f21208542d0f3a04129aab1c3a7212ef60872d9daab1acc99c025267 -size 59784 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-All-Clients.png b/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-All-Clients.png deleted file mode 100644 index 3944ec71..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-All-Clients.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89624e0cf5cd7b89fee176a53f4c26d1be67f2a60997e5884e17a38409e1b2a4 -size 98057 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-Client-Server.png b/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-Client-Server.png deleted file mode 100644 index 3f351357..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-Client-Server.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68e8f50710e004dec95f77eda1ac288f912776aac48e0f621181a3c0afabc5ae -size 77201 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-Client.png b/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-Client.png deleted file mode 100644 index 21c32477..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/client-server/Remote-Flow-Server-Client.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e3d085e83e3ab122491d36bb1995c476620c552f11636e6028d5b96f7ea51da -size 60133 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/apostrophe.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/apostrophe.png deleted file mode 100644 index 59ecb799..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/apostrophe.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79b6683e14bf3b68b3d67dbb2c56de34bf803306b1774d835a7b699fcb5b4c1c -size 1788 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/backspace.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/backspace.png deleted file mode 100644 index 244c2517..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/backspace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7faeb3f1ef88032bcac4e2b429b1f53be3689eb261c1db68934cc131420fc96 -size 1942 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/comma.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/comma.png deleted file mode 100644 index 4d180f85..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/comma.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9deded824629239e38f1b50be931524b716baaf6b231976d53dd0ef934a4f06c -size 1787 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadDown.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadDown.png deleted file mode 100644 index 1b0c4a33..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadDown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd4963c40505937491a28ed48f7b5340f0711af5615b179a0d409f9130ab5056 -size 5378 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadLeft.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadLeft.png deleted file mode 100644 index 7a43d896..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadLeft.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:864a165299092941b2901a42b86c4212aa0e1e94274577976d33f440c8c7a029 -size 5388 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadRight.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadRight.png deleted file mode 100644 index cf8c9efd..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadRight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ab7fff054aad32616a36e6475ebdbb1401833987c04adfc2bdc85766151003e -size 5385 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadUp.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadUp.png deleted file mode 100644 index e54b2129..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/dpadUp.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d20b1220b4ec834c790883be574af2708d0007eca769d6ec022a9e19b86aaa1a -size 2649 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/graveaccent.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/graveaccent.png deleted file mode 100644 index c6b074b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/graveaccent.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c9b67b7dd44659ac8df9d8ba07729fa03a4e0ca51f7b8e30a7fe02e5d0ec409 -size 1810 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/period.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/period.png deleted file mode 100644 index 81de2520..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/period.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6404edfa0046d444e544d99eb198caa00f8a533c1d298e0dc0fdc54a74b4fa3 -size 1668 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/return.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/return.png deleted file mode 100644 index 86ce1601..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/return.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:305aa80e349af6d922988514691772c9d39fe5806e0fae15f6b03730d4ab9d4e -size 1832 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/shift.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/shift.png deleted file mode 100644 index 3b9a1bf6..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/shift.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45fe97885cb035bc1c852acbf0bb8294bdd286ad277f731cc77c45c07a05a05a -size 1832 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/spacebar.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/spacebar.png deleted file mode 100644 index d4a10aa1..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/spacebar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f3c73ec5ee8a3f1013f8061d2b13f45550753de91c81f6a7472b73d04a73226 -size 1688 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/tab.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/tab.png deleted file mode 100644 index 78f34662..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6d7fd49717c27c2d10948df61c42788685bf284f7a49f90c08c8754a37c3970 -size 1861 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxA.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxA.png deleted file mode 100644 index 32ab44ec..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxA.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0307c6e9ee4563e37fdda844df08c0037d92e3246af83a4f15db291b038a6e7f -size 2965 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxB.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxB.png deleted file mode 100644 index 7279582b..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxB.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:975a38ab797724c729a9a2ff4ebd981983ea56f5c8826bc0dfe38ddfd8344bc2 -size 2872 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLB.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLB.png deleted file mode 100644 index 48a2d264..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLB.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a23c8a9d9bb8c784c6405040d1acef3107ff4f5e22a68d34749649009c49ea98 -size 2347 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLS.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLS.png deleted file mode 100644 index e37b90dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLS.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55830ad0a92d87f3de6aa03871acd7663d3a860ee1a72835b64035576f032697 -size 1994 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLSDirectional.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLSDirectional.png deleted file mode 100644 index 4dde6a5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLSDirectional.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b20ec4ccaa2bfcf03a0ce9a40b3f5e9f0d3666996de76cd3a39d7c3714953072 -size 2583 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLT.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLT.png deleted file mode 100644 index 569d2025..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxLT.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c7babcddf3fd88e99098065e8da33418aaeefb270cb1d1f7539e4eafb82aca6 -size 2271 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRB.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRB.png deleted file mode 100644 index bcd88c04..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRB.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2caf2c4554dafdb46d7e080a292d60608c15943aae5df1b7cb2fc1b74c63c5c1 -size 2611 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRS.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRS.png deleted file mode 100644 index d4dd32a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRS.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf40d955484467ca41cdb05d22a8af90a7286b154ed6f44ddc6a629b9889beee -size 2367 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRSDirectional.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRSDirectional.png deleted file mode 100644 index 772e391a..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRSDirectional.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfdb0655c705e998ba1f2ec145689ac900ec6723fba7f9a63983b5d9a24538bf -size 2778 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRT.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRT.png deleted file mode 100644 index c851656a..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxRT.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7a060e6229d619b507cb3286e9db1d3bc733680aca25cb922bc3a7b0f53c023 -size 2528 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxView.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxView.png deleted file mode 100644 index 651179b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxView.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a41717bcb50ec1d56436d61661841aea9fe57dc8ef56f75e39523582a0d0f5e -size 2432 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxX.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxX.png deleted file mode 100644 index 2a331ebf..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxX.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:721b7f623526da74cab4787df059e47e9411bb4772d39b2189a73b7680e67328 -size 3108 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxY.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxY.png deleted file mode 100644 index 56b5f702..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxY.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:859b79d469b81dd0cdd4b6dc2ae5cb3b51c38d7849ab556c07c057c68ba96b42 -size 2988 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxmenu.png b/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxmenu.png deleted file mode 100644 index b976723e..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/controls/xboxmenu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79b065e19691d3294bbc0207f9327c4f5ea35b61804765de0aeb6801569594cc -size 2525 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-rojo-plugin.png b/.cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-rojo-plugin.png deleted file mode 100644 index ff0e2ab1..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-rojo-plugin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b832a28240768422bf37d16c93aaec4e771bd5132ae554c7afba5803087ed984 -size 46859 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-rojo-sync.png b/.cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-rojo-sync.png deleted file mode 100644 index f9e646aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-rojo-sync.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a288982f6f5b71448f3d6d891da27cf1a9a0ae63ab58b1d8bf80edd4fa0f742 -size 35070 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-vscode.png b/.cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-vscode.png deleted file mode 100644 index 36a9907a..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/external-tools/external-tools-vscode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dddf1eef8e0b429925348f22b55c0945339962773b1c94646e9264e54f6dcf2d -size 395146 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/input/Gamepad-Inputs-PS.png b/.cursor/rules/roblox/en-us/assets/scripting/input/Gamepad-Inputs-PS.png deleted file mode 100644 index f59bb872..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/input/Gamepad-Inputs-PS.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f907ba3f7eb7b0da3823855f6e396b3cb29eb8d65bb28a1099b9cdd321fca61 -size 475686 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/input/Gamepad-Inputs-Xbox.png b/.cursor/rules/roblox/en-us/assets/scripting/input/Gamepad-Inputs-Xbox.png deleted file mode 100644 index ad1836ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/input/Gamepad-Inputs-Xbox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f7d27e158e4eb45e8c0ab56664e956ecb721a0d5a535dc533f9af904aba3af4 -size 373404 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/scripts/Actor-Tree.png b/.cursor/rules/roblox/en-us/assets/scripting/scripts/Actor-Tree.png deleted file mode 100644 index 454d0a3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/scripts/Actor-Tree.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6dd0b1baf476f2084c77a851f8273950d7898d47223d2482be3dcdd63a56a7ed -size 14666 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/scripts/FewerVsMoreActorsDark.png b/.cursor/rules/roblox/en-us/assets/scripting/scripts/FewerVsMoreActorsDark.png deleted file mode 100644 index a506481c..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/scripts/FewerVsMoreActorsDark.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a870414cd6693c3377a562392cb1ef14267152998e2664bb60cdaa0baaee532f -size 27524 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/scripts/ImmediateVsDeferredEvents.png b/.cursor/rules/roblox/en-us/assets/scripting/scripts/ImmediateVsDeferredEvents.png deleted file mode 100644 index 085bd17e..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/scripts/ImmediateVsDeferredEvents.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:519fe3d59ddbb5cfeea4b4368f23b8c7ddf03b999c567c2d9dc2a35129552233 -size 86743 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/scripts/Parallel-Luau.mp4 b/.cursor/rules/roblox/en-us/assets/scripting/scripts/Parallel-Luau.mp4 deleted file mode 100644 index 4adaa23b..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/scripts/Parallel-Luau.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f1b53a971da00358a2eafbb2d3f7b0369d7b6a6c6dd8cdb3e01036e4110f639 -size 17618217 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/scripts/ParallelExecutionDark.png b/.cursor/rules/roblox/en-us/assets/scripting/scripts/ParallelExecutionDark.png deleted file mode 100644 index 48a20c7e..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/scripts/ParallelExecutionDark.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fc4cc1d15d04a4510dfcc7a463d4db6aa4c30aea54d5ab35f78dce1f525c24e -size 32838 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/scripts/Scope-Diagram.png b/.cursor/rules/roblox/en-us/assets/scripting/scripts/Scope-Diagram.png deleted file mode 100644 index 501d9c3c..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/scripts/Scope-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40fd09c59b265de6dd60ed68fbc71c4159d01c33025059ca424dc0717ab31b86 -size 29821 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/scripts/Touched-Event-No-Debounce.png b/.cursor/rules/roblox/en-us/assets/scripting/scripts/Touched-Event-No-Debounce.png deleted file mode 100644 index 181378d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/scripts/Touched-Event-No-Debounce.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70222aa3ed183a39812c56f285aaadb1c86bee09e4e07111d8a0b278628184ef -size 81983 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/scripts/multi-thread.png b/.cursor/rules/roblox/en-us/assets/scripting/scripts/multi-thread.png deleted file mode 100644 index 92ed32d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/scripts/multi-thread.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9256c6f3e5ed4a2e49f7ca02bc1c84f45e1caa50c5e746455ccf8fe40f44f42e -size 23832 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/scripts/single-thread.png b/.cursor/rules/roblox/en-us/assets/scripting/scripts/single-thread.png deleted file mode 100644 index 38de7761..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/scripts/single-thread.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83077437c26dc6661abc364e42d2008d13ea7bdc6387e8e93fcc727feb5c19e5 -size 13908 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/security/Movement-Validation-1.jpg b/.cursor/rules/roblox/en-us/assets/scripting/security/Movement-Validation-1.jpg deleted file mode 100644 index cfe7822c..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/security/Movement-Validation-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02bc607a139ff0405aaf3b2407842585397e279c92e36aa4b9243108302ef7c1 -size 242997 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/security/Movement-Validation-2.jpg b/.cursor/rules/roblox/en-us/assets/scripting/security/Movement-Validation-2.jpg deleted file mode 100644 index 73e3538d..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/security/Movement-Validation-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9191aace9c5c6281019c707ad84bcaca2c573def3fd2c5cbb5a9e3743fd866a4 -size 263331 diff --git a/.cursor/rules/roblox/en-us/assets/scripting/security/Remote-Purchase-Flow.png b/.cursor/rules/roblox/en-us/assets/scripting/security/Remote-Purchase-Flow.png deleted file mode 100644 index ebdca23d..00000000 --- a/.cursor/rules/roblox/en-us/assets/scripting/security/Remote-Purchase-Flow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e1d1b669ee57c7c1a459b2bf5406aa2865e7c3cc4aa03e13fed92168f9b87c5 -size 150497 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-Before.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-Before.jpg deleted file mode 100644 index 972c9fcd..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-Before.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b893b08a4e87dddc7e01e7e75e448362aa5d358768c32cd916eafff6df918070 -size 150425 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-Local-Z.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-Local-Z.jpg deleted file mode 100644 index 521a9d0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-Local-Z.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1321ef0567ce67313a167509bc6a7090e75e0fa6f671316466f060d8c465dcc0 -size 125455 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-World-Z.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-World-Z.jpg deleted file mode 100644 index eb0cfa53..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Align-In-World-Z.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e4afaf6985847665400763ef4536564147b80d6a6c00613e21f487a5dedca51 -size 144705 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Center.png b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Center.png deleted file mode 100644 index a8fa899c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Center.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7529cb2303be0e9b9f980d88fd3a5bd1792b76cbfb7100537758cbe96da5989 -size 1542 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Max.png b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Max.png deleted file mode 100644 index 81f36e79..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Max.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89952586e5376d5083ba6bd36f10be1bdf5bd64baab074329a0408829fea8d3e -size 1487 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Min.png b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Min.png deleted file mode 100644 index f04a3949..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Icon-Min.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b32ad643e16d15377bb720f884183709ce930788ac6cd8503fa807fa4d22103 -size 1502 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Center.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Center.jpg deleted file mode 100644 index 48acca24..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Center.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3511b5dae76693d666e159fdd6b6c98c7f60eff90915f920ba0f281f1554ec4b -size 147747 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Max.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Max.jpg deleted file mode 100644 index 7ec07aba..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Max.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e75fb6fda0f9452d5b7d2b76bb82bf5c564c1aac74978a11b46e15352abf83e6 -size 151840 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Min.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Min.jpg deleted file mode 100644 index 854a9ea8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Mode-Min.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:498f0c72a9e9478499e458262b43053dbe448e67666cc5f23242e40ec45bdb2b -size 143728 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Before.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Before.jpg deleted file mode 100644 index 9c6e5317..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Before.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a528c50e49d223869e0cdd66dac1db25a7693bf8267d3bce17103ba405164ac -size 181667 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Max-X.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Max-X.jpg deleted file mode 100644 index 86d99c24..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Max-X.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:344b99241ef890ef5a588306035c46e444e307a5576387f703df22938a99e7b2 -size 149197 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Min-X.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Min-X.jpg deleted file mode 100644 index e2766f70..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Active-Object-Min-X.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11a3735e5304702bd9cb8c4073197e02f4d5ad189038d2559f857f6ca1f04a38 -size 149618 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Before.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Before.jpg deleted file mode 100644 index 73e6e4cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Before.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cf0435b484a51fd296c9930430d623357f7f44886a2f01d33f337f0f0b24155 -size 175812 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Max-X.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Max-X.jpg deleted file mode 100644 index a620b87c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Max-X.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4822ebd5c60a57e4bc7ee86d04569c7120abf841111b3773846e7189e8c12ed -size 142819 diff --git a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Min-X.jpg b/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Min-X.jpg deleted file mode 100644 index 678c2358..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/align-tool/Relative-To-Selection-Bounds-Min-X.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:926a10280aa1eda2e5aaeb5cdaa926d0121d0005b0ebe5adf1186964e31b7963 -size 136594 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Asset-Inspect-Icon.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Asset-Inspect-Icon.png deleted file mode 100644 index 3e3f840d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Asset-Inspect-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:855a4135a224e26b2a0a55af46e15ddbfd1477e35c6a7134ce529dbbebfd8dcc -size 40329 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Asset-Type-Filters.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Asset-Type-Filters.png deleted file mode 100644 index 3f4cdc73..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Asset-Type-Filters.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfe20f0050c92eeed5f880deb556df6aca99547b7ce46b6fb69c4dd31146929a -size 32010 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Display-Options.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Display-Options.png deleted file mode 100644 index 3cc020f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Display-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:277b0893f358854bcf2c05380acae491ddd05c02f59e3e9833a0a904903c0ec4 -size 32916 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Grid-View-Ordering.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Grid-View-Ordering.png deleted file mode 100644 index fe730fe3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Grid-View-Ordering.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:daea11300139c4375bbe048d881b1a00dd633be96476ba19f8d57c5e0a2eb7fb -size 23235 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Grid-View.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Grid-View.png deleted file mode 100644 index 39b253b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Grid-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65aa1f3cd620a22b759c3bdd8d33266a1a9c2e816130b1880e02f1ac1cb24148 -size 27538 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Import-Button-V1.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Import-Button-V1.png deleted file mode 100644 index 7b73e29f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Import-Button-V1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:553e88b9ef4db5d802caaa7f50cab22f9c870aa2232bea91558c756a5111df90 -size 12805 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Import-Button.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Import-Button.png deleted file mode 100644 index e150807e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Import-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb2e48213659f385cf6f2b793389385d6206e5158a049e0021ab11b6ec6aaa4a -size 16806 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Inventory-Sorts.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Inventory-Sorts.png deleted file mode 100644 index 7e996a83..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/Inventory-Sorts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fea5e84550c8169c8639005256571784f1b96536065ad6d6d84ef4741bd6210 -size 52791 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/List-View-Ordering.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/List-View-Ordering.png deleted file mode 100644 index a93efe5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/List-View-Ordering.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82f32a9d4cd8ac021d23a4c2153cc7035ea613a0745d5d9fbc36c5182d0f4e3c -size 58756 diff --git a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/View-Toggle.png b/.cursor/rules/roblox/en-us/assets/studio/asset-manager/View-Toggle.png deleted file mode 100644 index aebf4570..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/asset-manager/View-Toggle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:317e54437597385ce5ff1a5b480c91145a9d7b390c763a8ba7235e343cc92bcc -size 33950 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Collaborative-Session.jpg b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Collaborative-Session.jpg deleted file mode 100644 index 0d301834..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Collaborative-Session.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7f17a015b426f6979f0cd5d76d3640404741da7fcd35f923b6a2274bfa2a4a2 -size 191587 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Collaborator-Search.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Collaborator-Search.png deleted file mode 100644 index cfef0987..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Collaborator-Search.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:477e6184cf2d022d3f2a9d8da43ac586f8e27c29a00743694cd1510a596c3f37 -size 29164 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Comments-Cursor.jpg b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Comments-Cursor.jpg deleted file mode 100644 index 399c45c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Comments-Cursor.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6f365c1ed4f2ecaf72cdf3231956e3540541e073410196c878c5df01eba1bc0 -size 289953 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Comments-Window.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Comments-Window.png deleted file mode 100644 index cb7c3df2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Comments-Window.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29d202b3bd920d78f454fcdbecf8b558764836d929d1a7c51ce9162ae34d1187 -size 120235 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Commit.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Commit.png deleted file mode 100644 index 229985a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Commit.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae4767b2119508b37cb72566099524f553d7f97d5255df288d7b783a7527ccd4 -size 21668 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Compare.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Compare.png deleted file mode 100644 index 6cb31d7c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Compare.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3911804c4458e368af1bb7fbf4c249a8383fd01e73e3f61ec6bffa1c990387ce -size 39515 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Diff-Result.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Diff-Result.png deleted file mode 100644 index 9a2d6a4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Diff-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d61d3b661fbbf89b83bdf808e4c836e28ea90e2a98593c7d92e125a8a615a1f -size 82657 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Merge.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Merge.png deleted file mode 100644 index 08ca56cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Merge.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:913fe8f1b159d00981346d80d50fabe15019d838bd922637cf3a5421714d9e27 -size 38909 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Restore.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Restore.png deleted file mode 100644 index 6edb2e9f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Restore.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59ab834d21d280a00e076ce0d3401747aae30ef70fbf2b6d7a887f95d89649b5 -size 40741 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Window.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Window.png deleted file mode 100644 index d28e0d1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Drafts-Window.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eaaef3a609f5ac8ab8a386e7c225015fdcf6aa75c5a7501363b5c6f577eac21 -size 14596 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Edit-Permission-All-Group-Experiences.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Edit-Permission-All-Group-Experiences.png deleted file mode 100644 index 65d6467e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Edit-Permission-All-Group-Experiences.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b4127d12cfc0eec3f8ccea0c8ee159292ad91b77e33446c21061d4adc023a84 -size 50111 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Edit-Permission-Per-Experience.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Edit-Permission-Per-Experience.png deleted file mode 100644 index aa6fab7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Edit-Permission-Per-Experience.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcfaab62aa2a5f93fda060b702dd12cdceb3600cc514704db0d6be673f7a970c -size 39964 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Disable.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Disable.png deleted file mode 100644 index 5dcf6ccc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Disable.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c26c2372ce37cd8810f2acc0cc79721919db9b845d18db8546cd7be9ddd70a8 -size 48271 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Join.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Join.png deleted file mode 100644 index 83069ee8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Join.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a444551ade4313cebe3cffbf6f19ff131858e6a59d12b408beeba66eee829aad -size 32989 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Status.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Status.png deleted file mode 100644 index c26cae99..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Status.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffedd10421ca39c9ee39ab94e4105e77b91c2fe6a83564ba17e2dd79fb59aecc -size 38562 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Toggle-Selections.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Toggle-Selections.png deleted file mode 100644 index 0b85ed9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Collaborators-Toggle-Selections.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0f89d68b2ab994a8284b919954a398c18603f19c4b24282655e2c20aee9a94a -size 27484 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Scripting-Cursors.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Scripting-Cursors.png deleted file mode 100644 index 4def885d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/Live-Scripting-Cursors.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0803294dcd0d5531a6455bbba250dcf5b56705b010f50b236edf7815cc4067f -size 61534 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/User-Color-Explorer.png b/.cursor/rules/roblox/en-us/assets/studio/collaboration/User-Color-Explorer.png deleted file mode 100644 index 4b68bcbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/User-Color-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3ab49fcc01be717426a1e5b7cd7ec56cd081639a26ffd79ab9ea6fcc98aa44b -size 22164 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collaboration/User-Color-Parts.jpg b/.cursor/rules/roblox/en-us/assets/studio/collaboration/User-Color-Parts.jpg deleted file mode 100644 index 283c0120..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collaboration/User-Color-Parts.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f95772785fe0cf2e8439289f3fe7a0086d9998bf9602f8605b1c9ad5506ced5a -size 165455 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Add-To-Group.png b/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Add-To-Group.png deleted file mode 100644 index 3ef0d657..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Add-To-Group.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0570864bc4a6ba3916e5799c3cf3312d8708028a04060447c880b2f8011ccc4e -size 30960 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Configure-Groups-List-View.png b/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Configure-Groups-List-View.png deleted file mode 100644 index 421762ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Configure-Groups-List-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e392118ad1d0b594853e35585bba2f0eb3b0355c0f07e1dc16358960370f60c4 -size 34835 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Configure-Groups-Table-View.png b/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Configure-Groups-Table-View.png deleted file mode 100644 index 5c78e299..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Configure-Groups-Table-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6bf0dd1d56e7d5aac7ae72d508543a22c67d4ac0ecad774639ad0d3bd0c5e16 -size 30843 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/List-View.png b/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/List-View.png deleted file mode 100644 index e8b0b846..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/List-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e67366f57f279a77bfd2578b7f186b6eba2f5199fb40773fe9992c3003167180 -size 34861 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/New-Group-List-View.png b/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/New-Group-List-View.png deleted file mode 100644 index 6f9ea16a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/New-Group-List-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90b538ad93009c839029add8af98bdc499f5ebce5a71f4a5993748424130539a -size 39183 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/New-Group-Table-View.png b/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/New-Group-Table-View.png deleted file mode 100644 index 49a4ab8b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/New-Group-Table-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8da50a608b7177e170d71cb83fd0876b9f3bcbfb0412f8e6feacb1b6fcb14cff -size 32955 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Rename-Group.png b/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Rename-Group.png deleted file mode 100644 index f4fd1500..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Rename-Group.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1700e9126385256d0e71dbd769864f0acb5f08d7a1c64ff0ac166bd7d78f7ca5 -size 36535 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/StudioSelectable-Off.png b/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/StudioSelectable-Off.png deleted file mode 100644 index db48e8ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/StudioSelectable-Off.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d742e4fd997f919669bb5f42d244299d7f2babe6cc60296482d7f7d3f9a9ed83 -size 31837 diff --git a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Table-View.png b/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Table-View.png deleted file mode 100644 index a479770b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/collision-groups-editor/Table-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b89cc0c8be7f59fe7d5e48fa6fdc6cc295218169f96152595b9fddbfc9198a87 -size 28605 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/Callgraph.jpeg b/.cursor/rules/roblox/en-us/assets/studio/console/Callgraph.jpeg deleted file mode 100644 index 03a9efc9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/Callgraph.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99aba23afeac1dfcef93e6cb7b3c4b324ad995e3b040f7438e3561ac765d65bd -size 72062 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/Client-Server-Dropdown.png b/.cursor/rules/roblox/en-us/assets/studio/console/Client-Server-Dropdown.png deleted file mode 100644 index 3a349da2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/Client-Server-Dropdown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7aaeeef7194ea8020608bf4e8cd07d2385f1862b02e9fca7c864e359d7f6a31f -size 29691 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/Console-Summary-Bar.png b/.cursor/rules/roblox/en-us/assets/studio/console/Console-Summary-Bar.png deleted file mode 100644 index 54e125f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/Console-Summary-Bar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2ba5b655a157504d5d655815eed5a7abc80d4e50faae320d968a6ead3f37dbd -size 13684 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/Export-Window.jpeg b/.cursor/rules/roblox/en-us/assets/studio/console/Export-Window.jpeg deleted file mode 100644 index c1cca39c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/Export-Window.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24c3834a0e44704c32d56ecdafd872e161a62ced866e6e8e8a8ef640ab6a8889 -size 29534 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/Functions.jpeg b/.cursor/rules/roblox/en-us/assets/studio/console/Functions.jpeg deleted file mode 100644 index 49c881e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/Functions.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:348f9e2c2e018ad93f6ab61633d1271f9fbe3f8ae604bc9a3c1b91866f630ea6 -size 75970 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/Graph-View.jpeg b/.cursor/rules/roblox/en-us/assets/studio/console/Graph-View.jpeg deleted file mode 100644 index 08e99cb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/Graph-View.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:921c169ba84fd31d2f09807b2d3f66952b2d428a8b324795cb838eb6605ec76c -size 85082 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/Log-Sections.png b/.cursor/rules/roblox/en-us/assets/studio/console/Log-Sections.png deleted file mode 100644 index a08f483d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/Log-Sections.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:151df3742eef184a313f3412d4056f5427d878101a16514d03d1f302ffb9d1f5 -size 34853 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/LuauHeap-Native-Annotation.png b/.cursor/rules/roblox/en-us/assets/studio/console/LuauHeap-Native-Annotation.png deleted file mode 100644 index 9a81d5d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/LuauHeap-Native-Annotation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c00f5d3a463714d002fdf670885e2d97b32a938ad51969e9bb64de163fc0f36 -size 21536 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/LuauHeap-Open.png b/.cursor/rules/roblox/en-us/assets/studio/console/LuauHeap-Open.png deleted file mode 100644 index 0ad3ee12..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/LuauHeap-Open.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfa03980083eec66293bb928ef1726dd34efcc0f926e4a48e7d73ddc363ac1de -size 36082 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/Memory-Open.png b/.cursor/rules/roblox/en-us/assets/studio/console/Memory-Open.png deleted file mode 100644 index e96c032f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/Memory-Open.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a7a86859300a5b19bf11cdfbc8aab3fe775d7cc95d1bb8ea0a1c2ebff8c543f -size 36400 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Expand-Root.png b/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Expand-Root.png deleted file mode 100644 index 587b53fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Expand-Root.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9699bdc0ea8e96b5633f052f293e83995a81f4daa2da1fcfa0f9ab67d81eb2d4 -size 17682 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Native-Annotation.png b/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Native-Annotation.png deleted file mode 100644 index 3c3d261f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Native-Annotation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:197c6b52ab511e345ec9c236d8ad0a698d697b67568679d00ada35d80d0fb7b3 -size 23544 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Open.png b/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Open.png deleted file mode 100644 index 28d2f58e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Open.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c88f92a76f085c7f7dc190eaeca3f49ce2fe114d8b9d74cfe10894ca9d77aa3d -size 35779 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Start.png b/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Start.png deleted file mode 100644 index 22a3df30..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Start.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:944298b178f5aa484a5f5521b74ca1e6cb9297827eed6dcfbaa52448245bb162 -size 16298 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Units.png b/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Units.png deleted file mode 100644 index 07737622..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/ScriptProfiler-Units.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:223a79ca609024b9a07b610041a34432387847fbda301f7b59ad8184e7843de7 -size 16505 diff --git a/.cursor/rules/roblox/en-us/assets/studio/console/Unique-Reference-View.jpeg b/.cursor/rules/roblox/en-us/assets/studio/console/Unique-Reference-View.jpeg deleted file mode 100644 index 1883ca6b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/console/Unique-Reference-View.jpeg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b0ed30ee98d5f2b42ef3d702dc7e6369bc59348b65bfe6a1af387a2a9549f81 -size 92494 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Breakpoints-Window-Contexts.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Breakpoints-Window-Contexts.png deleted file mode 100644 index 87949616..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Breakpoints-Window-Contexts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62af1ac99abef7cb40862b63b487f7c8cea5f7e1d9b2cb72177d187b642fc07c -size 75711 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Breakpoints-Window.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Breakpoints-Window.png deleted file mode 100644 index 791603ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Breakpoints-Window.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dea00e24fafe9984b4688e00d14ff602e36de94b8f5d79d5c6c46999a85a25a -size 50361 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Call-Stack-Flow-Script.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Call-Stack-Flow-Script.png deleted file mode 100644 index a96b5a64..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Call-Stack-Flow-Script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b149a92fe25025b3705891cc5357143d4f9da6ca5c59aeaa6de6ff991664e51 -size 61007 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Call-Stack-Flow-Window.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Call-Stack-Flow-Window.png deleted file mode 100644 index 800abec1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Call-Stack-Flow-Window.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8498fe621be3b8f7ad09144b7abb17d4540ca4b079637636dee8a6141ec52a8 -size 56994 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-3D-Client.jpg b/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-3D-Client.jpg deleted file mode 100644 index 4033dba0..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-3D-Client.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c62ea4e663094ee8f3294f7fb4765641dd3f7efe7bf6d36e695de0f187342d07 -size 285133 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-3D-Server.jpg b/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-3D-Server.jpg deleted file mode 100644 index 8bd96041..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-3D-Server.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4457f3434b63dfc2ca586239b8b759cd240fe12bcd211627f87cb8f1ecca82dd -size 276055 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-Explorer-Client.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-Explorer-Client.png deleted file mode 100644 index aa8f067e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-Explorer-Client.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa2a100d27169d3fa1cf024ea7fbd65e6b265be25f14d87f1d99dde60b9bfb04 -size 48650 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-Explorer-Server.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-Explorer-Server.png deleted file mode 100644 index ccca3874..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Client-Server-Toggle-Explorer-Server.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6af9e9c12ca982be3dfbdabc90996e62c2348ba564f8ae81d17587c1a498fbcc -size 50317 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Active.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Active.png deleted file mode 100644 index e87d17f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Active.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c44bb5c813df7894cf286dfa8e02322af9e369fb2d8f3f9c40f84388f2dc183 -size 22053 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Conditional.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Conditional.png deleted file mode 100644 index 9af02368..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Conditional.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:788323814a616ee590f695441f7d101a3510f87fbb1838d0725c8731df201203 -size 21733 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Disabled.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Disabled.png deleted file mode 100644 index 7306b84d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Disabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3e1c4af484ca706ae35852bf25048b889764bcb1110db4f0fa302c375403d4e -size 21745 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Logpoint-Disabled.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Logpoint-Disabled.png deleted file mode 100644 index 900d34b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Logpoint-Disabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e57c46f4fddc93478500dd5e7c4f962378fe6fc4488089b19a1a74a75356939a -size 21694 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Logpoint.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Logpoint.png deleted file mode 100644 index e5c99044..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint-Logpoint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db28cd001c7cba2fb8c82fd405345490d7f8e08ab097b116f7607ca3f084263f -size 21335 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint.png deleted file mode 100644 index da455e49..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Gutter-Breakpoint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23e907fe43b6d1d90a8721ff7190124109215c2261998180f19c0ca1aca60ea4 -size 21368 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Native-Code-Size-Analysis.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Native-Code-Size-Analysis.png deleted file mode 100644 index 1d693eb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Native-Code-Size-Analysis.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:851ff7d4061a85dc6d5bc408e02867e90ac1a99aee9f37736b393e71cffe04f7 -size 197245 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Script-Editor-Mouseover-Table.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Script-Editor-Mouseover-Table.png deleted file mode 100644 index 464605f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Script-Editor-Mouseover-Table.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b48beb64cfb3d9cef425b56ff10a3718f65e19f092a3d91eeb3919be988071a9 -size 103931 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Server-Authority-Simulation-Radius.jpg b/.cursor/rules/roblox/en-us/assets/studio/debugging/Server-Authority-Simulation-Radius.jpg deleted file mode 100644 index e381dd9b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Server-Authority-Simulation-Radius.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40096fe8239deb44f61e2d059db919302a9479098bf67edcf483f86bcef79ce8 -size 241388 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Expressions-Script.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Expressions-Script.png deleted file mode 100644 index adf8b07a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Expressions-Script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69b3918edda781b63363744450c502b08755ad799d8e9f87b401ee47326e91f9 -size 158872 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Expressions-Window.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Expressions-Window.png deleted file mode 100644 index 1984a1cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Expressions-Window.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a709ddd595e163b8e766d0c778ebcb7aeb569d39f3fad22224531eff4b17242 -size 37211 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Variables-Script.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Variables-Script.png deleted file mode 100644 index 6bd8d0e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Variables-Script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6cc52b58d7e4830bd0158f46ee3182b51856fb982065d89d5fb668e520e3cc9 -size 159156 diff --git a/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Variables-Window.png b/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Variables-Window.png deleted file mode 100644 index b389525a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/debugging/Watch-Variables-Window.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13e8e044f3dbecb65f74e4798dce5f786fa15b00d1232f4c61ce95e44810d1ff -size 63800 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Branch-Expanded.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Branch-Expanded.png deleted file mode 100644 index e5520990..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Branch-Expanded.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a284d112b6238acef089d21fc3f330fe5ffc991c05336ee2cb2c0cf9140f8ef -size 129351 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/CSS-Test-Setup.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/CSS-Test-Setup.png deleted file mode 100644 index e797260a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/CSS-Test-Setup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90a361bb639752ded337bbf220de296c4618a16b049fa30e175f2eb6423a7c50 -size 52321 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Chat-Descendants.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Chat-Descendants.png deleted file mode 100644 index c9192de1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Chat-Descendants.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ceb877718b74e54a606228c8c78e221f21e3dfed80a2914707fa8e340888a93 -size 90937 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Context-Menu-Model.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Context-Menu-Model.png deleted file mode 100644 index 5a0cbf9f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Context-Menu-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b58c67d9dc86208b77d9e44f450a7e89eff001103aa6e0a8634eb98511efd8ce -size 173611 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Context-Menu-Service.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Context-Menu-Service.png deleted file mode 100644 index a0c8d4cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Context-Menu-Service.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:494313f4ac4fcd09df4b1fef2c219eaae93246d7a4242baaedd974cb766203d0 -size 159669 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Drag-Select-Searched.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Drag-Select-Searched.png deleted file mode 100644 index 2d341335..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Drag-Select-Searched.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:073a118d1a0488c5fa9a9671c7ee9952d0bde04d26593d93dfad288949e1a78b -size 80337 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Example-Maps-In-Workspace-ServerStorage.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Example-Maps-In-Workspace-ServerStorage.png deleted file mode 100644 index 5d27d527..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Example-Maps-In-Workspace-ServerStorage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf83098deb6836059583f742c0edef6f588605804c3026fc6f9c55b2e73436e2 -size 71510 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Example-Organized-Folders-In-Workspace.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Example-Organized-Folders-In-Workspace.png deleted file mode 100644 index 3afba29c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Example-Organized-Folders-In-Workspace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:905decf756f3522f6d2044acf84131bb49cce142c0cd225023ffe4c3c6fa84d7 -size 68042 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Folder-Children.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Folder-Children.png deleted file mode 100644 index e5901844..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Folder-Children.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d0e4627b2daada1aba70f2148c46270d6061119d9a007dc3542cc193e7a7339 -size 67882 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Insert-Object-Options.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Insert-Object-Options.png deleted file mode 100644 index eb1af98c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Insert-Object-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d96687b51326baae876ea904e8cb78c47b27d3575398acd605d661edac4e49a -size 25253 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Lighting-Atmosphere.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Lighting-Atmosphere.png deleted file mode 100644 index 64c8ccb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Lighting-Atmosphere.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c08ae6b8531b3590d19aa06b703f66592e842d79e24fec02420b4295611aa7e -size 20016 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Lighting-Sky.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Lighting-Sky.png deleted file mode 100644 index 996001c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Lighting-Sky.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f814ecced973fac11115bccfa422bc94a5e46ad69552caab376a9e07639c94a -size 14882 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/LinearVelocity.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/LinearVelocity.png deleted file mode 100644 index 0b5eedd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/LinearVelocity.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:287a8f8778849ada9ebddf60837dd16ce10d2dc4dc8ae9eb957cb6699b9140c9 -size 19543 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/LocalScript-In-TextButton.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/LocalScript-In-TextButton.png deleted file mode 100644 index e9d6bf60..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/LocalScript-In-TextButton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1704d9ff313daafbef6da18890464df251a4b4515fc6e5b2f6235c8ec3c1d3b0 -size 19161 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/MeshPart-ParticleEmitter.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/MeshPart-ParticleEmitter.png deleted file mode 100644 index 45672fc0..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/MeshPart-ParticleEmitter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77c65913a10d40901db61096152279a0e554de6e4996c2db299bb7a1e6e44979 -size 15916 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/MeshPart-SurfaceAppearance.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/MeshPart-SurfaceAppearance.png deleted file mode 100644 index 38717203..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/MeshPart-SurfaceAppearance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9cd0f32f141f900fda7c9a4b1b537a1e88ed235fe4585454af78735a9ce1a1b -size 17391 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-Beam-Setup.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-Beam-Setup.png deleted file mode 100644 index 98de0081..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-Beam-Setup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:762fe67b19e00e160882fcf6cbf66f04e16566f8d3520bc4786cd6c67d71d313 -size 14576 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-DragDetector.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-DragDetector.png deleted file mode 100644 index b597c7d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-DragDetector.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b61d68a40abe6781496bd58b04f9d8a54e38b00fa22fb6af880330d19c438394 -size 31108 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-Generation-Behaviors.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-Generation-Behaviors.png deleted file mode 100644 index 146a42f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-Generation-Behaviors.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8972f90d066fcdb43b2905636f411823e17cd0ea4fe2a74cce7adcbe243badf3 -size 24303 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-Generation-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-Generation-Hierarchy.png deleted file mode 100644 index 8ab420c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Model-Generation-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4c238c444bcfdbb044dfee038441ef104f7b948076071c85769030a741c66ac -size 54863 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Parent-Child-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Parent-Child-Hierarchy.png deleted file mode 100644 index 3a857241..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Parent-Child-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29d06462cfaf9c7a8b3bcbdc42cbc0c69372edfb30107f02f055bb14a574be1c -size 151287 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-Attachment-BillboardGui-ImageLabel.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-Attachment-BillboardGui-ImageLabel.png deleted file mode 100644 index 8d329d96..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-Attachment-BillboardGui-ImageLabel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbd4356606194a3ff49987b2b37ba5533e99f6c504226db94f4ad361e89d4359 -size 39782 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-BillboardGui-ImageLabel.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-BillboardGui-ImageLabel.png deleted file mode 100644 index 3ec06a6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-BillboardGui-ImageLabel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97f294433b6fd4f49a4af2ca5fd01cb86797b9caa045af37d26755919ce66209 -size 38938 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-SurfaceGui-ImageLabel.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-SurfaceGui-ImageLabel.png deleted file mode 100644 index 2da521e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-SurfaceGui-ImageLabel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3aa19b63a5615d124b94b87c0ba88fdeb752e1467b7d94b0525be600d2b952f -size 28976 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-Trail-Setup.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-Trail-Setup.png deleted file mode 100644 index fae89f99..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Part-Trail-Setup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4255c7d28703531e99b020a62cf4b247c6d6349f48d4c2c8c27031451687605 -size 10568 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Created.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Created.png deleted file mode 100644 index d89be9dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Created.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25e78009e7df088d31376c4e8540c62c7c6fd72a10fa734657a8fe24137b7d71 -size 22762 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Empty-Script-Adder.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Empty-Script-Adder.png deleted file mode 100644 index 052afad3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Empty-Script-Adder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abbd63b82c0b85bda185785a1969d1e8820e0584517b2cf006d06c4838d5ab19 -size 18362 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Inserted-Script.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Inserted-Script.png deleted file mode 100644 index bc4e0d15..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Plugin-Inserted-Script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd54a1877da907e81de79950eaa51b280dcafecb6f0fb39675de4b42a1254c84 -size 22185 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Reparent-Object.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Reparent-Object.png deleted file mode 100644 index 047b4a45..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Reparent-Object.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbe7ae4b4d9a906159e87c88d1809fa64bfd67cd04abb1c2b28ae42ba88206b8 -size 47398 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Model.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Model.png deleted file mode 100644 index e0ff5b46..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b9e3fbce36d848838545241bc35b4d5c7999426ca77a497ff08364db4e72843 -size 23710 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Server-Authority.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Server-Authority.png deleted file mode 100644 index 2fca6ebb..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Server-Authority.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f326aabf104eae8b7596352a1bdd2bd17f4c6d3337e22d20744acc1c1f97521 -size 14481 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Tools.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Tools.png deleted file mode 100644 index bcf581a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/ReplicatedStorage-Tools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b7fbc0554aaa4fbbf7f41a4ecef2128c17d7c735d47a382415f879303898851 -size 32329 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Clothing.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Clothing.png deleted file mode 100644 index 2c078505..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Clothing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce57f809efea58b136a29b774a0a32bc19519ad6b67c4dcd6e065db27ca49aa6 -size 13478 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Hierarchy.png deleted file mode 100644 index c5e1fc64..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1d47dca421e66aed097df1fb5d6fbcc8e3111a4908f3e4cceb00b5ca72f3f5a -size 98996 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Shirt-Graphic.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Shirt-Graphic.png deleted file mode 100644 index 984c5d78..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Rig-Shirt-Graphic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6924b9ad869852762286b68573d9f5ab118d25aa0e85b41fc405a857380a0586 -size 14432 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Script-Parent-Model.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Script-Parent-Model.png deleted file mode 100644 index bc10bea7..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Script-Parent-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1879846fa7f01c76a3d49008449c24b163352ab0f777a1d64678bf19303f2800 -size 7977 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Script-Parent-ReplicatedStorage.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Script-Parent-ReplicatedStorage.png deleted file mode 100644 index a58a0235..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Script-Parent-ReplicatedStorage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ac9c1a3303aa5a1eaba7f24ce90dfa9d37560cc43ac8b25feb7f36e1b7ac7cd -size 12985 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Script-Sync.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Script-Sync.png deleted file mode 100644 index b9e3a966..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Script-Sync.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a9e95c6c69af6494f7e998781dc8a84f675bf4d51173276bfed7d9d05e06e0e -size 233641 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Search-By-Name.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Search-By-Name.png deleted file mode 100644 index 4fc5baab..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Search-By-Name.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8e72b77b00482c4eb9f17307bffa3eb4503d2a82f187721bcd82aab2c16b58c -size 135818 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Search-Diagram.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Search-Diagram.png deleted file mode 100644 index b6279972..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Search-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96b41852ed72a02c9d4dfe2696cfc61671d7600117333db4a75c0ce2c9319fd3 -size 102112 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Select-All-Searched.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Select-All-Searched.png deleted file mode 100644 index c927d833..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Select-All-Searched.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cb6081a680997ec4d60f896c70131d5c9ba0161f4813c01afcb0d5f6a856791 -size 56163 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/ServerScriptService-Actor.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/ServerScriptService-Actor.png deleted file mode 100644 index c7746f8a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/ServerScriptService-Actor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c1e4c145ae387c56d73444524f1b96b544fbc5818736dc080b6029553a8ff6f -size 22674 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Non-Searched-A.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Non-Searched-A.png deleted file mode 100644 index cdf8ebeb..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Non-Searched-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79ac911d2cd6dc891fb9978932c3b70075aa329a190f72519b7c0d9651e03e84 -size 110790 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Non-Searched-B.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Non-Searched-B.png deleted file mode 100644 index 636be86c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Non-Searched-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85a66cd203df3ea97ad242e9554ae6ba1e12c105ec1d60d23c0122eb3f4476d8 -size 114156 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Searched.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Searched.png deleted file mode 100644 index 18d6875f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Shift-Click-Searched.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1dacdd421f1f63b71ffe17afe88db3cac591d665ee5c46c7c60611f6026fdbe -size 84578 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/SoundService-SoundGroup-ReverbSoundEffect.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/SoundService-SoundGroup-ReverbSoundEffect.png deleted file mode 100644 index 479a091c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/SoundService-SoundGroup-ReverbSoundEffect.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:185104534c83452e3b97dcdbd4784161ef277448fa593b55eb58c1f63617a623 -size 21012 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/SoundService-SoundGroup.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/SoundService-SoundGroup.png deleted file mode 100644 index 0109ec09..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/SoundService-SoundGroup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f8731bba68e2b095b2ab3fd58e7f5ac2fa032cef0b3e21fa387f3876d5dea61 -size 14866 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/SpringConstraint.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/SpringConstraint.png deleted file mode 100644 index 33f22725..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/SpringConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06e49d8c8f384abf5dadb27a18efd0b80783ae2170c228f1a93e5b0dceee6f8f -size 26375 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-BindableEvent-ContextEvent.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-BindableEvent-ContextEvent.png deleted file mode 100644 index d20873b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-BindableEvent-ContextEvent.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e3b0ee18e66f8733ebf1acb9b2235406ed394f7fd7562d8adeee82eaba4c6b3 -size 17267 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-All.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-All.png deleted file mode 100644 index 7fd440ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-All.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2cee6f213798cfe5130f8882ea17db5baa90deb473dee284ba3ff22018b6f69 -size 29150 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-GamepadBinding.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-GamepadBinding.png deleted file mode 100644 index 321ea0f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-GamepadBinding.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:742667c6b4ecbccb119889388d677e49ae32a339fa5ac88ab6ca9db5848d4d23 -size 29281 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-KeyboardBinding.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-KeyboardBinding.png deleted file mode 100644 index 403011f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-KeyboardBinding.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa1e6e60e2b2ce00e2869f6b8c2c3a3d755c82606bb86a623786fb596c5ffccb -size 27671 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-TouchBinding.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-TouchBinding.png deleted file mode 100644 index 50bc7382..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-InputBinding-TouchBinding.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a35fe95f28b95bebf390272802f5abf01d69723d7cd570bd4019a7529bebf86b -size 35242 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-LocalScript.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-LocalScript.png deleted file mode 100644 index 7169ef15..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction-LocalScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9d4597a1841e146af249111d82957c8ae4f4638b84e7d299e2ff92c0d0bb1c2 -size 26264 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction.png deleted file mode 100644 index ef7f3126..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext-InputAction.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:15ee75bfb7e7ee5116b2ef0b5c1020333f8b4aeb0a91d9d1cdaec696ffb59a17 -size 18901 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext.png deleted file mode 100644 index a66bc731..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-InputContext.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90cb613977dba8cd62afc833ad37ccf9f042fd83f745b5eb49a84610a66f6404 -size 21419 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-LocalScript-UpdateContext.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-LocalScript-UpdateContext.png deleted file mode 100644 index 3aefc02b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-LocalScript-UpdateContext.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43951d43000b67bb910736d9248cd7a393bff883ab881f4764a9f8b4d0edab9d -size 21343 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-HUDContainer.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-HUDContainer.png deleted file mode 100644 index 1e167b20..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-HUDContainer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd6de99a9fcb0cc696aa2a34a6096c2151d38fd808655a77040a7f58f340f904 -size 14071 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-MenuFrame.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-MenuFrame.png deleted file mode 100644 index e0eb7625..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-MenuFrame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6374372be5d3a02841432d74e92165993a62d2967749aa3fc6ccc9a75c42472 -size 14008 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-Path2D.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-Path2D.png deleted file mode 100644 index dcdd67b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-Path2D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28339fdec82c7744846fd8ee9a7858365ed5f550285d289025fdfce8ce4fcdfc -size 31086 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-SprintButton.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-SprintButton.png deleted file mode 100644 index c6646b93..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-SprintButton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e1549cf67b7e179bef5c8deb8403e98d853b4515ba94f29d74259b0860b70bc -size 21713 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-StyleLink.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-StyleLink.png deleted file mode 100644 index 50a0a5c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-StyleLink.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67c2ec0451f947ecebd34ae68948a45916eea7d779bd577bda0878f844101221 -size 19530 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-TextButton.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-TextButton.png deleted file mode 100644 index dc384b56..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-TextButton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4adc508fc8b58cc8f8fb1d09072dc8d8757b3cbade9ff52b3010180369b45bf1 -size 16284 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-VideoFrame.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-VideoFrame.png deleted file mode 100644 index 968a69bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui-VideoFrame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55d876e4b12759a93168342dada2057b03f8492e19cfcd981d69c5f26ccbbf1f -size 14640 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui.png deleted file mode 100644 index 77e53e10..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-ScreenGui.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62a9a722c189e54aec58e5d1962b41646b26ed233f72c3aae81739370ba1a435 -size 23856 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-SurfaceGui.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-SurfaceGui.png deleted file mode 100644 index f92688a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-SurfaceGui.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6941a717e62081a191be602c4fce8db713e8dffba2c36d76bede9b88ed54bda8 -size 35983 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-UIDragDetector.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-UIDragDetector.png deleted file mode 100644 index 6619449a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui-UIDragDetector.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a5cdf6ecc225715adf9478bba480a30dfba7bbe3c44568643f06f30e689bad3 -size 37559 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui.png deleted file mode 100644 index 260f5f73..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterGui.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bbe0e04a94c18184d24bbcfe5eb9d7f87a61d36211536fbe126969fdc14d005 -size 28459 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterPack-Tools.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterPack-Tools.png deleted file mode 100644 index c3cc2b5a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterPack-Tools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c7e17eca5eb3f1be45a422deb495f57a2334000d886e4e1dfe1d7509db2c114 -size 29517 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterPlayer.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterPlayer.png deleted file mode 100644 index bc4509d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StarterPlayer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f48234e1886529c44658a8a2cfb4c7faf4a3ec5e08ec7950fed9abb9ff99a8ce -size 18292 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/StyleLink-Propagation.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/StyleLink-Propagation.png deleted file mode 100644 index f1a797bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/StyleLink-Propagation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cbc21bd9c34abca25a6dc15d1cc12a37073793da3a868fee88726bdb1cb34c9 -size 60288 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Styling-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Styling-Hierarchy.png deleted file mode 100644 index ed596bdf..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Styling-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:611ea29537edd53aa8a8aa385531190ec9d431234241646ea308085cecc37d52 -size 73073 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Teams-Team.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Teams-Team.png deleted file mode 100644 index 0306fb41..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Teams-Team.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ae087c5993246d2dcc6749a5d9731d8a4adc96a1eaa7fe8827adea019ee0d3c -size 16974 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Terrain-Clouds.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Terrain-Clouds.png deleted file mode 100644 index 2c28605c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Terrain-Clouds.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7684ba541fde239c08b36be7d9fec15f10c0b03bcaa35f85ea6d0154563a45e0 -size 15237 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChannelTabsConfiguration.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChannelTabsConfiguration.png deleted file mode 100644 index 05ea4ee1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChannelTabsConfiguration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a73a317bdaf47e8a2616d9a43fbfdfb28cf74ad061b48cee081d3034350c6876 -size 35843 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChatInputBarConfiguration.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChatInputBarConfiguration.png deleted file mode 100644 index e1a078ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChatInputBarConfiguration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a1278dc34e08cda716226918a3bae216a87fd73409f6eb51a2ee99642c2c986 -size 35898 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChatWindowConfiguration.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChatWindowConfiguration.png deleted file mode 100644 index ec0bb5d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-ChatWindowConfiguration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab14946f6310a2ae3899a66e10542db98487ab789f3aa9239dfcfcc26e55bf73 -size 35360 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-TextChatCommand.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-TextChatCommand.png deleted file mode 100644 index 55b2996c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/TextChatService-TextChatCommand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24bd0b7c7e23b26020ae7e3177a009d96a1fc83ba140c84c4df35147b0b4e600 -size 39194 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/UIGradient.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/UIGradient.png deleted file mode 100644 index 024af206..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/UIGradient.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d2eef8bfc7e4fb398ef96af24e792bf3a389684ffba0f7ae90803e7d2fd7a2b -size 30682 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/UIGridLayout.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/UIGridLayout.png deleted file mode 100644 index 8630c098..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/UIGridLayout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b378af4af92baf9776283ae613b6e62946bcb896e6b6e7d52fa578c545efa15 -size 56247 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/UIPageLayout.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/UIPageLayout.png deleted file mode 100644 index 226ccf01..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/UIPageLayout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63a7148495415b70590d46289861266ff9239baafeb878d1fb430f304552eeb8 -size 32420 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/UITableLayout.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/UITableLayout.png deleted file mode 100644 index fdda3b12..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/UITableLayout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53564ab0aed3587c84f6959e90a5f007dedbde2d323acc1edffc035db5786c30 -size 61591 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/VoiceChatService.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/VoiceChatService.png deleted file mode 100644 index c53f4d0c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/VoiceChatService.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1c756a609d7fc797443803f864d48cfff16caf6a25275e46f92c835d879cf73 -size 19345 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Add-Object.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Add-Object.png deleted file mode 100644 index 4848df42..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Add-Object.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6645a0fd855fc8d3bcef08ed8e3e04eb5b7254380241ef84b622e51fb7ba742c -size 43325 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Baseplate.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Baseplate.png deleted file mode 100644 index ae822189..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Baseplate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:219c0e89b96249c042966079bf24842f11a28bba3144a4ee9f9c8897b7335ff9 -size 33776 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Terrain.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Terrain.png deleted file mode 100644 index 03139892..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Terrain.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7ceac4ed5f6d1e86043787207761e7b27ebaba1e61d867937cb53ecee72a0f0 -size 12157 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Tool.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Tool.png deleted file mode 100644 index b7cf32f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace-Tool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:826b2e70f1bfe547fa19f4014209ab8b5992d0a26a9cde46ad3a21df50d9c5a5 -size 15202 diff --git a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace.png b/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace.png deleted file mode 100644 index 2348ecff..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/explorer/Workspace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd2a84424271ab22ac035e4672853ff82efdd14d1a6c861b11290e03b3a178de -size 14886 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/3D-Asset-Preview.mp4 b/.cursor/rules/roblox/en-us/assets/studio/general/3D-Asset-Preview.mp4 deleted file mode 100644 index b5b6c718..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/3D-Asset-Preview.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:747b5814ae390374f7fef34805907301e39aaff0162842cb2175fc43df7a685f -size 641081 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Activity-History.png b/.cursor/rules/roblox/en-us/assets/studio/general/Activity-History.png deleted file mode 100644 index 3695146c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Activity-History.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:913cb2e4cb35394c5eb96efbac7243808bee8188b48d40d83029d585b7061167 -size 83783 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Boom-Impact.mp3 b/.cursor/rules/roblox/en-us/assets/studio/general/Boom-Impact.mp3 deleted file mode 100644 index be9aec04..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Boom-Impact.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe12be3f0e1264fd085386df79dffc8a28fafba3d53e85ecb9c87b45c47d5c8c -size 73274 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-Cyan-Purple.png b/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-Cyan-Purple.png deleted file mode 100644 index 750bc9a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-Cyan-Purple.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d81a8b0e1f59cbe97fd5af833cfcf72daa89ba10bea2dc9afd14a9bd579bc5f -size 117975 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-Purple.png b/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-Purple.png deleted file mode 100644 index cb36bf17..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-Purple.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ded5355afe8f66aae0d127df97bce6dd10fca7248c481a2ab562d089bb5b15e3 -size 118646 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-White.png b/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-White.png deleted file mode 100644 index e673904b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-Red-White.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67e92d2c423a39c70232102417565f0ac23ea360488974701121a99ed028f022 -size 86090 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-White-Keypoints-Labeled.png b/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-White-Keypoints-Labeled.png deleted file mode 100644 index 502466de..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-White-Keypoints-Labeled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fe5647a8ec6d4edfe03443495d8b57505824f7dd781f411caf7eac5fc96d89d -size 17515 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-White.png b/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-White.png deleted file mode 100644 index aca171db..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/ColorSequence-White.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67470f2400eadd4801cf163b0fabbf2f5f0957739b7c825fd65aeb918161d654 -size 10816 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Command-Bar.png b/.cursor/rules/roblox/en-us/assets/studio/general/Command-Bar.png deleted file mode 100644 index 9f89d78d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Command-Bar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04d24123e1f7984b16c432b08b6967c6fd3b6dc642ce202a94f3cb3057ca44e6 -size 46082 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Controller-Emulator-VR.png b/.cursor/rules/roblox/en-us/assets/studio/general/Controller-Emulator-VR.png deleted file mode 100644 index 584b89b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Controller-Emulator-VR.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:452d7d69546a87a05ee7dbb5f47f7994c9271b4f994636ad7757ef7b566f4b13 -size 155843 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Controller-Emulator.png b/.cursor/rules/roblox/en-us/assets/studio/general/Controller-Emulator.png deleted file mode 100644 index a61a67dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Controller-Emulator.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47bf484a60910ad13d0fe77ceb003b69a71236f8649970b786d38e5ac451278e -size 182931 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Device-Emulator-Phone.png b/.cursor/rules/roblox/en-us/assets/studio/general/Device-Emulator-Phone.png deleted file mode 100644 index 3e717e3c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Device-Emulator-Phone.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62813619b80fb277e48b0a963280ffe881d509bd591c54cb30d4d1d9525a5ef7 -size 74897 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Device-Emulator-Tablet.png b/.cursor/rules/roblox/en-us/assets/studio/general/Device-Emulator-Tablet.png deleted file mode 100644 index c57f4a1b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Device-Emulator-Tablet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b301b90da65b30752cd1a5b1dc0c8c30df6cd998844670c7e386a11b770fb1c -size 76367 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Expand-Collapse.png b/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Expand-Collapse.png deleted file mode 100644 index d03015fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Expand-Collapse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0d73b2fa8a62dbf7efd18ac1e448df3634c34e8be4003886f299fd4d1d18c43 -size 36562 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Grouped-Tabs.png b/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Grouped-Tabs.png deleted file mode 100644 index db879fad..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Grouped-Tabs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a32b17f774a4b68504f9130b6070724f23a69a4c6c8e75f359b812a3bb9217d -size 66805 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Pinned-Tabs.png b/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Pinned-Tabs.png deleted file mode 100644 index 6dc4e77a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Pinned-Tabs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf7b7858c6567779af24ec08b3eeb75464ef5238d1f3fb3fd971a9a2c8732b53 -size 201752 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Empty.png b/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Empty.png deleted file mode 100644 index 2b0c6201..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Empty.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad2389b44ce473f8e1497924287a9ad8c892a433421c6e950d36bb528fe0dc78 -size 266895 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Left.png b/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Left.png deleted file mode 100644 index e586a3c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36cb6e3412964607fdcc445ddfe2b52257534ced2dd5a74c2d9f92748ede4866 -size 216241 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Right.png b/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Right.png deleted file mode 100644 index 580d49ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Docking-Position-Selector-Right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eb1259c76983ff3185596bcde718d1f8031f9e40c1b6e40f9b9f5113c176428 -size 237628 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Editor-Window-Emulation-Options.png b/.cursor/rules/roblox/en-us/assets/studio/general/Editor-Window-Emulation-Options.png deleted file mode 100644 index f88b8dd3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Editor-Window-Emulation-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:922b51877f2856bf5b87239d376ab787a6dd72d71c45b0861d6814192d06f3d1 -size 101542 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Editor-Window-Object-Selection.jpg b/.cursor/rules/roblox/en-us/assets/studio/general/Editor-Window-Object-Selection.jpg deleted file mode 100644 index 61ef7531..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Editor-Window-Object-Selection.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f038b747cd60bfc7dcafbda00930199c5a1004bfe70bd173b41dd76efc7836c -size 236473 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Editor-Window.jpg b/.cursor/rules/roblox/en-us/assets/studio/general/Editor-Window.jpg deleted file mode 100644 index 3202b109..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Editor-Window.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7998267c1294875ff2203e6ee9973c2a543b50aeed1a040c793f27229f5f1a14 -size 210532 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Emulator-Viewport-VR.jpg b/.cursor/rules/roblox/en-us/assets/studio/general/Emulator-Viewport-VR.jpg deleted file mode 100644 index 05d8486f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Emulator-Viewport-VR.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:376ce192cf1bea80a4f3b3d4131ae756141c3a8bfb9ac7f3a54a988016cc6012 -size 188117 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Manage-Tabs-Popup-Options.png b/.cursor/rules/roblox/en-us/assets/studio/general/Manage-Tabs-Popup-Options.png deleted file mode 100644 index c475bb9b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Manage-Tabs-Popup-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2a66fa4113a49646dae5b86970817896a7dbf467c55e621c3856b73c3389685 -size 94866 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Manage-Tabs-Popup.png b/.cursor/rules/roblox/en-us/assets/studio/general/Manage-Tabs-Popup.png deleted file mode 100644 index 2ee2ace1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Manage-Tabs-Popup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d00b6596ec65d26dadc991d2cdc19686f073ffd6b69609f877a836bfd0c9c44 -size 220826 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Resume-Scripts.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Resume-Scripts.png deleted file mode 100644 index 315220f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Resume-Scripts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4fb2016b8c13b7b507803e1b15a10e81ab778ef2e0b4208ea7d02ec8899ebee -size 78566 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Stop.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Stop.png deleted file mode 100644 index b7cd0d48..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Stop.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eeb2abc30afc7f4f37fe3ba1bd922a36b42698b4421b67de804f91b1bc246279 -size 78542 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Tools.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Tools.png deleted file mode 100644 index 743afc7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Debug-Tools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5717adfdcc655ea9059db40974c0f7003e9e52f21b741fb8e82db259a4c8994d -size 77802 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Default-Tabs.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Default-Tabs.png deleted file mode 100644 index cfed3051..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Default-Tabs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:256c272b54889c5d41baea8c0c4b635948aeb66d1544c5beaa3ef3d91b47fc8b -size 132435 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Right.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Right.png deleted file mode 100644 index c647232d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1835fd7a7c9c98d49ee4fcd392ab34c92d1f9955791c77a86593dc32b57731a -size 64406 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Client.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Client.png deleted file mode 100644 index 302f1e4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Client.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c74584214cab8762a528486dd4da97b42c2dbf5e1f2a1e9f215b549d5fc89620 -size 29808 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Controls.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Controls.png deleted file mode 100644 index ad3ba7c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Controls.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b107a36fa0066cf541aab461af7b2bf0881599d6a97fd1570095b9acd285b1e4 -size 204997 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-End-Session.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-End-Session.png deleted file mode 100644 index a506b350..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-End-Session.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e533bee80dcc511fb819f69cb2f7c955cd2e2ddd02811f671675a6aa8cfed104 -size 80736 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Run.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Run.png deleted file mode 100644 index 0a1a1537..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Run.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e42f38df35ec97998f5109900ccf90bdad13e6fe33a3c909cb708f66eced572 -size 75673 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Server-Clients.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Server-Clients.png deleted file mode 100644 index 1038799b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Server-Clients.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ebb0cb46ab80febff160bca89c9f36b2966b7a453fd46f33be8f6f8ded7714f -size 78784 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Team-Test.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Team-Test.png deleted file mode 100644 index 934f06db..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Team-Test.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b27893c6a4c4a9713c8df56f794ad7bbe5c9f0b507d5e4f5373bff0e71dc852 -size 77494 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Test-Here.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Test-Here.png deleted file mode 100644 index 3ee25a46..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Test-Here.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03bbaf224a182f37054eb66b4e8d934baadbe44b3cebeb4c8b773b70a979031b -size 76866 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Test.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Test.png deleted file mode 100644 index 50cb3583..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Mode-Test.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65f5590da0735beb6ab74d74d021c35ad5ddeb61a116c2d10c30d6067eda33a8 -size 76142 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Options.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Options.png deleted file mode 100644 index ecf0591b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b49265c5eb41faef6bfe33b396174fa6c866ada51203b97c06a074e60b6e9bb7 -size 74808 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Pause.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Pause.png deleted file mode 100644 index 122431d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Pause.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66239daabdd763ca34797b20d684af6a110397b83ce7d4fce0fcad347b5ebde9 -size 76094 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Server.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Server.png deleted file mode 100644 index f9e85218..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Server.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a6b0ae81dd4e4acc36e37e0c99809f536816fa7dc96e962dbbfff61dd86da30 -size 30067 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Step-Forward.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Step-Forward.png deleted file mode 100644 index 0a7bf32e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Step-Forward.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa9ffc2e33ffede28fca52f2e25cabcc1eb6e7fe58bfd9e36d31de4def13e5a3 -size 76914 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Stop.png b/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Stop.png deleted file mode 100644 index f6085a1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Mezzanine-Testing-Stop.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8122d80e857475aa9e0b811a53f834452b069676be3459a79b6a0220bcce69b -size 76152 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0-1-0.png b/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0-1-0.png deleted file mode 100644 index 63b5aab7..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0-1-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a95edbc0eac427246bd1a8b5f9cf2af7bb2cf1ddef7c1c30a3a2a5b0a9d0420 -size 16285 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0-1.png b/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0-1.png deleted file mode 100644 index 52f0160e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b895bacd0a5aedbb0f73592b0b76f17895a238875096e1e6d4669680519e6e8 -size 11610 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0.5-0.5-Keypoints-Labeled.png b/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0.5-0.5-Keypoints-Labeled.png deleted file mode 100644 index a05ae807..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0.5-0.5-Keypoints-Labeled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36e059f23f67c4b79458697a3ae9893a81ae8fae9f0094751afe033ac585f010 -size 15932 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0.5-0.5.png b/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0.5-0.5.png deleted file mode 100644 index fbb3528a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-0.5-0.5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91ccfc2c4c14c0ca851c13bb6e2f29caf6033d915f428f6037371bc398e9d65d -size 8755 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-Envelope.png b/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-Envelope.png deleted file mode 100644 index 845ab71b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/NumberSequence-Envelope.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b90465bdd1be1119f02eadb06a4e143fad8e551f78e82a470dffae83c670eba -size 10891 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Output-Window-Client-Server-Labels.png b/.cursor/rules/roblox/en-us/assets/studio/general/Output-Window-Client-Server-Labels.png deleted file mode 100644 index 795318f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Output-Window-Client-Server-Labels.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c003e268a92fe7e8fbf341bb0c9a69380524c9f8e422393ef21b1499db6a0d3c -size 41805 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Output-Window-Diagram.png b/.cursor/rules/roblox/en-us/assets/studio/general/Output-Window-Diagram.png deleted file mode 100644 index a8360733..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Output-Window-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db2b2b80b0b7e7f001367a7411718637a1cf8a81d1814d6cf27d88135d440094 -size 91032 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Output-Window.png b/.cursor/rules/roblox/en-us/assets/studio/general/Output-Window.png deleted file mode 100644 index d7641399..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Output-Window.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ddf7a2594f73fa993f42a966a2b0c6c251aeb62a67b7b20a6e3f7526a5c7a946 -size 71449 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Party-Simulator.png b/.cursor/rules/roblox/en-us/assets/studio/general/Party-Simulator.png deleted file mode 100644 index 3d852b1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Party-Simulator.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d00401f2bf9baceadc19cd50310aa2b22f7d2c25cfbee00d6de92e9509d710b9 -size 136713 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Preview-Panel-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/studio/general/Preview-Panel-Hierarchy.png deleted file mode 100644 index a2c2bfe2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Preview-Panel-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83dc505376a13b176533857b9c59c92b098cae4479188647f09b5c230422a7a5 -size 85578 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Selected-Object-Bounding-Box.jpg b/.cursor/rules/roblox/en-us/assets/studio/general/Selected-Object-Bounding-Box.jpg deleted file mode 100644 index 101c0eae..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Selected-Object-Bounding-Box.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b12b579004de0ef2d0f58c0821a93cbfa0b40ca94d4b2f2e248972a52bbba07f -size 231666 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Selection-Cycling.mp4 b/.cursor/rules/roblox/en-us/assets/studio/general/Selection-Cycling.mp4 deleted file mode 100644 index 1eb307a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Selection-Cycling.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6effea3266ce09a0759f6147482811a4a6b676a019845c69c6b34fb87a51deb -size 3250101 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Studio-Layout.png b/.cursor/rules/roblox/en-us/assets/studio/general/Studio-Layout.png deleted file mode 100644 index 6f51d17d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Studio-Layout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25d55764ab0c36b69e34f1e15af1e18d1da97cc0b2ab64120cb1189a92bf46eb -size 346912 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Studio-Logo-Blue.png b/.cursor/rules/roblox/en-us/assets/studio/general/Studio-Logo-Blue.png deleted file mode 100644 index 3831a191..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Studio-Logo-Blue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fd5ced596aa4d3e846a0eaff46b845f86311fc58718cfe94562c32b1a89678e -size 38788 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Studio-Splash.jpg b/.cursor/rules/roblox/en-us/assets/studio/general/Studio-Splash.jpg deleted file mode 100644 index eb19b805..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Studio-Splash.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcc9c4c52d5ae0e4fac0cc5eefc606759f9b67eccf1f5077b68bac305c209a0d -size 263474 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Add-Custom-Tab.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Add-Custom-Tab.png deleted file mode 100644 index 59725d05..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Add-Custom-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6f5298a3c46410e68af3d55408acdb4c4a476b8d0c94b59de9b96fbaf5bc31e -size 124248 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Align.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Align.png deleted file mode 100644 index 6b9e2761..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Align.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5af85aa43e74729f9b6b351341beac4504fba9ff905ccc5e98914a1a64229567 -size 210161 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Anchor.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Anchor.png deleted file mode 100644 index 6da367af..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Anchor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf9b3cc2124fbc37028765f94d90a09b294e6f075fa8de9a3d608752c7fe1d08 -size 200390 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Animation.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Animation.png deleted file mode 100644 index f0b4539c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01ab953ccd4c00a86336d5aa1c480b6e0fd359478421c4c854bdcace1eba9c0d -size 205727 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Assistant.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Assistant.png deleted file mode 100644 index 50e2c45f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Assistant.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c968515b92583b9f9ce52dcd9a595f0ebc27daf26db021fab7f04a9418aa67bf -size 68245 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Avatar-Settings.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Avatar-Settings.png deleted file mode 100644 index fad7bce8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Avatar-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:912c8fdd572538f08759b92dc4d6b68851f341bf2d1a0d52d46cf3888292010e -size 206318 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Avatar-Setup.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Avatar-Setup.png deleted file mode 100644 index 8b99406c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Avatar-Setup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ae071b1ad01fc013687509e7d58c57c0f12ce073adfd528d0368b99c61799af -size 206486 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Character.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Character.png deleted file mode 100644 index 9308dc4b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Character.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8e164831f212914d2c575f1bb30dffc61724fe3b7fbf98c887e7956a47ba40d -size 205886 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Collaborate.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Collaborate.png deleted file mode 100644 index 8e9981ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Collaborate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95ae25766c2cd78cd6c01864b68a22cea526c4c35380d4b52aab103b47e408b3 -size 66968 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Color-Picker.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Color-Picker.png deleted file mode 100644 index bcefb35c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Color-Picker.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7495098f909d20a9bd43c9e789843fa7d88aae162477d92d8d0d9243a49efac -size 395771 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Comments.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Comments.png deleted file mode 100644 index 81a2a654..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Comments.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1d28ad7ea3cbf437e8768061ef9d4ee30b4d30b2604a94fa12123224069d625 -size 68744 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Constraint-Pickers.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Constraint-Pickers.png deleted file mode 100644 index 33e8ab1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Constraint-Pickers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1661a8b40603cb39844136cc94e34eaca9702e27c0e778f1be5c6bcc8288341c -size 196305 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Current-Collaborators.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Current-Collaborators.png deleted file mode 100644 index 60ada287..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Current-Collaborators.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b09310316b65b7077e14f8b14eb4b32dcc369b70ea3f57968dd660492b9c216c -size 75882 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Plugin-Button.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Plugin-Button.png deleted file mode 100644 index 4a12c2bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Plugin-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84c829eae7f5d4c86a55d07c6c18b95f3b9108063816281da51cc8cd169887bb -size 171189 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Tab-Add-Tool.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Tab-Add-Tool.png deleted file mode 100644 index c427fe76..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Tab-Add-Tool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7544e154d9a433fb8cd728beff3305ebdeb21e4782811dba291d62f30dbdc3e2 -size 97245 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Tab-Filled.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Tab-Filled.png deleted file mode 100644 index db20a89f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Custom-Tab-Filled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9749937818db84533e15504c123fbdb134989d2bb2ed8125c9aefc84229ba175 -size 186839 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Debugging-Tools.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Debugging-Tools.png deleted file mode 100644 index e6407434..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Debugging-Tools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee011017622eefe4eedf6ed0b4a9c810e2ee1fc0aaccc5099bd03db6b4f34e9b -size 173309 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Explorer.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Explorer.png deleted file mode 100644 index 71117b77..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e65bf84f9c0658c01464c5ea8d1b92ef74d1690b34b05e7c6bd8e61731d76389 -size 202295 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Group.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Group.png deleted file mode 100644 index 82c4f3e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Group.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a726b4133ca41ec530a603354c94c3c53dc0c9f730c7ad873290711eb67cc10 -size 200631 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Insert-Part-Widget.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Insert-Part-Widget.png deleted file mode 100644 index b0c2cb14..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Insert-Part-Widget.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50a3577c3d788d427596255338d489bbeeceaa58d4d2e56519ca6cc047e1ec7b -size 145000 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Lock.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Lock.png deleted file mode 100644 index 1e56d572..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Lock.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1010f0afcfbc1069af2a50e1118fa6eb17286fe34b750250255bba8c2b3e108d -size 200572 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Manage-Collaborators.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Manage-Collaborators.png deleted file mode 100644 index a646a8cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Manage-Collaborators.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9dc0f266170d4f673f394137c8a8b9be1f14255ff0a64ebc63a1a9053281dc90 -size 68696 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Material-Color.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Material-Color.png deleted file mode 100644 index 0ecef036..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Material-Color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2332e31d83b649ce214c464c4cc746539d9a3f69c091d3153cd0afe98a66bd13 -size 196697 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Material-Picker.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Material-Picker.png deleted file mode 100644 index 6dfda85f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Material-Picker.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5226e3a9fd24b2af9f47d2fa0b64f9870ee09f907d7533218e471c9d4ee014f8 -size 419795 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Mezzanine.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Mezzanine.png deleted file mode 100644 index d7aa31e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Mezzanine.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7be75d2429ae1f2e431fb189ba444e054448b6b4787e0778acb01ec81a7c9096 -size 191515 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Mode-Physical.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Mode-Physical.png deleted file mode 100644 index b0edba89..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Mode-Physical.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e00607aa990d0f8483d1de7c2da9ad10d3b8999f0adb516f5bebca3f7766b910 -size 208736 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Pivot-Reset.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Pivot-Reset.png deleted file mode 100644 index 8d2e9223..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Pivot-Reset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0014ec5571fb4642b78d590ea1ffda2b03f783842f5033e2d41891149c399a0 -size 207211 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Pivot.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Pivot.png deleted file mode 100644 index 75a2e967..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Pivot.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1182d31b7e12809cfa6d83e0c4e18357e082e0cdf9365f3ce432cb5f8e0b4df -size 205094 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Properties.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Properties.png deleted file mode 100644 index cd1989fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d444b472a489111e611fb47b8217524ff5ea4fca801d4bb47ea3dc3fb563150a -size 202206 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Solid-Modeling.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Solid-Modeling.png deleted file mode 100644 index 56ead74e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Solid-Modeling.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7635dfa196d6227304096418f5d920f624e030dd597db84911b8f76a10545a01 -size 209219 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Style-Editor.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Style-Editor.png deleted file mode 100644 index 44416db1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Style-Editor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a77f1143813128b0d88a92f3d54d88f65e1fc17cd945b12621e084bc7082712 -size 168391 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Terrain-Editor.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Terrain-Editor.png deleted file mode 100644 index 7a1ae034..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Terrain-Editor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee8dbd3106f0183eb9c1c38d828b45c81ad66389b9c0c3428499e30987c1a2de -size 210965 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Toolbox.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Toolbox.png deleted file mode 100644 index 4c2f31bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Toolbox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:426f597c6f1cb9dcd35bca974b472ec21002d29adb0690c568e752b9f7fd132a -size 206998 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Transform-Snapping.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Transform-Snapping.png deleted file mode 100644 index 1a32c69e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Transform-Snapping.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:471a1912027bfa17174f8b92bdbc59a7c4a5963ce35d908b59ffc32b599fc4ec -size 209706 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Transform-Tools.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Transform-Tools.png deleted file mode 100644 index 92078e0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Transform-Tools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4992d20c89142e5a369f14aac5ae2fa002cfeb51c8be62663fa91abdde6fe97 -size 208753 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Update-Available.png b/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Update-Available.png deleted file mode 100644 index 3a5b79a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Toolbar-Update-Available.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22f34cbeffce25796e84c1a1363c2a060bcb0f685138ba2ed28b54df2bc2962d -size 77614 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Touch-Simulation.png b/.cursor/rules/roblox/en-us/assets/studio/general/Touch-Simulation.png deleted file mode 100644 index 5afa51ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Touch-Simulation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a680732f3e83ca78cfdf952468a538264a41fde5a77f8749f46570ecfaeee64a -size 270466 diff --git a/.cursor/rules/roblox/en-us/assets/studio/general/Visualization-Options.png b/.cursor/rules/roblox/en-us/assets/studio/general/Visualization-Options.png deleted file mode 100644 index 35df92b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/general/Visualization-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:103f82ce4efe27c07d2234a45e8777f36ad21891c71a6385aa1a2cb5e04c7dd9 -size 53963 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Apply-To-Selected-Parts.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Apply-To-Selected-Parts.png deleted file mode 100644 index 22bf522b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Apply-To-Selected-Parts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eaa7327c82d40848242d4f4d06a4338bde9006bc0809eed52120de776d2cef4e -size 92407 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Base-Material-Selected.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Base-Material-Selected.png deleted file mode 100644 index ed7cd864..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Base-Material-Selected.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b911efc131a52def6ca06bde3e4c0f90c1f882936cd3fc4ce6086e463c1733d -size 108558 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Create-Material-Variant.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Create-Material-Variant.png deleted file mode 100644 index 69542ddd..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Create-Material-Variant.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:572895e96729ac6040e3f8a2072406632d10d0dcb864cb3ab437a32bd78ff013 -size 95234 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Custom-Material-Icon.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Custom-Material-Icon.png deleted file mode 100644 index 75b460ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Custom-Material-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:429bc522cbc3f17345f566585023e553ebddb15cea9e0eadb214017655ff071f -size 76969 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Disable-Material-Override-Specific.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Disable-Material-Override-Specific.png deleted file mode 100644 index 003877df..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Disable-Material-Override-Specific.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:493129cd1b118e465761ada51591cc1f82d5a82797ed52b992e3c9afc66cf3f8 -size 19160 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Paint-Parts-With-Selected-Material.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Paint-Parts-With-Selected-Material.png deleted file mode 100644 index 3deeaf6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Paint-Parts-With-Selected-Material.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc1edc70d7d8abf6645ec6a21a059481f541f5411b9ede9c52398188cf6ee8bc -size 90497 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Physical-Properties.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Physical-Properties.png deleted file mode 100644 index abf72603..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Physical-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e98d860012b680e63e233cfcc04a7c3b78de17e4de6759a494b33c72e0f625c9 -size 20690 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Set-Override-Disabled.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Set-Override-Disabled.png deleted file mode 100644 index cae3cfb1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Set-Override-Disabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3b275e46f6cebce652c65a73f3b4f8aa617ebbad898e93c577b5965934ca5ba -size 8289 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Set-Override-Enabled.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Set-Override-Enabled.png deleted file mode 100644 index 71b956a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Set-Override-Enabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24955583cb89e096fd4f021bc5d666287e7ea7bbdeead4cf2f31a14f86cdbc82 -size 9541 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Terrain-Details-Create-Buttons.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Terrain-Details-Create-Buttons.png deleted file mode 100644 index a4738952..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Terrain-Details-Create-Buttons.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f30ddc72009f67973a6c2f44ea1162b0c74eba4ee2d0fdd67015bd7c75d569f1 -size 13798 diff --git a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Terrain-Details-Edit.png b/.cursor/rules/roblox/en-us/assets/studio/material-manager/Terrain-Details-Edit.png deleted file mode 100644 index af517721..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/material-manager/Terrain-Details-Edit.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0c9a8717996e60fe64f0612374f1013ae3e25ef16b1074c39e0318c6a4b4257 -size 60034 diff --git a/.cursor/rules/roblox/en-us/assets/studio/packages/Compare-Versions-Selector.png b/.cursor/rules/roblox/en-us/assets/studio/packages/Compare-Versions-Selector.png deleted file mode 100644 index 50b7d0a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/packages/Compare-Versions-Selector.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb36551cce80caad53259e551a83b26ae2c1a0cba5dfe8c031d753da30c24167 -size 94798 diff --git a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Configured-Attributes-Reset.png b/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Configured-Attributes-Reset.png deleted file mode 100644 index a685db12..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Configured-Attributes-Reset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:252929560447a21638b879ec8aedd8fd6d3bde1773a200573ff12f8206b0ff41 -size 27271 diff --git a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Configured-Attributes.png b/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Configured-Attributes.png deleted file mode 100644 index d8ffd88c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Configured-Attributes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8c8c0cd319e79d2e6460d0a1968769cf3f8e8b9c028f08d5242b476272ee963 -size 25846 diff --git a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Modified.png b/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Modified.png deleted file mode 100644 index 195e0806..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Modified.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a1280e233306e574e06266c123bf98d4619c15b17f5527bb99b0c3f6d3f133b -size 22779 diff --git a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Structure-Explorer.png b/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Structure-Explorer.png deleted file mode 100644 index 78f2f79f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Structure-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da1dec2e0d51f9eac89c4a5853a3e6e39d58cdb581806c28550f4e72100f9599 -size 23079 diff --git a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Update-Available.png b/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Update-Available.png deleted file mode 100644 index 81fc783c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/packages/Package-Update-Available.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7dd6d8a7b8b1f05b6960c6345f3b8eb580056affdd1653573dbff6ab87ad222 -size 25687 diff --git a/.cursor/rules/roblox/en-us/assets/studio/packages/PackageLink-Explorer.png b/.cursor/rules/roblox/en-us/assets/studio/packages/PackageLink-Explorer.png deleted file mode 100644 index 52772cda..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/packages/PackageLink-Explorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f30a1692e0d728d17e68ec54b26c852b68527cba694e10fe302b5519f1d8ef2 -size 12950 diff --git a/.cursor/rules/roblox/en-us/assets/studio/packages/Script-Unlock-Link.png b/.cursor/rules/roblox/en-us/assets/studio/packages/Script-Unlock-Link.png deleted file mode 100644 index 8f46e921..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/packages/Script-Unlock-Link.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e820f62ea70eb390e9d866ea3e6958296c0d24d9188143eb43770fb9973f0e7 -size 74128 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Center-A.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Center-A.jpg deleted file mode 100644 index 9c22d9dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Center-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d373bf20691aa012cba24d7fab98dce804635b480325a8a82b39593c2bee13d5 -size 128060 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Corner-A.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Corner-A.jpg deleted file mode 100644 index 7456205d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Corner-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee8d556922b9bd7add0189288146256095a8c8aed711da7abe78444ab8995163 -size 127812 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-A.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-A.jpg deleted file mode 100644 index 132d504c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:71416aac5f72b64f752644fdc1060c96ee65416474450015892a72cab6f5f301 -size 189672 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-B.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-B.jpg deleted file mode 100644 index 34449203..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79390221c34842938e0d5304a71cb66a5e3dc7706b80c8920dbdd99ca4f9b014 -size 183928 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-C.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-C.jpg deleted file mode 100644 index 77c30585..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Model-C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a05e4df3a87d5901014eec50d6c21e81738cd33f19bcc55553c7f580fa0c4a8e -size 186473 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Outside-A.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Outside-A.jpg deleted file mode 100644 index bdcf4ede..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Edit-Pivot-Outside-A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8772848e3cf2c9596d2fb8778f5c8b677c35ff4582f55db180758ebad43703ae -size 127196 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Hotspots-Model.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Hotspots-Model.jpg deleted file mode 100644 index 155c21af..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Hotspots-Model.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa774906b68f9eb91c14df0e1db6227b4ce8442e1be91f6a6488ca1ff8a0cde0 -size 135057 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Hotspots-Part.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Hotspots-Part.jpg deleted file mode 100644 index 665d8ec4..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/Hotspots-Part.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b38464055dcde44ca7a099bccd8ef7078fc79e497c0b5a7138d42211429bf3e -size 72623 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-1.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-1.jpg deleted file mode 100644 index 6a6cff16..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67a2c701ae16195c0060f9c901795f69632c07d6be32cd1d7c584c61a859f642 -size 160111 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-2.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-2.jpg deleted file mode 100644 index 8757b39e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5be931f6b823e95b92d39c91a602fc4496a02f442271ef6d70a97decf5e4983e -size 118576 diff --git a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-3.jpg b/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-3.jpg deleted file mode 100644 index 835be05e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/pivot-tools/PrimaryPart-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:081824e247b5bc95745cfc329c499f4038c2012f7029b04595d2f82fdd4ff058 -size 124506 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Add-Attribute-Button.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Add-Attribute-Button.png deleted file mode 100644 index b0ff8d22..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Add-Attribute-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:647b53d11b871880ba3c1af0fb016cf8c50b35c59989f9dd5c5a019e1d6bb466 -size 11910 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Add-Tag-Button.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Add-Tag-Button.png deleted file mode 100644 index 751dbe88..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Add-Tag-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10924a4b351a4ca2d7ba5188f09c9517dc04e4643a055013d403348ba85f2ba7 -size 10444 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/AnchorPoint-Default.png b/.cursor/rules/roblox/en-us/assets/studio/properties/AnchorPoint-Default.png deleted file mode 100644 index 353a3bb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/AnchorPoint-Default.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77d83fae613a835ffba0decb6720a3174677c52c6e372964759b4d7b707a7c1e -size 9521 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/AnchorPoint-Overridden.png b/.cursor/rules/roblox/en-us/assets/studio/properties/AnchorPoint-Overridden.png deleted file mode 100644 index 5046fd3f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/AnchorPoint-Overridden.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:829ac8ba41ec7eb0768dfc3ba0054fbff195b438d8d857e70653e8ba9c239925 -size 8876 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Appearance-Color3-Picker.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Appearance-Color3-Picker.png deleted file mode 100644 index 0ae16fef..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Appearance-Color3-Picker.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fdd004c0d83595c0ed3658b68701aef5fe8f679a8840f3819b1ac92aea52b3b4 -size 12676 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Appearance-Color3-RGB-Entry.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Appearance-Color3-RGB-Entry.png deleted file mode 100644 index a521a9cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Appearance-Color3-RGB-Entry.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:529abf11c2e1c41189b0a301ecf63e03725710d95460f4e9f8429bc8ea51116f -size 12822 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Attributes-Example.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Attributes-Example.png deleted file mode 100644 index 51ceb7e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Attributes-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:139a3f0da8ce47093816750ab7e66a088ed94b1076b0cf62451c678aa0a0365c -size 26494 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Color-Input-Options.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Color-Input-Options.png deleted file mode 100644 index 1a4954a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Color-Input-Options.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c717ea6f47f94b16f5972ee5912073f45136f1000e1ce6d34be14ca43bb1e8fa -size 23886 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Color-Open-Sequence.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Color-Open-Sequence.png deleted file mode 100644 index ff0fe88c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Color-Open-Sequence.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57f67110030126e6273c7bb37094f8b81294220c013d6afaaf64b06237e30bc5 -size 6235 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Color-Picker.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Color-Picker.png deleted file mode 100644 index 83c8b251..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Color-Picker.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c39d6b9b4a9cc10c4799841e6dddc355cc1f56198ea8b825dce67eb7ad200017 -size 31209 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Color-RGB-Entry.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Color-RGB-Entry.png deleted file mode 100644 index 377de4c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Color-RGB-Entry.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7a03cbe86c234775a4b03039b6fb4a7525137a0aaaa6f30fd42e4818e7af04c -size 26446 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Default-Properties-Toast.jpg b/.cursor/rules/roblox/en-us/assets/studio/properties/Default-Properties-Toast.jpg deleted file mode 100644 index 388fa74f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Default-Properties-Toast.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fede6d6ae95526b6ffadea0f2c189d42d7821efbbf93182b4a296a42598ded9b -size 303241 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Enter-Private-Asset-ID.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Enter-Private-Asset-ID.png deleted file mode 100644 index 6014c917..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Enter-Private-Asset-ID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df1e3bdf391bed83a4f78c8ea66a2f0ed5ecf7b8ef37e3c39cdc60a7a955315d -size 32687 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Folder-Sandboxed.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Folder-Sandboxed.png deleted file mode 100644 index 90325112..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Folder-Sandboxed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:867e75d39654a8d9ce199950166f073542fd9302a0ef8b6d29660626d2c4c860 -size 32593 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-AnchorPoint.png b/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-AnchorPoint.png deleted file mode 100644 index 5b08a923..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-AnchorPoint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d65fe9543dc6caf3ddb32042ab015d55eb4d7e5880a1015837986cb2840ad6da -size 18283 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-AutomaticSize.png b/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-AutomaticSize.png deleted file mode 100644 index 2e192492..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-AutomaticSize.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99e2cf10a1bba5b6094c616d6a5e63d788d6add4beba14200b487c0b514fd805 -size 25594 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-Position.png b/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-Position.png deleted file mode 100644 index 9d5af34c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-Position.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66e48711a99a2fb470cda3b2e0920e46865923fc53bf8d5d862c2ea13363febd -size 30800 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-Size.png b/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-Size.png deleted file mode 100644 index 8b8c6943..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-Size.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5c49dc9ad531613ba51aa16859eea5c63465744564984c558080d9059b93523 -size 29667 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-ZIndex.png b/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-ZIndex.png deleted file mode 100644 index 28175ede..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/GuiObject-ZIndex.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03c437e910dfa09a72221104616313eba344e057e626e6adba27dcf39564a05a -size 16291 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Input-Combined.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Input-Combined.png deleted file mode 100644 index a1330ad7..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Input-Combined.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eead5e1bff5970cf0db92781d91cc24e24d3e6b12c6d26839ada0ef4479eaf9f -size 18854 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Input-Expanded.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Input-Expanded.png deleted file mode 100644 index f72ff1c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Input-Expanded.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ce4036c0e0fdf14d024ace153e082590653f8325b5c16f8259e34a16880ee4a -size 11209 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/InputAction-Type-Bool.png b/.cursor/rules/roblox/en-us/assets/studio/properties/InputAction-Type-Bool.png deleted file mode 100644 index bbff3a35..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/InputAction-Type-Bool.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e6ae41e47d9c2d69761cf0d460b5a09f739f56c78e01dd4758890cfc49fbb69 -size 19150 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-KeyCode-ButtonY.png b/.cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-KeyCode-ButtonY.png deleted file mode 100644 index 6936daa5..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-KeyCode-ButtonY.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73092df0382e89972c7ca22be649ece3915bcd1d973ef94f2dfccf947fb72964 -size 17727 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-KeyCode-LeftShift.png b/.cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-KeyCode-LeftShift.png deleted file mode 100644 index 3bad2108..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-KeyCode-LeftShift.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2059d8ffbb827e0be449f5f5fec984b853dc5837c2f9bc71a70bedfb2890ea68 -size 18138 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-UIButton-SprintButton.png b/.cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-UIButton-SprintButton.png deleted file mode 100644 index 4b56d88d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/InputBinding-UIButton-SprintButton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4be3d9bcc2bd5140d99b4dc994005c56e4bbebfe618467fbf14310a5e1af644 -size 18664 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Instance-Filtered.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Instance-Filtered.png deleted file mode 100644 index 84079734..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Instance-Filtered.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:885aff7586e1d11337161e50ceac1bfec0bb11026cbf9a7f4f43801761950d1d -size 24145 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/LinearVelocity-Attachment0-Unassigned.png b/.cursor/rules/roblox/en-us/assets/studio/properties/LinearVelocity-Attachment0-Unassigned.png deleted file mode 100644 index efa6b976..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/LinearVelocity-Attachment0-Unassigned.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92bbd8d3df73401a502400ecb543e570d27e793c83db96754999feecbe954969 -size 22412 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Model-LevelOfDetail.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Model-LevelOfDetail.png deleted file mode 100644 index b3833514..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Model-LevelOfDetail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:627e85defe80ecadefae296f241e7556a5ca70c749e7dc96334040863f57128d -size 15061 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Model-ModelStreamingMode.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Model-ModelStreamingMode.png deleted file mode 100644 index eedde26a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Model-ModelStreamingMode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f133d8aafbc83c544e94f019a7a53de8df520ebbbad6b6bea6894b077cb8b7a9 -size 30904 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/ParticleEmitter-WindAffectsDrag.png b/.cursor/rules/roblox/en-us/assets/studio/properties/ParticleEmitter-WindAffectsDrag.png deleted file mode 100644 index e5e31665..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/ParticleEmitter-WindAffectsDrag.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:301430c1317200c8a02353caaefba7dccbe836c74f0c5bd23226e2d7c3f3b9ac -size 20273 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Path2D-SelectedControlPointData-Expanded.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Path2D-SelectedControlPointData-Expanded.png deleted file mode 100644 index c6d62a18..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Path2D-SelectedControlPointData-Expanded.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7541d40c9ceaac36ed600fcebf6a695ffd422a2bff4dcfe1b06ed37a3561599a -size 51970 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Path2D-SelectedControlPointData.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Path2D-SelectedControlPointData.png deleted file mode 100644 index daadb39e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Path2D-SelectedControlPointData.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7221a9a8c82a145fb7f4ca0a4988688a016070072c909a570fcb45722c5e0da -size 29015 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Remove-Tag-Button.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Remove-Tag-Button.png deleted file mode 100644 index 7c5ef1f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Remove-Tag-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bde7495ea3a0e28e54816bf7d1e22badc98c31dc8e87ab1ce5f8e57ed6e83d62 -size 10663 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Rename-Delete-Attribute-Button.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Rename-Delete-Attribute-Button.png deleted file mode 100644 index 7074f5cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Rename-Delete-Attribute-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d7adcdbfa96546f33567db79f5f9a667634f1abec8e069cfc520f1340905212 -size 11499 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/ScreenGui-ScreenInsets-DeviceSafeInsets.png b/.cursor/rules/roblox/en-us/assets/studio/properties/ScreenGui-ScreenInsets-DeviceSafeInsets.png deleted file mode 100644 index a1b79015..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/ScreenGui-ScreenInsets-DeviceSafeInsets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ca8796f1b83b78591ceffae2d22b843603a0880cc9c8abacdf7001d7e56f9fc -size 35686 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Script-RunContext.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Script-RunContext.png deleted file mode 100644 index 2de02627..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Script-RunContext.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21ccbadc8c2a0ec8040309fb6769187d5a91f02dd038daa76d1d544fe2c6eb22 -size 46719 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Sections-Example.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Sections-Example.png deleted file mode 100644 index 403a652b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Sections-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8add4bb75ebc637b9c4ce10afa2c59ff083b60bc5f820f27d5ef83f2757a2a9d -size 113358 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Set-Attribute.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Set-Attribute.png deleted file mode 100644 index d1d6a941..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Set-Attribute.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cffe4ff44e5c57515364d6c8e1edd30beb0b789341fd911e7dd9225a3715ef97 -size 7875 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Set-Tag.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Set-Tag.png deleted file mode 100644 index d7d6fbd3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Set-Tag.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c44b840023b7d58d5bb32fa831a22f78a81188f00a64f6a3406037f91060c16 -size 4807 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Size-Open-Sequence.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Size-Open-Sequence.png deleted file mode 100644 index 9f04a4dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Size-Open-Sequence.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:675e86f63af8e69aade70b45039638807489cf894400517e22cc77e677e217ce -size 4191 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Sound-SoundGroup.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Sound-SoundGroup.png deleted file mode 100644 index f52da2c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Sound-SoundGroup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:472373d56e3b86e5290c306497600121c8c0d0faee157ca1c5edb4904a699039 -size 14485 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Sound-SoundId.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Sound-SoundId.png deleted file mode 100644 index 2b79fdda..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Sound-SoundId.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:868454eee0bbfcbf7903b849d09da6bede1551339d115077ef35ffae8671a66d -size 15886 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/SpawnLocation-TeamColor.png b/.cursor/rules/roblox/en-us/assets/studio/properties/SpawnLocation-TeamColor.png deleted file mode 100644 index ab2c4f99..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/SpawnLocation-TeamColor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4daa67fadbf8c24a123bb03a26ec167a1559e01702e852f7d659c73f329a6f11 -size 11753 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/SpringConstraint-Attachment0-Unassigned.png b/.cursor/rules/roblox/en-us/assets/studio/properties/SpringConstraint-Attachment0-Unassigned.png deleted file mode 100644 index f72bfddf..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/SpringConstraint-Attachment0-Unassigned.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0a982926d372031009b3441aded8a9d301c26e0ab5ff2135843d0bfb3bfc0aa -size 22609 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/StarterPlayer-Camera-Group.png b/.cursor/rules/roblox/en-us/assets/studio/properties/StarterPlayer-Camera-Group.png deleted file mode 100644 index 556d2966..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/StarterPlayer-Camera-Group.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69bc096395581ae0beeec94ca6efee1a99f20068dcda2a1fc923657937899b0b -size 59350 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/StarterPlayer-EnableMouseLockOption-Off.png b/.cursor/rules/roblox/en-us/assets/studio/properties/StarterPlayer-EnableMouseLockOption-Off.png deleted file mode 100644 index aabd59c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/StarterPlayer-EnableMouseLockOption-Off.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf3836d830ce5ca5519ce51db3699cc833c9aca379c0f7d736b3f45b24ca6466 -size 19088 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/StyleLink-StyleSheet.png b/.cursor/rules/roblox/en-us/assets/studio/properties/StyleLink-StyleSheet.png deleted file mode 100644 index 516a5acb..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/StyleLink-StyleSheet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0247e1e13c014c45089a23a6c73735056239709babe574a1adedcf6596d35757 -size 12934 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Styling-Modified-Property.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Styling-Modified-Property.png deleted file mode 100644 index 3b133af2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Styling-Modified-Property.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8af4f4a327c098a6f5d1309f8cfd74d900c01c261845f142ad1f808070cd6442 -size 23372 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/SurfaceGui-Adornee-Face.png b/.cursor/rules/roblox/en-us/assets/studio/properties/SurfaceGui-Adornee-Face.png deleted file mode 100644 index 793d680a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/SurfaceGui-Adornee-Face.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:13e42463862fcbf9c3a6db661d17590be80dc56f57aef4bc248575735cfdc296 -size 39247 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/SurfaceGui-Face-Top.png b/.cursor/rules/roblox/en-us/assets/studio/properties/SurfaceGui-Face-Top.png deleted file mode 100644 index 99a900b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/SurfaceGui-Face-Top.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ee64e2d6342d6ac87eacbbb7eab97a55a77c1665ed293d1e03020ed216aee11 -size 23760 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Team-AutoAssignable-Disabled.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Team-AutoAssignable-Disabled.png deleted file mode 100644 index 0bd924a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Team-AutoAssignable-Disabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17b8077fbc127eb8dbfe00a7e6f9ee0d206ddf6cd1920ca3a0b15bff613955f2 -size 18290 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Team-Name-TeamColor.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Team-Name-TeamColor.png deleted file mode 100644 index 59196eb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Team-Name-TeamColor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77f3cb5ea146ee3a552589c77fdc5d64835637e06f7ce1e7dd33d2781d3200a3 -size 15463 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Terrain-Decoration.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Terrain-Decoration.png deleted file mode 100644 index 10df6f60..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Terrain-Decoration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:170a1d50cd508243eb522e6d370104156a3d2710323165167f34f37a64d942a8 -size 15228 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Terrain-GrassLength.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Terrain-GrassLength.png deleted file mode 100644 index 8f104ec2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Terrain-GrassLength.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5179d14cda30b50f0caab2b7bcb36cfa7d8c3c4ae9dcbec3dfb398d902a5c6cd -size 17442 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Terrain-MaterialColors-Expand.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Terrain-MaterialColors-Expand.png deleted file mode 100644 index f051ece2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Terrain-MaterialColors-Expand.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69d270408e8d2704340909a447bbe5e0f4545d1b545c9f6275cf0d7adb6d0b31 -size 26876 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/TextChatService-ChatVersion-LegacyChatService.png b/.cursor/rules/roblox/en-us/assets/studio/properties/TextChatService-ChatVersion-LegacyChatService.png deleted file mode 100644 index 4984846f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/TextChatService-ChatVersion-LegacyChatService.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5baf46251871a6e06c5af9dec365785ed38467a17f4610490dbc025d6ba416f3 -size 34938 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/TextChatService-ChatVersion-TextChatService.png b/.cursor/rules/roblox/en-us/assets/studio/properties/TextChatService-ChatVersion-TextChatService.png deleted file mode 100644 index f5174e2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/TextChatService-ChatVersion-TextChatService.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb1cd8add8a9babf25a8c92c4f129712c56a0838c3be0a297124429cd49ab838 -size 34340 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Tool-Grip.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Tool-Grip.png deleted file mode 100644 index 15ed394b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Tool-Grip.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48319fbbf22511f06bf02f04e4195655673a9a9189ecb15f30409e27089c0227 -size 25577 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Tool-RequiresHandle.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Tool-RequiresHandle.png deleted file mode 100644 index 8a947255..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Tool-RequiresHandle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:faa6af708681fee4defdb6fea8a6bfa449fc3cedb201fa1d584244d763c0cb8a -size 30994 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Transparency-Open-Sequence.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Transparency-Open-Sequence.png deleted file mode 100644 index 3116cdff..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Transparency-Open-Sequence.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b682a489fd878ea8128060a3cf88e8775d1459d8191570653fb86bcf380ee2e -size 6422 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/UICorner-CornerRadius.png b/.cursor/rules/roblox/en-us/assets/studio/properties/UICorner-CornerRadius.png deleted file mode 100644 index ea7b65ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/UICorner-CornerRadius.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e49f27dba8630224116c720d0fe97ac5a376bfbd00d363c9e7c99d6c0c8c044 -size 11835 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/UIGradient-Open-ColorSequence-Window.png b/.cursor/rules/roblox/en-us/assets/studio/properties/UIGradient-Open-ColorSequence-Window.png deleted file mode 100644 index f6ecaa0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/UIGradient-Open-ColorSequence-Window.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b977d6d75cc8012c601119a07b500ed1b4edcf175f3c22b6a10905786259f15a -size 26536 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/UIGradient-Open-NumberSequence-Window.png b/.cursor/rules/roblox/en-us/assets/studio/properties/UIGradient-Open-NumberSequence-Window.png deleted file mode 100644 index f75a1e76..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/UIGradient-Open-NumberSequence-Window.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d1bb2c0e35ba2641c36c4122c76ecc295edc28f346d651ad16641a02b177ccf -size 26891 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/VideoFrame-Looped-Playing.png b/.cursor/rules/roblox/en-us/assets/studio/properties/VideoFrame-Looped-Playing.png deleted file mode 100644 index 126ef5cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/VideoFrame-Looped-Playing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9bc8cea12ba2501949a724aa4b63db00a10957eabe0ffa276102d7111a1ebe1 -size 8548 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-GlobalWind.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-GlobalWind.png deleted file mode 100644 index f1a87a8a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-GlobalWind.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1de4e5ce0d91e88b4e323652c844a5fe33ec314a16e6f45843a057e91b6e0b08 -size 13199 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-ModelStreamingBehavior-Default.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-ModelStreamingBehavior-Default.png deleted file mode 100644 index ac9500e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-ModelStreamingBehavior-Default.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7aff9d9979ece855c439086daf57373a08d44ab057e0ed85ef3c387d318e3a0e -size 21215 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-ModelStreamingBehavior-Improved.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-ModelStreamingBehavior-Improved.png deleted file mode 100644 index 9458f45f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-ModelStreamingBehavior-Improved.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a8c868669795feb1bf02e049dd8cafb3975e29326b877c8e6e1038b56da5d0c -size 21812 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-Streaming-Properties.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-Streaming-Properties.png deleted file mode 100644 index 0f796537..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-Streaming-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa1317500ed7bda81a1d96133136508800d88e8fb01563461d4e3ddfd254d07c -size 52628 diff --git a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-StreamingEnabled.png b/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-StreamingEnabled.png deleted file mode 100644 index 35f044e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/properties/Workspace-StreamingEnabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25d4bb2c90d9bdf8da2b222bfbe7a561b25aab24baf4a8a92572dc065b2fc56e -size 41070 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddAboveBelow.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddAboveBelow.mp4 deleted file mode 100644 index 1110757e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddAboveBelow.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b3dc9a9041cbc47581114d910cf5a264c6d8718fd49eaf7b5455e6acf0da1b8 -size 40062 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddToAllMatches.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddToAllMatches.mp4 deleted file mode 100644 index ab9d88f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddToAllMatches.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a845795e9457736008bb17ee7a5dece5d7105fb1ec8023258d671021e40d8510 -size 86200 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddToNextPrevMatch.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddToNextPrevMatch.mp4 deleted file mode 100644 index d3ece9b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddToNextPrevMatch.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9213300229d583461a05b75605602c250a78fc1ecbc5696de6142c25892ae1a8 -size 88835 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddWithClick.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddWithClick.mp4 deleted file mode 100644 index 02c627e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddWithClick.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:419e44121e6963153a41a66ef8625bf6de3c35b0851487c7bb902941455a080c -size 85286 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddWithDrag.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddWithDrag.mp4 deleted file mode 100644 index 1eccf09d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/AddWithDrag.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8e112e0f29d4d7236f956954b1731dd069eaf6272acdbfdf4cf42244eb6aa84 -size 121183 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-API.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-API.png deleted file mode 100644 index ae7471dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-API.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c8523ecac27e9549a38a3a972bab06ed30564202b070576a6e6a7de9a2c401a -size 209552 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-CustomDocs.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-CustomDocs.png deleted file mode 100644 index 8f8b5069..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-CustomDocs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a91ca99afe23482d8758d99d6261a20dfe1a0fbcb6a7242cac33260468cd8b3d -size 74938 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Data-Model.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Data-Model.png deleted file mode 100644 index 8af9e868..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Data-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6d9255d838ec11d5ff84b63464ea076822952171472dd80b50a30e5424809a7 -size 43219 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Diagnostics.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Diagnostics.png deleted file mode 100644 index 9a33972d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Diagnostics.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b845311b14306ffdea6ed6747888d6378a1c012e6929b29c87a64fe746b1ad9a -size 39799 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Signature.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Signature.png deleted file mode 100644 index 300bd27a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Signature.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78203bf2191c2ad436fca3937563e61d507eabebc0816240d74fe5fc5612fb58 -size 68229 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Suggestions.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Suggestions.png deleted file mode 100644 index 2fc5dfe5..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Suggestions.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a4e02db92d972cc427156380aa4757683aa0201e89c8f8f0b2f48b0c68e7dd9 -size 49924 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Variable.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Variable.png deleted file mode 100644 index aae3d440..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Autocomplete-Variable.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8627f0c2229f694e32078657b4e6aba66603592e16d654a3819599771465c6dc -size 40090 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Code-Assist.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Code-Assist.mp4 deleted file mode 100644 index 9aedfd9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Code-Assist.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5de0852a2b6d09d9f5e096fb49bb7fbaa0c486ad772f96ba4ea31b6eeec57978 -size 2608245 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/ColumnBlockSelect.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/ColumnBlockSelect.mp4 deleted file mode 100644 index 93cad5bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/ColumnBlockSelect.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c98d430662bd3623d9b4baaccbb47b453c6673764870006bc77a2e5e8aa3071 -size 127589 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/CopyPaste.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/CopyPaste.mp4 deleted file mode 100644 index 93639004..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/CopyPaste.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f67e3029953f1c8e6d1ec4f84ff2654fbc55190ef1f67c97782911b63418131 -size 146415 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Find-Match-Case-Whole-Word.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Find-Match-Case-Whole-Word.png deleted file mode 100644 index 9b869017..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Find-Match-Case-Whole-Word.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b93a0454802cfebfce2d12f52d8e3c602f6053fa1b1fa4d84bc6f5293c818e6 -size 20829 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Find-Replace-Widget-Labeled.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Find-Replace-Widget-Labeled.png deleted file mode 100644 index 02cf518f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Find-Replace-Widget-Labeled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02329638823ab529d85c980b082b561bb9304490b250a6b21dd736bc8107c962 -size 78422 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Go-To-Declaration.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Go-To-Declaration.png deleted file mode 100644 index 2fb749ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Go-To-Declaration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6222b907a42858db62c335b18f554bb411db959ffae4f00da8b0e70478ce6e1a -size 121621 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/MatchCaseWholeWord1.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/MatchCaseWholeWord1.mp4 deleted file mode 100644 index 5582ca43..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/MatchCaseWholeWord1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1eb6e12dab6d2a521e2a86f5c34f2e252f0634abe4f3fef4ae0e48eb41899a8 -size 16894 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/MatchCaseWholeWord2.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/MatchCaseWholeWord2.mp4 deleted file mode 100644 index ce671521..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/MatchCaseWholeWord2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9df7efc93794e596d3c2f2360d88a1b0bdd9f2f340cd4a756c09482d52d072b3 -size 85190 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/OnTypeFormatting.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/OnTypeFormatting.mp4 deleted file mode 100644 index bfd9c4ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/OnTypeFormatting.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5d2d83a8c7acdec2cdde314959c4585b421800b9c6b0099185b4ac5cfb71341 -size 54248 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/RemoveWithClick.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/RemoveWithClick.mp4 deleted file mode 100644 index d416cf12..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/RemoveWithClick.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ed893efed417ae4c46d50e7ef163ac219562a8bb70dc416b34baa22f26c8b0d -size 27155 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Analysis-1.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Analysis-1.png deleted file mode 100644 index 6891ae69..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Analysis-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7600fd56c42477e893a19036cc839e60ba3a061048caf90dfdb8e27055d3d7b1 -size 57117 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Analysis-2.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Analysis-2.png deleted file mode 100644 index 27d35305..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Analysis-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e3270afa1bfe216ef20887a9b913ff17921cb6a91d7f1b5a988282908dac088 -size 39110 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Functions-Filter.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Functions-Filter.png deleted file mode 100644 index d6168052..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Script-Functions-Filter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:709c28b1a0f109eb2093812a3b0b995f07256a40b540b3734ddb32f793dfc213 -size 210094 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Shortcut-Edit-Select-Prev.png b/.cursor/rules/roblox/en-us/assets/studio/script-editor/Shortcut-Edit-Select-Prev.png deleted file mode 100644 index 564023b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/Shortcut-Edit-Select-Prev.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78d712a545e5e2e6c9b7fd3a91d3d7cd26a9be41350b63eb225974e8703dad56 -size 22227 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/SplitSelectionsIntoLines.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/SplitSelectionsIntoLines.mp4 deleted file mode 100644 index 9b6af521..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/SplitSelectionsIntoLines.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:efc459804e99a37dfca733fc446e12ad071746e3f7e6f6f4d8e1cf44adb6cea1 -size 67544 diff --git a/.cursor/rules/roblox/en-us/assets/studio/script-editor/UndoRecentCursor.mp4 b/.cursor/rules/roblox/en-us/assets/studio/script-editor/UndoRecentCursor.mp4 deleted file mode 100644 index 3fad1067..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/script-editor/UndoRecentCursor.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:817d7a96cd0744c68849253b12f325b2b380a7ffea549ec4e15a1f70e0146a93 -size 17176 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Brush-Shape-Icons.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Brush-Shape-Icons.png deleted file mode 100644 index 172bc492..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Brush-Shape-Icons.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:970fab96cd415c979695b03aa03e31f169f54092c55ca1e8c9730dbe4c0e7baf -size 3820 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Brush-Shape-Size.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Brush-Shape-Size.png deleted file mode 100644 index b038c9fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Brush-Shape-Size.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aee90679c8e920c12ba4dadfe7efe7e54d56e9a03a12154f746c7417a97e8996 -size 11151 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Clear.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Clear.png deleted file mode 100644 index 51d75ecc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Clear.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21529c5a818f5247bd23b9c8430d7e7c2b04fffc1c1288fd96fd917797ac6694 -size 16332 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Generate.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Generate.png deleted file mode 100644 index 6aa0c6d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Generate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a37741a626df453e28a4f623c8cb0f5027aefc77e1533513b1d7512476c635ce -size 17230 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Import.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Import.png deleted file mode 100644 index b714e8fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Create-Tab-Import.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ad5385fab3fe8b810bf86bda66db8ee26e5ce63066af22fe7d2c154f5376ffb -size 17546 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Draw-Tool.mp4 b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Draw-Tool.mp4 deleted file mode 100644 index 840dcbc1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Draw-Tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48cfa240341d76b502a489225f575be394bc7fbda94098f472397e1f577938e9 -size 5071073 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Detail-Tools.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Detail-Tools.png deleted file mode 100644 index d8442682..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Detail-Tools.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d713d928a06ae3b5ac5460696e23a9391930aa75d45bce39a2ec14a3b533785 -size 30083 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Draw.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Draw.png deleted file mode 100644 index 9727fc84..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Draw.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6964e7ba7e1e620c4b521ed933c30a6fea17a30bf25137d7995ca295a9ec885 -size 30176 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Fill.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Fill.png deleted file mode 100644 index 527bb2d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Fill.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99edbaef4a02b12bc3283df348ff52a9d0950494641d2b0b56f7398f4bdee449 -size 26555 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Flatten.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Flatten.png deleted file mode 100644 index 0bf5f9d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Flatten.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8dc896b876107cc0b9fbcca10d240c62bd3831d8704559524848aac68881194 -size 29684 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Paint.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Paint.png deleted file mode 100644 index 53bd5d4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Paint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0fa08a0da5736493ba395feec4f411b7b21737418fa7d618a93e7e3d8da85c3 -size 29477 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Sculpt.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Sculpt.png deleted file mode 100644 index 5eccd225..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Sculpt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9676f970f49a2502b6afdbbce89030960a0e83eebf52da6855996e6d66ba8616 -size 31760 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Sea-Level.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Sea-Level.png deleted file mode 100644 index ed8e3b57..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Sea-Level.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32a1cc7183edf6429c397048f3fbf09e05f894714390e5a8ed9826cab2ddc398 -size 30278 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Select.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Select.png deleted file mode 100644 index 7ef61d83..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Select.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffe62c7311e7015cb845bfbf7f6a554910eccb3e0539c506af6c4ff98e76ee01 -size 30856 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Smooth.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Smooth.png deleted file mode 100644 index 2d011085..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Smooth.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33b9f043e2f032be6101dd2ea54c19577719e908d6eee3c3a3d6485d18faf2f8 -size 29868 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Transform.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Transform.png deleted file mode 100644 index cf601e52..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Edit-Tab-Transform.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e2997c39f287d4119f6bf42dc3162d0c0661b5437f33469746772b29356896d -size 27793 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Fill-Region.jpg b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Fill-Region.jpg deleted file mode 100644 index 4ab7108d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Fill-Region.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:827cf55bc0b5ec97c348aa274978465768a4d3ef9da38cecaae12a9ce53d164c -size 187964 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Flatten-Mode-Icons.png b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Flatten-Mode-Icons.png deleted file mode 100644 index 634e330a..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Flatten-Mode-Icons.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:179a912029da10a2b8f9b7e8c35417a8395463bbe886632d10aac8515c7ff1f9 -size 4008 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Flatten-Tool.mp4 b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Flatten-Tool.mp4 deleted file mode 100644 index af71b1fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Flatten-Tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b2522e9ada6fc1a23151318050409e0dd2a0f60bfa5cb7db956edb6f30f70b0 -size 4841829 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Generate-Tool.mp4 b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Generate-Tool.mp4 deleted file mode 100644 index a8fafb7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Generate-Tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:723fcba45c00d85416f3f1b1e0fcdb51fa0793967f5fbce149c2b6eb790c0688 -size 1194891 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Import-Tool.mp4 b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Import-Tool.mp4 deleted file mode 100644 index 8e14ae7c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Import-Tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed81bee35e1f2cd811ef1fe819a84f014c93626f39cf97215e09cd49296f3ea6 -size 602585 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Paint-Tool.mp4 b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Paint-Tool.mp4 deleted file mode 100644 index aaa08188..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Paint-Tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f2f7fff619bff3f9da39d16d3ce59d6daed0b06cd0c79ba83b866bee675676f -size 7258092 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Sculpt-Tool.mp4 b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Sculpt-Tool.mp4 deleted file mode 100644 index 7d3c1765..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Sculpt-Tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:050e04f1475d1bd38a5af75e7f491f91386ced133d77712fbc761ee2232df909 -size 5266015 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Sea-Level-Tool.mp4 b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Sea-Level-Tool.mp4 deleted file mode 100644 index 401b2ae2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Sea-Level-Tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8302bde3117004c6bd0be1c5b1488792d2d7081c98f0687092fbeae589c799ee -size 10189993 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Select-Region-Labeled.jpg b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Select-Region-Labeled.jpg deleted file mode 100644 index dfa8b8ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Select-Region-Labeled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a803a6faa51e7dd41c83e398e5071f0c9cfb7885c10171f0e0d522d2edb6cdda -size 249196 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Smooth-Tool.mp4 b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Smooth-Tool.mp4 deleted file mode 100644 index 46320337..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Smooth-Tool.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4a1481cad65c8db312eccddbf7b1c3bbb044a99945ccbef0f911a1a56eac48f -size 2922904 diff --git a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Transform-Region-Labeled.jpg b/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Transform-Region-Labeled.jpg deleted file mode 100644 index 972ace5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/terrain-editor/Transform-Region-Labeled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30da8db2aa9ee0fb7a27277d7f1726347de398d578bd8dff6bb9d489d0c83d27 -size 268187 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Art-Style.png b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Art-Style.png deleted file mode 100644 index 2d83aec2..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Art-Style.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae709085614e2f71c0e043b2f2f7b04b5470b5dc3c2d910596a6ece6d4b9cb24 -size 30042 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Angle-Bad.png b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Angle-Bad.png deleted file mode 100644 index 735b1145..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Angle-Bad.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f08f2aa55cdacda3129953af1415c91b9469eb6038bb7ae61379891a2b4626a -size 45727 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Angle-Good.png b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Angle-Good.png deleted file mode 100644 index 5f30e666..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Angle-Good.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebbf671e733b03cf05038e6d8dd61e4a9ae985f98ce47c1a159e6ddfe5ee0aba -size 49214 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Mossy-Stone.jpg b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Mossy-Stone.jpg deleted file mode 100644 index 99b43caf..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Mossy-Stone.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29419397f7d80ea78821335050a22b80df12316c9d3d5a2f8bfca7d85bfeb05b -size 110465 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Post-Preview.png b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Post-Preview.png deleted file mode 100644 index 87e41574..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Post-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dc5a24b03a8ca577ac2dedfd8e00f9b77eaa4334ea8daf281cafaa8312b4069 -size 191039 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Rusted-Metal-Charred.jpg b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Rusted-Metal-Charred.jpg deleted file mode 100644 index 0987133b..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Rusted-Metal-Charred.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:046a7152f7b82c52477190a3c83ea6ad5daf71e9d72c447c42ab5bbc337f192b -size 118256 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Snow-Covered-Ice.jpg b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Snow-Covered-Ice.jpg deleted file mode 100644 index ebff56a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Snow-Covered-Ice.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:902389b70f448238380bc858f04bf8ca5d2b5c091ea0ef61ecd111c2d9354797 -size 120286 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Untextured.jpg b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Untextured.jpg deleted file mode 100644 index a4f9b3ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Generation-Untextured.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e23a38e9e2d695d38b12d9d41be478449bfd67909ac6d2f321f25f141d1e96e4 -size 86436 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Saved-Textures-List.png b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Saved-Textures-List.png deleted file mode 100644 index b0256166..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Saved-Textures-List.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40e33303c7dad851a7562fad564771781919378c61e1972d515de1a25a138bae -size 22404 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Bad-Back.jpg b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Bad-Back.jpg deleted file mode 100644 index 36810d5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Bad-Back.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45d0b6406e09e6f32663d3da2ebdf3ee987e87db81f8f3340e63f7af8816f2c4 -size 135066 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Bad-Front.jpg b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Bad-Front.jpg deleted file mode 100644 index 8e737ec8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Bad-Front.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:795f6fd37cefafe498d5bc1c3e405e9407d987620847a08d1658483c1ef7c569 -size 143116 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Good-Back.jpg b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Good-Back.jpg deleted file mode 100644 index 5845ac50..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Good-Back.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccd5867b68cba541fd0a7f21a56107d53adf9a76c77f9b9db80fbdfb0ed1b6a7 -size 125029 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Good-Front.jpg b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Good-Front.jpg deleted file mode 100644 index ed9e6e2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Specify-Front-View-Good-Front.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4506153c88e2f1a3b69a50fb67e33005670be7278d8763dbe904e0c78a74aec -size 141319 diff --git a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Texture-Applied.jpg b/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Texture-Applied.jpg deleted file mode 100644 index 9964e796..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/texture-generator/Texture-Applied.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c744a7cebadb588c558ef2bc9eeb43ae9c1ea63071fbcf7a229c8d45c86c43a -size 194317 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Asset-Inspect-Icon.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Asset-Inspect-Icon.png deleted file mode 100644 index edc7d676..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Asset-Inspect-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0429fbcbd8ef1b29d2d2a7cc4837ee454676adf77079e2c556dfcf2ca4ddb1b8 -size 58670 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creations-Group-Packages.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creations-Group-Packages.png deleted file mode 100644 index 0fab7344..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creations-Group-Packages.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c254ff17283c590a16a63993290bfbd9f58422b2ac82b293875682ffa8e10ee6 -size 11568 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creations-Tab.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creations-Tab.png deleted file mode 100644 index f1906ba1..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creations-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c56704059ea9a2930321c047aa26257b76f6c8cc0d8e1475be25de4fe928c880 -size 8829 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Advanced-Filter.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Advanced-Filter.png deleted file mode 100644 index 4b2ec51e..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Advanced-Filter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5abc4fc4bd7de466f1e9912180b92863e32ed6ff840bde15b81eb196bac698b6 -size 12360 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Audio-Discovery.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Audio-Discovery.png deleted file mode 100644 index e9daf7e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Audio-Discovery.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b605d142a0a4417d968dfcb3a0a2116e0fd4ea22769903e583032863a9f07bad -size 122509 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Audio.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Audio.png deleted file mode 100644 index 42ef9eca..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Audio.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc77163e48535094b0e3953ed882f8123e858e01e4e5796db59ce9e9818f3028 -size 14565 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Categories-Ads.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Categories-Ads.png deleted file mode 100644 index e7078f97..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Categories-Ads.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:793742e4c3a929d5e9dafea71781790dbc3f6974217027c6e1664470b181a73d -size 11483 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Categories-See-All.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Categories-See-All.png deleted file mode 100644 index c0276aef..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Categories-See-All.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bd5f6c3eb6fa8736705f0c4a949eee676da84646d17f312bf1f9e98451553cc -size 85932 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Category-Selector.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Category-Selector.png deleted file mode 100644 index e7b88b22..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Category-Selector.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4280e0d2822bdd5c8dd0e50dd1263f26e18cd77df4adecb1f3f181decb57906 -size 22262 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Scene-Manager-Plugin.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Scene-Manager-Plugin.png deleted file mode 100644 index bdb6e6b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Scene-Manager-Plugin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b08ea72fb8d1dc3e3548aa8b757414f46e096796a338cbcdfd051fe7576b30fe -size 39404 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Tab.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Tab.png deleted file mode 100644 index 484b6818..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Creator-Store-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a57323403b0f41e66cfe6ee944dcf8c7eca63e5db418d64cce728bd1a80f4224 -size 14156 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Inventory-My-Packages.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Inventory-My-Packages.png deleted file mode 100644 index 489a9526..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Inventory-My-Packages.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:854136e6555a9621ab49edc3ca255979664e5f3936f58fd81b38e2d38cc19c56 -size 14089 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Inventory-Tab.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Inventory-Tab.png deleted file mode 100644 index 81bccc43..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Inventory-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7967c4e42d4c2983407b514a2c49c81c9f69c14db620c2b7627979191ef16c8d -size 12789 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Model-Search-Example.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Model-Search-Example.png deleted file mode 100644 index 751dfb79..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Model-Search-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50c5fa2a2924c9c4bdfc4507f000ebec7b96042907f21ff8c45834c68fd043ea -size 53609 diff --git a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Recent-Tab.png b/.cursor/rules/roblox/en-us/assets/studio/toolbox/Recent-Tab.png deleted file mode 100644 index 8b625799..00000000 --- a/.cursor/rules/roblox/en-us/assets/studio/toolbox/Recent-Tab.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:835be229069ad9f6a5dcdaea4c9f5922f768cb0b5ef396b4f392e651833c137e -size 11994 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/.gitkeep b/.cursor/rules/roblox/en-us/assets/tutorials/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Background-Music.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Background-Music.png deleted file mode 100644 index 973e28a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Background-Music.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef75493951dbc3bfc14b0de3bb5b88680071f34fdd46a00f58f5e97535fdec02 -size 696722 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Box-Modeling.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Box-Modeling.png deleted file mode 100644 index 82ce0427..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Box-Modeling.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef3797879651eebc0b6402fb68ff8d5a4c663a53eeb1396095c86048008c8518 -size 485053 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Creating-Animations.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Creating-Animations.png deleted file mode 100644 index 0a91f011..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Creating-Animations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:279fda3f7c1198b0e9fa1156a58e2a621e97c32a5950e152d768901a5e5d15e0 -size 458086 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Creating-HUD-Meters.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Creating-HUD-Meters.png deleted file mode 100644 index 0ac863b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Creating-HUD-Meters.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef052a76bc0953107ebdb9349c83c29e084786c9e68b1b765bbdc4e61218d886 -size 215086 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Events.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Events.png deleted file mode 100644 index 65fbe110..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Events.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6188af3e71fe242f0ee21b96d454915e5b772b128dd39d7517d6bed8f210be8f -size 724172 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/First-Person-Camera.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/First-Person-Camera.png deleted file mode 100644 index 35b69243..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/First-Person-Camera.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26c2a23d8a707960dcefac045de4a68306b5942025da9f653a44084017a514e9 -size 524370 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Humanoid-Model.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Humanoid-Model.png deleted file mode 100644 index c4819016..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Humanoid-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6453c90161c91482cc32d3673d760559172abcbaf375b4f26c55164c0cb3c0b3 -size 485097 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Indoor-Lighting.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Indoor-Lighting.png deleted file mode 100644 index 8460bd99..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Indoor-Lighting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e3a20877c99b767c6155d2c797fba7771601bca4794b222a860b9ee54b084ad -size 1673830 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Interactive-UI.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Interactive-UI.png deleted file mode 100644 index e9284ca4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Interactive-UI.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:209345c572ab50ec7df6dbc709124178098c00a47da6515a71e39c5b2dafe5c6 -size 151388 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Isometric-Camera.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Isometric-Camera.png deleted file mode 100644 index eda19c95..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Isometric-Camera.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a1eee0a6fa9c12265fbaff8ff1e14bc8f2ab1d3f8ae3647f2f95c133d8434e6 -size 1103952 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Laser-Beams.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Laser-Beams.png deleted file mode 100644 index 327f290b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Laser-Beams.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ddf9cbb812a0ff6079fa9a466b7b9fd22113149b1ea10e6f836e05560ac0465 -size 614234 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Modular-Environments.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Modular-Environments.png deleted file mode 100644 index 28150964..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Modular-Environments.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6efaea8a28471eb0c0c9d3a3a2dad09749e20bf6b94b2028ea54aa478cdec093 -size 834207 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Moving-Objects.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Moving-Objects.png deleted file mode 100644 index 021572e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Moving-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6f90c46efae43c29920b049227112ba618533685db2386e756d01d238db80cf -size 897472 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Neon-Signs.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Neon-Signs.png deleted file mode 100644 index 666b26a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Neon-Signs.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4eba2bc883366923ec96d224d695ab60afa7d013021b3e1ac94feb4ffac10fdf -size 330422 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Outdoor-Lighting.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Outdoor-Lighting.png deleted file mode 100644 index 7c28394a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Outdoor-Lighting.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea81cbbd0ca6cfd534eb5df01c52be72f434612207d6c87428ce08be224cbebe -size 2140426 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Part-Interfaces.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Part-Interfaces.png deleted file mode 100644 index 0647e5ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Part-Interfaces.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a383f214ea973b23b6dec0a8d95e87045d40e7b88745ac1863f166f0e55e1b46 -size 268744 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Player-Input.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Player-Input.png deleted file mode 100644 index 57160a8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Player-Input.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce02356eaa259c505f81c98605446969d8020c08dc4173eb9d949448565686b0 -size 458604 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Positional-Audio.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Positional-Audio.png deleted file mode 100644 index b4bc2789..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Positional-Audio.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d548ad626724903d1aa650b53266f93fef75306321fd81a43876b22129e7628 -size 803385 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Properties-Attributes.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Properties-Attributes.png deleted file mode 100644 index e7971efa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Properties-Attributes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94bd755be19339fdd49ddc4b8618bf146eb5baeb80e07adc7b9cec2b92ad8d6d -size 315801 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Proximity-Prompts.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Proximity-Prompts.png deleted file mode 100644 index 43a66a9d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Proximity-Prompts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:92acd122a220c2bcd191ae6ce60606998c6ba7ccdeecdc4230a0b467a7b428b5 -size 438839 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Saving-Data.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Saving-Data.png deleted file mode 100644 index 84624018..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Saving-Data.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54aa5554aeedf7ca6338a7c0f5a7c7da1ea92c2845d79c726c84c734737ada76 -size 990282 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Score-Bars.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Score-Bars.png deleted file mode 100644 index a5e86515..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Score-Bars.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c781fe8c9f4f9a377e69d35bcc469f2e40eb133004a1c5afcb6410bd2369e3de -size 239954 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Script-Types-Locations.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Script-Types-Locations.png deleted file mode 100644 index 0595fced..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Script-Types-Locations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8259907617af9ea50aa1d169f556354d3344098c337c18d5647a2b0c4304e83 -size 582622 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Scripting-Avatar-Animations.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Scripting-Avatar-Animations.png deleted file mode 100644 index 3d8a4c3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Scripting-Avatar-Animations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f71124f1e22a04fafc9ec67b5fda58badc17cbe7c80edf6ffaf4aec606c6712a -size 734265 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Services.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Services.png deleted file mode 100644 index f70f0fea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Services.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6a49e24a60066722040cf4b0940e14234cced7c3062114e5fa311e8664da605 -size 549255 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Side-Scrolling-Camera.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Side-Scrolling-Camera.png deleted file mode 100644 index c5feb871..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Side-Scrolling-Camera.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0275a417b7bff93a06fb49cbcfe1626920a7475c8af37511cfc6253c507ef2a5 -size 828726 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Simple-Mesh.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Simple-Mesh.png deleted file mode 100644 index a53bd02e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Simple-Mesh.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f88b87463404cd38dd0f5481f020d6bed173dd7a8bedd81f24cb5fd927a60e78 -size 597317 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Spinning-Objects.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Spinning-Objects.png deleted file mode 100644 index ed0710a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Spinning-Objects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bd35596ecd9ae4d04738366e15c34b586a07c32a9509dceb32dacc019bf3fc0 -size 382273 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Text-to-Speech.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Text-to-Speech.png deleted file mode 100644 index 4f3bd69d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Text-to-Speech.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:206298b1de9262abdd973c9c780699be84639200c33e59a4637e3bfa535682f7 -size 622195 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Vertex-Coloring.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Vertex-Coloring.png deleted file mode 100644 index 81252647..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Vertex-Coloring.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cad09ba322ce120699758a7f2433366a6529fff6002252193b55183464a71264 -size 858542 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Voice-Chat.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Voice-Chat.png deleted file mode 100644 index 24903944..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Voice-Chat.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9cabc1d97301e0545a1e92fe1aedefe557d6193d2ad0f0214d5d7ca8fa9d1603 -size 547783 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Volcanoes.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Volcanoes.png deleted file mode 100644 index 4ecc2a54..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Volcanoes.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1892f19bad81f99e60aaccbea18932dad70a9e3383a08b7e71a400874da795c8 -size 1866345 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Waterfalls.png b/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Waterfalls.png deleted file mode 100644 index c17a2362..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/UCT-Overview/Waterfalls.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:257768ebf2d03d6145ac319d24ca55c82463f5c068833ce0553f44a519754d5c -size 831910 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Button-Default.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Button-Default.jpg deleted file mode 100644 index 6291bba9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Button-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c4383bd28059dc30f91c47bc72d597494a43e87bd083a95c36d35e59bc20e48 -size 10899 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Button-Pressed.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Button-Pressed.jpg deleted file mode 100644 index 2e685c5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Button-Pressed.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65a42ff7c56cc37d84d28d06be5d0340ae9a4cc673698648fd6457b10755927d -size 10839 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Default.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Default.jpg deleted file mode 100644 index 46f976e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:207935bb8eee55349fe8bbbf3962467247c42fcf10d3b10019fea4edf21531b0 -size 17910 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Feedback-DataModel.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Feedback-DataModel.jpg deleted file mode 100644 index 1873eb9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Feedback-DataModel.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:822cb77b601d2d009c3765b7cb2228ab5d6f514de16b91cb0b140f461f4cb774 -size 6673 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Feedback-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Feedback-Final.mp4 deleted file mode 100644 index 2359f1c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Feedback-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9bda5e74f066c90a2f3eeb6a78c1d9abba603d865e0a928d28f2188ebf3951d1 -size 1813958 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/In-Focus-State.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/In-Focus-State.jpg deleted file mode 100644 index cbd74ca8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/In-Focus-State.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:956c8a0bdd75d107064e5274dc5701935a1b9a811ce584e5122703f69469d5bd -size 21821 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Looping-DataModel.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Looping-DataModel.png deleted file mode 100644 index c16c3e8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Looping-DataModel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad9a784ba52f952c018fc0795c2fb0b9de9f1cac42ad65a59e6b84475f3842ca -size 6190 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Looping-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Looping-Final.mp4 deleted file mode 100644 index 3fba1aa1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Looping-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:821b65a601c91fc9e624922d46d739e80230052454a2e1111ebb2b5a743ada1f -size 8685624 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Metal-Track.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Metal-Track.mp4 deleted file mode 100644 index c46f09bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Metal-Track.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ea6f4ce520dce54642cdca2aada254ae49121ef868ba342428b10069bf0433b -size 5604306 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/On-Hover-State.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/On-Hover-State.jpg deleted file mode 100644 index aeb22de2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/On-Hover-State.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f2c409562d4d711d9798f715cbdbdfe6840f2c3595626dea784bfe1c4f5594a -size 18936 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Selected-State.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Selected-State.jpg deleted file mode 100644 index 428bba22..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Selected-State.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec7c1c6c69bb7de2f3fd84f1d4bd839153fe60676041c74977b051bbca3b6529 -size 18516 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/UI-DataModel.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/UI-DataModel.png deleted file mode 100644 index 68726bcc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/UI-DataModel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5422869e0d5d376a9aac773a5c53344a16fc5472faf40de10ba4c0aac6470d7a -size 8723 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/UI-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/UI-Final.mp4 deleted file mode 100644 index 03cbfe22..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/UI-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39588a5c9f00810783938c6803c99041728a103463c92aaa4612501b9dd1dbc0 -size 3236807 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/With-Looping.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/With-Looping.mp4 deleted file mode 100644 index c83fef2e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/With-Looping.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:efc24bf61f6023455599da42ddf5ac61915b754d100b97ede6d4b8ec091aa7a2 -size 2791537 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Without-Looping.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Without-Looping.mp4 deleted file mode 100644 index 037de6fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/Without-Looping.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26d1adfe72c1362c2a9e2142b30a100fb3de853bc18cc6ac51c49e3a66281957 -size 2762362 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/game-state-example.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/game-state-example.mp4 deleted file mode 100644 index 8597dbd5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-2D-audio/game-state-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5fc7c034556890a705dbac5a5aade464e4524e2dd71bcf3ab18875fefcbdc93 -size 2029982 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Button-Default.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Button-Default.jpg deleted file mode 100644 index 5e9d8728..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Button-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2320c50e8a75b606c81f6e5f77282a5e38f75a65c93680733a2a9706dbce508d -size 22487 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Button-Pressed.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Button-Pressed.jpg deleted file mode 100644 index da24fce4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Button-Pressed.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a88ded6b7db78287f9378813c274840cf6cda9716b1963cbdd312cdaf2bb99b0 -size 20599 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/CharacterDialogue-DataModel.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/CharacterDialogue-DataModel.png deleted file mode 100644 index e83656a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/CharacterDialogue-DataModel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af277ae3a4bc2e1dc0e54592be3dc31d8c9ffaf68c280d1464a2e3c4503f3d0c -size 6123 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Dialogue-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Dialogue-Final.mp4 deleted file mode 100644 index 3d7b9bfd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Dialogue-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b4aacf3f58bc0efadc7b4fcdf5eccbc4d02feff085cd23277b1a55104c7d3db -size 8989844 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/EventFeedback-DataModel.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/EventFeedback-DataModel.png deleted file mode 100644 index 56265d36..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/EventFeedback-DataModel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c393558d7852879d3e46ee0a80592bd2b2aab6496638c874d0d397f12f204f09 -size 7859 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Experience-Object-Representations.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Experience-Object-Representations.png deleted file mode 100644 index 27d282b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Experience-Object-Representations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ffc3b28fb021cfce90f2e6804256919ae237a1e5bdf223f0269e619dcab278f -size 642965 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Feedback-DataModel.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Feedback-DataModel.jpg deleted file mode 100644 index a5f66ca4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Feedback-DataModel.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:791087c70b97f9b6ba17420b7506e8a81e5286ffdbcb12639a4c0d36f998cbe0 -size 4345 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Feedback-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Feedback-Final.mp4 deleted file mode 100644 index 26f4b6ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Feedback-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0129a187f177db90263ab7a0552d389c807e7f728cdb2999bf7eeadb9ed75965 -size 8663128 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Looping-DataModel.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Looping-DataModel.png deleted file mode 100644 index 100e0615..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Looping-DataModel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01e8353c9084f9149b8ddd0fa9dad56c2adfab8f6936bf73fa33bbabd1358f13 -size 6480 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Looping-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Looping-Final.mp4 deleted file mode 100644 index 739c34a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Looping-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d992849d82e2f3e46ab8fd57454e2d233bb06dc8d2d694ea10081c5282400a6 -size 11024306 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/ObjectInteraction-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/ObjectInteraction-Final.mp4 deleted file mode 100644 index cfae0829..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/ObjectInteraction-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd1b8d7771a69664e4cb2c0063b051e0d8880737f60a80d39e2290c385c75ca8 -size 9044651 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Plant-Example.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Plant-Example.mp4 deleted file mode 100644 index 82f4f662..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Plant-Example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e8137c23215b69a5af2dfc081ad0a4368e406fe3c25cc2a9f2d56554b404f57 -size 21502164 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Realworld-Object-Representations.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Realworld-Object-Representations.png deleted file mode 100644 index b2007a5c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Realworld-Object-Representations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:baeb3a3ee7e54719385bbd02b93183b37466f5d7fbd55d5ee81d2332f40354ca -size 654362 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Space-Bark.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Space-Bark.mp4 deleted file mode 100644 index 68ed2a0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Space-Bark.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7acda92477ad4a326320c021adf61f8b526cfc583fb611486183d1b1a1bdbd2f -size 8500327 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Volume-Example.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Volume-Example.jpg deleted file mode 100644 index 30c2d6a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/Volume-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4edb814f4da44a78554c642c900011da7d57272d3582f92a392a8f2aab82a2f8 -size 193645 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/event-example.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/event-example.mp4 deleted file mode 100644 index b26768a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/event-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2ab32fa4cc1c31d705803e54eeac8143640ad12e0082ccc20419f978e2af3b8 -size 2884971 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/looping-example.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/looping-example.mp4 deleted file mode 100644 index 8babd931..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-3D-audio/looping-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a26092fc8316e01a74ef96bca9ce7230b4824f5e275ed3fac2540ecd42094e38 -size 7116998 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/ContextTTS-final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/ContextTTS-final.mp4 deleted file mode 100644 index 8d43bb96..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/ContextTTS-final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f7c4627992b54ea49c3ffe17787380993039c049d80a7fc2a4f0795376e4bc9 -size 32863928 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/GreenGumdrop.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/GreenGumdrop.png deleted file mode 100644 index 622917a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/GreenGumdrop.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c66b7a5ea1f4696630661dec302ab621e651c5847c1bb076ade0ff5bcc90a3c -size 89838 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/RedGumdrop.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/RedGumdrop.png deleted file mode 100644 index 26167bc6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/RedGumdrop.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47cb6feb1613e20879743d948b5b7dda6a7f685518f4c1dbc366f61388dcffe8 -size 117826 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/YellowGumdrop.png b/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/YellowGumdrop.png deleted file mode 100644 index 32f75223..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/YellowGumdrop.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f3d9f38ab6b9ae9048622cffd457339a735e35fc5a94836bc3d1d43ed3b0003 -size 104001 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp1.mp3 b/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp1.mp3 deleted file mode 100644 index dea66d58..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp1.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d51834cac64675b2e47b9d61ae0684eb019a7a2ca99b0a13d36f0b51872a065 -size 49583 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp2.mp3 b/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp2.mp3 deleted file mode 100644 index 1bd2def4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp2.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9e1b7a5fdd60a932226f6700c3da54cef6b83c46de82f619a7be2c6b34e2a01d -size 92211 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp3.mp3 b/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp3.mp3 deleted file mode 100644 index ac1cbebe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp3.mp3 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7fa22a90fab441def4e59636f6fe807b6b700eedd00649bcbc3efae695897295 -size 96046 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp3.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp3.mp4 deleted file mode 100644 index 69bd92b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-exp3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3ed47dfcee4df19ff81d92385d00af71957d8253e88aeb6492518f8ba71d98c -size 261110 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-final.mp4 deleted file mode 100644 index 20474b12..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-text-to-speech/basicTTS-final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85662b3cd7a2de1b4c20df1cc43443bafa67d20644104b919921cbbcb4652ca3 -size 2203992 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/add-voice-chat/DisabledScripts.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/add-voice-chat/DisabledScripts.jpg deleted file mode 100644 index 622c29ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/add-voice-chat/DisabledScripts.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:771e81521610619232df1d3d4d7ff418c4420b4f88934a57713a72dc03803d0f -size 21532 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Additional-Mesh.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Additional-Mesh.jpg deleted file mode 100644 index 41d7abb3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Additional-Mesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b34d08e7172ca62e3df4a0001d672916d842fa0dc505c57536732432ed4dc318 -size 283752 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Core-Mesh.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Core-Mesh.jpg deleted file mode 100644 index 21c550fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Core-Mesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:574d8653a5bb555e741d9f1b4423e4e08228213d5481b8a4bc484deed6456431 -size 267901 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Making-A-Building.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Making-A-Building.mp4 deleted file mode 100644 index 0704cdf7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Making-A-Building.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b35c1b662a3c67de96834f37f72654c7c7ea768df060964ebc9f3f2f8a29f1d0 -size 7951288 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Overlapping-Meshes.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Overlapping-Meshes.jpg deleted file mode 100644 index e64e30bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Combining-Overlapping-Meshes.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7571cd3ef5677e34af2761b36bc92ef20d79107a3f7f649480a7e93c0c211cb8 -size 272416 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-MassSelection.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-MassSelection.jpg deleted file mode 100644 index 946bd7ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-MassSelection.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5cc1c55d87559ddec3c87f436be4ee3e3e7b444eacc10f3ffad9e7553c1f5a2 -size 131256 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-MaterialVariants.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-MaterialVariants.jpg deleted file mode 100644 index edf3a78e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-MaterialVariants.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcd5a95a01548973cc3113482f4948356ccbe26f1cbf585601f61be7095c3b35 -size 43373 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-NewColor.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-NewColor.jpg deleted file mode 100644 index 95e27476..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-NewColor.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6da10b4c8ea98c031807935c268a89459ed6d07d7f1c2ebc822e13a6218be438 -size 121976 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-NewCustomMaterial.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-NewCustomMaterial.jpg deleted file mode 100644 index b6832231..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Customizing-NewCustomMaterial.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2ece6064e50efb3b4caf90256eee64a2da30ebf7ca756c1ed0819459f598b90 -size 112244 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/DecorativeProps-Building.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/DecorativeProps-Building.jpg deleted file mode 100644 index f698641a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/DecorativeProps-Building.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5457ddae0f5c7fe406df85c03584964f7d1931518382f7e305d34d59d3308aba -size 124275 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Overview-Asset-Kit.png b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Overview-Asset-Kit.png deleted file mode 100644 index 11e37d6c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Overview-Asset-Kit.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e161a6e91eaada89340dff9ec464f5ad94404789279f28bab2a0a649c9053f5 -size 1896701 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Overview-City-Template.png b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Overview-City-Template.png deleted file mode 100644 index 8850fb7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Overview-City-Template.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5b946d172fcf1d54a14addda46c771881681d73816e95bc3b907ae19bce0783 -size 1608901 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Aligned-Diagram.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Aligned-Diagram.jpg deleted file mode 100644 index 841fc4c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Aligned-Diagram.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b02596a83ade8c92a13afff2ea9bf456011f9a1706827dbbd13d0c5daa4e4de -size 91421 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Aligned.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Aligned.mp4 deleted file mode 100644 index eeecb430..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Aligned.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d7c135b95d905d7916be0c5cd3925022205fe19fab2bd5982e6dfba91ea029fa -size 1130265 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Awning.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Awning.jpg deleted file mode 100644 index 3b30dfe6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Awning.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbb2ccef2f895dda4abeb029767403fe93ee4468080e83ca91dd14f3fcfb72bb -size 204190 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Cornice.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Cornice.jpg deleted file mode 100644 index 557b5288..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Cornice.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c701a93667bfede889d6c6e33fa88861072fa4ca31be8e420c23954339a6ec25 -size 258273 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned-Diagram.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned-Diagram.jpg deleted file mode 100644 index 2d36a6a0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned-Diagram.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:653f582e0da9735838f17d4b697aab81491c31852e5755325d35a1f067acbe8f -size 177082 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned-TopView.png b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned-TopView.png deleted file mode 100644 index a161f76b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned-TopView.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:708705c0048ae9f79fbeb555a2ed3cdc0a62f66abc12987c58cd6c4ce76fd6a2 -size 275610 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned.mp4 deleted file mode 100644 index d0200a2f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Misaligned.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d4a41c7c4d1ada1c324c286f105b9da18d7b1912ba694ebe7b2cd295696bd65 -size 1625114 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Railing.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Railing.jpg deleted file mode 100644 index 364536ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Railing.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad9902c43645251b08ec942fe9f31ef8263c8000f4aced36432b9fd0384f5c10 -size 248745 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Stud-Diagram.png b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Stud-Diagram.png deleted file mode 100644 index 0ea4714b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Pivot-Points-Stud-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a241ebb6253ecfcfbd7933c4acd6cdb2f3a8d33b53b55f6ca5b643c73e191af -size 1328362 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Snapping-Behavior-Values.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Snapping-Behavior-Values.jpg deleted file mode 100644 index 6226a5d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Snapping-Behavior-Values.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec0a40f0d29a542d1f63c364db252cdfeef36c2c8299d926630eab0608c4304e -size 13096 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Concrete.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Concrete.jpg deleted file mode 100644 index 80b97f56..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Concrete.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1a7b3ff7144730e4b3f42cf7e631f2bacbfa7cd8b3c181a395b4eb78f69d548 -size 20001 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-DefaultTrim.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-DefaultTrim.jpg deleted file mode 100644 index 5c919a11..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-DefaultTrim.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3034b96c1286f941b13001edab335717832848465e183897d6d8199dce88b7c -size 248807 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Delete.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Delete.jpg deleted file mode 100644 index 3ef13270..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Delete.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acae98cfcb2fdd980f5ad5ec6d7a9370f99ed3944c022e0875f833e44a8e40f2 -size 1086677 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Final.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Final.jpg deleted file mode 100644 index 2398879a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Final.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5800e09b9a5c56c2416dcb3e6639c04e22a161f1554e21fa93ead598bc8d96ce -size 247997 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-NewColor.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-NewColor.jpg deleted file mode 100644 index cd0f1fdf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-NewColor.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59a54c07d4d68698f03cbfe6f933409caa5c3f85e63ab8236fe44595a3f35dfb -size 258895 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-NewTrim.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-NewTrim.jpg deleted file mode 100644 index 65a1279d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-NewTrim.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06a9b077174d139c329c6466a7745206b63dad48f144b36e0d92a0f6b738f5eb -size 243164 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Objects.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Objects.jpg deleted file mode 100644 index f39f9c5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Objects.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d660b8d3e4b8925b8ca433476cb50a3202bfd7d745c030f527ffb09ab76a4e5e -size 51273 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Wood.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Wood.jpg deleted file mode 100644 index 265a46ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/SurfaceAppearance-Wood.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0ff67311d0d904a0a8c90ea3d60a1e031cb61306fab85376350f774d55eb01c -size 24569 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Textures-Building.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Textures-Building.jpg deleted file mode 100644 index 121b69d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/Textures-Building.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f8068847e793f6a73ee28b4798aca58bc1013295bdaddd931cec03b89bdc09f -size 64504 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/WithTexture.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/WithTexture.jpg deleted file mode 100644 index 4e1cb9ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/WithTexture.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c53a358000f871df14fa7b1f3f10ee1857752520110fc0398289477269bb7409 -size 256862 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/WithoutTexture.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/WithoutTexture.jpg deleted file mode 100644 index 360d4899..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/assembling-modular-environments/WithoutTexture.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32fe5261bea2620d8ae2c9eda8747cd60709883b2351d525ab3029cd91aa967f -size 253546 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/basicParticleFinished.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/basicParticleFinished.mp4 deleted file mode 100644 index 14eb5345..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/basicParticleFinished.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df34380d3d77f5df4360c03a77b6b86e058c1bf666530b4879940daf1af899c3 -size 108044 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/basicParticleNoLight.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/basicParticleNoLight.mp4 deleted file mode 100644 index 52afa0c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/basicParticleNoLight.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:324733e9fa01c8ef8a0876d45f5f81f016d070bf3ed75669fff03bc9ba528931 -size 91403 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/defaultParticles.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/defaultParticles.jpg deleted file mode 100644 index 258f3642..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/defaultParticles.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:725391c3b52debbcf21a01a1af8e90c94d5ac3bf2ce4781c34efef872e8d4ab7 -size 1000108 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/explorerMeshPart.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/explorerMeshPart.jpg deleted file mode 100644 index 624ec8ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/explorerMeshPart.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f23ab15152a1529406cc0bb8c5585a70db2fe7666a4fb7b73ce7213f8e7a0b87 -size 67067 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/meshProperties.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/meshProperties.jpg deleted file mode 100644 index 53bbaf7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/meshProperties.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a98e5bee43d974daf332f27bd021fe649ddc6d7560dbe90002a4caade4ea5221 -size 87784 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleColor.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleColor.jpg deleted file mode 100644 index b1b755fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleColor.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:816541038c6188417aa8e72cd9027c3599d6bec0399cf9bbfbed0d07f5af4590 -size 39714 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleColorGame.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleColorGame.jpg deleted file mode 100644 index 57e90704..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleColorGame.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1675b3a46921ee5dd8123ed6dac5b2fa0fef79b936637e8b04453b8f2b041c4 -size 691658 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleLifetime.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleLifetime.jpg deleted file mode 100644 index b2b2eade..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleLifetime.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:908bd35a29d39a93f6b89d9245cbad88f0da67f61d9f8d3bdffecab6396236b3 -size 48977 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleLifetimeGame.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleLifetimeGame.jpg deleted file mode 100644 index 70251b5b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleLifetimeGame.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0c268a82b90b1638a72bd1dce2821f9d0848a455abdf885593214c714df43c0 -size 674330 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleRate.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleRate.jpg deleted file mode 100644 index ed23d14a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleRate.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e0a617c213e897ba3a06be7d818885029c6a8975f6a81a607c580bb8ac5091d -size 47776 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleRateGame.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleRateGame.jpg deleted file mode 100644 index e1c16473..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleRateGame.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:246a27e8d026c50886a795f6a8723dc0b88342e3e2eae8f9381939ebe5515f74 -size 669761 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpeed.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpeed.jpg deleted file mode 100644 index 89d8d464..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpeed.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d53a3564fb15013fa98d7f161b5eafe5f0616fe2bfc0eb243efc6f320b03aee8 -size 39411 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpreadAngle.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpreadAngle.jpg deleted file mode 100644 index 7309a7ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpreadAngle.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cc62ff7c4ecac68290840279761ddae50b692b7ae4ccf6cf8409645ec471124 -size 46790 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpreadAngleGame.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpreadAngleGame.jpg deleted file mode 100644 index 668f7033..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/particleSpreadAngleGame.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00382d5a1fe00ef671eb6ed82e17f50cf62af6e2b378288ef5c7d5aa665f47aa -size 650821 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/rotatingParticleEffect.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/rotatingParticleEffect.mp4 deleted file mode 100644 index bd5c763e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/rotatingParticleEffect.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b9c854d3712cccb8bacf2da13e5c3d74b58c4c5a7106f993ef64e5d6950d7ac -size 975324 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/scalingParticleEffect.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/scalingParticleEffect.mp4 deleted file mode 100644 index 649115db..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/basic-particle-effects/scalingParticleEffect.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5086687e52bd1e7e2c941ca45ec6668d680011d3174cd8e0a7d8fc37deee48ad -size 825509 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Add-Platforms-Final.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Add-Platforms-Final.jpg deleted file mode 100644 index b9e710f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Add-Platforms-Final.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbd6cfadce89f56be40e16854a45a01d8e9827862906e6400a62d563d97ca43e -size 136486 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Add-Platforms-Greybox.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Add-Platforms-Greybox.jpg deleted file mode 100644 index e8116d83..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Add-Platforms-Greybox.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eef49192756db4acc248d19b04138d5bcdb1c9284e5e78161c03451ae8f5bae2 -size 78303 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Add-Folder.png b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Add-Folder.png deleted file mode 100644 index 7a577b65..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Add-Folder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d9e9714399ff690c401a9ada018af96918224b9ab4ca7f9205cb53da2ea072b -size 36736 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Add-Model.png b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Add-Model.png deleted file mode 100644 index 840ee7d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Add-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d23626e14ae3004981ce8e61734052ae9acca67e300953fc87976981b1204b6 -size 35685 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Character-Humanoid.png b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Character-Humanoid.png deleted file mode 100644 index a62045ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Character-Humanoid.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63c345967821769605578aa6ad056e021108a767d62019120562c708b26f7ff2 -size 37935 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Model-Renamed.png b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Model-Renamed.png deleted file mode 100644 index c75546ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Explorer-Model-Renamed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c44350db58418ea38fb45894df61ce2ce2613a5daf8f3296855dcd3dd9947aab -size 21252 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Final-Platforms.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Final-Platforms.jpg deleted file mode 100644 index 077e74ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Final-Platforms.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:127da5003c62a292360a2045d461f20cb0c534e3cdcfa46df4f7268c8e798e41 -size 255716 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/First-Platform.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/First-Platform.jpg deleted file mode 100644 index ad96fb20..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/First-Platform.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d939829fd35921e89de1297293893aaac323cb7a85ed4e3262f5bd0f8785e85c -size 246144 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Final.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Final.jpg deleted file mode 100644 index a67f6a06..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Final.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19bfc754b7f90daf452d77bfeaded871e96684dcc9292020e062c53fe1c804aa -size 56129 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Negate.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Negate.jpg deleted file mode 100644 index d1cc01d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Negate.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:831b72228753f3b5e847afd36a11364828d042eaea94cace3c5930298b82bfbe -size 54244 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Start.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Start.jpg deleted file mode 100644 index f5ed93b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Start.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79cdfaf2523ac63b29890a03189554f77be300b3f99b4600365590f2e38bade5 -size 53465 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Union.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Union.jpg deleted file mode 100644 index 68dd3e6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/HollowTunnel-Union.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d979aead2bd77811feead26646e0096784c6d5c3cee084a76dc84e018f89631e -size 57710 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Humanoid-Jump-Settings.png b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Humanoid-Jump-Settings.png deleted file mode 100644 index e2d77614..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Humanoid-Jump-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc6bb4934ff2edec873117afd4ad019503ecb4feeac63d595dad95c1e0ce3a47 -size 14228 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/New-Part-As-Child-Of-Model.png b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/New-Part-As-Child-Of-Model.png deleted file mode 100644 index 4e86c173..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/New-Part-As-Child-Of-Model.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7bb3f61067781e264b20229b90a9d108d5e88e1d5f253996742618d40e9eb4e5 -size 20552 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Part-Picker.png b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Part-Picker.png deleted file mode 100644 index 65fcce46..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Part-Picker.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90752d272dfce1b421c0a10795c83d0bb10578b8482f2c24786d9c4b9450470a -size 140943 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Platform-Levels.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Platform-Levels.jpg deleted file mode 100644 index 63029516..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Platform-Levels.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f462ec6053486b374a17b03abc94cf603c4185eb2bb3051d240d39d490de604 -size 219562 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Platforms-Aligned-Underwater.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Platforms-Aligned-Underwater.jpg deleted file mode 100644 index 4688a6b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/Platforms-Aligned-Underwater.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a22027a90eaf161b4fa1d433a44aa55564b6c8f4146cad92fa124e477ec3607 -size 119517 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/playable-area-walk.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/playable-area-walk.mp4 deleted file mode 100644 index 1dae8e75..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/block-out-a-playable-area/playable-area-walk.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6168e7d6903ab83fe8ef98214fbc22d6ebf8bb746bde02467a7cd308e330d969 -size 14425943 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/Ferris-Wheel-Edit-Place.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/Ferris-Wheel-Edit-Place.png deleted file mode 100644 index a33fb301..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/Ferris-Wheel-Edit-Place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0ecebdfc33e41c5a8e6738d4f1981f880345c9ea36a05c24d9fae15f9ef4b4a -size 134307 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/ferrisWheel-finalExample.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/ferrisWheel-finalExample.mp4 deleted file mode 100644 index 8247192e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/ferrisWheel-finalExample.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf3cb80774b29908523cdbd371b682b9f49387490e42261a0c7123ba4c02ab0a -size 1266682 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/ferrisWheel-inContext.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/ferrisWheel-inContext.mp4 deleted file mode 100644 index 40fc1102..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/ferrisWheel-inContext.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90badf3a3319a6bd2bbeb02605534659650b13bfdd43a28f3a00c29950af25ca -size 3689675 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_actuatorType.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_actuatorType.png deleted file mode 100644 index fa3a7e0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_actuatorType.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:170735a33cdc6db74596b54b47753bcdc104df039fd79f5175ce502a6f031f3c -size 24211 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_angularVelocity.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_angularVelocity.png deleted file mode 100644 index 5a86eaa6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_angularVelocity.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c9483091a97d239c7b15cd0d6ef450ce20a67c6ebd7053ae9bbde25ace5b2b5 -size 27247 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_mainMotor.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_mainMotor.png deleted file mode 100644 index 483ec41c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_mainMotor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a90a85f012f3ded2d858b71cfc1023a2d3a4c652d4d9cec9bac771674b27a297 -size 35464 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_mainMotorAttachments.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_mainMotorAttachments.png deleted file mode 100644 index 5bb523d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_mainMotorAttachments.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:047bd97673ef20f8aa31459f3d94089073259a94f4ef3071a5217b0483d25332 -size 22769 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_motorMaxTorque.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_motorMaxTorque.png deleted file mode 100644 index 8157ebb5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_motorMaxTorque.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a6c68d3194e213a67e56d5732cb965c61f14184a335bb2ad0cce4aa69fea186 -size 27192 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_moveMainSupport.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_moveMainSupport.jpg deleted file mode 100644 index b38462c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_moveMainSupport.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b9da8cc4db868137df247874bb1befcbce0b1f40a5fd3f34ac6de15599365db -size 63531 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_movedSupportAttachment.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_movedSupportAttachment.jpg deleted file mode 100644 index 191c3a53..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_movedSupportAttachment.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fec04f12cb14941832631a63f26941c19c3a645ed46d056894c05aa541d25ec2 -size 43155 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_movedWheelAttachment.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_movedWheelAttachment.jpg deleted file mode 100644 index c059346b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_movedWheelAttachment.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97030b1b1a9667d550906abcd668da2df1c19899181bf864ef85da9d7dbd1ab4 -size 62012 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_originalPosition.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_originalPosition.jpg deleted file mode 100644 index 21e56881..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_originalPosition.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dee99244a3e72120baad88e9597b498a475ca399aeaa7e7f20d79c137e85bc1c -size 70599 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_rotateWheelAttachment.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_rotateWheelAttachment.jpg deleted file mode 100644 index 37e8cc6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_rotateWheelAttachment.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18d943870db7137e448c6695e43e92ebb1956c7a0efbfe2a0a301116a12e7774 -size 106466 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_supportAttachment.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_supportAttachment.png deleted file mode 100644 index ebaeea7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_supportAttachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95789bf1d5da172a2863dea62f7aba5c10959a7dd87760b3e0e1376c5fa3ec98 -size 33797 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_wheelAttachment.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_wheelAttachment.png deleted file mode 100644 index 72e790c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-ferris-wheel/makingAFerrisWheel_wheelAttachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0be47f247b0721f682538bde6bac904610b3677214cbf8429f45c772a34fd793 -size 38652 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints-showDoorCreated.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints-showDoorCreated.jpg deleted file mode 100644 index 056ba135..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints-showDoorCreated.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a36133ec878eab656255d08e20596ff6352d705c855d69fc2ba15ab7a8998aa -size 48789 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsConnected.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsConnected.png deleted file mode 100644 index 462c9f5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsConnected.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b41e752f11e32d75391d46a5e6b5f75d40596f7a3d0331d0a5792b8ebaf0a97 -size 4097 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsCreated.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsCreated.png deleted file mode 100644 index fa8df2a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsCreated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1505fd01229148f853e67938b81e38f7ba01c024e89265ec3f7c37fa283ce1b1 -size 4988 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsRenamed.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsRenamed.png deleted file mode 100644 index 67d3dae4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_attachmentsRenamed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a33a090520b2366dee24e1fdec94d859a5227010c7a06274de2cec3ecb438df -size 9191 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_doorSwingingWrong.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_doorSwingingWrong.mp4 deleted file mode 100644 index ff02d88a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_doorSwingingWrong.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:398b9712dd16192767873298c3047d4f45ad2aa15b0b0a612b139b70046663b0 -size 578850 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalDoor.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalDoor.mp4 deleted file mode 100644 index 9108ac67..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalDoor.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bec664c6fc727a894d82be801b134e4a069167be57f3ea0e24c0740825503800 -size 267309 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalDoor_WithLimits.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalDoor_WithLimits.mp4 deleted file mode 100644 index aa1661d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalDoor_WithLimits.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b138e876ad49702c9a834b4e9ff201eeb4b335ae98ddb899d5bc20742910963b -size 190941 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalExample.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalExample.mp4 deleted file mode 100644 index d3977b72..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_finalExample.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ee623c4e73a0c8494743fc25e99a28fc05fcf3b7b48abcc2d573cee3ded8be3 -size 409615 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_limitAnglesV2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_limitAnglesV2.jpg deleted file mode 100644 index 675fb437..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_limitAnglesV2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f6a2856b8e7b351603d89b610941f8a918f8539c8544c54876189064be0dbff -size 77514 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_limitsEnabled.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_limitsEnabled.png deleted file mode 100644 index 92efbdb3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_limitsEnabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eca9b50b7d2893dbdd8a03bbff9a9e4a599fff157bf2f034be58b982cde03fe1 -size 8190 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_primaryAxis.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_primaryAxis.jpg deleted file mode 100644 index 150d3033..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_primaryAxis.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e3d93cd2a44e17a37ad3e719368dce84ebdb2a8e2b2513f58ec7ca651c7927d -size 44404 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_secondaryAxisArrow.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_secondaryAxisArrow.png deleted file mode 100644 index 07e0b2a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_secondaryAxisArrow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62d0f2a58b4bfd0506c5abbd2e5e3981990a2b4a50066ba70e6008ab1e298598 -size 51297 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectAnchored.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectAnchored.png deleted file mode 100644 index 6c56197a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectAnchored.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b310ab71e55754003bdefe77e6aa2e0e19af1b214e0776449721e9fb1d6a006c -size 7726 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectAttachment0.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectAttachment0.mp4 deleted file mode 100644 index 1b9e1a47..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectAttachment0.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d4cef19ecdf6fa6e9c447a2e53cf08339dfa1b824f4fb736a5febb679571efb -size 548192 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectFrameAttachment.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectFrameAttachment.png deleted file mode 100644 index 06794975..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_selectFrameAttachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d69eb68c9956f6c16d1a0404426d2d3fca67590787b80630e3ac3e4ddc9e8d7 -size 9920 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAttachementsMoved.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAttachementsMoved.jpg deleted file mode 100644 index ba70eaf7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAttachementsMoved.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89a541ab9632276fc6b9b99b45d469cca98ecae91c16129f0971d48beacb0e25 -size 28446 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAttachmentAxis.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAttachmentAxis.jpg deleted file mode 100644 index 8f01eb35..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAttachmentAxis.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d50bff63838c23eb738dcd9984d441ecf92dbc39bbe6158231139328947fb8b2 -size 42915 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAxisArc.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAxisArc.jpg deleted file mode 100644 index 718a9c97..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showAxisArc.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4520b80da584e7e8277d110e5cfe2c8eb29df2fd638eb5dbee6afabbdaaeeab -size 51519 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showCreateHingeConstraint.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showCreateHingeConstraint.png deleted file mode 100644 index 5341afe4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showCreateHingeConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de3b1ab6ceebe9baac7b3bb918364cadd0ffcdf528478174d94c1ef7da7eb376 -size 6427 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showLimitsSet.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showLimitsSet.png deleted file mode 100644 index dc4fc764..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showLimitsSet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75e4a14f17e9637f73de554cf01cc1c73b1d312b3d893755e8e1f31929b72f41 -size 4007 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showMoveAttachment.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showMoveAttachment.mp4 deleted file mode 100644 index 61fd558d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_showMoveAttachment.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0550eea5bea0f8550b1276795eeb129f0405c92c24bb490e1a07a71fb9e1007 -size 227312 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_snapRotate.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_snapRotate.png deleted file mode 100644 index 3c9adb38..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-a-hinged-door/introToConstraints_snapRotate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48b79e4013d8c9a0590382e858e09a0d27266773ef4ed22a4a61f9f89c81cfaf -size 5895 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Mezzanine-Assistant.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Mezzanine-Assistant.png deleted file mode 100644 index dbd87b58..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Mezzanine-Assistant.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50d3f63ab972be3868777c70c9d74fdeb00b0eedf936a7dec4bfc80d86bce94e -size 84294 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/ObbyThumbnail.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/ObbyThumbnail.png deleted file mode 100644 index 76afbb8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/ObbyThumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66f11b7ba0a48ec3df87e0fb1840f31fca54bd195e5158ee5df53ff91891a333 -size 1327385 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Studio-Setup.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Studio-Setup.jpg deleted file mode 100644 index b98c9690..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Studio-Setup.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfe6adec24e0a2a8d6e50865e4a8a7ebb60df82932e9d8c6f0537b2e859f202e -size 162858 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Texture-On-Surface.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Texture-On-Surface.jpg deleted file mode 100644 index 090c096e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/Texture-On-Surface.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c357ffaf1a4735d73c28262a5ae87c8f9e55914729af19553ff5b0c8c4b8162 -size 99182 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/anchor-demo.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/anchor-demo.mp4 deleted file mode 100644 index d338a75f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/anchor-demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e89401cc0b66879ba1c6718860d0db08c24bfe837d7b9ecb1fed5956a60f044 -size 262262 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/createPrompt-2.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/createPrompt-2.png deleted file mode 100644 index 1027f4df..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/createPrompt-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2916ec78c211726daf78d906c195ed1ea12f90a79623b61bc2c0a9f12ca22d46 -size 32962 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-1.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-1.png deleted file mode 100644 index 6b3d358f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3ba7bb03739b16f53eb7393c91463082cd96b679a21d0e2c896eebbca10e469 -size 1233347 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-2.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-2.png deleted file mode 100644 index a848fceb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b45080ed6601d5af008335ac6120d7c835d82e79b6040f8b24cd8fe9763b339 -size 1155645 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-3.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-3.png deleted file mode 100644 index 75af8c50..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96fc01d44fff025ebdd1d7709f60eea7543ff1a3212001ff678e0441f465b103 -size 1280358 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-4.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-4.png deleted file mode 100644 index 509256e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97ad8687f7ce9f03089667aca20f3170cc53c71262d13d5ddbf9bf20fe864b09 -size 1155283 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-5.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-5.png deleted file mode 100644 index b76aa24d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/customize-5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d2eae5ace265868811ccbe624f6d6e0bcd7d910232c6c2d67da712cd8107eb5 -size 1181046 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/insert-2.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/insert-2.png deleted file mode 100644 index 41388e25..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/insert-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44aac9f1eb813f471c24b774eb69c405cdc62a79d9cf78e7b927bb3e2d51252c -size 635182 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/insert-3.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/insert-3.png deleted file mode 100644 index c90533b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/insert-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b391964bfb8e133fc94ce5e00478d03d707cc2c0e53973307d1d429125c5a38e -size 738803 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/materials.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/materials.png deleted file mode 100644 index 8dd59f81..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/materials.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cc59583692b1473a2298a3003d9e129f49c384f646430dae9a2b582d7339035 -size 380388 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/part-picker.png b/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/part-picker.png deleted file mode 100644 index 72878952..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/building-lesson/part-picker.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1345d5feba819373b83b97f9d8d98e9190b1940c583c1a7f1b76532ef972b261 -size 50826 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/coding-lesson/StoryGameThumb.png b/.cursor/rules/roblox/en-us/assets/tutorials/coding-lesson/StoryGameThumb.png deleted file mode 100644 index 20eabeb0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/coding-lesson/StoryGameThumb.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1fcc88f3df702fdd004c16ce9a5d701b9984aa2fa7d04e329ea0aff6e39734b -size 1377169 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/CameraManagerScript.png b/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/CameraManagerScript.png deleted file mode 100644 index 3f697e7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/CameraManagerScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aac5005bdee0a07ed09acd11043103d01f287bebd02363c70d41a0f892993d9f -size 5878 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/CameraModeProperty.png b/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/CameraModeProperty.png deleted file mode 100644 index 7a5b43fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/CameraModeProperty.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:833481618acfffdf48d8ab8dbb067c33116d35336fd020600754d8285e5541c5 -size 3820 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/FirstPersonCameraExample.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/FirstPersonCameraExample.jpg deleted file mode 100644 index 744bc6f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/FirstPersonCameraExample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2ebe8ad28418ac542a6fa824dceb29d1f7aebaf6d8a3ca8d4446dc0bbd66a5a -size 378038 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/IsometricCameraExample.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/IsometricCameraExample.jpg deleted file mode 100644 index 49299576..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/IsometricCameraExample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:885e7d99a1510cf628a6b07963d0887ee2d16b3df4761ae69d84f2f812a74f8c -size 675526 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/SidescrollingCameraExample.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/SidescrollingCameraExample.jpg deleted file mode 100644 index 03eee34f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/SidescrollingCameraExample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8e2b776eb74abaaf612b5bcbd85afd93a0cfeb6a1751af21cf2fb7bfc8f2e4e -size 321067 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/StarterPlayerSelection.png b/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/StarterPlayerSelection.png deleted file mode 100644 index 5bebd5c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/StarterPlayerSelection.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59096c073f89a17ba8d2835c8fc7a5741079e9078f65b6941299af49d4a0bae8 -size 5434 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/ThirdPersonCameraExample.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/ThirdPersonCameraExample.jpg deleted file mode 100644 index 8308d376..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/ThirdPersonCameraExample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e4e5afaa798e64342b3ff8abf4e3666afe697b5b1b6a73d4c6a9b2a3d5f4b92 -size 378397 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/VectorComponentDemonstration.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/VectorComponentDemonstration.jpg deleted file mode 100644 index 18ae1672..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/controlling-the-players-camera/VectorComponentDemonstration.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f25aada989d2b0ff01b11d759ec9a9e47f097cadbdfb551677bddec440cc08f -size 1494633 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Coins-Final.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Coins-Final.jpg deleted file mode 100644 index c03b0e0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Coins-Final.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd509934a1492b8613a390166a85bb721c990a09c6e689c0f98fe30d9ca13ded -size 208532 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Mountains-Final.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Mountains-Final.jpg deleted file mode 100644 index 7ae6c2d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Mountains-Final.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a016d9f28c0ded5e1c534beeb80f8ea407a46de5e5f4d29d14f0693a1914a556 -size 221652 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Organization-Structure.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Organization-Structure.jpg deleted file mode 100644 index 427fc39b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Organization-Structure.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55627eb53fb6bffb15f17a10c9573e44d0fd447465c267ff0445863d54899abe -size 21515 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Platforms-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Platforms-4.jpg deleted file mode 100644 index 796460ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Platforms-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ba64faf702db65b5088320573849c9785c131d6fcf4b6d9a613f62f19bd458e -size 121768 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Platforms-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Platforms-5.jpg deleted file mode 100644 index 1959bf42..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/Platforms-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb3d7250c91277779367c3acffe88ade3a9db160c4e5f20a12146d83ea1bd6bb -size 163315 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-10.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-10.jpg deleted file mode 100644 index be507fb6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-10.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64eead6e01a6b6ac90d07f9c43bdd934936efd520cad7b2a0fe1d5d766ed8397 -size 161054 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-11.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-11.jpg deleted file mode 100644 index dee0f32a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-11.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2be8738ea337ac02f25f6a1d17c8cbde35ab4367c49b77b01ec5b0c88e250e93 -size 162884 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-12.png b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-12.png deleted file mode 100644 index 23984267..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-12.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd02ab7805ec48647ab25a1652c493f174baac57b70197bec5b23cf5543cfdc2 -size 711124 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-13.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-13.jpg deleted file mode 100644 index 27edf4de..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-13.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c012ec0205e1b6d561f692c41d166f39a5ebb6606515686384410c0edcbcdd0 -size 165073 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-14.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-14.jpg deleted file mode 100644 index 7f288a51..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-14.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26a98f2cb5bb53e39d023d75884f5a633bfb4a055511262849cf5eee250dcf68 -size 161118 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-15.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-15.jpg deleted file mode 100644 index 8eda2a38..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-15.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d951065a7aa0fe0ef12e458b250b606ad08d573cd51a09e0416e62b80b7efe5 -size 159768 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-16.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-16.jpg deleted file mode 100644 index cd8044b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-16.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5408b83953d2ce1f72bc06d09c3f566732a551565379fc630ab41a54ee28a1d -size 159692 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-17.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-17.jpg deleted file mode 100644 index 336cb33d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-17.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c986e5a3c8536ed7dc468b2e62784038195e41bd12255207621f24c083fc9a1 -size 158566 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-18.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-18.jpg deleted file mode 100644 index fca65de8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-18.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eea149bf457d981e9f47664e4ec3eb46c9131d23be2908d4f61b251ce5294430 -size 158383 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-3.jpg deleted file mode 100644 index 082adfa5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e22593c0244979add990ae982d53e64b702abe41308260892e1ba1b0d1db48fa -size 165609 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-4.jpg deleted file mode 100644 index ea5286a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c7307c99df4daf7cf288a44a499b8b051c139fef4a4f0d64a626364e9a0cf66 -size 169508 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-5.jpg deleted file mode 100644 index c26e56c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac6513515684fa4370cb93c3ce0acdba9d72e2d21c6526e95b0e195cbd8ba7db -size 169681 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-6.jpg deleted file mode 100644 index 2739d9bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec591209d1c656b023027cdae0d9f469f2fc047a344d2010214ba6514b6139a3 -size 168928 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-7.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-7.jpg deleted file mode 100644 index 503ea2d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cdf72910bf27059c33e06fb4f9bbf00e2ede387cf1448f81d288d9edf3e0f9de -size 171077 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-8.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-8.jpg deleted file mode 100644 index ee5d8551..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f22410f04673028e6ddb5472cea74325ac7f7a50041029692469cd22c7bb58c6 -size 165450 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-9.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-9.jpg deleted file mode 100644 index cb0b05bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/ApplyAssetLibrary/SeaStacks-9.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d41b3d598beb0401c969cd4db4367f85b64093472219037de7995cc6e8859d30 -size 172773 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Asset-Library-Complete-With-Materials.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Asset-Library-Complete-With-Materials.jpg deleted file mode 100644 index 6f8f47fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Asset-Library-Complete-With-Materials.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e48c395eb9377f4e7e0f8873e149d0cc07111651d99d9d45cbb60308ff9356c4 -size 217149 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Asset-Library-Complete.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Asset-Library-Complete.jpg deleted file mode 100644 index 035eda3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Asset-Library-Complete.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e9f73a2f3cfd2b727595f419b698759ccbcbad572d5cbe2a084ddb504815dfe -size 216819 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Baseplate-Deleted.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Baseplate-Deleted.jpg deleted file mode 100644 index b7301f27..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Baseplate-Deleted.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdc39a3f86f977577901eb06194e2e31acd0c7aaa71f4205a2cbd9a9fb8ef207 -size 69142 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Coin-Mesh.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Coin-Mesh.jpg deleted file mode 100644 index 5e118246..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Coin-Mesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:795ddd0a7c6bcbe8030c57a2a7a21b4d5e0a2550fa1519721292997b1cd84272 -size 44400 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Completed-Sea-Stack.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Completed-Sea-Stack.jpg deleted file mode 100644 index 358997a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Completed-Sea-Stack.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b3768ba17696082b73247e13270b3344e7841ce55c8be3976e69cc1ca3d4a6a -size 209196 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-AirParticleDensity.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-AirParticleDensity.jpg deleted file mode 100644 index 950a31d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-AirParticleDensity.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:11ff0e0ed27b437c301d55fafd664175b11fbdfbf6fb174f893cd239c9a8580f -size 159548 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Color.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Color.jpg deleted file mode 100644 index 18f84a39..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Color.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7472e9121b134b86707656e11cc65b4295e03ce67d334f1b474692467df92a51 -size 183098 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Offset.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Offset.jpg deleted file mode 100644 index 0a03d2f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Offset.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03d66396ec62003b419437de49ecd8da1411c18e7652cec6e3d75823d27d5267 -size 158801 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Shadows.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Shadows.jpg deleted file mode 100644 index f97c86a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-Shadows.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b491bfec163e1bf2bc14a1cfc35b29ef926a31375d0e7c7368874f60e1046c75 -size 92433 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-SunPosition.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-SunPosition.jpg deleted file mode 100644 index 3eecd0dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Custom-SunPosition.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25ae237a12fbdb4129865b57a0d191cd4a09ec9c2c04234d46b8345bc3fa0d94 -size 192597 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-Color.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-Color.jpg deleted file mode 100644 index c3ac4941..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-Color.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b00bd678beb4f0000a0424aa5e5ddd2e225f93db841bff34e259b63f2df627f4 -size 182966 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-Shadows.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-Shadows.jpg deleted file mode 100644 index 7c6aaa6a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-Shadows.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d5635b1e9eaf91511a6b6fb73b5fe58ea6976a5c3a8bcbe9cd690d6e0aa5e4d -size 91711 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-SunPosition.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-SunPosition.jpg deleted file mode 100644 index d0f86675..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Default-SunPosition.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9b0002041482af81294e8cae0e50f0d8d4cdfe27d00431966ce6aa37eb714ef -size 186419 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Dust-Motes-Sky.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Dust-Motes-Sky.jpg deleted file mode 100644 index 59beed1d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Dust-Motes-Sky.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f02cda82374e1d35f0431ff9019d87e825ef502993a0be42e8d90d03350d9d3c -size 100203 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustMotes-NumberSequence-Size.png b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustMotes-NumberSequence-Size.png deleted file mode 100644 index 6f710bce..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustMotes-NumberSequence-Size.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5d7c16256b7196a244866c25719c7fd3a1d7392ac1f732f085940f8c3991d71 -size 11790 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustMotes-NumberSequence-Transparency.png b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustMotes-NumberSequence-Transparency.png deleted file mode 100644 index e012ebdc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustMotes-NumberSequence-Transparency.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34be10eb509f843437f8a72e7d23f2f98d7eca0ae06842ae13e0469ee7feb672 -size 42984 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustParticles-1.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustParticles-1.mp4 deleted file mode 100644 index e47d6645..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/DustParticles-1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b32d9070d1a39fe94a780130b2db5c40c333b524ed078ba2aa26134d847d0bb -size 1371181 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Coin.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Coin.jpg deleted file mode 100644 index 53f4aa5a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Coin.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3caf24ceb4d95d8388ff4d9d0e62a3e0ac930cdfbe1f229bf1ebdfdd1f17f2b7 -size 189106 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Flare.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Flare.jpg deleted file mode 100644 index 76c73c47..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Flare.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:51553f57fc1eed749b4365022862b745308942e77fed0076d203077082d2db1b -size 165582 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Polished-Assets.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Polished-Assets.jpg deleted file mode 100644 index 072b4ab2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Final-Polished-Assets.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8388fd995a95e2bef8c7bbb5bb1bd0d272d58cf379b0744c2682c00f08c4abe -size 145759 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/First-Platform.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/First-Platform.jpg deleted file mode 100644 index d272b039..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/First-Platform.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b6e33cfc803234df12eac83cc9fc3c8ac3189ac0e73575f72a4c8b76160d320 -size 258698 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-1.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-1.mp4 deleted file mode 100644 index e5ecd75d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a017206337c98c945e42e4a398d4d6a8dbdf435ebf710c2f2f7143d1be9eaac1 -size 619800 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-NumberSequence-Size.png b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-NumberSequence-Size.png deleted file mode 100644 index a3d7a54a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-NumberSequence-Size.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78a1c1c5d30b03437189cf46c87eb3fed9a40dffc67a396a4a15bcfa1c582e38 -size 13717 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-NumberSequence-Transparency.png b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-NumberSequence-Transparency.png deleted file mode 100644 index d6bc2d65..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-NumberSequence-Transparency.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba49ea2d3bf146abd37c94997058662a6d138cdf55c87c71cea465b857e18d2a -size 18431 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-With-PointLight.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-With-PointLight.jpg deleted file mode 100644 index 0606bca7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Flare-With-PointLight.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:542c78993c091fc9234c3d1940caa6d7950b58f55c7013d3f84f6179e0188b60 -size 161998 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Lighting-Post-Customization.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Lighting-Post-Customization.jpg deleted file mode 100644 index f64a6f2d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Lighting-Post-Customization.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff65efbd635893cc42635e7d2e3e4c646ea32b122d48b23ae97b828fb8b1e561 -size 221284 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Lighting-Pre-Customization.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Lighting-Pre-Customization.jpg deleted file mode 100644 index 636aaf48..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Lighting-Pre-Customization.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4ce3f006683f9b22b06fb19738d03c0b48967fcab4f73fcdfc98f3b1c7b7f57 -size 193883 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/LightingStyle-Realistic.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/LightingStyle-Realistic.jpg deleted file mode 100644 index dde3e0ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/LightingStyle-Realistic.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6b8c658c6ad642d75585904403f249df9da377aa88f8f2c10370ff5c50804a5 -size 103379 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/LightingStyle-Soft.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/LightingStyle-Soft.jpg deleted file mode 100644 index 216a87dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/LightingStyle-Soft.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6275dfdcbcf7242b573d911f99b5bd06871aa05b2853ba59b58459cb3f1e4a21 -size 105466 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/MaterialService-Contents.png b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/MaterialService-Contents.png deleted file mode 100644 index 4cb4d000..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/MaterialService-Contents.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8be74893256887dcb57456edb3918bf40d21339931051149e60a25fed121ea4f -size 26752 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Mountain-Mesh.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Mountain-Mesh.jpg deleted file mode 100644 index e9c03508..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Mountain-Mesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf2acbd6a9e74bdfc766ce5e019fc6eee624457b1552e12a665d6be14242cbf7 -size 149350 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Mountain-Meshes-Stacked.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Mountain-Meshes-Stacked.jpg deleted file mode 100644 index dd97c99a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Mountain-Meshes-Stacked.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dc88d0c7241e25fb892400e49bacc58bc730bed8d50ab2b39736fb3249aabac -size 138755 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-A-Model.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-A-Model.jpg deleted file mode 100644 index e0f6f710..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-A-Model.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d281e0a272626a6c61e558d2044e8cd379a86467202649ab7b394ee237d71d3e -size 95035 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-B-Model.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-B-Model.jpg deleted file mode 100644 index 564b730b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-B-Model.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c554a937c1916ef7a5f18fafb7cb434f4ec2844bf0307ada6e5ce5ed764ca6b9 -size 87083 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-Types.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-Types.jpg deleted file mode 100644 index 52d7f892..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Platform-Types.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f922a08bdc6e73ca00cba889afcd724bcb54852d5b5eb1fc8a9224bebb99067b -size 198837 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Pre-Polished-Assets.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Pre-Polished-Assets.jpg deleted file mode 100644 index 14b63c5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Pre-Polished-Assets.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d17916b6dc3f8bc2c3e683b26d9c38622057cf82c9e3035ea035c69fb10c7b5 -size 139236 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stack-Cave-Mesh.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stack-Cave-Mesh.jpg deleted file mode 100644 index a2bff6df..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stack-Cave-Mesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a6e89718c8bbe08953071519f8a62fa403b2e1c8fae168fe1ac16bd91c2d867 -size 92840 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stack-Mesh.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stack-Mesh.jpg deleted file mode 100644 index 1f3a555f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stack-Mesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6472406191b34918e9445cfc85bb53c7e9ddd63738f349e30f9cc273deb1f285 -size 97076 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stacks.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stacks.jpg deleted file mode 100644 index 2a316d20..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/core-building-and-scripting/Sea-Stacks.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fe68f142717250972c34a4331c57f5f82cce4b6ee46dcd45c286755ea33ffed -size 200133 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Adding-First-Sphere.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Adding-First-Sphere.mp4 deleted file mode 100644 index 8bceb0e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Adding-First-Sphere.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:192eccbcacd21ff78b1142404c609a3d2d923016b567530839e2bb270fbb5138 -size 644344 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Draw-Settings.png b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Draw-Settings.png deleted file mode 100644 index bbba36eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Draw-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a1754cd2820fb57e8d1f24ab02bfc0479afe45edfbf1436374c9ff78bf928e4 -size 303738 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Fill-Settings.png b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Fill-Settings.png deleted file mode 100644 index 87d71a15..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Fill-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8c370d16cdc7af1d0a8354083c640b89b292f314c97286acb8fe48ee37ea91b -size 479572 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Flatten-Settings.png b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Flatten-Settings.png deleted file mode 100644 index cbc67280..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Flatten-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7c3ea036ddc9aa4f39688ee2aac97d74ef8ac5ed80542cc1356374650cc1a4a -size 73462 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Paint-Settings.png b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Paint-Settings.png deleted file mode 100644 index 3a70eb4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Paint-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c76c0476156a589808802999b5bf22c470076bd347b856ef0abf869a3ac48ba -size 298389 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Sculpt-Settings.png b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Sculpt-Settings.png deleted file mode 100644 index 890169b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Editor-Sculpt-Settings.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bdfbb4ec5bbe40f3d6024dc50deb9aae4f31202d474bdb453ce7bb5a668736a -size 300826 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Filling-Water.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Filling-Water.mp4 deleted file mode 100644 index 044c447f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Filling-Water.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19fdc0505f603f91b8fa38b571c6641c03a7e888058063f127d63eb617e16c88 -size 8479432 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Flattening-Sphere.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Flattening-Sphere.mp4 deleted file mode 100644 index fce175b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Flattening-Sphere.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7bee692939b8546023b3a40aab331bc9968b242c00cc0d93790088e0805850a -size 1335918 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Painting-Grass.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Painting-Grass.mp4 deleted file mode 100644 index 2d4ab610..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Painting-Grass.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0df54f750e7b08ca53ff41e08a1330a77e86049cd95ee54cc12edba6b4b6521 -size 10950001 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Sculpting-Edges.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Sculpting-Edges.mp4 deleted file mode 100644 index 3b23ad27..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/Terrain-Sculpting-Edges.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:362ac8fed78d606bffd13e82d0d295b52b7fd177ea48a049d4e812adf442167b -size 2564388 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/create-an-environment-with-terrain-spawn.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/create-an-environment-with-terrain-spawn.mp4 deleted file mode 100644 index 3429955c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/create-an-environment-with-terrain-spawn.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6b31ef45094c8e84639d61ba2214a9661d9301f372321b5d6f42356d98fc392 -size 20794585 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/create-an-environment-with-terrain-walking.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/create-an-environment-with-terrain-walking.mp4 deleted file mode 100644 index 960c13f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-an-environment-with-terrain/create-an-environment-with-terrain-walking.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31cfe4eda3c1c10be03098820dc56881806a7c03ea660fb87a0bc43d6445eb50 -size 21349539 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/Hazard-Part-On-Water.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/Hazard-Part-On-Water.jpg deleted file mode 100644 index ec931de6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/Hazard-Part-On-Water.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:240ecbe7d25dda97800008388c2762ee7336ad771bd1e7a8735ef641f083d286 -size 71607 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/New-Hazard-Part.png b/.cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/New-Hazard-Part.png deleted file mode 100644 index dc9e3393..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/New-Hazard-Part.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bca15bb64377ed11e0d4fafdf081aebacb97cfe25ac030295ba1f774c2a6f319 -size 27478 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/player-hazards-example.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/player-hazards-example.mp4 deleted file mode 100644 index d2304be8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/create-player-hazards/player-hazards-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:546bba1dedbe1f05ff784d382a313aef5e5b6292ca5ab58bf3451decde22f0b7 -size 30042960 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/Showdown-Town-Edit-Place.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/Showdown-Town-Edit-Place.png deleted file mode 100644 index c65507c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/Showdown-Town-Edit-Place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:716d9a65c157b52f7129344c46c198f64811a7ce14c94466c373efb374f5df46 -size 197148 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/dangerousVent.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/dangerousVent.jpg deleted file mode 100644 index 86726069..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/dangerousVent.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f14a9e08eb00f2477499c3dced39ae015e422a9c0255545fbe0a94e2e8d08b3 -size 435753 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/finalHealthPickup.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/finalHealthPickup.mp4 deleted file mode 100644 index 821c0b01..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/finalHealthPickup.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8c01c291e11eca99b320b373429162652024a9042cff21f0450475edb0be385 -size 1102282 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/finalHealthPickupTest.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/finalHealthPickupTest.mp4 deleted file mode 100644 index 5c3b7ccd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/finalHealthPickupTest.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4724101d275fab0ec780f4689dd5dbc4a77dd6cb1645967eabd7e908f8dcef7 -size 2539970 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/forLoop.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/forLoop.jpg deleted file mode 100644 index cabee348..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/forLoop.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e0cec3b68c3e46114eca963a6a6e6d1a3fa5005d1da61a056947e53eb702836 -size 80505 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/fullHealthPickupEffect.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/fullHealthPickupEffect.mp4 deleted file mode 100644 index 625fe6e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/fullHealthPickupEffect.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16feeb86e7be12ac15ce35ff8d67a8e01469ce177f5ad69106f89e00f0dd9283 -size 4014445 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/healthPickupExplorer.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/healthPickupExplorer.png deleted file mode 100644 index bb9581ec..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/healthPickupExplorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a22bf096f8dc5ec1ff4a414aab17791c787fcbe66b2ee913f937a6d3ceecaafe -size 12239 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/healthPickupGame.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/healthPickupGame.jpg deleted file mode 100644 index bfe26515..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-health-pickup/healthPickupGame.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c71434ac9b8bb5b173ceceb4ce90a1bcade41babe3c5dc61e0cf9a19870e1be6 -size 474214 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Device-Emulator-Preview.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Device-Emulator-Preview.png deleted file mode 100644 index b29d09db..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Device-Emulator-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1be93af088434fe49b570cb1d1108ebc4b46bb4d8ba5f04af1618b7688c64ac1 -size 172569 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Device-Emulator-Setup.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Device-Emulator-Setup.png deleted file mode 100644 index dd00f73e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Device-Emulator-Setup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ae99f6c5038d20d99298f38f5c7412600fbdc34a13b4e9ee8747b905190a21d -size 151995 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-2A.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-2A.png deleted file mode 100644 index f2b50dca..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-2A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d823e32712082bf8b85fe4609ecae72449772134cadaec574ecd4746a6a21e13 -size 765481 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-2B.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-2B.png deleted file mode 100644 index 74133efc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-2B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6598c706e27bc834f8c165d3fa8dbce82b86f6652fe71f9a8ed67043cea7e0ae -size 1907130 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Diagram2.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Diagram2.png deleted file mode 100644 index b0e91e8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Diagram2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb2532a51d41d40c6d537e0d271f8cb3f746504dedb50d13c30a011a1a1f6c13 -size 79882 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Horizontal.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Horizontal.png deleted file mode 100644 index 273859e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Horizontal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6792a4565c37a9b28ec88a22863e5abaea4657d364687104cfde4a347fb455da -size 81193 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Vertical.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Vertical.png deleted file mode 100644 index 054054bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Frame-Vertical.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2510048f10d4d0166cf8259deaa3cbedd0209b90d5238553b46b2f5a6939ca0 -size 85612 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Icon-1B.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Icon-1B.png deleted file mode 100644 index a46ea79f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Icon-1B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57333df78e868d331eb371e84e05d97f9ef3f625cd0c3d6941bdb3241e2860b4 -size 1897234 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Icon-2E.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Icon-2E.png deleted file mode 100644 index 2f6b7055..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Icon-2E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce00b95ae638e30947db00153e0e7efbb5b5ced83789899ccc8a40d5df2ec3d5 -size 777632 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Score-Bar-Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Score-Bar-Intro.png deleted file mode 100644 index 50e5042b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Score-Bar-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f72620bc02a140c2609717db7b50ae5fcb28edbac7d30ccf06570323bb24c519 -size 1717358 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Text-1B.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Text-1B.png deleted file mode 100644 index 946d153c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Text-1B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7766f9b6b65b07c48096a4602e6dd067586c677e9f564f53bf569059643d7912 -size 1903610 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Text-2H.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Text-2H.png deleted file mode 100644 index b83a8f14..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-a-score-bar/Text-2H.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f205d1429ea3ac07514b7f07a134dc7f7cdc7a5028121accfe51a5096c0721a -size 1913019 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/bipi_t2_showFrame3_front.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/bipi_t2_showFrame3_front.jpg deleted file mode 100644 index e4f0f374..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/bipi_t2_showFrame3_front.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:738496538b3abe9627bde52c393c9d7d0e69ec0d2238b43b28712ea3d4f223b2 -size 22070 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/bipi_t2_showFrame3_side.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/bipi_t2_showFrame3_side.jpg deleted file mode 100644 index e7fed6e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/bipi_t2_showFrame3_side.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:403a3d0850ea62330d0fcca638c0acfba1a081f92b06b54c0c8328516c82581d -size 12249 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_exportedAnimationWeb_alt.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_exportedAnimationWeb_alt.png deleted file mode 100644 index 13f9b909..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_exportedAnimationWeb_alt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b669d525266da074053e143a997b2bc9bcf3fc6e0a1380358df526791c8c285c -size 47551 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_01.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_01.jpg deleted file mode 100644 index 8a225f60..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_01.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:97ca114e4c500010f45de3523710c6eb7e4758c81380d64d1665782d891537ed -size 14976 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_2.jpg deleted file mode 100644 index 024b58fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4f6681be935a40e976aea1335db4a103f121740ca4da91871df25bea65fb916 -size 16009 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_3.jpg deleted file mode 100644 index 89510cd4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e665cc907f82e77f993d4ea03fcfb82eeef83f69f1a0f5690a657340e0de2a64 -size 18698 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_4.jpg deleted file mode 100644 index 0d492768..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/ccs2020_t2_jumpAnimationStills_4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77041bbcfb34190fd2835605579f12b321bfd813c18204743a636711ecf12846 -size 15496 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-AddKeyframe.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-AddKeyframe.mp4 deleted file mode 100644 index 7c463a8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-AddKeyframe.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b36998f149b2e7671dce1f7d091698962bf1e4eaab924c6c25b66524adfd132f -size 27651 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-changeExactTime.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-changeExactTime.png deleted file mode 100644 index 9eb55d7c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-changeExactTime.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec7889e3f4283644deaa58f8dab12f4b1095ca9d4b1009ce0ee41cad0c84d466 -size 10554 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-clickAddAll.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-clickAddAll.png deleted file mode 100644 index effdbc05..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-clickAddAll.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc24ba894b6fcaf62346af6e1f2b0c359bef812815fa4831de3bab173a1e0456 -size 7409 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-clickMenuButton.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-clickMenuButton.png deleted file mode 100644 index 72a8630a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-clickMenuButton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79e85d632fc299900df34569fbb1974ddb3d7407f4e2dda3d998374d8a7d49fa -size 8285 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-exportAnim.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-exportAnim.mp4 deleted file mode 100644 index 8c1a0599..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-exportAnim.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:637077cc7fe7041bd6661bee1e2c1996b2cd62b29e0a8d48866c3528fbbcf9e8 -size 28933 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-exportCopy.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-exportCopy.png deleted file mode 100644 index b7dd7ca0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-exportCopy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99c0c31e0740bad07bf4f9e2c033ac53208c0d8f908fd74d348358b205d2d5db -size 13112 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-partHierarchy.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-partHierarchy.png deleted file mode 100644 index 15b0ecbf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-partHierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6386e5bf24bb61d960d6d16eb44c784eb70118fa187ccf675a248195db34293e -size 9487 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-pasteLastFrame.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-pasteLastFrame.png deleted file mode 100644 index 1b4c1728..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-pasteLastFrame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b3341685d01ed16beecadcdfcae18c6e99b44ff734fc59c3bed9836e94149f5 -size 8013 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-rigCreated.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-rigCreated.jpg deleted file mode 100644 index ea2af1e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-rigCreated.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e818a541125658f61b1f20025123780cbb5433e1f20f95338ba810836bc7502e -size 53209 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-selectFirst.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-selectFirst.png deleted file mode 100644 index 167d2a01..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-selectFirst.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0a01ba391ff62435fb3eb6f21ada986a396b2d5c8f3ad1765978071abe13b9c -size 10369 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-setToMidFrame.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-setToMidFrame.png deleted file mode 100644 index 8d24bedc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-setToMidFrame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2062195e9d5f2324f30400029d0585c29b6fabef59b6ea6bda90d136fa9574f2 -size 6829 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-setToThirdFrame.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-setToThirdFrame.png deleted file mode 100644 index d199d99e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/creating-an-animation-setToThirdFrame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:021a6a8a493bc1cdb9e5b9165b8c1fc95debd870f2950b836d20d015e3b77b23 -size 6776 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/intro-to-animations-victoryPoseFinal.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/intro-to-animations-victoryPoseFinal.mp4 deleted file mode 100644 index f795aba2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/intro-to-animations-victoryPoseFinal.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95a49de319e02dc170300abfe27a805445a8b1e9937b7f5b67fc3c7266d52fa8 -size 1558487 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showFinalVictoryPose_simple.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showFinalVictoryPose_simple.mp4 deleted file mode 100644 index 1f024f9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showFinalVictoryPose_simple.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31964d5fd700ace0cc0623337499be659e2719ece88fa6efc3eda274e195b5df -size 451501 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showMoveBody.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showMoveBody.mp4 deleted file mode 100644 index efc3dd79..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showMoveBody.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb7470d0968d6f94887dc6a74eae255250f41bb1098c81c1d79910a435498f1a -size 121563 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showPose2TimeLapse_optimized.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showPose2TimeLapse_optimized.mp4 deleted file mode 100644 index 1e653d99..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showPose2TimeLapse_optimized.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc3f3a4f90bd42ef3088a16b62678c91e618b0a0bf8e270e308e3261b4084ede -size 2541262 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showRotateArms_web.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showRotateArms_web.mp4 deleted file mode 100644 index 28c27f98..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-an-animation/showRotateArms_web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8aafa656b47751a1217acc9d54bec39a4f08c3a465fa7772a359edfe994e37f4 -size 207007 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Add-Rig-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Add-Rig-2.jpg deleted file mode 100644 index fb27a720..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Add-Rig-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d453f19aa21e15fb1dec4ca2af5a64fdc989bb0109f87a78e978bcea196f2ec -size 1057553 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Creations-Animations.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Creations-Animations.png deleted file mode 100644 index 5373f770..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Creations-Animations.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5e969bc89316cb0ffe8267186a2d817ade461c7f5c3c264780021ab82456935 -size 52325 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ellipsis-Button.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ellipsis-Button.png deleted file mode 100644 index 45804a09..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ellipsis-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6f9ea197a2bf5a11ebbbfb5c6480f0ff457466b85926f23972fb3c0789d974b -size 16169 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Feminine-Rthro-Rig.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Feminine-Rthro-Rig.jpg deleted file mode 100644 index 4edd45e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Feminine-Rthro-Rig.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44f9b42e7afd7aea3007293da3839b265f287cbc3c471c3c7e7bb6a139cf1fd1 -size 344982 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Final-Animation.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Final-Animation.mp4 deleted file mode 100644 index d01cd3ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Final-Animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32d6ed6fccb9c356881164bf088c9fb52223c55feda11ebf8dc86c5dd8e00c9a -size 7182255 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Gear-Icon.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Gear-Icon.png deleted file mode 100644 index 322d295c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Gear-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fae366b8535eb4ad2592394daee8d8a9a42a073111a84d49e308af519fd82447 -size 4807 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/InterpolationExample.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/InterpolationExample.mp4 deleted file mode 100644 index 2692ccac..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/InterpolationExample.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de92707b36c95366d189f8a120f68d0dcf9e9f3cd61ab2774520535f1431d5d3 -size 2821387 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-2A.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-2A.png deleted file mode 100644 index dd8f0921..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-2A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d7f7e543783797b36aecdd80cf37652d80a5aa971333d23a269a12a19b80637 -size 12362 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-2C.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-2C.mp4 deleted file mode 100644 index 8eb0dc39..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-2C.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:417127751d1f9d226d9716c5f8c9019e2f7d138454488fa75e9c28e926218008 -size 127212 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-3A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-3A.jpg deleted file mode 100644 index a2b13809..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-3A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01ce1936d54e9125570f93ee8c5f286b1382ca60e3cf11daeb3c4800f84cec15 -size 1005812 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-3B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-3B.jpg deleted file mode 100644 index ca9fd2b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8da40961c40db731b277e45e6ce71f2a7b9a417f3e1b28d0274f1efc364ee269 -size 999944 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-4A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-4A.jpg deleted file mode 100644 index b155d12b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-4A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c542636f130516ee95259320817e0878dce09caed2752dcca49df39215c3914 -size 1009459 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-4B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-4B.jpg deleted file mode 100644 index acea5879..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-4B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebe4f4d989f08ac335741049a6291c7f21df4098118a81c6705a6f4517e2c237 -size 1010421 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-5A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-5A.jpg deleted file mode 100644 index 288088a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-5A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0420d7301ce9b451cf2ccd6aacdfa63c38e788f38ba66e88b87297d3dbfc6d7e -size 1020152 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-5B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-5B.jpg deleted file mode 100644 index 98d33b0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-5B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be8b90b254b63b7988762f33124fbc857d6c5c3e33da59d5f25a42098e254cba -size 1009840 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-6A.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-6A.png deleted file mode 100644 index fe7136d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact-6A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62d36448be22f4de585a232ec3020e42432c74617cc7e4061a624e9aa3b8bf93 -size 12296 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact.mp4 deleted file mode 100644 index 5c50a7c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Contact.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a7fc40bc1b2385b6d0685c87574e68cda5086de174fdc8b40117454b02875c8 -size 15708836 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-2A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-2A.jpg deleted file mode 100644 index 7d80ad83..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-2A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d97162584fbe5bbf02b1da9985b3a4878fddcd1f3ac94a50882971bf4aa9572 -size 1009196 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-2B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-2B.jpg deleted file mode 100644 index 31a37a33..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-2B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c3db7f4fd278e69652d5270ce0d52abd24eaf471fd847a919a9a2cd157fd891 -size 1002934 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-3A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-3A.jpg deleted file mode 100644 index 7f36ded8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-3A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:496730c9d6840ad31f13d513e1c9a6c9106498fc1523fbdd95e4e460968999d2 -size 1017335 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-3B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-3B.jpg deleted file mode 100644 index e279b3d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:433bafdc05ffba2c70610cb755d6c935676107e760200044eb286a80912100d4 -size 1003979 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-4.jpg deleted file mode 100644 index 3ae9143e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53b35ca312519e0b6eb085ff898568e25db943b171176134dd6fe4598e58ffea -size 1006028 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-5A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-5A.jpg deleted file mode 100644 index dfa7938c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-5A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a35921f41566d8dbb8fba86678fb1f9580f5c06d118256125ab32798b189c5e -size 1009971 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-5B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-5B.jpg deleted file mode 100644 index 4babc69e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High-5B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ca0901a64d335be8df60df21336773ebd558b13d2056d24853a7a51e323823a -size 1010469 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High.mp4 deleted file mode 100644 index 9998a97c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-High.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74cb356246fc0b8070f0ec8b05cd03b693b375b0adc136608e03cb2903734688 -size 21768460 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-2A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-2A.jpg deleted file mode 100644 index 0a82c7b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-2A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:155dc91a552781059e8c383c8474ae143f5f3b688e5c14c78720c959702b62b7 -size 1009123 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-2B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-2B.jpg deleted file mode 100644 index 5aacb9f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-2B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c86fbc52ba6f2b844916ea318c776f11326dd3c651be1a7b85e6f5d0340985e5 -size 1013821 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-3A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-3A.jpg deleted file mode 100644 index e6bf24e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-3A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b777fe1254a34949c9d9e64e789a407314e6f799fdbd9368a238ead88538c746 -size 1014781 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-3B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-3B.jpg deleted file mode 100644 index febfd8cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:045edf25b0686d21df569242915818d92257c15fd0174effff83ed24d2b760af -size 1014004 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-4.jpg deleted file mode 100644 index aaadaf57..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20e6caf28a0d85bb58c87e8f38336bbb63226e2d7be3b7127a4d7f3b399fb8ed -size 1005717 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-5A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-5A.jpg deleted file mode 100644 index 622ee2f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-5A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fc46089d1dfeff3197483763aa4471bcc8633c8cc6e6cf2c658b7f9e4df5430 -size 1009794 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-5B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-5B.jpg deleted file mode 100644 index c474b2f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low-5B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d43892ba67e0f46b3862336896315822da3a3ebe69eab6b45bf6491097cd5a5 -size 1013648 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low.mp4 deleted file mode 100644 index 8bafc8ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Low.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:426b3f4b220c47bdc19df84cc83e9c38c34e2824252c06b63a3d0468bce7e485 -size 17273390 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-2A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-2A.jpg deleted file mode 100644 index fc56aab9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-2A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e8d3874ef92e0c97d0d09e4d2dfaf99ea0702387798857a084b7a5e9cbc1957 -size 992232 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-2B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-2B.jpg deleted file mode 100644 index b5cfbf17..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-2B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:555c1d6908ec67f11add0a26182a5ec27ca506569d0c6c7578ce75941f22a1d2 -size 1001626 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-3A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-3A.jpg deleted file mode 100644 index cd62d672..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-3A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70642f778f326ebdf9535a7887f57ffcfb5ca33994ccb067c31f6239841cc313 -size 966862 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-3B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-3B.jpg deleted file mode 100644 index e99ff8a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63532e675b94dfcebf308228bbc42a1d3c76e35dcb15be368416baeed193f6e4 -size 1002628 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-4.jpg deleted file mode 100644 index e247bea9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d16656da444fed4fc8d8c70c3b9307199361f04c12d2a783b5f5cf606d25ed6e -size 985523 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-5A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-5A.jpg deleted file mode 100644 index 7efcf35a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-5A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:155d031371878730b220315f02234b9148964db2af935b97362a845b85a2a25c -size 1016426 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-5B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-5B.jpg deleted file mode 100644 index 4bf8da98..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing-5B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:329bafaf7c4b9a858b27b4e426457352067a577071f44f439bf4ad94bb214f4b -size 1003325 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing.mp4 deleted file mode 100644 index 53a27524..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Left-Passing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02f636919cd57d2f362bd0bc4c6d5303ea8d71f07ee6378dac09642f561a3d57 -size 14646739 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/LeftStepSequence.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/LeftStepSequence.jpg deleted file mode 100644 index f4b90a2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/LeftStepSequence.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:127163f8dcff54be507c0b730e1fcfb9fa809887d64c78018cc6d9a752a725d7 -size 371778 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Masculine-Block-Rig.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Masculine-Block-Rig.jpg deleted file mode 100644 index 6f654953..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Masculine-Block-Rig.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5dbaa5aba19b6d16ef352b3a0788b644ca48284cbbe40b0fe9143a05b9d160f8 -size 267273 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Masculine-Skinned-Rig.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Masculine-Skinned-Rig.jpg deleted file mode 100644 index 2c4c70cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Masculine-Skinned-Rig.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67847fc20fa0814b539a6f40aee99e922f4c588cb891a10ef9c79080d9143274 -size 337474 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Publish-4.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Publish-4.png deleted file mode 100644 index e16bd9f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Publish-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:506eb68aa1093c4b20a855de153e85609018991d504ac19ad2252af1b45b6219 -size 32661 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-All.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-All.jpg deleted file mode 100644 index 140bb6a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-All.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8c70f934be163f138ce3b6153e765a04b58987a3c250f16de786c844c8a2971 -size 1145346 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Feet.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Feet.jpg deleted file mode 100644 index c9dd95bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Feet.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:de2541b8e2bd5511285ec0f96fdc618d9764369450bc37ce48100d98b911e612 -size 427122 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Head.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Head.jpg deleted file mode 100644 index a44ec07e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Head.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca18ec0f60e9b37c415163ffc8ca757504374dadab0b0f19925b42060b06d2ab -size 922957 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Masculine-Rig.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Masculine-Rig.jpg deleted file mode 100644 index 213f1990..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Ref-Masculine-Rig.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aba9305c323016665437bc7fd85cf0bab1fb13eabb046443d3225500dfbfed7b -size 433559 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-2.jpg deleted file mode 100644 index c0fe8450..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c53839b8c89e1d4fa074a809544fd4be21c9f569c8e3763934631d6f9e976e08 -size 1008038 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-3A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-3A.jpg deleted file mode 100644 index 1719156a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-3A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a0bd2396962feaa482900a8f7ba5982228923ae69b2e797bc1ee62a5e554bd58 -size 1005464 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-3B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-3B.jpg deleted file mode 100644 index 47283d8a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:197e578cba5ec588eeefcc9e8ed065896a3cdf62a53e5ea2b3635ace8436f32e -size 1014288 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-4A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-4A.jpg deleted file mode 100644 index fbc77c56..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-4A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fb74d47216f559b4b4e07fd36884f49e01190929c8ce77856aa9c8c782d4a7f -size 1016185 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-4B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-4B.jpg deleted file mode 100644 index 411578d8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-4B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c81527d8520662a479992a248c78be4b125cf34d335a6f8de846a0d50aa551f4 -size 1075915 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-5A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-5A.jpg deleted file mode 100644 index aadde04f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-5A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0badccf487a97bcee30cb0a1e29945f808323893d0ce910e0f788d88d8854382 -size 1062926 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-5B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-5B.jpg deleted file mode 100644 index 5340e3b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact-5B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d101a4e3e22fe5df0aecc2c842b7974afd41cf37a882d8a6fa8a84d80e8a2909 -size 1068230 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact.mp4 deleted file mode 100644 index 5fff402a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Contact.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac8aee4c574ea8f35c40505ce0092d1eeb46d2c21de6cbf1d1f46447c8dd6426 -size 15800135 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-2.jpg deleted file mode 100644 index d8bd2d0b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:114c8f630a31b944b96f0c48862f29ec358be5b7e816f78683e843c5ff9dec3e -size 912566 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-3A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-3A.jpg deleted file mode 100644 index 4ce34cae..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-3A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c9af37fc4eb6d052c661a8945edfdb1939fd4832fcbb0140f76b4eaf52b18f79 -size 924717 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-3B.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-3B.png deleted file mode 100644 index 3ad263d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-3B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5aecdb19067bf3cc64a28e38ac3351bf8e03499ce4d5bc577415af7c36a76b0f -size 1140817 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-4A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-4A.jpg deleted file mode 100644 index 85df9d2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-4A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a56a9c45d9b78b7ff03809e729d7d05660e14211f7a3e72b8b72d7030d6e896 -size 938940 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-4B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-4B.jpg deleted file mode 100644 index ec30ca12..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-4B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fce5337cbfefa1f02bbaa4a34f47604d491499d25328eb645c3b9c81728df58 -size 932359 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-5A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-5A.jpg deleted file mode 100644 index c094361c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-5A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f2f59091a5d0d5073982c7962ec2024ad2f95e6523540f96567b84e70b434fa -size 929419 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-5B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-5B.jpg deleted file mode 100644 index 18c30a7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High-5B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc93dd29a41417aecf6232f7168b2ad476dbe526f57b949f597624cb011df7ff -size 935469 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High.jpg deleted file mode 100644 index 18c30a7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc93dd29a41417aecf6232f7168b2ad476dbe526f57b949f597624cb011df7ff -size 935469 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High.mp4 deleted file mode 100644 index 6d19196c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-High.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:043a5a053b471534730dddc470831306bdb369ec58f17196c70daefda756f4d5 -size 16934158 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-2.jpg deleted file mode 100644 index 989d7472..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f8d5c687928fa3528363cbb5e45b646c61cfc3f145a5a3da75c1733b57fa69e -size 1072394 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-3A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-3A.jpg deleted file mode 100644 index 9f12b0ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-3A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fde6184708ce9c5a11ea99521e5650d72de1884137d590fa507d3a4b91bce92 -size 1060759 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-3B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-3B.jpg deleted file mode 100644 index 8e285e66..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cef40f5bbcf9f6ad7e4a21833c71a803e365a0e8753f9f8d23e9bce795c527a -size 1070808 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-4A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-4A.jpg deleted file mode 100644 index 8edb9003..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-4A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58b29df63493136951468d2b08ff7c70d8981d3990001ee3206b245b4a140165 -size 1068555 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-4B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-4B.jpg deleted file mode 100644 index 5a281f1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-4B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bedfc1f365fd71d8c116297004401adaa57c74865d5d2565b770eaab23f638cd -size 1009459 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-5A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-5A.jpg deleted file mode 100644 index 086d9be1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-5A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ece8eb0d16f2e8dd9d19132cc192e8706defcfa36d2a12a4951eff899087ea8 -size 936577 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-5B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-5B.jpg deleted file mode 100644 index c76726fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low-5B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f99093a79c2b0311cf1e1b7d41a385d0748c3d4c5c65d8aee247190836a46b78 -size 932800 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low.mp4 deleted file mode 100644 index 5d2fcd0e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Low.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8041b7f8f8fe3c79abab284846bafc046d0bd309b8af4f86a454e621bba9805 -size 14970961 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-2.jpg deleted file mode 100644 index 288c0b11..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da173203bedfcc3deee3799f353ae83b486e7b4485784589845bf7b51e2639d9 -size 932301 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-3A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-3A.jpg deleted file mode 100644 index fb74fe77..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-3A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5ff0adf79f2330a1cb6eeaca9432d6429c2a9842dae0b4ef6e37149b704baaa -size 935210 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-3B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-3B.jpg deleted file mode 100644 index 0108f740..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4595240de57b25f45b5bdf915217b1caff577bf2397e0d6cc269bdbb454fdd7f -size 938946 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-4A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-4A.jpg deleted file mode 100644 index b9e83649..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-4A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b9b109b2123068e5aac7f56c26041d7fd6789312f661412612f40a9a67dfd0a -size 930959 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-4B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-4B.jpg deleted file mode 100644 index 461f186c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-4B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08b842dcab1957a7e3f685582952387f2cc01129442bba22a775182d2593b387 -size 932316 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-5A.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-5A.jpg deleted file mode 100644 index 0390aadc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-5A.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77a3148fea4b00fc67a59fe2272d26462c2cf7c60466f6dbd3f95fdcd5209952 -size 936078 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-5B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-5B.jpg deleted file mode 100644 index 7230510d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing-5B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c18f3993e7d78d9b8e6815dfd303310e597f41866ca297cf7bc1fceee684536a -size 921958 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing.mp4 deleted file mode 100644 index fcc25313..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Right-Passing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3af1d1db4bf92c5086a89d8de47151eccccfb30356882a9e88359b73ff9c9dd -size 14735270 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/RightStepReference.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/RightStepReference.jpg deleted file mode 100644 index 816a908b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/RightStepReference.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a60f20b536ee2ed8214052fe4dc83dfb822a4f9c59ab47a61aefe8ed7dbccf2 -size 370185 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Test-1.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Test-1.png deleted file mode 100644 index 824ba8c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Test-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e690888e48951cd86bcbe534dc8c2f1b5019f1ada0c15fccc26ecdd3e44393b2 -size 12295 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Test-2.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Test-2.png deleted file mode 100644 index 2c506aa0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-character-animations/Test-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74784a906139d6a4b6e8dadf25b5dc2d801b96b1fd56c8b36d03487b78cce7e3 -size 12296 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Constraint-Details-Scale.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Constraint-Details-Scale.jpg deleted file mode 100644 index 7c5f0d55..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Constraint-Details-Scale.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f97225222967d0ff12eb250595cf240e4061fc261dd7c119ac08ad3d2711249 -size 20739 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Constraint-Details.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Constraint-Details.jpg deleted file mode 100644 index 882451a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Constraint-Details.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3be2a1a70ad940535852ec4f8d4b662c459e541e1adbf33810e80a5ca7b4aa26 -size 19828 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-Platform-Track-Hierarchy.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-Platform-Track-Hierarchy.jpg deleted file mode 100644 index 66791ad8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-Platform-Track-Hierarchy.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8145a1a5dc3310b37681a0f19bb2ba5f6a18dec0116f4324e64d37c1b88450d -size 8843 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-Platform-Track-Parts.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-Platform-Track-Parts.jpg deleted file mode 100644 index 8a24bfc8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-Platform-Track-Parts.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60e1a83804c4204881241618470e8247d3dc7d6f76d0ca2b0ec8c745b7c045da -size 545425 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-PrismaticConstraint-Attachments.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-PrismaticConstraint-Attachments.jpg deleted file mode 100644 index 2e8d3b3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-PrismaticConstraint-Attachments.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:894b6e1780c703bd6460280ec1832d3bcae8bb3e79eba414fe66d594158551fc -size 16795 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-PrismaticConstraint.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-PrismaticConstraint.jpg deleted file mode 100644 index c864c700..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-PrismaticConstraint.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a8a3a13071df849cf2991671fd493d6419f90124de68cc564ee2b1b642233a4 -size 23011 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-ProximityPrompt.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-ProximityPrompt.jpg deleted file mode 100644 index 5d61ea36..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Creating-ProximityPrompt.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac2a008e1ca550511cef6e2d0b5ce4f9759477aed1e13c3be9d68a1c062322a1 -size 37072 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Elevator-Comparison.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Elevator-Comparison.jpg deleted file mode 100644 index f534e969..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Elevator-Comparison.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c76b3239196d055a07dcfaa51ac4c9b42c4013bb945968baab01ed1f9b004039 -size 208944 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Elevator-Stud-Visualization.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Elevator-Stud-Visualization.jpg deleted file mode 100644 index 76774402..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Elevator-Stud-Visualization.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bc96c5e7a36565efd076acf9b81362b45f34b56c7b11d13c6f3b0de60f927d2 -size 116180 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Moving-Attachments.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Moving-Attachments.jpg deleted file mode 100644 index ee90ab2e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Moving-Attachments.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8929f622120e0492305070937ee18c9090c7bd70ead9e13e73231f5cca7f25ed -size 396124 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Overview.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Overview.mp4 deleted file mode 100644 index 40d22b7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Overview.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:106f0e26b5d21dbf8a091f77e46cd65c88cc4ed2e506a1bed781323cfb9e554d -size 1578162 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Rotating-Attachments.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Rotating-Attachments.jpg deleted file mode 100644 index f5127cbe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-elevators/Rotating-Attachments.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98704a637417bd3fdbd37d9fe9806a50e49792ef515f631218c2a0c16f37ec01 -size 825334 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BankersLamp.rbxm b/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BankersLamp.rbxm deleted file mode 100644 index 36557f53..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BankersLamp.rbxm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec64fff0c54ba396873512e4a059b74ffe87a0e1a5879c071ecf49ec6a79b653 -size 53949 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Attribute.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Attribute.jpg deleted file mode 100644 index 9257fdf6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Attribute.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec7770827769e2afb0e9bc3af915b01a76f0baea80f5f343c4810612ebd0dadc -size 22717 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Default.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Default.jpg deleted file mode 100644 index 900db09b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43c6fd619da76bbba331e7c0c456708a0664c95baa2f7039a9f52990695319f9 -size 30138 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Example.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Example.jpg deleted file mode 100644 index 143bd2c3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6f6bcdc2f82472b6d5322a08ab37a3f4ff2b4c0a451b9dd1e96086ca6487835 -size 41544 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Menu.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Menu.jpg deleted file mode 100644 index a7a1f4aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/BrightnessCurve-Menu.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7045530f3a55cc37bfbeba5287fc014589f3156f6031e8b360c5649b5c9d0fd -size 7137 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Importing-Sample-Lamp.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Importing-Sample-Lamp.jpg deleted file mode 100644 index 9d9aadb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Importing-Sample-Lamp.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33e8a831232288a6dfd5c53d31651ba351b625f0a45e33c3de6e903c0f4aec46 -size 18076 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/LoopDuration-Attribute.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/LoopDuration-Attribute.jpg deleted file mode 100644 index b114f220..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/LoopDuration-Attribute.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e09a63e7cf3c3198a44a2beb3cc62de6598a3638a13b92a130d460ea2b826a7 -size 9891 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Overview.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Overview.mp4 deleted file mode 100644 index 003e68ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Overview.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30e624d36fa06dc25e7986024e7f62e40ffe606c7d09ce52bb25037f47d95156 -size 550652 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Scripting-Light-Flicker.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Scripting-Light-Flicker.mp4 deleted file mode 100644 index 22697b25..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-flickering-lights/Scripting-Light-Flicker.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19eb83c2cac97656e1a1eec3dc85a74d989ea9bd3d295563b8101e74018a631d -size 555250 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Default-Health-Meter-Disabled.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Default-Health-Meter-Disabled.png deleted file mode 100644 index 5429376a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Default-Health-Meter-Disabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc340ccf593a26796fd918ad57b8c3907ec2cbea345bf577bc48a314e3ec0d31 -size 146332 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Default-Health-Meter.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Default-Health-Meter.png deleted file mode 100644 index 9b36359f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Default-Health-Meter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72e1164ef223a307808f5ad2c6a7d513a589d1e4c612dced5b4156f57c3650ab -size 279776 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Phone-Constrained.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Phone-Constrained.png deleted file mode 100644 index c7396cd3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Phone-Constrained.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1da2e58079cd8876b2f3846ed27961578910bc35150c3b68607503c39133752a -size 271028 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Tablet-Constrained.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Tablet-Constrained.png deleted file mode 100644 index ff5ecdf6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Tablet-Constrained.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38b3e1e9245c2245a0746fc59bf7141f418d2967ff4ef81a94e4615217fef60b -size 331877 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Tablet-Unconstrained.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Tablet-Unconstrained.png deleted file mode 100644 index 861565cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Emulation-Tablet-Unconstrained.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72c9c5adc9a6566f634acf5c2319a48a8dd3717a555b18edd9e6179fbca436f3 -size 325495 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Intro.png deleted file mode 100644 index 9768ef66..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:961b5ff97470ecd71bb646d9ae658b667b3ad381a627a325a235a2a5cebbf95b -size 324774 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Damage-Effect.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Damage-Effect.mp4 deleted file mode 100644 index c5faf3aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Damage-Effect.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea81019b9971fe758f8e72e7bd23419e151df480bc09680ab20d84b96eed1ee9 -size 9618926 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Static.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Static.mp4 deleted file mode 100644 index c47d2bd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Static.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df5d39f2533aaba24ff86f275249348ff558bf1da34cbdc9f657294677256aa0 -size 9945317 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Tweened.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Tweened.mp4 deleted file mode 100644 index 8a8e10c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Change-Tweened.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2657dcf49c7d0c102a32157667ebd4d8219afecde060dfd2327adfd41164a97b -size 8225202 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-CoreUISafeInsets.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-CoreUISafeInsets.png deleted file mode 100644 index b18a8d87..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-CoreUISafeInsets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc3952bd0eee3cb9d57ee0680389dd0afb3de2387368fc88e85bcf82aa6d5e4a -size 277718 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Components.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Components.png deleted file mode 100644 index a7d172ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Components.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f784b4f9b254cc44cf8e3912c0459a629a12758a47bbbd2741be9559061f8999 -size 174077 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Finalized.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Finalized.png deleted file mode 100644 index 4db6b1cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Finalized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d124b6992d5d346bea17f5c9e31833700e0684e236a0fd2be6c47c7d7a6bb997 -size 188817 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Large.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Large.png deleted file mode 100644 index 8a63c8e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Large.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21939326807ddcfc1e4ff00f60577994b2bcabb2429da3544ba6deb79434b343 -size 179541 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Preview.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Preview.png deleted file mode 100644 index 3664d229..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Icon-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02b77e39faf59a0581b9767df7c39596404bb0ba1b13ee6888a3fc443ce07ece -size 167554 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Colored.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Colored.png deleted file mode 100644 index dc0d232e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Colored.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8af1f734afc7aa41decb6a9c5187dd3a8df1aa5113cc87b273a2a611291bb46 -size 194697 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Preview.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Preview.png deleted file mode 100644 index 321f9b78..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d14a16ea8011c0c8809c7bc7b848dd53ec664e9227d7284a631a74565d126ca6 -size 175684 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Resized.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Resized.png deleted file mode 100644 index 281c2c45..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Resized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:666dcb6062e1839717ea3a3e6a866c09e2dc93b3825ff2aa5a42e36b97104e8b -size 186178 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Rounded.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Rounded.png deleted file mode 100644 index 66f0b5cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Inner-Fill-Rounded.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0080888464176a0a303d6fa7ac5962c88c76fa80aaaa90cd34e7631caf19f960 -size 195022 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Anchor.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Anchor.png deleted file mode 100644 index a0fe7343..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Anchor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2052a632896a084dabb2010cb92da49845d75c23f459fd5731dff48e79830de -size 192786 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Opaque.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Opaque.png deleted file mode 100644 index d0d0930f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Opaque.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:103a51d1351c9bda148b1746efed05e4de98f9bbb9b12b46f10140c48b1840dc -size 199399 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Preview.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Preview.png deleted file mode 100644 index 2aa3a566..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d88b658016ed624200c50d4659d97bc582d3f9e2bce081e11eafd5a0fbf5861 -size 186275 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Repositioned.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Repositioned.png deleted file mode 100644 index 9b4e0933..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Repositioned.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e13d05cee8371840f19b84e7c8e4b3a77a719b22db229c2d6c534c77556b6fc -size 152708 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Resized.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Resized.png deleted file mode 100644 index 473c8438..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Resized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:561f2164e154d86df2d61328808e31d52d59cc709cac41abc9ebcf824bb11449 -size 174249 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Rounded.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Rounded.png deleted file mode 100644 index 48b8e866..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Rounded.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fcadb71d17f2e57a0ed7392d6f219ff142307b17e38bb6efe7812a36d3a0bc1 -size 198929 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Stroked.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Stroked.png deleted file mode 100644 index b2d0214d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame-Stroked.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9dd6857a0c61107d5ae8dcf1054e1883aa645cab0dee1089f735766eb1859a57 -size 198493 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame.png deleted file mode 100644 index c7469e3e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-Design-Parent-Frame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:412ea04bb4bfdda8d94d276793e9c4f6a270eaa1f20232c5f6e56b6273042457 -size 190818 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-DeviceSafeInsets.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-DeviceSafeInsets.png deleted file mode 100644 index b0d5257e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/Meter-DeviceSafeInsets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99b7b83f87df22c77cf2b7d2e98a94fdd534d0a4287efbf0459b70ca9f407043 -size 290602 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/ScreenGui-Axis-Ranges.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/ScreenGui-Axis-Ranges.png deleted file mode 100644 index c334bb29..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/ScreenGui-Axis-Ranges.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3947a554a746d1daf7c18207eb25282527af47c8fb414828a4a2c817616dce2d -size 302498 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/ScreenGui-With-Padding.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/ScreenGui-With-Padding.png deleted file mode 100644 index a7368917..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/ScreenGui-With-Padding.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:efa2b57cc1519129e8a8f01a9e228272fb3a6b9cfb3bd21a5d1d0583b68de2ee -size 329790 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon-UIAspectRatioConstraint.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon-UIAspectRatioConstraint.png deleted file mode 100644 index a17cc346..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon-UIAspectRatioConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c9886695f4925b9c4d765f2ab1413cf4f12c30911942e183c942ce1d4c951fa -size 52084 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon-Values.png deleted file mode 100644 index 2583ed91..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5505224bbf8be72a4b1e3233659677062938978278474080e743e432f09d523 -size 30135 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon.png deleted file mode 100644 index b0d390d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18ba8a9fc5e659efc2ef4e0ed568b51da0a830ae6a38cbffd86d82d8cb56bb4d -size 46277 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-InnerFill-UICorner.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-InnerFill-UICorner.png deleted file mode 100644 index 6b35fef5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-InnerFill-UICorner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b05f726507f8709c620d09d4bc7ea68e680e8bf0cc9ebbf2aba6c019fb2e877c -size 44205 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-InnerFill.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-InnerFill.png deleted file mode 100644 index cd29c2b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-InnerFill.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1eda512b1c1591c68c656d80d574f57e5aca227502d205cd596618e470a4357a -size 39179 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UICorner.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UICorner.png deleted file mode 100644 index 2ddc77b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UICorner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:029fb73d34b91f49d945b3a1c22ecaafcf44df4f9221e665a151b674ad36593f -size 35230 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UISizeConstraint-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UISizeConstraint-Values.png deleted file mode 100644 index e8c2e3fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UISizeConstraint-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0c5e228b5e7de19b6692b1f9d3671b510b67fa123edca4f1bd5b27dbc6f4a0c -size 31273 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UISizeConstraint.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UISizeConstraint.png deleted file mode 100644 index f1bd5835..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UISizeConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3bea3e7c7eefaec4bf6e7e9b12174b2ca60c04c7f2906e947e7648e201af78dc -size 55744 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UIStroke.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UIStroke.png deleted file mode 100644 index 82e67500..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar-UIStroke.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f3f5d74b11122e953e874ca9068ccdf948d96d15ba6d85b60f11425767c59a6 -size 32684 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar.png deleted file mode 100644 index 33acf248..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-MeterBar.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b426336714f937e93ce3045a3f27e5821f65bb7a3e1ff53d2678beb3b140bff1 -size 29988 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-UIPadding-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-UIPadding-Values.png deleted file mode 100644 index d00f8c24..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-UIPadding-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:294986837ce1553db0e89c9dc9bb6fc3ce62aced9db906f4460d05ce391107c1 -size 76544 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-UIPadding.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-UIPadding.png deleted file mode 100644 index 49da4d44..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer-UIPadding.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32625407f11928d2c961509aacf797f6ea9e6b1febfbc00972a62a5c348a5a88 -size 31013 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer.png deleted file mode 100644 index f4fbd263..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterGui-HUDContainer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e15104ea168274809f4b8f8c3cba916941480e7a57abf3340e7af0aacf8b86eb -size 32140 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterCharacterScripts-UpdateCustomMeter.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterCharacterScripts-UpdateCustomMeter.png deleted file mode 100644 index 9434be1e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterCharacterScripts-UpdateCustomMeter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a00674ec3450204b597ff03678c8b76944071c65ddf9f27cab60ac5d5b306f4a -size 59460 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterCharacterScripts.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterCharacterScripts.png deleted file mode 100644 index 627f672f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterCharacterScripts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c2871694028bff3b73a5b1b7bcbd4d2e0e90f363f78769f80bbf8d49028a367 -size 43561 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterPlayerScripts-HideDefaultHealthMeter.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterPlayerScripts-HideDefaultHealthMeter.png deleted file mode 100644 index 734297cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterPlayerScripts-HideDefaultHealthMeter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81d89fdac558d99d9952ff3e90e83c733611df440657104b8215aeb33893ce6b -size 44179 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterPlayerScripts.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterPlayerScripts.png deleted file mode 100644 index b472bb4c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-hud-meters/StarterPlayer-StarterPlayerScripts.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e560c826f826b00f4959a58bca709f5a9d638e6750ad87fbd446b6309c9bcdd -size 34973 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Big-Triangle.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Big-Triangle.mp4 deleted file mode 100644 index 8da6b52c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Big-Triangle.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0657173c33f2ad852dcfc44ede730530d517fd0def5a7c74d2a5548d3070ebe -size 8956445 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Impulse-3.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Impulse-3.mp4 deleted file mode 100644 index 5988eb47..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Impulse-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79aa70ddcae1a0b0770a19f10696b144e2f4110eea431c98ae41645fee566335 -size 1453845 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Intro.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Intro.mp4 deleted file mode 100644 index 400a79ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Intro.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54e3b7abc08ad4d12c057523c11e8d96bb8548e4b64362176ce1a3737530a69d -size 6448485 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-3.jpg deleted file mode 100644 index 4930f90a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce4c5fb9da91e8847c15df7cf9f5bc62c6608dca3716f6523fe12529b077bf51 -size 504995 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-4.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-4.mp4 deleted file mode 100644 index 50743b00..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-4.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67d10a20ea255c14fc832cd6945d006e7d668be4c3d38de4813d6ceb8f9a9ec2 -size 965136 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Attachment-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Attachment-2.jpg deleted file mode 100644 index b4ca29d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Attachment-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70e3c71b1f03f31c0d312ec09aba5e30582a515d4624a8a4101336e3ca5187e6 -size 468221 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Attachment-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Attachment-3.jpg deleted file mode 100644 index c877308f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Attachment-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60126d16f255f9b3e6a747f7ec3af08d3e8c6795a312cc95e2497b6b20e77855 -size 483825 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Intro.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Intro.mp4 deleted file mode 100644 index 4e827cf9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/LV-Intro.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a77d05bbfc2196d2e061c7144c51963b6ada66d7e8514be23d4adcad4d5bc9e -size 5494531 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Move-Block.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Move-Block.mp4 deleted file mode 100644 index 65e7774f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Move-Block.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6be04510a322abb85c6af3e1c87765d4577c69ee7df667b839b36b589cb1fab5 -size 645094 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Movement-Axis.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Movement-Axis.jpg deleted file mode 100644 index 06999565..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Movement-Axis.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b17a7f49c95365137f4845440b2a6cc3d305d51aae0245c5d682ec72864d47db -size 1209315 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/One-Stud.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/One-Stud.jpg deleted file mode 100644 index b6b4f4ff..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/One-Stud.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a758ac53c81808b9c1921c4d0c4c707c22b2ddc55565e176f9f23ff5ab4941f1 -size 94645 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-2.jpg deleted file mode 100644 index f9b61621..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0dd6df4da9f85ba064b402ec2a8d8baf86c3c9d1f91da4cfc87ade8ab7539552 -size 502531 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-3.jpg deleted file mode 100644 index 25a1e251..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:818d28b1f2b01f83febde2246672bed879d4c5c7223b54ca6afc1cd48df756fe -size 503755 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-4.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-4.mp4 deleted file mode 100644 index 90c57808..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-4.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e14c2fbad51e2d43a6b21ece49ad3e8a1e3852d6d9ca57a2b15d1306e7352c6 -size 742354 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-2.jpg deleted file mode 100644 index 62d5bb75..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95304e83712b71a6e6b017061ffd388cb6e90e2397d6f10403673903e1404c01 -size 487632 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-3.jpg deleted file mode 100644 index 51ba2be2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e4437513d93312b1d7f285a86a834c247780a5aa5bf257d70e30ca20090a339 -size 487843 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-4.jpg deleted file mode 100644 index 75ffee7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18b6d9cad7564e84e3b8b5bb106bf99ba36431556bdc5a969455deb54a636a49 -size 493008 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-5.jpg deleted file mode 100644 index 23b6b959..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Attachment-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc2b51726f358f672c713780165c839785c405e3cf0bbd420bf33d6716e42a61 -size 491041 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Intro.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Intro.mp4 deleted file mode 100644 index 3c1f5648..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/PC-Intro.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98e9fd42958eb25494d62662acaef814890fababc8ef2b4b900bc94029610835 -size 6340288 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Plate-Friction.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Plate-Friction.jpg deleted file mode 100644 index 76f1d2b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Plate-Friction.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea00b4b284a88f8c8b07cf65a1d87258c5fb096e8fec5249f5c0f4c801f07d51 -size 332137 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Plate-Friction.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Plate-Friction.mp4 deleted file mode 100644 index 52c71ba5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Plate-Friction.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c0bb53110ba5c23e26a413bc3e2c70effd82e0ad8b3cc4850e1fe8c7e6792e2c -size 8640288 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Small-Triangle.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Small-Triangle.mp4 deleted file mode 100644 index 079b7688..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Small-Triangle.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37a700b038e5591fe8bfe0a90e5b0ce6f9f02f47481ac9035ba3e663bf314a41 -size 42697 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Wind-Block.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Wind-Block.mp4 deleted file mode 100644 index f163be67..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-moving-objects/Wind-Block.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9ff0f7fab1bf8db145050d2c2b1ed4d0efbb9091d18158fe33fc0203612e91d -size 872844 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Backboard.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Backboard.jpg deleted file mode 100644 index b5ab48bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Backboard.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2413115b4d1b3c64cf273953f1f66dfbbdb6c843a1078b3d479d5c21b93b825f -size 48749 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Border-Moved.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Border-Moved.jpg deleted file mode 100644 index fc25e4a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Border-Moved.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b8bedac17356e273e7079c523e25c06b22a14082e621aafc2b342489129fb77 -size 62231 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Border.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Border.jpg deleted file mode 100644 index 095eebe4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Border.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ff9c6c88f97af251dba52b1efbbb8c7b3e486357788261006bf99ef97637086 -size 58439 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Duplicate-Border.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Duplicate-Border.jpg deleted file mode 100644 index 9bdd849b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Duplicate-Border.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a98b7df39905bd51c675949efedca4fe05da3746021c70396d6e0dc7db68f414 -size 69409 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Final-Sign.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Final-Sign.jpg deleted file mode 100644 index eab6334f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Final-Sign.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c369c30636db88101db3a35e0af8e8235e1c45e18f6ed01963a8c0d8899927f -size 71101 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Moving-Border.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Moving-Border.jpg deleted file mode 100644 index eb1b87a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Moving-Border.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7601b1ff33048dbdf81d59e18c06a26f5515960e7169886c28c0fb05f3015b2 -size 75296 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/NegativePart.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/NegativePart.jpg deleted file mode 100644 index dc255d88..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/NegativePart.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fdb363d39d32b1eb5d617e34441b00e56f32838ff51c6fbf5b42e15ff97a8d0a -size 68783 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Overview.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Overview.jpg deleted file mode 100644 index ac01266e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/Overview.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a86892ddf582f14188cf709ea805cc691bc5e252946172570d92b17216f69188 -size 103174 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/neon-sign-baseplate.rbxl b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/neon-sign-baseplate.rbxl deleted file mode 100644 index 4353009d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/neon-sign-baseplate.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1cc2392b955ae247943d9ffaaf91d03cc831ee4d47bfe1ed61d089224a9bed0 -size 57988 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/open-text.obj b/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/open-text.obj deleted file mode 100644 index 2cb0e59c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-neon-signs/open-text.obj +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d782fba22d5de91d505bf76ce496635a832ad54f1ea6d5a4219822311f320d0 -size 48641 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-MeshPart.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-MeshPart.png deleted file mode 100644 index 617c1b07..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-MeshPart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:479bc049841e92ed8eee88ef42536ec1c2ae0641235332915f3578960b194984 -size 6358 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-blaster.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-blaster.png deleted file mode 100644 index bf92715c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-blaster.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3e8946ec75adcd66d1023d41141269031e992f75bcc967acf928d8ceb5f67ef -size 5172 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-equipped-character.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-equipped-character.png deleted file mode 100644 index c43b0d76..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-equipped-character.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7efb57712b3430b533ac42cc1bdd950b96cfa9db8455f09d025908c888ac732b -size 9688 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-handle.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-handle.png deleted file mode 100644 index dad7a423..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-handle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a606c856a7274aff737c3375e87940999a97f21a4a00fc93e118cbaf5c6bf9ec -size 4081 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-sounds.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-sounds.png deleted file mode 100644 index f6f9b756..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-sounds.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea7638e45209261d2b9180e6ccd26e6991a9599422ffcf14b432b1e073956c76 -size 4588 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-starterpack.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-starterpack.png deleted file mode 100644 index 7a2b9459..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-starterpack.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:590fa194cda290a75f87cadbef799a4992cba7d1dd38f16e57834e59c55d06bd -size 5363 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-toolcontroller.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-toolcontroller.png deleted file mode 100644 index a124a4de..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-toolcontroller.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14d908021651c137cb074414995712ed646fdcd65c81945092ee62237518f99f -size 4588 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-unequipped.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-unequipped.png deleted file mode 100644 index 2926d36f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/explorer-unequipped.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5397a22cc5f7531251956fc37658bd7c361da736f360e748564eab587a80616e -size 10747 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/properties-MeshPart.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/properties-MeshPart.png deleted file mode 100644 index 6913a92d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/properties-MeshPart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f1e62a3e61a2d713734715c8fea192e9f27aa47c33923a8b695f9a26e54edb1 -size 11923 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/property-grippos.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/property-grippos.png deleted file mode 100644 index b3a87257..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/property-grippos.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eec0096720c7b537d3c171c1b003822afafe208a40154dec4216ed65a6508ecf -size 2781 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/title-image.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/title-image.jpg deleted file mode 100644 index 7d9d4ead..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/title-image.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfc204943e52b66d48026f67d6179298221fd72ebdae469e26c82eb0bf16e177 -size 93379 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/video-collection.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/video-collection.mp4 deleted file mode 100644 index e5f4ebd8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/video-collection.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6e12a746aac05e16df3d9b1a6ba68d57a9ef8d842ea7898cfebf1a6939e9a43 -size 495838 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-blaster-icon-2.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-blaster-icon-2.png deleted file mode 100644 index d51a1e6f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-blaster-icon-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20e3fcf35085c2989ee6c58bfdb24feb31a50e4da2ed47d3ae8f83faa7104f40 -size 2092 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-blaster-icon.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-blaster-icon.png deleted file mode 100644 index f09ce741..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-blaster-icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:452a3efd0818bc609640ed28dbc80d00b76e2e894d5a2f2c222850045f9d29ed -size 5471 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-mesh.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-mesh.jpg deleted file mode 100644 index 3e943c0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-mesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87300c19f3e7eb15440faa254ff34aede4a95e7397caaed60b7c6ddd81d8f010 -size 76090 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-tooltip.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-tooltip.png deleted file mode 100644 index bafc0df6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-tooltip.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:236150666b2f9d45398f8b8f3a9ee880637d5420e8b1e1f1a33744d8115ee592 -size 6750 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-weapon-pos-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-weapon-pos-1.jpg deleted file mode 100644 index 3a613010..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-weapon-pos-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adc14aded746e4a25e03e01e4e416a5033f42dda3db379fad565201db27b63ee -size 201250 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-weapon-pos-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-weapon-pos-2.jpg deleted file mode 100644 index 4d994773..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-player-tools/viewport-weapon-pos-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2cce4876d99d76b0b2ba416e5cb2b502901183d43676aa8c0ff6003cee67e77 -size 194916 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Attachment-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Attachment-2.jpg deleted file mode 100644 index 25ea9edd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Attachment-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6cfc0c84aaebc10bf46829edda45dc0bdd06b198046429d7f9676dba082fdb7 -size 1165431 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Attachment-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Attachment-3.jpg deleted file mode 100644 index 955ea7a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Attachment-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39362ed4b117f057fc3de9d6ed79b4644c7da64c9c791b4b1a04a8f54c1aa8db -size 1167874 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Constraint-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Constraint-2.jpg deleted file mode 100644 index 743cf526..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Constraint-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f539920a830459cc1745bc954de55153bcdfb89cdba5c092f63f65112d960b4c -size 1180248 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Constraint-2.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Constraint-2.mp4 deleted file mode 100644 index 6886b140..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/AV-Constraint-2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95c110e1b94d75ac575552a0612108700dfcdcc04753fcc6ef3d44e59870bf89 -size 5907300 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Attachment-Visual-Aids.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Attachment-Visual-Aids.png deleted file mode 100644 index 3ea29038..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Attachment-Visual-Aids.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a19b8b11cf203f9720eba9e416b03516bb87689563f7e05ca2137cf5cbb4738 -size 3934258 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Big-Block.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Big-Block.mp4 deleted file mode 100644 index 9db09a8a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Big-Block.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7044c965578153a6fe3c15db1493315f6f4ed46f0276210a6a5248f725a244fc -size 5686031 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Big-Triangle.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Big-Triangle.mp4 deleted file mode 100644 index 584b666d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Big-Triangle.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:895217e07a9363e9c5b9836e6256da6818c789d1d47749d5e8dab0f719ef0541 -size 2547753 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Dirt-Friction.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Dirt-Friction.png deleted file mode 100644 index d87cd145..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Dirt-Friction.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4faeff3578e74ac1bf0de150ae1eb349bc0e6d7a9d928a52b6773181c184d58f -size 1941877 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Dirt-Propeller.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Dirt-Propeller.mp4 deleted file mode 100644 index 7e929c87..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Dirt-Propeller.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b64d2e98e1b1ec6f72fe42a0b73da5627e2b37884b486ff847af34e69bc36a7 -size 4280960 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-2.jpg deleted file mode 100644 index ff5ef999..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fc94a645c7767d73d46ea77d59d1999f8a731f31314c91e14ecb48c612f0857 -size 768572 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-3.jpg deleted file mode 100644 index c618dceb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfd557f3f962bf96b0fbcc162cf3404718f14b2e84f9722f1108a778378979d0 -size 767163 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-4.jpg deleted file mode 100644 index c53019dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Attachments-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:29607b1c59f12504c765a036ede4a2e805e7b1b4b98857550ad6d6d811134a48 -size 749970 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-2.jpg deleted file mode 100644 index d340e587..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e42fa6d11f9f790aae3603d4a161aa0cd6cd2046b766a178ddb57851c488beae -size 809116 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-3.jpg deleted file mode 100644 index 44393431..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e41326f46b23bb93349e77162a7ab93deb78ebf04566a73431b110709cf87ac -size 784925 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-3.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-3.mp4 deleted file mode 100644 index 22a83c41..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/HC-Hinge-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:545689149c0fef7a1dead0288a0e359f634a47847c2bc01d1e8384457766d288 -size 7803588 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Impulse-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Impulse-1.jpg deleted file mode 100644 index 85e83204..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Impulse-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46ffc41d2cbc3cc6b75babedf9248685940c7f065958e73c81796e592a25fcd2 -size 1155239 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Impulse-3.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Impulse-3.mp4 deleted file mode 100644 index 2e1fcb36..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Impulse-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5e9dc396f000a22d80ee9a893e73d8012263311bbd042b2f6bc4906842c8800 -size 38036820 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Little-Triangle.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Little-Triangle.mp4 deleted file mode 100644 index f0fcc2a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Little-Triangle.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4926001edfba220ee4fff751cad1efe022c19fec17ee27c6e1523ac1c7ac7847 -size 1375801 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Overview.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Overview.mp4 deleted file mode 100644 index 3aa128c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Overview.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23bcffaa704b1af68097d6b972ffb7abab946b42c6a2ff992a5b0d834d473407 -size 8072034 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller-HingeConstraint-Method.fbx b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller-HingeConstraint-Method.fbx deleted file mode 100644 index 5d155574..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller-HingeConstraint-Method.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ed4e0fbc60692da9b6e35b7bcad3a2f5a83d4d6d8a6ae66850bc5c61ddc3753 -size 45088 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller-Scripting-Method.fbx b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller-Scripting-Method.fbx deleted file mode 100644 index cedf1d3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller-Scripting-Method.fbx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c4ff0d144edff90d5941a20fd0622b6c0c86ec91e9a36fb2af9473e4e4f808c -size 39776 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller.jpg deleted file mode 100644 index 5690817e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Propeller.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:072a98ccf2a36bcbb149e79f220b9b5944e22ad3736102940916af670907754b -size 763593 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Rotational-Axis.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Rotational-Axis.mp4 deleted file mode 100644 index 941f907c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Rotational-Axis.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b54a11ef1be06d671541575acde9f61448e327e7f5436cd73b4278b59c96b84 -size 2966352 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Rotational-Axis.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Rotational-Axis.png deleted file mode 100644 index 3bb7f28b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Rotational-Axis.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f464d53e56d77c5df4109a72195d308224f7bf38506d92c7174f2d76392805e5 -size 2981271 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Stop-Propeller.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Stop-Propeller.mp4 deleted file mode 100644 index 09e520ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Stop-Propeller.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df3c1919d26ce09d94c2794b17ebef7a966bd9d091e1bb91226abdb12981963b -size 3052677 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Using-HingeConstraints.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Using-HingeConstraints.mp4 deleted file mode 100644 index b2b29828..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Using-HingeConstraints.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be9d77d1d2149246a4a6cba8e2f1521824d6ad6da3b1d0326e725738bbceba04 -size 2205567 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Using-Scripts.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Using-Scripts.mp4 deleted file mode 100644 index b8186db8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-spinning-objects/Using-Scripts.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3279acd846bd7049158a23b42f975698de52a08df9a7b3891a05c7383453e9b -size 3398145 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Bottom-Layer.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Bottom-Layer.jpg deleted file mode 100644 index 1a833b71..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Bottom-Layer.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52fcddbf0d155a76795d903966cf8b916251157f527c5021f5fd18ab866b6163 -size 1074538 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Crust-Texture.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Crust-Texture.jpg deleted file mode 100644 index 2ac9dd48..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Crust-Texture.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e70be740c29103b4657d237c526dc8182d96c8d5eb9580e62eba1a48c0a0b41 -size 432895 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Custom-Lighting.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Custom-Lighting.jpg deleted file mode 100644 index 991c6e87..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Custom-Lighting.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f752819d28afc0053282bfad0ca58f1fbe5655c8348ab4e18b537b8111379c84 -size 941197 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Default-Lighting.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Default-Lighting.jpg deleted file mode 100644 index 8cc4d765..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Default-Lighting.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd44397770b830d3e1206eb3196d888a6d6a5bf5dfe42f49b3de648689270c36 -size 1299363 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/DenseSplash-Texture.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/DenseSplash-Texture.jpg deleted file mode 100644 index 3fab9a5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/DenseSplash-Texture.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5aeadc82dfa16475a297a5c08c66a0d102aef930b7f3563e77b139948f6f41c6 -size 216223 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-2.jpg deleted file mode 100644 index a4db708e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55e5490f9892dace7ffe60825e495f3633ad2283ed6ff4076a59a253dae5c310 -size 4290539 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5.mp4 deleted file mode 100644 index 1e8135cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:549055eb613dd1c3e205c0efee08813c66270d9da966eb98186dd45f5eb8abc8 -size 7929756 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Color.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Color.jpg deleted file mode 100644 index 6b350c5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Color.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c7620480995b20767007845ecfadafd4d3d12729f82b6db420a3478a91efba8 -size 79711 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Size.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Size.jpg deleted file mode 100644 index 6f0fd75e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Size.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56b08664e6accf6ee4ebcb75d7cbb2cbd90ee136e8012e9ed46e86ee651ee432 -size 149817 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Squash.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Squash.jpg deleted file mode 100644 index bb71e129..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Squash.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b9264fac22e406442d7c7ef0ef15dfcbf059e84d955375962b981e68e87d2e3 -size 232102 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Transparency.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Transparency.jpg deleted file mode 100644 index cc3865eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-5Transparency.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ec8d67a0713e906efe0cb32aa5b653a3bf39340ca10e398ff04327223926a06 -size 267271 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-Texture.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-Texture.jpg deleted file mode 100644 index 7e6fe179..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Embers-Texture.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4120d217eaecb79bde42e1b96fc84f28aee51f60c159c9714b7ec35a498c7e6 -size 84734 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-1.jpg deleted file mode 100644 index c76759e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e5bd2f85b822c4dc9901ea35d9487b9b48213e41d7645621221cbb77b1a96cd -size 2347907 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-2.jpg deleted file mode 100644 index 3082005b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ed4763cd617db4537823e966fdfc7b3d12376f84f69c902bc2a6bc934ca0766 -size 2349886 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-3.jpg deleted file mode 100644 index 776fd47e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ad4c5386d5f3c0404167fb0c2c3c6c7882b960bb53c8df460973fea7d74bbf5 -size 2002905 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-4.jpg deleted file mode 100644 index 23a6dc03..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/GL-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc2f84a0edea2a12a4fe5f46ef2841efbd40ae28112ba7ca93b4832253c3751d -size 2221646 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-3.jpg deleted file mode 100644 index f94bf0b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e40ca1536c9f894ed4b91cc2e873d86eeb1a5f545e26a31fba6e36b5a17df7b -size 3032406 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-4.jpg deleted file mode 100644 index 2ef5f107..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:719e6d37e459514053cda36df6046f3d4949eb7f035be0e401fceb09f150d8ae -size 3029975 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-5.jpg deleted file mode 100644 index c58b265c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:143c638cea7b3056bfd77c98917540c4141944531b87107f6efc1c5224e9600c -size 3057278 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-6.jpg deleted file mode 100644 index 4947e893..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95a2ff862a34715e8b3260cebd72e18495bed5027bbf275638b0b2378c715422 -size 3176312 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-7.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-7.jpg deleted file mode 100644 index 97904aa9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LL-7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41f6a1e4d0e0bc62d57fb59c5f5e59b4b14006c4f819cb61f48753567863e938 -size 3088505 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-10.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-10.mp4 deleted file mode 100644 index 50d4927c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-10.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85e224fc5182fbcc1f51f3c6c840609512e07eb1c41800df291b395524ce73ee -size 1378343 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-11.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-11.mp4 deleted file mode 100644 index 4a67050b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-11.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a98906d77c0e8d0cac64e04a08db942a56b3605b0c9a9ac2e9d5eec99922b76c -size 668052 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-3.jpg deleted file mode 100644 index abc95b7b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9726e9a7931d8e823785af3a8dc330db56e43c1e5a793243d09b5e134684d39e -size 1969689 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-4.jpg deleted file mode 100644 index 62ba6bfa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0bfd9633bb2304abbcd697eaa5482e6b4bf1fb6afd0dfbd146b291613f7f087 -size 1851968 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-6.jpg deleted file mode 100644 index 0ab5bf26..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:529ca9cdea68421dc50be44f730365ae4bcd3d00ac6c8ff2a1eb280c4ebd7966 -size 1876911 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7.mp4 deleted file mode 100644 index bc21623c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9cf8a254f4b379d135b53e7e0c0b85df7433dbe5c4a3fe885e69dcd95c99896 -size 867358 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7Color.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7Color.jpg deleted file mode 100644 index cb2b9eb2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7Color.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1c1593eed7089f8b15102095727e7b374b50733004a742bb587cfeeff98550e -size 87320 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7Transparency.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7Transparency.jpg deleted file mode 100644 index 23176dc6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-7Transparency.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d36e1c729e9ac36a6d90d2da2d50b50fa71b9b50910faae752c8eb60fae5ae7 -size 197269 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-9.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-9.mp4 deleted file mode 100644 index ddb7512a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-9.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f721b8bf584ab1d3ba448015ff19f5c59da7e402bfd5142a03496613514e445 -size 1232594 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-9Transparency.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-9Transparency.jpg deleted file mode 100644 index 63a4f012..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/LavaFlow-9Transparency.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:236038cb7221103ba14151594e32bbb10c072ef073b694364170d6a581e824a6 -size 128776 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Middle-Layer.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Middle-Layer.jpg deleted file mode 100644 index 7e23c908..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Middle-Layer.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00c316fe13cbb57b30276db47cdf3cf03a77b834cf126e4de92aa8076c88f831 -size 1524124 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-2.jpg deleted file mode 100644 index d7b6c1f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e533a3eab3188ed673f7591846b68a963c7f2456b8ff1c1ec89096c3ee6cbb3 -size 2563212 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-4Color.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-4Color.jpg deleted file mode 100644 index e4e25dff..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-4Color.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c60b67d659b2ec1585f600fc9195bb56760e1755f9c5dfedf3765d1d098582b -size 74783 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-4Transparency.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-4Transparency.jpg deleted file mode 100644 index 1f22f888..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-4Transparency.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5d93491c40d5209448adff9c958d6bbcbb301c600d52645bf6293fc627fff0b -size 145361 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-5.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-5.mp4 deleted file mode 100644 index d8d56cb7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Plume-5.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c528edcb40e1961ab12c9806ca13a87ff7d53f98b625af5ad32dcee5fc1de64 -size 3489689 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-2B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-2B.jpg deleted file mode 100644 index 03da56fa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-2B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84d12b781f118d87ae313e662fc21f9fb44e487a31fbc927dbbf35a55c817c8f -size 2731135 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-2C.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-2C.jpg deleted file mode 100644 index b7298a25..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-2C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04c37bacc6df66795a7e56dc52c0fde84aa2a379ffed0bd70b3320e215733f42 -size 2628691 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DColor.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DColor.jpg deleted file mode 100644 index ec53942c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DColor.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6285382959240e2328cd77a37bee891d283aaf8aea53564af12757709b6346fe -size 78448 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DSize.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DSize.jpg deleted file mode 100644 index 17a78b90..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DSize.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a5071fc1b739370e224fb31501472aebb141cc31d78eeeaa8ecb7c61bbbd8c42 -size 217330 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DTransparency.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DTransparency.jpg deleted file mode 100644 index 6791104c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Ripples-3DTransparency.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01a5a17b0e0ad9eba109a814546e4c3bf032a49bbac1a93648eb42e51dfc3e55 -size 212267 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Sample-Components.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Sample-Components.jpg deleted file mode 100644 index e9d74d0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Sample-Components.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b79966a3221d4cfcf90a321eb515e8374ff234c2d11cb1512d457bf4e52b0905 -size 870507 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-2.jpg deleted file mode 100644 index e886f02d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0189c086db4a1a317c1145fdbe952b227dfc713ed82f6f349810983e7fcb840a -size 4330900 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5.mp4 deleted file mode 100644 index d0e604ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e749964cbd91048d55a879e9bcdbf4e43721cf7a4278cd70270ca7fa34394c27 -size 8323506 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5Size.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5Size.jpg deleted file mode 100644 index b87d6b20..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5Size.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fff707c8484e2520983a16670442422345080f807275fb46a2330632b0f28db6 -size 278540 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5Squash.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5Squash.jpg deleted file mode 100644 index 2c221378..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-5Squash.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45ea254fc7d93e73780cbcdb6690f376156459a2f9d513a3435c18cc77ca28bc -size 268868 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6.mp4 deleted file mode 100644 index caf737f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83d5696352a93a121e447ffc1dd634c03c500e350bbeed7aea730f6a9a92a903 -size 9639271 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6Size.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6Size.jpg deleted file mode 100644 index f5b31d44..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6Size.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef407282ae697716c694b2def158f9726b6a0455d7e7666ae72d3e224e050a8f -size 194996 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6Squash.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6Squash.jpg deleted file mode 100644 index c7985d42..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-6Squash.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:daccd1800dea9ab99fc85b561b87411378574ada7b4315a1f6b7dd7cc941f5f5 -size 172802 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7.mp4 deleted file mode 100644 index d05e99ce..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0970ecc60fc31fa1bca07bc5458b7990067d2ad24d73e37031a9ea48db0cc3d -size 8153568 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7Size.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7Size.jpg deleted file mode 100644 index 2e6c2727..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7Size.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc845218767730efadb2a91111dfc9355362a65c7b237e5e40afa6ceed36f92c -size 207161 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7Transparency.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7Transparency.jpg deleted file mode 100644 index 1865224e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Splashes-7Transparency.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fe376771e9baaa77c35d7475a9cf980c64fab0d11a6c89f37a48acff386862e -size 218065 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Top-Layer.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Top-Layer.jpg deleted file mode 100644 index ccce078a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Top-Layer.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc0b4172ac6b13fcb200a091deb0e3d829659c3e890c3cd5a104d9081cf2c659 -size 1721645 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Complete.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Complete.jpg deleted file mode 100644 index f8b50709..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Complete.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:710b3ca4144d5220b796b5d6f9a44ab105f3302746d03dc3534a95a72e6a55fe -size 317841 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Components.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Components.jpg deleted file mode 100644 index 55ce6609..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Components.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69622edfc7ea810589501a1e2b70a704eae4cd622a8fb0a5548e364d51b3ff78 -size 4727556 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-NoComponents.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-NoComponents.jpg deleted file mode 100644 index 889d1f03..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-NoComponents.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07adbff0dc82c761a41acf0a616ecbb22f5387f36c4ec4c6293b57b96dfd1bed -size 791379 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Start.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Start.jpg deleted file mode 100644 index f77ef1d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Volcano-Start.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a08732e20971c9ece2ba29843b475480ed33ca0a5373e45377362d52d6d946e -size 2993744 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/WebbySplash-Texture.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/WebbySplash-Texture.jpg deleted file mode 100644 index 10ef9c85..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/WebbySplash-Texture.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aadfc70eaeb2bcbf9f08f5dc20072a8e9963069032f1df0e28ee638604aeae1e -size 193998 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-Bloom.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-Bloom.jpg deleted file mode 100644 index 51faafa8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-Bloom.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28080bfc48a179c58b0258347e3bc144949e7f75dfdc18d3a4816927fec7fc9e -size 1241783 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-LocalLighting.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-LocalLighting.jpg deleted file mode 100644 index 51faafa8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-LocalLighting.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28080bfc48a179c58b0258347e3bc144949e7f75dfdc18d3a4816927fec7fc9e -size 1241783 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-SurfaceRipples.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-SurfaceRipples.mp4 deleted file mode 100644 index 4366c782..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/With-SurfaceRipples.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0378b550cc44d4ef4e2c0dedfe09ef9d70347ab4440dcdc82fe660247ab5f4ec -size 1513685 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-Bloom.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-Bloom.jpg deleted file mode 100644 index 8829d275..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-Bloom.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd8d1a3b1663d857912ba609e33ad402081bc3a01b1e5301c4e94f3aa399c37a -size 1134449 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-LocalLighting.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-LocalLighting.jpg deleted file mode 100644 index a194132b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-LocalLighting.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66ce75b2a313e4f028e4025d1d5dd3927ec11446109f69feb4c0f0bc24e3b9a0 -size 2140014 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-SurfaceRipples.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-SurfaceRipples.jpg deleted file mode 100644 index d40e69f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-volcanoes/Without-SurfaceRipples.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc9c75bda8dceb710875c0f200ef7986ac8c18086e8eb59282f994441154949c -size 2552513 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1C.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1C.png deleted file mode 100644 index b8fa1500..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b388cf3f4a7092eff858a7cec1cf2913a540f78fe7878b720aabdbde0cad8135 -size 1834323 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1D.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1D.png deleted file mode 100644 index 08ad72d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0b7367037a5f4b97fb9676fee716ae374be1757093e48e4a92603a876dd1fe4e -size 1157560 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1F.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1F.png deleted file mode 100644 index 46319a7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1F.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fd23cf8e849be52e9a5c505ab19ff479c5dca3a0aafbb76f971be7a257c38f1 -size 1160001 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1G1.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1G1.png deleted file mode 100644 index 919cc3c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1G1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd5ee4e86b83e0d188b8d52e2e9c519d9a28a2296eea60ca0186022089215ef6 -size 12798 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1G2.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1G2.png deleted file mode 100644 index e940fbd2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1G2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e35406825b2033a250af9099fd6a8e9b794af0ed1c234293053b1b59bd5d86cc -size 4581 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H.mp4 deleted file mode 100644 index 292ba00e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:792e0f0962a871c2205f272b19a283556448dffeee8cebf39e7bcea69940dab0 -size 6137463 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H1.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H1.png deleted file mode 100644 index fd3059f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:255bde26cd114247d5949346813c8356f94b918a7b4406e18f26e046a53d7ad1 -size 16667 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H2.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H2.png deleted file mode 100644 index cb7dc510..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-1H2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:302b4a98be5928713e073fe6f1598ff3519f0dcdd8ba3f2f834a47a4d10e7314 -size 31449 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2C.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2C.png deleted file mode 100644 index bb575646..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b44bc68142590541dc250c7bf5d95568423e53053e7f71896acd1c265a442933 -size 1208768 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2D.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2D.png deleted file mode 100644 index a776288a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c30a1ecd1212ceada1c256f0d08d07f0ea19cc4b059cb0e0b6e7eaa0a79eab00 -size 1222747 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2F.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2F.png deleted file mode 100644 index 97b8e761..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2F.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dbb6d549a1dca7baba395923451df9ca382e08bf0446b4b3e4a92bf2fb24cdb9 -size 1224055 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G11.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G11.mp4 deleted file mode 100644 index 5353cc42..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G11.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81bae628be486fd5ca97fb9d3e029d2ee6a877ebe51753da7cef8f8fbde03b8f -size 5219818 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G8.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G8.png deleted file mode 100644 index 7608a96b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G8.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:119e101e40a55e58e702c715a4705f1e572ba38d25545a5922838decfb641afa -size 11438 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G9.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G9.png deleted file mode 100644 index bc39dc05..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-2G9.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c0f8338ccfdad4f15a6bc2fee5f13070204c845a48c3a2ebfccea7ca6ffe3ab -size 32359 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-3.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-3.mp4 deleted file mode 100644 index 04e023ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:505e1a64192e41eee23fb783b9885d9f7c745b9bc3a58e021841e577b0fa5501 -size 5383833 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-Final.mp4 deleted file mode 100644 index c8429adf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3eff98ca24d77942c1513921c80498c3c24185ec5a499e7d895a793de87bbbc -size 7750596 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-MainDrop.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-MainDrop.mp4 deleted file mode 100644 index 542e191b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-MainDrop.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a01eb7a388f07cb0fa95d534bd37cd8079ec9b08ac3ed7ff34ac62a1ae8cd954 -size 5570217 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-SecondDrop.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-SecondDrop.mp4 deleted file mode 100644 index 1d5c5f72..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-SecondDrop.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8760c3a11950e1ad60b107fae56bfaf938ebb7f1bcaa4e8e64295b2daf913ad -size 6577437 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-Unnatural.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-Unnatural.mp4 deleted file mode 100644 index 4c908ed4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Cascades-Unnatural.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98b28d2f8da81ab4c380bc7f029bff1be0ecb68393b7f9a6b5fce0f94b8a6b8b -size 5353557 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Falls-Components.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Falls-Components.png deleted file mode 100644 index d85694c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Falls-Components.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:406981e02485d174cdcaccd95cc409831bd5773f2b97b857341a67f569e4b193 -size 1412808 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Falls-NoComponents.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Falls-NoComponents.png deleted file mode 100644 index fa2868ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Falls-NoComponents.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36bff8b561d3e906d04bbddba6eb3eb1cc0e2e58f2e39d46b453c78ef44c0777 -size 8552083 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2.mp4 deleted file mode 100644 index 5f154df6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e85ef516c18a1332fb167494ae62f2191f4e90ad3bddb6c3a8af102630806d99 -size 6693824 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2B.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2B.png deleted file mode 100644 index ce8e0430..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ab7b255746e1ff239b3da4e83d29930f99c14d3e09027b2c2d3acd7767fc78d -size 3629032 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2D3.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2D3.png deleted file mode 100644 index dd15b02b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2D3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4274b9c9af75091777863a571696ad7bcb3b50fe733a006241d46347540775db -size 29637 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2D4.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2D4.png deleted file mode 100644 index 114f8046..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-2D4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1af63bfe07ac27368583041388adcc00dc9b1ca21abf4bafe51ee0a4d3f96e1 -size 52426 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-Final.mp4 deleted file mode 100644 index 3b3e047d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3bd4d48465b7f2506aac08a302f7ad67108db0e381f90b5bb5416dfb5015f38 -size 7745350 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-Texture.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-Texture.png deleted file mode 100644 index 692e808e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Foam-Texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:edc94ebcaaced9be25f96d2fbdd0db35bc4054cbcc14fbbffdd3ed702fb5cb1f -size 165946 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Intro.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Intro.mp4 deleted file mode 100644 index 74fac804..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Intro.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:056699257d2c6979508fcf9e4e9307f386705e7a091cde289f95bc2278d53be9 -size 5847943 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2.mp4 deleted file mode 100644 index d4b657e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4756ba412a1569a02f199a8c6fb276222e507f6ce018cb0e094d41f71d207377 -size 5693612 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2B.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2B.png deleted file mode 100644 index 71b4a7d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afe570c7734cd939dadc7c788f184f23bef6e17d1dc5dfba35328666ad903a82 -size 1268400 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D2.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D2.png deleted file mode 100644 index 800ed425..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d106425c37dc131ce26191ac707ab27416bb860d3b5a2908b49f938fbdf66b3b -size 2730 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D3.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D3.png deleted file mode 100644 index e0f23da5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63515145ecd6a117ba7b8e1a922df99fcde6a483f444ad246f5a7dfb319f6b68 -size 9904 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D4.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D4.png deleted file mode 100644 index 63e9f6b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-2D4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc8c81e6809caf3943b8110177d31b142f1a55df8a3d3955f07ac4d66777e623 -size 14404 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-3.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-3.mp4 deleted file mode 100644 index 42b5124b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60a1b0464b687965f7a58af28455983c4eaebd610dcda559ffca1b5445a89de3 -size 6031449 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-4.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-4.mp4 deleted file mode 100644 index 6b2b9a89..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-4.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f89dbac8d5121215eecc6044bd718c3d6c8a48d0703277420e07904b6bf9fcc0 -size 5614546 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-Final.mp4 deleted file mode 100644 index 9efb84ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7cc8e03fd5e278bee036410e67cd04ad44c0eda5e982dfd9eee624c9f4298782 -size 7740123 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-Texture.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-Texture.png deleted file mode 100644 index 97b965ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Mist-Texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2c439cc59873b388020723cc49c058c858b536082332aa765d60dca1885970e -size 136007 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-4B.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-4B.png deleted file mode 100644 index 8d6384c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-4B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a22ef6dae2b012fec0614fb7b2ffe3c7b27ef09008855a4da1d4adbba0093d55 -size 1050656 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-4D.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-4D.png deleted file mode 100644 index 15841afd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-4D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d0159111f111ac5f4e5aa691a9bad340aedcdd0c1ef81d40aa8f4b528ac0329 -size 14266 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-Texture.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-Texture.png deleted file mode 100644 index d63cf844..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Rainbow-Texture.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6a622f238fa605112fea8d7943a9782655cf0190c44a221f3bd9227e67a7273 -size 49591 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Sample-Components.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Sample-Components.png deleted file mode 100644 index c813621f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Sample-Components.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0d24c1265a37c0b285cfb3731e0abe595031791dce20cd8fb9757776b0cdee3 -size 1841323 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Snoqualmie-Falls.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Snoqualmie-Falls.png deleted file mode 100644 index 6937bc17..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Snoqualmie-Falls.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:912b5c6db4f2100f6fed8278743ba0795c46e6cae20a13714f7cc94f39ca5d64 -size 2536902 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-3.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-3.png deleted file mode 100644 index 37b1751a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21893283456fcab9c97a2f14f0c241f4701a4a009067faab934ad8688862a678 -size 1289650 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4.mp4 deleted file mode 100644 index 3f2cf4cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2f907d0d1bc59d371f8299d51b433e77f9258b8ba27a7ec683e8b8a8a35cf07 -size 5889706 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B2.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B2.png deleted file mode 100644 index 176084d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b5c6b4cfb0722959aa2b4624a5171802e8c539e9e64d6ce606cafdc34b3db59 -size 2723 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B3.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B3.png deleted file mode 100644 index f9a06dbd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bbff407566fa915dfd85b340a07aec4c5655bcf40766b9d8d8eaf51a56500f2 -size 36158 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B4.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B4.png deleted file mode 100644 index 32bd5055..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-4B4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7973aa4543992c21294a4291737cdd9a58c524ff21ebd04f673fd267d0e8af2 -size 24569 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5.mp4 deleted file mode 100644 index 1904f065..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4baa47e7423ddaf1f49c4a89abb5a60aa5222a757c267a8884daf9580d27503 -size 6000666 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5B2.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5B2.png deleted file mode 100644 index c3c77237..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5B2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e97d78155e703519581d2e78811dac23d60b80870cbbb8c477da404960b590cb -size 20026 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5B3.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5B3.png deleted file mode 100644 index 3ac78227..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-5B3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:671e83721a7e10f18830d01e342bc3e43d9af8ca4b01967116940e940e484f7d -size 23402 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Dense.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Dense.png deleted file mode 100644 index f6f6fcf9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Dense.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:072f238a1797a8e9189ab6ec171efe2bda5d8e513294792e4d2b882641a3576f -size 675102 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Droplets.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Droplets.png deleted file mode 100644 index 6c2fb5e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Droplets.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d96d395daec401a2656958672bad2619594b4f573c617c213a6af85375bf7c50 -size 73861 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Final.mp4 deleted file mode 100644 index 37c553cd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8283f428e1fe64c954f69576195b115f3399e5150691cfeb027ab86a6caf7094 -size 7322868 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-WhiteWater.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-WhiteWater.png deleted file mode 100644 index 342aa455..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/Splashes-WhiteWater.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7798a7b104576c289734901ff6d0e2b157ff5f28c0947a02a293edfcd288ed7c -size 203590 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-3.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-3.png deleted file mode 100644 index f6795863..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b290281d19950c8a3eef6023d402f9c26e2af083f1659e430b714478d54c3bec -size 3655431 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4.mp4 deleted file mode 100644 index 67b9fada..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee98632e57a723d427f6023e2c136c32ca0866873b11c0cd6c507b4f0614c7eb -size 6977775 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4A3.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4A3.png deleted file mode 100644 index db4731a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4A3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:420be745d2c9747bd1e55b7fbf9a47aae5ea71965c53207f95fa69c11a717e27 -size 36419 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4A4.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4A4.png deleted file mode 100644 index 78e6b6b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-4A4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f099cbbd3a9a2152949f941c40208b577a5e615d39e6f98b5f53ab1fa1c0817 -size 125309 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5.mp4 deleted file mode 100644 index 07ef9768..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3d03f77558f683cefe27cf3b1ba3d0e404217ac7ac492ccaf68ed044fe033f6 -size 7174065 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5B1.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5B1.png deleted file mode 100644 index ee728e68..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5B1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff20d1b88318ff15063e6d2477c062af574066f0bbea371ead3ac051480304ab -size 27751 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5B2.png b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5B2.png deleted file mode 100644 index bd29444e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-5B2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94757c5c96fa3d22360266dac1cce8f118e55ea6a8076d5d75219bf0a08e93d3 -size 21804 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-Final.mp4 deleted file mode 100644 index ed9fca6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/creating-waterfalls/WW-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46c493627b0a85227f05bc074965930ac8a54ede6883992f2e149a5a7fbddbe6 -size 7986561 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/Treasure-Island-Edit-Place.png b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/Treasure-Island-Edit-Place.png deleted file mode 100644 index 11e8535f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/Treasure-Island-Edit-Place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:096212fe30db86cdc40a73e35bca6f60b55458ede8b4dc3770608a64613bcd38 -size 147262 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/accelerationParticles.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/accelerationParticles.jpg deleted file mode 100644 index 9360a20e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/accelerationParticles.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f1c9c2be5053950541af873c340d054a894be268dda62349a39839416e6b261 -size 248121 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/centerLavaLocation.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/centerLavaLocation.jpg deleted file mode 100644 index a1c279dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/centerLavaLocation.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a003d763be972e63ed1fbd5e64c8fcbe4a8e58fe0818ab67064cf26e1b45fd7 -size 20995 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceDefault.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceDefault.jpg deleted file mode 100644 index ac7218b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceDefault.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f12c26e5bd1cad4df208e9c121cf5b245d219b74c8beff73e9545b3a8e1e1e4 -size 99542 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceGradient.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceGradient.jpg deleted file mode 100644 index abc311dd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceGradient.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb40669400a51de91fdcf6e326f3564772ed4e84cc547d8dd3540ceb9813a1aa -size 147717 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceParticles.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceParticles.jpg deleted file mode 100644 index 06fc69f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/colorSequenceParticles.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4f928eb61f3e3da89db3b269b1c7f0fb3be30fe08b5171348f0bf0c755d3e3f -size 248321 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/fadingParticles.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/fadingParticles.mp4 deleted file mode 100644 index b892acb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/fadingParticles.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:adbe00a2ed1ae4d8db6a70857435822d3d1ceab775f0102e0c953d7678ed191e -size 645164 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/finishedDistantVolcano.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/finishedDistantVolcano.jpg deleted file mode 100644 index 4c8892b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/finishedDistantVolcano.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e8aed2789cac2c3dfb10c488b6171d1264717a3edb9c48cdc1ca45a5dbdac9e -size 241647 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/finishedVolcanoClose.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/finishedVolcanoClose.mp4 deleted file mode 100644 index 96e67d6c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/finishedVolcanoClose.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f0ad3945448b9d9f89c0b3e173f7c13943cbb4f25e9f75c26788f8d81a444d33 -size 492417 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/newTextureVolcano.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/newTextureVolcano.jpg deleted file mode 100644 index 29965b1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/newTextureVolcano.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd7171d3b9af1e2303a94045cff69d8bcce05fbe00e49de2bf25f157cc71d184 -size 333957 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/openSizeSequence.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/openSizeSequence.jpg deleted file mode 100644 index 82283cde..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/openSizeSequence.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6952fb80138cd495fc3aaa2519c755e4c7d833f3580f785fbf1a4728ac6f579d -size 58716 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/openTransparencySequence.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/openTransparencySequence.jpg deleted file mode 100644 index a2b25614..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/openTransparencySequence.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e6d343d4952435c154494e29fd51d031fae54036254c4c1b7d4fc80c07cefd4 -size 39434 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleEmitterInsertionVolcano.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleEmitterInsertionVolcano.jpg deleted file mode 100644 index 3cc53a25..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleEmitterInsertionVolcano.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d673fd746738bc8d4e993984859622d68ed659eec41b032f23ba0806ed725117 -size 385116 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleEmitterInsertionWorkspace.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleEmitterInsertionWorkspace.jpg deleted file mode 100644 index f3cb5a7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleEmitterInsertionWorkspace.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a8a9780fffa60d564460e3eb8056eee1b220621cd0430a19cc7de7231b63759 -size 11284 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleExamples.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleExamples.mp4 deleted file mode 100644 index 876daf97..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/particleExamples.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbe4a9f29929a8e400382636f4549d7ac0eaf0ab7391b5ca125355745fa35190 -size 529631 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/sizeSequence.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/sizeSequence.jpg deleted file mode 100644 index 642d8335..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/sizeSequence.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76cff900bb2ad891301d02204d33049b93661179c7d52b88b3c2b1db410681b7 -size 170661 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/sizeSequenceParticles.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/sizeSequenceParticles.jpg deleted file mode 100644 index ead90129..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/sizeSequenceParticles.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:853c39514381181df196e37c314336594913048ede7beb95917724259ceffb71 -size 245355 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/textureProperty.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/textureProperty.jpg deleted file mode 100644 index 68ffdad0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/textureProperty.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52e780d739b0e77d5087ef848d6fbff1635553f50fc8e8bea74fd9c494cff3cd -size 78670 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/transparencyDefault.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/transparencyDefault.jpg deleted file mode 100644 index 8d7d7b41..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/transparencyDefault.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e34844ba466d7c32cf740c03435b10042d07a8e54d7191d84cdc4c92b4e8316 -size 160817 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/transparencySequence.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/transparencySequence.jpg deleted file mode 100644 index 102c3728..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/custom-particle-effects/transparencySequence.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e388bf3007a492f819b2a83280f3082a4a3346de72f75fc2eb656dcab1c39290 -size 215101 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/data-storage/DataStoreTutorial.png b/.cursor/rules/roblox/en-us/assets/tutorials/data-storage/DataStoreTutorial.png deleted file mode 100644 index f63f84d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/data-storage/DataStoreTutorial.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a577e9ae9dccba7ed93c84a711e732579692bb6e2144b3bf0fb5bb0bc3afd05d -size 948622 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/data-storage/DataStoreTutorial2.png b/.cursor/rules/roblox/en-us/assets/tutorials/data-storage/DataStoreTutorial2.png deleted file mode 100644 index 6b4a9e39..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/data-storage/DataStoreTutorial2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0eba0583fa344f89c757a93c9d044101e647270713433d4005cb63d4e4a5bfb5 -size 769577 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/lavaFloorGameplay.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/lavaFloorGameplay.mp4 deleted file mode 100644 index ce3c9d2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/lavaFloorGameplay.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18e17735c71e83b051f8baabfe07833aa525d827c0cf0bef21acbf8e6d3f9409 -size 804053 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/lavaProperties.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/lavaProperties.jpg deleted file mode 100644 index 0456b884..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/lavaProperties.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ced8e673aec1e11e7cf0ff2231dab37eacf4bf52ee9ddef0a0870141fd216c89 -size 41909 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/partInserted.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/partInserted.jpg deleted file mode 100644 index 16f509a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/partInserted.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f023a70d7e2ee24dedcef66d7f156abe54d3020c41cc479a2f4f49f7e4a3a93 -size 376791 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/propertiesSet.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/propertiesSet.jpg deleted file mode 100644 index 93bad197..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/propertiesSet.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd5dd4207e9a10f6453f42daede5c4751ff5c272beeddeb9007e70d44c886a8e -size 355609 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/scriptExplorer.png b/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/scriptExplorer.png deleted file mode 100644 index c27186a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/deadly-lava/scriptExplorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ea281aeed3987623444aa639ed22585d584c0d75a1375520a5da5619c05b152 -size 28370 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ReloadingSymbol.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ReloadingSymbol.mp4 deleted file mode 100644 index 3d669e1f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ReloadingSymbol.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9d7371832fb73d3ac222d53fc2c4401cc36a799443a5c47fdb3e8f5172a8d3a8 -size 1798603 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ReloadingSymbolZoomInOnly.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ReloadingSymbolZoomInOnly.mp4 deleted file mode 100644 index 0eaab610..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ReloadingSymbolZoomInOnly.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d444d370198e44c6b5e855bbfaa77ae8735a1ba6dcba370d950f10e480d1b1c -size 408172 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ToolControllerExplorer.png b/.cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ToolControllerExplorer.png deleted file mode 100644 index a6c708eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/detecting-user-input/ToolControllerExplorer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:67c97949d8d420537407a9bb7f5aac173596134ea2e68f2f00a7cddfd3894f77 -size 5981 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-2.jpg deleted file mode 100644 index 6795116c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b596d29e5f84a4b568966929463450b93d1caabb150efc46e2d6e2ddf03e1732 -size 101997 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-Custom.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-Custom.png deleted file mode 100644 index 78c9c703..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-Custom.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f91a782e4c48513ba28adab5de8dd3146520da445e694482bb9a6a7f392dd7f -size 1283668 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-Default.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-Default.png deleted file mode 100644 index fd0645c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Ambient-Default.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6493a2fcccce72a1ac3a148f14f3ee802cf33fe740c61a2e2c3041ca0c63cd2 -size 1273847 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-Final.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-Final.jpg deleted file mode 100644 index aa4fe076..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-Final.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:901328ea3eda081142c4cebb99517b96be5d8ee568eb8d49ec5ab106f3a28a43 -size 64856 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-NoParts.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-NoParts.jpg deleted file mode 100644 index 195d5a93..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-NoParts.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d1b592ff841026612813f446902a330003501f88e564b2f5f53e5c9fae964d1 -size 390111 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-WithParts.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-WithParts.jpg deleted file mode 100644 index 2289d97a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Cabin-WithParts.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:881eb188f58c353d9352b815f0aebc59473e58104472fd485a9ff314d64d53d6 -size 151151 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-1.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-1.mp4 deleted file mode 100644 index 60501105..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fd628fcea62f20b836c21688e5808de080440af48e17990e3ae44a328b289d1 -size 17239013 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-2.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-2.mp4 deleted file mode 100644 index 9f440c36..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3a544a6a8eab981e149d0d161408b172927a8ef53792e883d738dd130d33baf -size 16467981 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-3.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-3.mp4 deleted file mode 100644 index 2a806c04..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98e396535b1a8e0ecdf90603b0f835c5bcad3f951f6d910d6b23775f07067bd8 -size 13236020 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-4.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-4.mp4 deleted file mode 100644 index d9fc5e26..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-4.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33d25ac756a94db16858d2e812e4e1bfe49ee5498989465ff360e991bb49184e -size 2877203 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-WithPL.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-WithPL.jpg deleted file mode 100644 index 2f3c1876..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-WithPL.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5109afa3ad26d138925d98059c93e25a25b3596285f1d087901f0c2ec5e91a88 -size 215027 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-WithoutPL.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-WithoutPL.jpg deleted file mode 100644 index fb01aea1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Candles-WithoutPL.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5bd5dbe75bed5e59f3d2813020a4ac8bbb97219edb2b54c4e8ee2c5a0bc8196 -size 189746 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Contrast-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Contrast-2.jpg deleted file mode 100644 index 84ecfc12..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Contrast-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77b772a0ef52527d810c18ce4b003d90d9ad59a8a8b7223bb6dc9f3e873c24fb -size 1710599 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Deer-SpotLight.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Deer-SpotLight.jpg deleted file mode 100644 index c6016907..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Deer-SpotLight.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81d778d418f4cc2260217a7ebcdf3ef15e9d67f47f3d909aa7ffa0417e137af4 -size 162034 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Deer-SurfaceLight.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Deer-SurfaceLight.jpg deleted file mode 100644 index f5d49e63..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Deer-SurfaceLight.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78aabc20a4e89990e74705cc49f28585f829a84fc4c271a072291294d76a47e1 -size 178889 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Density-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Density-2.jpg deleted file mode 100644 index e92057cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Density-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea7f14f7fdd961d48bde892dc8e525210b6966ae6f4223664c82cb99306968b9 -size 144665 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-2.jpg deleted file mode 100644 index b991a516..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae316f979fdd228cef9bcfa6ab37e44250581e6e21acca76aebffdb29f96acca -size 1092085 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-Brightness.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-Brightness.jpg deleted file mode 100644 index 1a479742..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-Brightness.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0f728574c320c57c86b31082678798c488b1e2f1f7837b2c2d1d90a0de0bd11 -size 669632 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-ExposureCompensation.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-ExposureCompensation.jpg deleted file mode 100644 index 57af9b4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-ExposureCompensation.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e8f2e4c5418df87950ad317bca39e7352895fdbff31057becc1a83bf18fa4a4 -size 725348 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-NoChange.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-NoChange.jpg deleted file mode 100644 index 57af9b4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Exposure-NoChange.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e8f2e4c5418df87950ad317bca39e7352895fdbff31057becc1a83bf18fa4a4 -size 725348 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/HighDensity.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/HighDensity.jpg deleted file mode 100644 index 6fe2e8c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/HighDensity.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d17050f2fd01fb6c08a0f359efa8b950fe487446746bf139b1ea6e5262624ea9 -size 453056 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-1.jpg deleted file mode 100644 index 18e477b7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:043699104f99789ba11ef6a04c7ced147ed5ac142f5da1ee11719f7a51abd07d -size 85500 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-2.jpg deleted file mode 100644 index 2483aafc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:861b1d02e77ee3ec44fe394dabf831b6c76c5d37a88df591687d32c982ee5bc9 -size 154993 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-3.jpg deleted file mode 100644 index cef73f82..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56b9e20c952d7bbfefe9aa1bf13b320adb025b2b4445d2a31a72abd983de5225 -size 182431 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-4.jpg deleted file mode 100644 index 02ea47f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Lamp-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cb2bfc0af025d406ad5297dc789667113e7e53ad5aa7fc76e396e249098d200 -size 207115 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/LightingStyle-Realistic.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/LightingStyle-Realistic.jpg deleted file mode 100644 index 66bb8b34..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/LightingStyle-Realistic.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc4cdf45daae12ea723e4174de08ede25c8df070c9677fed0a51d0d71d438f75 -size 140006 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/LowDensity.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/LowDensity.jpg deleted file mode 100644 index f70e64a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/LowDensity.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8371f793f6e77e1f3903ab637f65c6a23bfc6017df7242444f2c556d626af379 -size 91487 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-1.jpg deleted file mode 100644 index affcf280..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a3ac4e1f8f1fa8c5ea333b685e22c1f250725274dd2d7d218c3c53d45b3b9437 -size 195571 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-2.jpg deleted file mode 100644 index 699f09e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:775f30728f009c92b7ec11546a5583a8561cfe445a4b545bb76b7053de0b3f19 -size 194599 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-PointLight.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-PointLight.jpg deleted file mode 100644 index 34aa0aff..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-PointLight.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c4b9c00b1f0a8b381423ffd6f5718c04bee5854d3665ef758792eed9a18478c -size 223133 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-Realistic.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-Realistic.jpg deleted file mode 100644 index 6d22fc07..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-Realistic.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1ba09bc0ef93bed1fd7830266da40cec6757144498834f047807cb62c65b522 -size 159838 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-Soft.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-Soft.jpg deleted file mode 100644 index 61517651..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-Soft.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da697279f76734dfb2d4a1a45b290c535b648882e135177575c72d98e44335a1 -size 140889 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-SpotLight.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-SpotLight.jpg deleted file mode 100644 index df5cfef6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Radio-SpotLight.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:759d23c0b53a95d702d8139ab469ccbe6d8bc333fc81e1a4586697f3d863fa5d -size 192972 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Sample-Complete.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Sample-Complete.jpg deleted file mode 100644 index 60f5fc3e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Sample-Complete.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04b7565a114abff64b0bc78c570cc5ffaf08c3ccd8cbf3620a35dd38843c4470 -size 1300862 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Sample-Start.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Sample-Start.jpg deleted file mode 100644 index 648c23c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Sample-Start.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:312d39ba270fb96368c6ca46050d928b33b7f6e1261f2a8246b02bb1f86f1ac7 -size 939522 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Skybox-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Skybox-2.jpg deleted file mode 100644 index f1b0363e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/Skybox-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d14df2b4c2499eec756a37311a490234f7872cf9721845ce19157c2cd73cbfe0 -size 160016 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxBk.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxBk.png deleted file mode 100644 index 0ec6bb48..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxBk.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b72e7625a8d7f9199fc114041a9e6fc9e96da1be7574f5ecb30baff2732aa8dd -size 216142 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxDn.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxDn.png deleted file mode 100644 index d02bd2fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxDn.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0993765272ba1a248d01be6830f426c484ae53fb4fa55c2dd4d6ba51d37e29e6 -size 2984 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxFt.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxFt.png deleted file mode 100644 index 81068a83..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxFt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91e92888d6111b0ec12d1a73038eb24e52bdca181212e76e4f7dca8e3bb7d476 -size 211465 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxLf.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxLf.png deleted file mode 100644 index 826f10d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxLf.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:223de74765b5ac07dab15aa7695dbefc144bfcc2b96f5de805363768eab9ab8a -size 204878 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxRt.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxRt.png deleted file mode 100644 index 80fa55e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxRt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f89e1a31d28422de5f27c381bcda479c4790ff4dea3678ab00778123d26e1420 -size 210084 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxUp.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxUp.png deleted file mode 100644 index 5ed59a47..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SkyboxUp.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f6ecc4854b2e75c1e8579d2dfa61ffafd4947bbcc504bbbbe943d4b4e279ce4 -size 126874 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SunRays-Custom.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SunRays-Custom.jpg deleted file mode 100644 index de9b3b58..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SunRays-Custom.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39e9e39faf30d1a03117c8872b7312f8be4652ac13bede2e1031842d10d69d41 -size 966299 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SunRays-Default.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SunRays-Default.jpg deleted file mode 100644 index d81b6b6e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/SunRays-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8d9a8a96dfb22ff804cbb143494c3797b808bfbf41ef6e5d27e70393db68721 -size 142994 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/TimeOfDay-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/TimeOfDay-2.jpg deleted file mode 100644 index d5e76c7e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/TimeOfDay-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb35376c7696066db231506014ebde56517d31b9a7a3ac2cb853d824c739f144 -size 151689 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/WithReflections.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/WithReflections.jpg deleted file mode 100644 index 7782eea3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/WithReflections.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73e63ffc20bcb2dc3a1fc4599465977c341af48766b5652d6617c357526b65c0 -size 2276965 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/WithoutReflections.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/WithoutReflections.jpg deleted file mode 100644 index 8c5dcf74..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-indoor-environments/WithoutReflections.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee49824b0537a26f9ef8b2f47df87a5b6ded7d1d75f365c1560306442d1a9996 -size 2174500 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Adjusting-Brightness-Color.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Adjusting-Brightness-Color.png deleted file mode 100644 index a88cbc28..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Adjusting-Brightness-Color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7150fdb05e6cdb6190dabaa2681e91ac4a01fefacfd3e9f12ec2ec3e02a4cfd3 -size 1529796 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Ambient-Default.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Ambient-Default.png deleted file mode 100644 index 9f9eec9d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Ambient-Default.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2e8aa068e8e5fd658c2eaf5185f60f3989b569e1741c0ac478c968b8a30c9ac -size 1663900 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Ambient-New.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Ambient-New.png deleted file mode 100644 index f1226164..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Ambient-New.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:186fd705a08f08caf7369a54f0a88f197fd06c2688b03352996c6576e79d9f8e -size 1963369 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Bad-Skybox.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Bad-Skybox.png deleted file mode 100644 index 4a11b748..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Bad-Skybox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1a352fd0d02c2362b6ec51310857d898dbabb150dc1c57e8d9102a524b523c5 -size 526531 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Color-85-78-54.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Color-85-78-54.png deleted file mode 100644 index 2bac1a5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Color-85-78-54.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02c766844467dff3a63208d7a06c41e1dba7e288798c13295dc98d8d2627ddb1 -size 2108660 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Default-Sun-Position.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Default-Sun-Position.png deleted file mode 100644 index 7d365fc3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Default-Sun-Position.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e462febb37e0776b0e05ece23d214efbc46ccf4d7402bd89fc55ec686914c42 -size 2290232 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.272.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.272.png deleted file mode 100644 index a1ab76de..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.272.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6b8b1dc020a7816c536abb33b81f7a80e61087b02c3a673ee93d1dfa865db5e -size 2071974 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.3.jpg deleted file mode 100644 index f17a7486..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c3228111a51dd3175ee7a787914c581b1cfb3a681fe326f6c96510e033506a3e -size 459039 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.jpg deleted file mode 100644 index 990782e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Density-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49391d2769948ad345fecebd0d4c0b78030b6732469a2e57da60d0b73afcd199 -size 488675 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Enabling-Shadows.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Enabling-Shadows.png deleted file mode 100644 index 2313bfdb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Enabling-Shadows.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f5ad7a34d2232f0f5e9e6ae00bff07b69203fc6239534983bb04c3b314b5ffa -size 1520818 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/EnvironmentScale-0.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/EnvironmentScale-0.jpg deleted file mode 100644 index 45376da9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/EnvironmentScale-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e17bbb66b366bccbefd213a22d5a4ad98464f8677e813106c0850b9c590da53f -size 403375 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/EnvironmentScale-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/EnvironmentScale-1.jpg deleted file mode 100644 index 1b54eb18..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/EnvironmentScale-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36443efc70bb51414c5eb42b63f194b69eeda4790cbf955984b57748642556af -size 393379 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Forest_EveningLightingExample.rbxl b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Forest_EveningLightingExample.rbxl deleted file mode 100644 index fc9b679c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Forest_EveningLightingExample.rbxl +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95ad55d57c0905cf46685537d8ab0a9ee3767fbef120f50dca1e8b6009eb1c45 -size 3685174 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Good-Skybox.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Good-Skybox.png deleted file mode 100644 index 6d52ba2f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Good-Skybox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c393df87b54ae8bab46efdc06334aff70561473e1dbc5f74a46a5b6760c6946d -size 450396 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Haze-1.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Haze-1.png deleted file mode 100644 index 1be8e54a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Haze-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d66b92d580017c04d739c4f32a7e9841683c524f58ca6608f3eccfc6708597f2 -size 2068314 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Increasing-Range.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Increasing-Range.png deleted file mode 100644 index 172d186e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Increasing-Range.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1584e2b57a4f3759b0d0da7acfb029042a2d9e468100967f3f38e666a2912a8 -size 1556516 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Intro-After.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Intro-After.png deleted file mode 100644 index e9264a71..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Intro-After.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:06c902c10409fe4a72531f9b9a8902977a5554f62e0d1dd5d7a8a55989fe0a41 -size 1984143 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Intro-Before.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Intro-Before.png deleted file mode 100644 index ea93e1ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Intro-Before.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb2bfb85af5294466e7f969ed0bba80ea06e92ba57b9f70cd7307986d1943f77 -size 2217149 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/LightingStyle-Realistic.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/LightingStyle-Realistic.jpg deleted file mode 100644 index 1c6e8962..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/LightingStyle-Realistic.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba886d765dadda66b44148ebb7beea7e75918d69245276930c0c3cc2dbbf62a3 -size 442695 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/LightingStyle-Soft.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/LightingStyle-Soft.jpg deleted file mode 100644 index 2ce416fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/LightingStyle-Soft.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b137a4ca08f9b4fe934c2433eec61ffcb57e4e6b4b9351dca3ccb0d1c6d5884a -size 508094 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/New-PointLight-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/New-PointLight-Values.png deleted file mode 100644 index 3e5852ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/New-PointLight-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:feeb51ad4b8021407fe1e7a1a4801f30557f6843ddaded0c9f0621d8d8d1853e -size 1367313 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/New-Sun-Position.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/New-Sun-Position.png deleted file mode 100644 index 8d9d7ff3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/New-Sun-Position.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a587d7ee9ab447564aad13a863288c91444baba0266b0ca3aeb1586d7000c439 -size 1999776 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/No-PointLight.png b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/No-PointLight.png deleted file mode 100644 index e10bd47e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/No-PointLight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f631e91c327ebf90759a50a7c6778a890d3a96ac01cc3e3756388a044f9f6bdf -size 902131 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Yes-PointLight.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Yes-PointLight.jpg deleted file mode 100644 index f5a9934d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/enhancing-outdoor-environments/Yes-PointLight.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:355596ffb2d17598f9076b44938352f4874f27a7d15c5d0a6d8efac489ef4603 -size 317178 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-1.jpg deleted file mode 100644 index 2c65b735..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bfa29a8271702aba4bb87ebea37ddda7ac97b9b4517a664ed0aa4c1f7e08ff45 -size 148390 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-2.jpg deleted file mode 100644 index 62288389..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:496cbce12f206a79e208ee793b64257775b370d805e4dad634db237b783476cb -size 152033 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-3.jpg deleted file mode 100644 index 439a9a31..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47fd7fa5b80d0b4585212ccf3e4bd38962726bfe0f9a5d4e9a29c29a75289560 -size 154512 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-4.jpg deleted file mode 100644 index 7f8d132a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f85da6a79913d5ea2346447386e0da46bf08130087a72810e0fb8a1405b83e1 -size 162357 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-Intro1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-Intro1.jpg deleted file mode 100644 index fcc86974..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-Intro1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7e63096cc867b1e1c665b65159e854b8f59957da10099a82178c49f4a8f9b1e -size 102616 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-Intro2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-Intro2.jpg deleted file mode 100644 index 83d73289..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CombatPockets-Intro2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e166ac165c1a5f925e1d869385a0461416071cfd59e5f8dd5e7a4f42fbd367b5 -size 82076 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CreatingPlayableAreas-Intro1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CreatingPlayableAreas-Intro1.jpg deleted file mode 100644 index f631ff5e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CreatingPlayableAreas-Intro1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2ce594762a854adfff8f59ed53b1f86f5a4ec46585627d04a09ee4e7cf025a0 -size 287707 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CreatingPlayableAreas-Intro2.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CreatingPlayableAreas-Intro2.png deleted file mode 100644 index 311e9788..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/CreatingPlayableAreas-Intro2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:911e5b07365b5cba381a23e74f9967258067cf24a040fe8d4d1e10cd9c06aa78 -size 602607 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-1.jpg deleted file mode 100644 index 30e9133c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b1fe5a46c913b1fc5cf49f4619e7f7cfef98dd6fb1c514443a33d932d23be39 -size 160023 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-2.jpg deleted file mode 100644 index 86b84888..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ca65851285212cde35c433a169ea7c166e10bc49b9a4b591019f5999a2d5185 -size 163512 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-3.jpg deleted file mode 100644 index a2b4b3c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2df4f0fe9cd79cd74c5d9c7fa70526f01dd906c798a91c7ef8c21c6d0fe62348 -size 165705 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-4.jpg deleted file mode 100644 index f9746a0a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:acaf2b219910f886380c42e5a4b57849023a059cbfa3232853fb21ea858c3fcc -size 167262 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-5.jpg deleted file mode 100644 index 40529a22..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95c01637f9fd1c872b217ee8ab5761669557bc9f3495104b7e4859b22f339ce9 -size 167855 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-Intro.jpg deleted file mode 100644 index aabe056b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Exterior-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22bdcfea597de1b1571f5331f78b3e9b28ee4ba399798c69c0e93d502220c9f2 -size 118384 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-1.jpg deleted file mode 100644 index a69b856e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6feb7402b9e7cb822c84f21695445614cbee04c5b09a72665143814f5b9861c -size 263967 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-2.jpg deleted file mode 100644 index fbe99b53..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54dce6af6778ea93274cad46d68b897615e4e3f482e6aa4705dac5a05bef8237 -size 196740 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-3.jpg deleted file mode 100644 index 3d506742..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9d7c387ce114186e94c07bf5cbba1619bb4db6219f46afc254f5dab5c609eb3 -size 150509 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-4.jpg deleted file mode 100644 index b0182d17..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec247e64ae6be3bd6b34a2adb6cffdf640b695a5cca14ed03c8adb04c4fafe22 -size 150646 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-5.jpg deleted file mode 100644 index 6848c566..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c15985642bc319bb2abed5c3745d69674102c85242386765fc24825ab46df03a -size 142830 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-Intro.jpg deleted file mode 100644 index b850737f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Floor-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be9202e10ce4e1e5a964a088fe82092daaa82d38a9bd5e72df90496fe5fe75f2 -size 84287 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-2.jpg deleted file mode 100644 index 5fbd1a4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:023fee107daba2e7e24c28abff4985fd376f6b3cb3a1f5b04a1a9e4a0a66222d -size 67530 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-3.jpg deleted file mode 100644 index ece074a7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74c34dbd5d75e371df96e871d4c0b81fcc47ca4cf8ef9247449b6cdd20162081 -size 74561 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-4.jpg deleted file mode 100644 index dc1763d4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralCombatPockets-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:486468d8c357b93440d78d1cfd4048ee9cea8ffcdb70328df0d416169e199414 -size 75818 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralExterior-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralExterior-1.jpg deleted file mode 100644 index 5e816e8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralExterior-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:793df9a4f76a83b44a4ef0271b1e7c1257407353fbc1f65bead1077d2569ca75 -size 90596 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralFloor-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralFloor-1.jpg deleted file mode 100644 index a105e335..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralFloor-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:517a0ecb753532962941cb3e4d85cd667211a554e5266b1d5d279bd1b88bf965 -size 58361 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralPerimeter-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralPerimeter-1.jpg deleted file mode 100644 index 8a04f94b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralPerimeter-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b002daded2e673408ac625d0a2d920cec6bfde1dcdf5556202dc775eb5ae15d3 -size 61553 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralSpawnZone-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralSpawnZone-1.jpg deleted file mode 100644 index faaf4a51..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/GeneralSpawnZone-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2bcc0c6b943ef2dac824b4b861cdc55e33762d1d2dd5d8555f591c82c06740bd -size 62278 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-1.jpg deleted file mode 100644 index 29d4e3fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e37d526265035eaedc6a58c5320395974b2cd1f4f9c27069906c475fd17d9536 -size 145275 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-2.jpg deleted file mode 100644 index 6f74a125..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e4a043745e686850a715abdd97fe3a26b9333d905c123e1e5d28244306d0995 -size 130679 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-3.jpg deleted file mode 100644 index 6ac49ca6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc30799165ab2e527b816ba25afc52f7b5e75a3edd2f41f915b197ded90a93ea -size 127434 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-4.jpg deleted file mode 100644 index 3ff3bd3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05c3c006ff6726ad7f085ec96bb26de3c862374c5cc29ec3db5002db843c2c4f -size 130732 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-Intro.jpg deleted file mode 100644 index 17a773c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Perimeter-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a79b9cd79c83a80cc758c7bf366b43ce0c5f75f35a985c84b45ee599c3ca7728 -size 84456 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Placeholder-Left.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Placeholder-Left.jpg deleted file mode 100644 index a7b4d64a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Placeholder-Left.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:001069be1ca65257c1e739d04176d1315818617e03eeb68869cb1e63b2e5b7ae -size 100857 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Placeholder-Right.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Placeholder-Right.jpg deleted file mode 100644 index 91e3513c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/Placeholder-Right.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f81402ef6f1a40a4fabc0bd3582e2fc2861097a240f3dbd6390f651e172d867 -size 117824 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/PlaceholderMaterials.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/PlaceholderMaterials.jpg deleted file mode 100644 index 93e5214a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/PlaceholderMaterials.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:36158f2a44cdd597ad33081cf02dd231eec6adee65d39be1194cc150c683ac49 -size 243093 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-1.jpg deleted file mode 100644 index f70a89a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79dacd14193fbfb32f70aada6e418633864a3605ea998759c5240cbb6a153a80 -size 130617 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-2.jpg deleted file mode 100644 index 826e8550..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abd07ce33617cd77af71673e6ed73ac719cbbb04a4a0590098993af5a5adcb2f -size 138043 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-3.jpg deleted file mode 100644 index 9b337e77..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f4c487ac9177100ae7b60d6702d9132947a27acdee151bb6c1fb28bb92b64af -size 137717 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-ExitPoints.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-ExitPoints.jpg deleted file mode 100644 index b1c1d0f9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-ExitPoints.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3cef7a9a51b2f951f23524b5e0a075def3b87e86c5f5c1ed3d082fc838189863 -size 220676 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-Intro.jpg deleted file mode 100644 index 3f1e116e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/SpawnZone-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccb6b5f4fade43d4b1eab9f7d74946577367b516dfdbfe9a76bd593f0e2a8b34 -size 81535 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-CrossLanes.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-CrossLanes.jpg deleted file mode 100644 index 17d45132..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-CrossLanes.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07938a18cf3613c7a6029d45a12247242075e213cab58fa6724659b45c360ba0 -size 93887 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-IntersectingPoints.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-IntersectingPoints.jpg deleted file mode 100644 index b5d4c55c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-IntersectingPoints.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c503a17bed443541a5a7bddbf31c19127142fbf28c5231fef6b4ab64dc68eb7 -size 88658 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-PrimaryLanes.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-PrimaryLanes.jpg deleted file mode 100644 index d03dcb97..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-PrimaryLanes.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6164db53fc99b6fa65172614275fe54da9ee744f740e72b859dfefa9fcee69e9 -size 99397 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-SpawnZones.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-SpawnZones.jpg deleted file mode 100644 index c75e4696..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section1/ThreeLaneLayout-SpawnZones.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:287bdba5123cbf06fe63b18b0498421a2b13f4fd7e9d0bcdfc8139bd01e54b3e -size 78927 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Art-Style.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Art-Style.png deleted file mode 100644 index 06c8f574..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Art-Style.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a04f9263ce6bf9ca9d8d881070d43a186714b840c51aeba565aac833e587430 -size 3564195 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningModularKits-ModularKit.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningModularKits-ModularKit.jpg deleted file mode 100644 index 773a9688..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningModularKits-ModularKit.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c325aafe8ca6448b5c04e6884cc24371e8f4e35ae2e40160c92daa4d3bbc3cd -size 195982 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningModularKits-Snapping.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningModularKits-Snapping.mp4 deleted file mode 100644 index 30a476e8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningModularKits-Snapping.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d45c25b0b2974187b0419f353bb77e040b4b8145515d4b2f1b0dae35f04d5d5 -size 3868774 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningProps-PropsKit.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningProps-PropsKit.png deleted file mode 100644 index ef758317..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningProps-PropsKit.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1257b1cd04fa86dae2c9deef20fe48ab3f713553fd67fd17a7c874bb1916d57 -size 1200429 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningProps-Scale.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningProps-Scale.jpg deleted file mode 100644 index f9bb7eef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/DesigningProps-Scale.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cbd9c50419cb1cfc050c06d590cbc4098f18ed34dd3679210954f603aacb46b1 -size 119993 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Overview.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Overview.png deleted file mode 100644 index 32a3994c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:55a84e2afed025fb1067e5b9dc8bd20912a522fcab0e19855a1c2db184b8ad3c -size 935593 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Moss.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Moss.png deleted file mode 100644 index 515c7c60..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Moss.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4131c42b16d7932b461c322cda4775585b1f9a06577fc306c5eeee1a4df59377 -size 1071273 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-MossFlowers.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-MossFlowers.png deleted file mode 100644 index 584f45f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-MossFlowers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41d98e36113382934abc7fd9ad199d7a8aa8b418bad6e0208155e1bc7dc7114f -size 1398820 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-MossStones.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-MossStones.png deleted file mode 100644 index db07fbe9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-MossStones.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3250ab89f75a84cd74e68642d344144e5d957eca922190f0a1d691b348eb890d -size 1060649 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-NoElement.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-NoElement.jpg deleted file mode 100644 index 380dfa50..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-NoElement.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e927791d28bebf64880ba20406297bfa6b38f0b694b08575e9b3fc8278ce513 -size 139194 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Part.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Part.png deleted file mode 100644 index 1bbedd6d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Part.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2264981b0238fa8cd6a164c9de1e357414a4a4218cf5369c932356842a52fa21 -size 645045 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Stones.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Stones.png deleted file mode 100644 index 9673a93a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-Stones.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9701580ec1d7814e10adf1fc97d278c5dbf804c1b26cc693932b63a3c3e76f19 -size 804299 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-WithElement.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-WithElement.jpg deleted file mode 100644 index 8af0d878..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TileableTextures-WithElement.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:019072fadfaddcb7820c1f5b510b55b3a2adee6e4757ff2636dba2c034e830a8 -size 151022 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheetTextureMaps.zip b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheetTextureMaps.zip deleted file mode 100644 index 00e63cd3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheetTextureMaps.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd34e14edbaf9bd720b906d2244bfa99c3a23cb0c0c6c91da68ce6795fd34f16 -size 30412070 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Albedo.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Albedo.png deleted file mode 100644 index 18a3c2e5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Albedo.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fac920fce2ee00d6c97b0847640796aa46ea5f9b70ebecacceeb5a7d4c1c15f -size 2566938 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Ceiling.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Ceiling.jpg deleted file mode 100644 index 5aac4cc4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Ceiling.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3204cfd1b1ce5ac41808ec2647413e89f812b539d46ebdc6339f99832b47f52 -size 123139 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Doorway.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Doorway.jpg deleted file mode 100644 index 14880da1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Doorway.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b416eae3ad83764fa6ca710e310e254784355f8483a0fe4741e2676c75e4e26 -size 195674 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Metalness.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Metalness.png deleted file mode 100644 index 865c1fa2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Metalness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:428357348ec0c99bbf3c1f1915d94d408e63e63fbcff2153021aa93b75533500 -size 2950 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Normal.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Normal.png deleted file mode 100644 index 451e7bb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfffa9bab55f8d7f1f314132c762f845d5852a4b5766f6fd66dd90bc50a409fc -size 790995 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Reader.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Reader.jpg deleted file mode 100644 index 11c540b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Reader.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d16064874a6406db9cef8e05ef88f3836b236101c78e271479705066c1d94952 -size 21244 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Roughness.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Roughness.png deleted file mode 100644 index 3a190400..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/TrimSheets-Roughness.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d878813f90006ba1d2bd2a333e89b676a4a6067c7964e8395138f391157b56b4 -size 49373 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Trimsheet.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Trimsheet.png deleted file mode 100644 index 2e1ed100..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section2/Trimsheet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c718abef221f8b457f89bc2caeaff94e4e6bc99e2977337f615237ceb5c44d5 -size 2738527 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CastShadow-Disabled.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CastShadow-Disabled.jpg deleted file mode 100644 index ecde7329..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CastShadow-Disabled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:18db96b1f98551f6a8990f9cdc89cda6445e2b28d7b114c0a29822c78846850d -size 225379 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CastShadow-Enabled.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CastShadow-Enabled.jpg deleted file mode 100644 index d6846e6c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CastShadow-Enabled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70b0b8dcfef391e1b91ad331113d9a38c6d2c3432c7d834e53ae1a75448c4df1 -size 766279 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Box.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Box.jpg deleted file mode 100644 index 9d9f230c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Box.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:254fe7d30ffc1212a2748f2f48299d4859ac3054d43a24ae8fd31b02cda93c6c -size 52562 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-BoxTop.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-BoxTop.jpg deleted file mode 100644 index 16c1a633..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-BoxTop.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b7ad5aff21580549184605b8bf1432440ca256aa29207ea2bb78639a57be3a43 -size 68308 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Default.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Default.jpg deleted file mode 100644 index 879ede68..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9dba7079e0ca42c5a16be818fc977b8f2bef98277d3da7211f63c16478a8eee2 -size 60569 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Doorway.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Doorway.png deleted file mode 100644 index 3e9f1329..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Doorway.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:120e826822f8a30d82495ecbc025e531ae53bcb01b653dc2b04f11cd89f6feff -size 109103 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Hull.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Hull.jpg deleted file mode 100644 index 96ccd805..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-Hull.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e17da2a5361e6fd0dc3cb221fd26be4e9a55c10d8242404f43cd0a9ebfd5adff -size 51537 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-WallMesh.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-WallMesh.jpg deleted file mode 100644 index e3428743..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CollisionFidelity-WallMesh.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b3682d64bb6d49d4d4620d7b7493e60ef1fcf7b431d564bbef0f2c30cfde4e8 -size 84928 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/ConvertingAssets-2.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/ConvertingAssets-2.png deleted file mode 100644 index 1f3e81a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/ConvertingAssets-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4eff1a2a4759dfcf85b8ac469ce737eb5a81191e73445043793a0c87a77293ba -size 4668 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/ConvertingAssets-Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/ConvertingAssets-Intro.png deleted file mode 100644 index 666880ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/ConvertingAssets-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4aca9a2022d60040cb3dfe78c80a1cfbd3cb36cfd45e73146619402ccc879d12 -size 44305 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-4.jpg deleted file mode 100644 index d25881c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee205f6cee0c457f0e20931ee0e4b384d93da7714d19c75b3f25efbb78fe4906 -size 34898 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-5.jpg deleted file mode 100644 index bc1499bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:984eee7d3d7dd14809620fac3069d0144c22411315994b9e664f8702be050d17 -size 22163 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-7a.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-7a.jpg deleted file mode 100644 index 569939fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-7a.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e57023eca6080420251030abbf79c1115b45aba02c4c9cf25d3f39c9fb82aad7 -size 81150 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-7b.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-7b.jpg deleted file mode 100644 index c5782c83..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-7b.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff87666636ae989dc6b90499e16e0b463f9347fa1e936c33dba2c9ce8d72494e -size 244944 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-8.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-8.jpg deleted file mode 100644 index c03165f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bc0d6eaf9ad40e9f1b57496151de287c19ef8836824e3a5d4b26fc688cab3ba -size 11129 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-9.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-9.jpg deleted file mode 100644 index 75936334..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/CustomMaterials-9.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fce0e668c17ab6e7cfdce6ea165ee1d3f2cc92da3107e67571f38f1cb9505a8 -size 13545 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/DoubleSided-Disabled.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/DoubleSided-Disabled.png deleted file mode 100644 index 0698be03..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/DoubleSided-Disabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89a1515d1c5517bf2413d4254f582e066f269b0f51e5f700b9c3b4cc72b3602a -size 272792 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/DoubleSided-Enabled.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/DoubleSided-Enabled.png deleted file mode 100644 index 1dfe634a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/DoubleSided-Enabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a75521936c0077454cf23ba727e0ee6203e253173afd9406c2d09e497ec9a8e4 -size 287347 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Importing-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Importing-3.jpg deleted file mode 100644 index 71113348..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Importing-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c93d9cde8f6142813a1effd003dc3ed00aa5b715649817dfdd4248e3538d124 -size 135575 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Importing-Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Importing-Intro.png deleted file mode 100644 index a275a7cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Importing-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2fd171a9bf9af9c319712cafd00a78d85ae557f409f7615727d63f670628f6f -size 9799 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Overview.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Overview.png deleted file mode 100644 index 120e2fe1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/Overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8459778d446f0de4fe4d5965c9a08337fe8ba4948583bcc153a25f10739c4a32 -size 734039 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-3.jpg deleted file mode 100644 index 52eb90af..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b066085e62c41b8962d901b0db587fcc6642d427d04fefa7b2d77aa05208a638 -size 13485 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-7.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-7.jpg deleted file mode 100644 index a0652a52..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eadc16a07342db1ae2172f21a211bc3d97e1f70450d9ed0201fee5bbdcb354e -size 5646 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-8.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-8.jpg deleted file mode 100644 index a89d26e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6707f45df115a61caab6a673083b589e1a2725c15d376adc82a1019c5370d7f -size 7782 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-Intro.jpg deleted file mode 100644 index 32320165..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SAPackages-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b3cf45519ca765647b4df4232e1044cb0d61e223c70f7dde697b1233730d19b -size 281111 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CanCollide.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CanCollide.png deleted file mode 100644 index c723315a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CanCollide.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:640f67fa4d630e4e4a30dcb8b8f19228b1182d2f69c287a6549eb96c4c3f2666 -size 1515608 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CanTouch.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CanTouch.png deleted file mode 100644 index 7ee8209d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CanTouch.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6db0e23543cbbf4ec7f9aeb6b314aad94838558aca6e468dbf6722959d68829d -size 17223 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CastShadow1.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CastShadow1.png deleted file mode 100644 index d6ad2277..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section3/SettingParameters-CastShadow1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:83971ac0dfaae364b029cc83647bbec16fb29498d308589a2dd65d9093d44354 -size 578080 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ApplyingLibraryDiagram.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ApplyingLibraryDiagram.png deleted file mode 100644 index 86b6984c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ApplyingLibraryDiagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8768ef7f2994a9e18f15b48cb8617801c357166912f6f5cfcb5ae834c4be6813 -size 27594 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-1.jpg deleted file mode 100644 index 64eae365..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d80dd184da107f790b57bf0b06cb870e6c230a2c8a9883a10b434d657404f97a -size 13611 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-2.jpg deleted file mode 100644 index 00500c40..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0021b3a3bea98ad4934dbf73addd6f8c5bbd2302a2e6f036ce080d33ce992ea2 -size 519883 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-Intro1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-Intro1.jpg deleted file mode 100644 index 8147145a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-Intro1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d14d296b450e4e2d3c7dd2f58f87fcf2d3c04faf0293fdca340f4165034546b6 -size 488102 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-Intro2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-Intro2.jpg deleted file mode 100644 index 31f314ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/BackgroundClouds-Intro2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a023c91cbb9080384e05eb75f7847ea92cb298e115f93112bea70ef1585437d -size 507158 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Ceiling-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Ceiling-1.jpg deleted file mode 100644 index acf4d6fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Ceiling-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cea3c260db9e4f82739864fa895a9f53c4da0d682c22f1223180668594c1e24a -size 179583 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Ceiling-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Ceiling-3.jpg deleted file mode 100644 index f0a4f1f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Ceiling-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0d7a7ddda7c34d0de9fb6439195fcc0ec7fe248452bf966e2d12b860059cdf2 -size 173684 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CloudVid1.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CloudVid1.mp4 deleted file mode 100644 index 10009994..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CloudVid1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63252eaab62b36ea83ef14c264d029c80629a11276c5392c8b6a9b0a2b346714 -size 1918365 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CloudVid2.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CloudVid2.mp4 deleted file mode 100644 index 5031c33d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CloudVid2.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:801b893e18b4d1ebbaab614058b85f856e4857bd6f0d1891c13956c80ee71452 -size 4121840 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-1.jpg deleted file mode 100644 index a2371867..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf8ff9eefcda91ca0609d1739ee7ea86ac636ace7d0e0aae9a4cdd172e2e1b2e -size 184675 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-2.jpg deleted file mode 100644 index c712a13d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b56ab9be55e77362510abdff56a3a830823dc66338b67847cb38f827b868a2f -size 188430 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-4.jpg deleted file mode 100644 index 9cd752af..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8af31a48c3ee556869e77e4cb97548715474bfbf764e0f07434b8b91f4675f27 -size 188615 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-5.jpg deleted file mode 100644 index 526e20f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Columns-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8378455311012db02a4caf14f72f9b321b59c6c8a663be9cb578156ff379b26e -size 188999 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-1.jpg deleted file mode 100644 index 40c54992..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c06b3b1bdc1d8ed6db066e5667a6cf335ffc05a6252bc252bc056a0b776a2caa -size 337450 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-10.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-10.jpg deleted file mode 100644 index 0d00c043..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-10.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60fc7867c7793ed2e04f0b12ae6362b2f36fdff7aa1c129702141d48073b76e0 -size 343202 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-11.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-11.jpg deleted file mode 100644 index 25f34c86..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-11.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc6f84fb43a3632d53216e4aae9c8809f38e341ed515684c330b52e046bcedad -size 344278 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-12.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-12.jpg deleted file mode 100644 index b7021347..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-12.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5985ac258faef07286e414b7bddfb5bb8182d51eec61eb929c2ae517498838e4 -size 341531 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-13.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-13.jpg deleted file mode 100644 index abd10f00..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-13.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6478fb48f87d18b86d15090dfd1c4cf2c891821eeea373eaf12b32ed1f37816 -size 345708 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-14.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-14.jpg deleted file mode 100644 index e4f1081a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-14.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ea019ddb23a53d6f68a27656d9e74aae7ccaf75d8796b3b72911ef00ef33d84 -size 345748 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-15.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-15.jpg deleted file mode 100644 index 41853257..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-15.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abea9b633bc4b4a6663497cd0c4ebc26968835ed55e7a0a5b6444a0f5dd3950a -size 347254 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-16.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-16.jpg deleted file mode 100644 index 9a5ab72e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-16.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b35fcd4c27ee4d5f2cfad1c5e2ba61f03b70dfca767fc377b070b75fabee6482 -size 344659 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-2.jpg deleted file mode 100644 index fbd66311..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8bf6b42dc305ac0f4dbd3aa2e639e7fdfb3e42438444961f373c81d68b1ed04a -size 335968 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-3.jpg deleted file mode 100644 index 26187138..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2219fb7066e151942b7ae1ef9eadbdf440ad4a3606ecdceddd81310a10c55036 -size 335034 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-4.jpg deleted file mode 100644 index e5f620c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a3cde3223992f472ad9d24ed26e231231684fa1f3dd380ec2827d0a25ed1cc7 -size 330971 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-5.jpg deleted file mode 100644 index 5827b1f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f5b7053c6a1c473f54640c8db92030fd9c2a39eda77ceaa141af95a5bdf1d88 -size 336628 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-6.jpg deleted file mode 100644 index f185df07..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c90ec854b6bde994dc0379807118c881b9facb7dc2978030af544f4973daa3e8 -size 336512 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-7.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-7.jpg deleted file mode 100644 index 76e1bfba..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:54584b769d7dfc392ba1b141a2d642063ed2413fcc5620e806f6e07b298248df -size 337678 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-8.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-8.jpg deleted file mode 100644 index ffbe65b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1e92c6df5f79696c3ce1b3b1c041d0ca1bba2832b80beea8600e6d209be4df7 -size 339197 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-9.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-9.jpg deleted file mode 100644 index 316cf755..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-9.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:efc4af2de19d633f8e042eb0218dda6c6371129376f990715ed67f3a824107e8 -size 344661 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro1.jpg deleted file mode 100644 index 5d3b6b45..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df3ba8b2abc7229c837909fbb0def352936d29e2d1f4a2ae0823ab790712eddb -size 112460 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro2.jpg deleted file mode 100644 index 0d49db96..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3f8649e3fda8abeb545aeb1943d8726a9baabf6aa1f0611af49e42ec5d2c732c -size 156100 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro3.jpg deleted file mode 100644 index c6678b4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/CombatPockets-Intro3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2148f3276796221defb9e09ad365824f6505702fd184bebed29f68e6015037da -size 77267 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ContainingPlayableArea-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ContainingPlayableArea-1.jpg deleted file mode 100644 index cadb9b9c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ContainingPlayableArea-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dae4cffbc85d77b27df2a36bea9f229cb62dd56e17e441666bf5f44862e548b1 -size 232134 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DeletingGeo-1.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DeletingGeo-1.png deleted file mode 100644 index d8b2d6e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DeletingGeo-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d328319fffbdfe2e01a1d76406814883441fd368c8230f95662d87d900432578 -size 557761 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DeletingGeo-2.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DeletingGeo-2.png deleted file mode 100644 index 065d0a3f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DeletingGeo-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f2ea95369f0c75a0605bfd17c99c0e1fdeab0f47b7c7d49451ba32b06e0f1195 -size 486954 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Doors-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Doors-1.jpg deleted file mode 100644 index 14d256ba..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Doors-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e344b66cd1ef3dc59782b7bfba202ad8c4024ef445a270c77ca95a4ebaed5a1 -size 230264 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Doors-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Doors-2.jpg deleted file mode 100644 index 561929a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Doors-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94b9a2416cb7749f5f703cf3237d5dd7d6eacec6df51c33d207cc753321093da -size 228881 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticles-4b.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticles-4b.png deleted file mode 100644 index e3df8c16..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticles-4b.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63a1ec6d2dac271c80940d9c034aec9fca433b57b5109111a51e808428cd348f -size 9319 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticles-4d.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticles-4d.png deleted file mode 100644 index b3ae48b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticles-4d.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7079f359293791d232866e8196ce29c4105aeb17548da5eb27446018ae7af5cd -size 15353 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticlesVid-1.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticlesVid-1.mp4 deleted file mode 100644 index fb35e26f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/DustParticlesVid-1.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8732fcb0682971980f6e1b719d9e8e5e1b75666efb7b4355e2572704a1f040f -size 954102 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-1.jpg deleted file mode 100644 index 655d9aaa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c66a9c679e95f50bd4b54c292cc223724eb19ae429334dad5de02232970cf4dc -size 303814 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-2.jpg deleted file mode 100644 index 49c4a8d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:623383eae59d137988fda6add8d32dadf4e63009938c9080744b71f255464dc8 -size 317904 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-3.jpg deleted file mode 100644 index 50d2b872..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ea7924d8e1f0ccd992b1f40bf27e85d666792c3d78b91dd7241c9ea5c80c1f9 -size 324455 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-4.jpg deleted file mode 100644 index 4db84fbd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a89912b562e53d853682d2827812175912343d77950dc610999877dc35f3ed4 -size 331079 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-5.jpg deleted file mode 100644 index 50ac8ef2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c628d17f8a6c67f6d406fb3a04e41c3a4630824b582fe82a871864f71a7b27e -size 329036 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-6.jpg deleted file mode 100644 index a88da5a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5d12a2ae0684dc6c0e40474481cc2796fe4f4a9815981022f2be0984481f8e0 -size 201445 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-7.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-7.jpg deleted file mode 100644 index 99b30bf8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:96f3c2657bd3e9bcae77031e9480e966440b5d12b5fe4fb43fcf3bb84e66257c -size 198249 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-Intro.jpg deleted file mode 100644 index 7fa39b20..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Floors-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e5deb2974bf30d758a2840b03e69ebe9af73a7170b4f488a4146c37822d562f6 -size 51171 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-4a.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-4a.png deleted file mode 100644 index b14dfdee..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-4a.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93b677088a5d0e9383b076fb150987abfcf5b6440206a7660d99b4f056b1a02a -size 4587 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-4b.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-4b.png deleted file mode 100644 index 69e9bb07..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-4b.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b65472a3436c65fa7319955ff72e0970596687c8535954044a3b335074e0112 -size 13313 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-5.jpg deleted file mode 100644 index d9fa7144..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/ForegroundClouds-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6838d03a8ba5d44d31ed18cc5a2466cc07a435d91e792024ff8e4787ae6c261 -size 203529 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralColumns-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralColumns-1.jpg deleted file mode 100644 index d9aba941..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralColumns-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eac21f8e785e6f8ec8aea257e3b7f329f534cee4d012132b00194174674ff4fc -size 290370 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralCombatPockets-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralCombatPockets-1.jpg deleted file mode 100644 index e22de086..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralCombatPockets-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc7467996d15f04fadacc369a2607b304184b2d09bc1da4636ec27e274f996cd -size 274812 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralCombatPockets-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralCombatPockets-2.jpg deleted file mode 100644 index 6653e102..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralCombatPockets-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0191e431231d41cbe7e5be3e1f594ee308896c71bc98c35bbabb8b7fc17864ad -size 274585 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-1.jpg deleted file mode 100644 index 34ce27f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e9ff0e74e047d1cc261f04394f605d6bcf874ac805c75142f78a80b3964d891 -size 235824 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-2.jpg deleted file mode 100644 index ef3374cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a50c4b24ef58a3533dd4e920cf833f96cd313013b24242a7ea7e02924a79d940 -size 250608 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-3.jpg deleted file mode 100644 index ddd62f4b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48ba18caee7d57ce070c003bdd1c542a55b4ad99c0022a94eb2b7b5ce8e882ef -size 248732 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-4.jpg deleted file mode 100644 index 39dfbced..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1599bd18e5f5211ed79dc4b43ca9dce4ef4198710beeefdf0e6d1a0f95120628 -size 250240 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-5.jpg deleted file mode 100644 index e72872e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0179044636bed7869783de231f192e9cc4732192982c5070d4257df6286e5210 -size 249335 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-6.jpg deleted file mode 100644 index d725a5c4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralFloors-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5732b04be66048b28d90f6ebf2a2ea2292db8736ade6296c09fccc2103d730ab -size 262635 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralTowers-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralTowers-1.jpg deleted file mode 100644 index 161c8f15..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GeneralTowers-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:746a024ad22be3b14a38e66b3c39e5c8d3b9ec12a6f8aa6b379f90486e3bf80b -size 281415 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-1.jpg deleted file mode 100644 index a88dfa36..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27cd2626dedd0dc4e171bbbd10a59e9882fb2516547a3c7b237f45dbf549efcb -size 234609 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-2.jpg deleted file mode 100644 index 85bf7fd4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4b6dc262f58f91bc2db5f344de892d4133a4a78501d305a22f6b1bbc707f082 -size 225712 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-3.jpg deleted file mode 100644 index 20c6034b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a97130e520f4660cf50181d062e3b1ba6180adeb13ac3a27188ae6a7589af65 -size 227638 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-4.jpg deleted file mode 100644 index 3adfda1a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/GlobalLighting-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b439993ef271e13c1b5c5552475baa7e4503e2f16ebd03a036e24661d7447a4 -size 236763 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-1.jpg deleted file mode 100644 index b93f24b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:525fde2ee2d748960e3eae2991135bae3f1d5f639a95c5b2f2ad144ded3203a1 -size 234055 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-2.jpg deleted file mode 100644 index 05521093..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a59ae400363cd0a5db59ccde2387856374b21bf9558696e776058104e45e6bd2 -size 240032 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-3B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-3B.jpg deleted file mode 100644 index 14b3855d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93c6e6e7ddd5a0ee55a5560c0a1bcdf3123343dea03a24e809e9f711417333de -size 227450 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-3a.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-3a.jpg deleted file mode 100644 index 8eb951fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-3a.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f13ff8885f190edc651f2392a28d8593cd5cfdba8d3548fb4460a07dd183dadc -size 233158 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-4.jpg deleted file mode 100644 index ac0a09bd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdbbae9c01aca59676f7e99606ba0a6ba8080c787051a6f39f455f06d65ef0d8 -size 227055 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-Intro.jpg deleted file mode 100644 index 69e1d748..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/LocalLighting-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4877c870bbc40f9db5fe994e63b1d9152de67d0a4f8a4d7080ed5d4509063d2 -size 254926 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-1.jpg deleted file mode 100644 index 83078edb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb342e471e3c81cb5a145b32774ca9534f4359eef24261935fc6207ee376f68c -size 152633 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-2.jpg deleted file mode 100644 index dc899f46..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33046b2a27b6fbca63fb5c424d64cd0d64efc298ff7188977f833e089af77cb9 -size 154516 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-3.jpg deleted file mode 100644 index 1cd20518..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:994f3359684ad5a70e9bbb47a3a14b2a8c44eca739c84e2e85bed142f3a17cb6 -size 150591 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-4.jpg deleted file mode 100644 index b7450fc5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overhang-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af7856b0080631de1d6bda2036b6335e018ca89c5c590c1d1ee1a8397ae4ec24 -size 153326 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overview.png b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overview.png deleted file mode 100644 index 5529dcdf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Overview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e9096414d74263c916a17a9ad720fc15e354ce9364b73e9750690a2241ee78a -size 948549 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-1.jpg deleted file mode 100644 index 4e78c3f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:139c07660c854a638d50c684e24effcc8b372af4d69913f9cca8e85898305ec7 -size 335031 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-2.jpg deleted file mode 100644 index e714a452..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b1f7b6c7cd0190586bb7cc5c6aa133f99a52f617441073ef05d2364272be29b4 -size 651890 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-3.jpg deleted file mode 100644 index d0520bec..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bae0878d65439bcfec2af671aee06861754acb89da3bc93da2e69fa1d90a717a -size 343449 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-4.jpg deleted file mode 100644 index f27b598f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30c24bf10adbc6e3e8a2b3ab8472aed1931f9033eba096eaaf63e03d6b55b240 -size 350512 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-5.jpg deleted file mode 100644 index a80176d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66be7bf7c47efc1bd9fad1bbdb5dfb3e65bc0e5638835b7cd9dbfe7be3249641 -size 349771 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-6.jpg deleted file mode 100644 index 5b7d845c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ffd213528661d578dcf082a605218a935c70835fd55347b7c22a20ca9aa2808 -size 348612 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-Intro1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-Intro1.jpg deleted file mode 100644 index 882939f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-Intro1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cc1992932275dfc6e5fd691babe73ff969e55a8de2af2b4adf29c71953040b2 -size 172594 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-Intro2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-Intro2.jpg deleted file mode 100644 index 5d877f20..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Perimeter-Intro2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f545780a91c57a0fac0dfb48f17cf97cc9a81c81bcfe318e2ed09cb94efb067c -size 135807 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-1.jpg deleted file mode 100644 index 7f34ae83..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:765ca2e04c043e6c9a341b70a3fc150f3339bca350613a94f164c8b076787c68 -size 195978 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-10.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-10.jpg deleted file mode 100644 index feceee55..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-10.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dc4da1f8e6236d923fb0be5ecec1c1ea6f80685acd2ab32db760bdabf3f90ba -size 309370 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-11.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-11.jpg deleted file mode 100644 index ab4a082c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-11.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af9ee01118798bacd109d5b73d114168dda9d318de7986a2698bf5d319536aa1 -size 196117 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-3.jpg deleted file mode 100644 index 3f4ca109..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04cc73304b4c585a6566be36e0a5cc7f6fe72ca21d964b6b7241c7de747c56c5 -size 194864 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-5.jpg deleted file mode 100644 index 41aa777e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f8399cc5730b13e2b9c1a5eb433b19777e9113ec562e8aef034262d9a3f3f8e -size 196470 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-6.jpg deleted file mode 100644 index 49764d66..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a573555ae6d5a6e450d0fcfa258643a4e85a1ffb5955ceefc202eb513e78a01 -size 174920 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-7.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-7.jpg deleted file mode 100644 index fa6ad8c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8a33f19a70471130883c7a0fe986b26874a5c820fc41566a06771478986f93d -size 179867 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-8.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-8.jpg deleted file mode 100644 index 30f9c394..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8166510afac9d9a71644487cf71e64e2039dedf9fb64054a2d833f40ffe5a9d1 -size 189442 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-9.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-9.jpg deleted file mode 100644 index 8edd6736..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Planters-9.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a3862588c1906d0e13cbd26fd1a2741f3065219bea99a9ee61168d077f8c1d6 -size 288348 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Roof-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Roof-Intro.jpg deleted file mode 100644 index 8be32d4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Roof-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:056a9b5f8cbd9726c15d55ac57ea65fbf88146b084ed189f2ccad8c8f092d814 -size 172413 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-1.jpg deleted file mode 100644 index d6dd3a52..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:794e54f48bf48112adec15415a8eef552f6d101bb4ef990b945a288432738c7b -size 196337 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-2.jpg deleted file mode 100644 index 3c4c5650..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:372ed2c6182d55ce7b7fba746ef7f28cec79f1ace4ae9212e67166e3ef774d60 -size 195842 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-3.jpg deleted file mode 100644 index e138b236..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a9bfa763da79aeeff52712ec34e94cd36fb49f911fea57ef7a651520f56ac5ff -size 197917 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-4.jpg deleted file mode 100644 index 55645d9d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a82876471279a70f2dcc0664be58865a0b46fc9a1173370bb8e00f83716dd0fd -size 198681 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-5.jpg deleted file mode 100644 index 8b4dd0d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dd874d6c0e79729dc690fecbbdffb5663d590f80ab6607c7aa8d2cfacf75df4 -size 198049 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-6.jpg deleted file mode 100644 index 63286f0b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac712615acf5ba1763e4a292e37bdb0255d8d8001f6ad27eccda46bf020104d9 -size 197794 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-7.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-7.jpg deleted file mode 100644 index 348e04e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a89b824e471a38dfb9b4800f705a5cf5dc186808aa37efb6329f7cdcf0e3c05 -size 197433 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-8.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-8.jpg deleted file mode 100644 index 84ac1b8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Skylight-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:296a3799f2e87014428fc7c08e2f255e55419f9262dce466f56dbb4a1ecfe174 -size 196720 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-1.jpg deleted file mode 100644 index 9134c778..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8407907b093f61e0832149d08b2e1852cb5796f7c3b4f0e7cbfd8bde879615f7 -size 328268 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-2.jpg deleted file mode 100644 index a1f7ddad..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4406b2ffd566c6aa3d8d08fae972d189ed6dc4896fec5bcc0c43db1272b4649e -size 326668 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-3.jpg deleted file mode 100644 index 489b4135..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:713117e2b25b8cb7fd9672e35ee971d524ff504c1b25c06437b1a98d7e58ed49 -size 332561 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-4.jpg deleted file mode 100644 index adb16e35..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpawnZones-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f4bd8bd77c9f7d30e1fba526e674773519ff75f31caadb0aa6a5cce209062314 -size 332427 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpecialEffects-Intro.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpecialEffects-Intro.mp4 deleted file mode 100644 index b66f90f4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/SpecialEffects-Intro.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:676b003e789eb84fd32d1d2d30645ff7d00d808d084c34451708907977aef4a9 -size 4636810 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-10.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-10.jpg deleted file mode 100644 index ecaaa818..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-10.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e92d8586343ee13d92d812181cad76d1b80b9c394630ca58a8eac372707cc5a -size 174533 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-3.jpg deleted file mode 100644 index 2ee17ada..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfef0ed29a68006b1372455e8a49bb319055c942e703fbeeb9bb88442bb0a2da -size 25175 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-4.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-4.mp4 deleted file mode 100644 index 0c301c58..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-4.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fc0b70b24c1107d53bd2981db1b8c0c95b4bb73a20763ba1444d5ef22ac5541 -size 23373100 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-6.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-6.mp4 deleted file mode 100644 index 64f06bad..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-6.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:260f4dc916a946454e7bd184e396c9ca20061ac5da6ff3c5d676ba12e1bf63b3 -size 43178132 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-9.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-9.mp4 deleted file mode 100644 index 95498b9f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Terrain-9.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cdddb66f807e32bf42bb86b18f2f2b819eea30c79f067f42421f0ee567bee4b -size 41884001 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-1.jpg deleted file mode 100644 index efc71c2c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0407d1b3c6e5d71266626210ec9071a9f0946b1ca483bfc278c2586fd947c159 -size 145769 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-2.jpg deleted file mode 100644 index 17338e55..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34af5cf37bc64d49572e8d0af380685d1624cb735b1acefba91d9658705772fa -size 140754 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-3.jpg deleted file mode 100644 index 77872516..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25f0d54b2fc1377402b3d44f74dbd2600cb2eab3c93ed06e37e80bd4cc1c68ed -size 126925 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-4.jpg deleted file mode 100644 index a0d763c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df07b79d3b144c015487f0af82a35c186178c5861b5d135b44ff4b1cd95bd9a1 -size 137709 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-5.jpg deleted file mode 100644 index 5e0da9f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e927f3b27712ed161679a47fef22e4a1a23374b99a669f226c9c2beddbf287d -size 223104 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-6.jpg deleted file mode 100644 index 0086f9f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad45d9b2f372cd329287e65fc0cc2233f2509179b4f8b04d45bfa277d607ddc3 -size 231298 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-7.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-7.jpg deleted file mode 100644 index 25daedf3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-7.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33805461e9eeaa33ab52bf64c4c4f66ddacf5ae7e1daac94a885b1e6427c669b -size 220268 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-8.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-8.jpg deleted file mode 100644 index 3a3ff5c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09eccce1e65e5e8da22b85b82d2865b76709ec4bb2b7063583ef485377fbc451 -size 225190 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-9.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-9.jpg deleted file mode 100644 index eec61579..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/TopRoof-9.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23b6157735fff5c54049d135ac2c4345eccd946e22903ed44b6ec44605c59bfe -size 224212 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Towers-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Towers-1.jpg deleted file mode 100644 index c56917ae..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Towers-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e69b82d5541896801ab101c6a1457a2590b7f2ff01b962b2a62905188baea09 -size 183501 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Towers-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Towers-3.jpg deleted file mode 100644 index 35d07d8d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Towers-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28bc5755ca76630079997bdf5e1450ae6a69ad94019b64f5e8917a6e13e82d01 -size 187937 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-1.jpg deleted file mode 100644 index b705c5a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f56b3db6cb662d59cdbee7312fe66103882d55a3399e6886af66d438b6d035c -size 151488 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-2.jpg deleted file mode 100644 index c25d754a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4f6766959d1f39f35c46fa3df65aa2fed432dde39357a1e7ea9206a891f5cb0 -size 152209 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-3.jpg deleted file mode 100644 index fd9553a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a02cdff1115dd294c096c0cc6fd02db808a0df381f1230d1d10a781c64e3cef3 -size 158450 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-4.jpg deleted file mode 100644 index f65021fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c3c0f301bf150c6e419fb0f6b46e08101ef7b74496a889f87661dcbe97ca754 -size 157016 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-5.jpg deleted file mode 100644 index 3a1f7d96..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section4/Trim-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49803876c8de8b3398ba368af98d6a1c26e7024f99d760eeb433a371644e5351 -size 158525 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/LayeredTransparencies-Left.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/LayeredTransparencies-Left.jpg deleted file mode 100644 index 4649c085..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/LayeredTransparencies-Left.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2dd7786f7763b3c50e0cb73fd3244916ddd156d497ab70378869f148f59adfa6 -size 239056 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/LayeredTransparencies-Right.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/LayeredTransparencies-Right.jpg deleted file mode 100644 index b9bf67ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/LayeredTransparencies-Right.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:847aa9812eb34612850e5b3d80d0d41243eb4d020582a299e04254f46b7e865f -size 524870 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/OptimizingGeo-Towers.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/OptimizingGeo-Towers.jpg deleted file mode 100644 index 30716c76..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/OptimizingGeo-Towers.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0331dd5e5cceb100c42f56565efd5572b0663d766a0a8c575ecce2421638701 -size 280896 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/Overview.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/Overview.jpg deleted file mode 100644 index 9f141b97..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/Overview.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1663c9caaa5ad9477884c14276212168aef506f26da7ad9f7f33c2994b8ff928 -size 87204 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/RemovingTextures-Firehydrants.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/RemovingTextures-Firehydrants.jpg deleted file mode 100644 index 9c87b3b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/RemovingTextures-Firehydrants.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af29f637a5a36f7f59d0e0821abbb6b034dc119350145dce30b465350961e4d1 -size 102972 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/ReviewingParameters-Disabled.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/ReviewingParameters-Disabled.jpg deleted file mode 100644 index 3419abac..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/ReviewingParameters-Disabled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fcd95b4b5156a21c91dcf35a3c3b0cb3af95fc5bc7dcda3d3c62913374a4a247 -size 514572 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/ReviewingParameters-Enabled.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/ReviewingParameters-Enabled.jpg deleted file mode 100644 index c5d93494..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/environmental-art-curriculum/Section5/ReviewingParameters-Enabled.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e70066630b3e8d3e10ee9ba256dcebd3ca1ea780449aeb3168a2f5fda46b9b33 -size 512398 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/completedFadingTrap.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/completedFadingTrap.mp4 deleted file mode 100644 index c01fac26..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/completedFadingTrap.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:770b0440d096b1c66a0edf82e7c553aef116916f555c6ec7e8764db135d9b75d -size 572771 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/forLoop.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/forLoop.jpg deleted file mode 100644 index b04e8bf8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/forLoop.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e552343b6355dc830ffdb7518768e8642751003c39d13235dfb54ace1b349a71 -size 73698 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/multipleFadingTraps.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/multipleFadingTraps.mp4 deleted file mode 100644 index 5d2cc9c1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/multipleFadingTraps.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6d0401295d3d18f2fb9b6bcd4b7e13c3a4c9b5df0a8ebbc1541a42c77c37195 -size 1304119 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/partInPlace.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/partInPlace.jpg deleted file mode 100644 index 47bc29a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/partInPlace.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:862176cb1091c75c7f80ad0666e11a3b37790c1b7f3f55dfd5a6f6e524c50478 -size 340662 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/scriptInPlace.png b/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/scriptInPlace.png deleted file mode 100644 index 7ceefe8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/fading-trap/scriptInPlace.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7cb77b5cb21937a625a23d12841a31fcecd3f9d45f6b5f3c475bc5ae426178c -size 6220 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Defeat-UI.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Defeat-UI.mp4 deleted file mode 100644 index e194ab25..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Defeat-UI.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca9b7eee6d023e98f758cd2c2d0767dcd2cd8aca32cc0b97007f766e320a3424 -size 490713 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Large-Prompt.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Large-Prompt.jpg deleted file mode 100644 index b9d31703..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Large-Prompt.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:384dd9fc862de2a58726f75b92c196a6e5fc87111d9613504057f1ae4a48dba0 -size 176533 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Placeholder-Prompt.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Placeholder-Prompt.jpg deleted file mode 100644 index b562949c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Placeholder-Prompt.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d77df43c4006cea9550e2ca93321be975a62bba81084142fa4fda0d493a728c -size 173832 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Rounds-Diagram.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Rounds-Diagram.png deleted file mode 100644 index 4e202cc3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Rounds-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ea61c8bf077b7e5cc088d6e399eeeee1c6175631e8bb5057ef1338c17218cdc -size 105457 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Victory-UI.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Victory-UI.mp4 deleted file mode 100644 index 5af7142d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Adding-Rounds/Victory-UI.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7441cb3c9f905e56e80fe1c88bec2887947f09211da2864f9208b1a19265cd98 -size 484440 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Blaster-Behavior/Custom-BlastState.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Blaster-Behavior/Custom-BlastState.mp4 deleted file mode 100644 index 9c5b61b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Blaster-Behavior/Custom-BlastState.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e59a24bbb4eae7407e78f7a4728967c864dc3d3df763d2d37dae70aaf7d034d -size 1387729 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Blaster-Behavior/Normal-BlastState.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Blaster-Behavior/Normal-BlastState.mp4 deleted file mode 100644 index 42387ee4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Blaster-Behavior/Normal-BlastState.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:819b1eee7ee662a2e9011731545d8d1b74286ab3173a06d216876e1d6af2171d -size 1002904 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team-Players.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team-Players.jpg deleted file mode 100644 index 1760c0a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team-Players.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c29bdadd02887d462e3fc0f212f2740c3618c554136eb98a2e109591868abe0 -size 200661 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team-Properties.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team-Properties.png deleted file mode 100644 index 0ddc80eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:161491f94b94f90aad40f9ddd1a67758da2edc610433558f106137b5a936612f -size 34377 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team.jpg deleted file mode 100644 index 895d48ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Green-Team.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d498161b62e03fa814cf7bc19d9919e1213e13643f584d989fef59bf50d34c2 -size 23390 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Intro.png deleted file mode 100644 index 54dae5b3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6e3c9a68ad68cac93f318c670a66c93c80c4a0418f73d3e0f181d29bedacdbd -size 1269969 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Leaderboard-Indicator.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Leaderboard-Indicator.jpg deleted file mode 100644 index 657e3c18..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Leaderboard-Indicator.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:14b6253c4b737bdea02a02ef77dbb779cdd0f6da3a11e8acdaceb0217ba63880 -size 104147 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Name-Tint.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Name-Tint.jpg deleted file mode 100644 index 730fce5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Name-Tint.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cbed6b1a123d4857e97314e105d33ae2c4b90a131df9fc7afd85954e77bede9 -size 254498 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Objective-UI.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Objective-UI.jpg deleted file mode 100644 index 7481c5d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Objective-UI.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f754fac53bb1266863c645fa679e7797d52e6e0cbecd6d7617ffd63c684c22e -size 175765 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team-Players.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team-Players.jpg deleted file mode 100644 index b5510e55..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team-Players.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2584d7b7ba53e42322db21e21dcf3615e1363070a682e1e670ddcd3afa0df8ae -size 455450 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team-Properties.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team-Properties.png deleted file mode 100644 index 2e165786..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c264695107cbf19e4d5c163af40acf726ecb8495ec5863285762cb7214741c49 -size 34553 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team.jpg deleted file mode 100644 index e6bc26df..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Pink-Team.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89225126d841b44cfc0c65cae747860abf8f2b99ad917c6dec06cc64b7808edf -size 26417 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Player-Indicator.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Player-Indicator.jpg deleted file mode 100644 index 944ea358..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Player-Indicator.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0039c6d4b7b50cc338731c0453c9267ab6c873743b70410f809a74a5de14178a -size 62366 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Team-Indicator.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Team-Indicator.jpg deleted file mode 100644 index c8067037..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Creating-Teams/Team-Indicator.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72b4aba049f85b438fe3422aee13166d5afb1f6ffff4aa0a26a92502516fb4be -size 255873 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Detecting-Hits/Reduce-Player-Health.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Detecting-Hits/Reduce-Player-Health.png deleted file mode 100644 index eadaebb5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Detecting-Hits/Reduce-Player-Health.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3e6d4f50631ec4170de891cca526d5e156bc7203e03a7aeb3fd61060229ff41 -size 1036086 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Detecting-Hits/Two-Rays.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Detecting-Hits/Two-Rays.png deleted file mode 100644 index 62309d84..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Detecting-Hits/Two-Rays.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bcfcdb671569b46b8779b25484697cc8a9da20ccf6e1f8a70e1c7477bc1d1480 -size 759900 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Find-All.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Find-All.png deleted file mode 100644 index f4afb551..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Find-All.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b7bac2927301a4ee3af93c3a9bcc58506b8bdfaf78326d29d477122ac2cb317 -size 146991 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/First-Person-Visuals.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/First-Person-Visuals.png deleted file mode 100644 index dbced655..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/First-Person-Visuals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c69b0e50a0d287117e1de73711c123534ddc7b465c4fb81adc49b0ef0d1861fb -size 949284 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Neutral.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Neutral.jpg deleted file mode 100644 index 56f5fb4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Neutral.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa21fc16805c4284522e4318149a051b7cfaa43ac78e509c16f0dbc1b5488a54 -size 1161714 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Reset-Character-Button.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Reset-Character-Button.png deleted file mode 100644 index ada8c122..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Reset-Character-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e972afe91dab243279a6a21e1d192738258c542e70be2c92923a507ee03b25a5 -size 263691 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Respawn-Screen.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Respawn-Screen.png deleted file mode 100644 index 9840251f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Respawn-Screen.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6b3a6a84d66515faf9132399b726bddf5c297d676549ae3c70ab2638d402a9ab -size 700388 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/TeamASpawn.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/TeamASpawn.jpg deleted file mode 100644 index e86254fd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/TeamASpawn.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9adb5b4677b0b427db50d0f6800aafec9e0ddb1f84c4430aa398a459b6c3b89b -size 1454333 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/TeamBSpawn.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/TeamBSpawn.jpg deleted file mode 100644 index 2844a39e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/TeamBSpawn.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b93877354bd13241662d1278b94955578bba5f09f8fe9f9543169ba44ec823a -size 1465475 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Third-Person-Visuals.png b/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Third-Person-Visuals.png deleted file mode 100644 index b1e1bbe7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/gameplay-scripting/Spawn-Respawn/Third-Person-Visuals.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ca4a35aa7c21b9346b36a4b992e5b5f208e2324f13907ca71120b61e6821700 -size 506854 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/CFrame-Render.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/CFrame-Render.png deleted file mode 100644 index 48846485..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/CFrame-Render.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35fef379791d4066cfb293954949ba3e107f4527311536ec11b7c3c1c4e38ec9 -size 304235 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Client-Laser-Communication-Video.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Client-Laser-Communication-Video.mp4 deleted file mode 100644 index f6ee09a5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Client-Laser-Communication-Video.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2928e54772a35e13ae6ce38df6f69deb512019270187de30205e1540d9bcefd8 -size 2891900 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Character-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Character-Hierarchy.png deleted file mode 100644 index e08efaf7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Character-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7664e35a39c7f72ae205a45241518185bc5df3c7cfd6c83789c6677a6aa8bd26 -size 14811 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ClientLaserManager.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ClientLaserManager.png deleted file mode 100644 index fd7cae52..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ClientLaserManager.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df2fcbdae68eb9371512015d5940adc4256abf669fd2dade85016816351a1e2a -size 6220 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Damage-Character.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Damage-Character.png deleted file mode 100644 index 69417803..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Damage-Character.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3db8878c93624cd1ae27c377e7fd071d38676f6ff3551244f9730efc89ac3aa8 -size 3929 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Events-Folder.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Events-Folder.png deleted file mode 100644 index e8287f5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-Events-Folder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1d5412544169890e12b4fd9e5c7a55af8673d0a2fcdf51204267861352e7ceda -size 3578 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-LaserFired.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-LaserFired.png deleted file mode 100644 index 968ccaa7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-LaserFired.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e090b9d982198b62c9902c2751b3840cb90bdd6e1ccaa59f8bdec908844e7fd -size 4473 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-LaserRenderer.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-LaserRenderer.png deleted file mode 100644 index f25c79b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-LaserRenderer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b229dd9c3ee01f2c9e7d20a8d896abdcc020b0ad73d318b13ed770f65e8a4bde -size 4789 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ServerLaserManager.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ServerLaserManager.png deleted file mode 100644 index 448c3abd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ServerLaserManager.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f17694f5abc6d6ecfe3c9952a37b62f85469894bd9494dcc295449196a914384 -size 4777 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ToolController.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ToolController.png deleted file mode 100644 index 1af4d4f2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Explorer-ToolController.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8c1cf6fb0dfc9bca5c720a0a077454d46068a52c96461402cce371b95903c81 -size 4597 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Introduction-Video.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Introduction-Video.mp4 deleted file mode 100644 index 294343ea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Introduction-Video.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d9f7e42c71fcfe5ea2d5989b59789efc65bf5f032d64abd64aa5f4d826121e1e -size 6698912 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Laser-Render-Video.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Laser-Render-Video.mp4 deleted file mode 100644 index 247cbe8a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Laser-Render-Video.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e26533b9a6b4332b1ecd35adbc271c2768c7d5dac8f3e3a5887973fe12b22101 -size 887057 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Output-Video.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Output-Video.mp4 deleted file mode 100644 index 10882d36..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Output-Video.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65293489128e2c9bbca74dd1792c4b93c1ed1ae3eb6d84b2d5b068392838bf7c -size 3215705 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Ray-Diagram.png b/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Ray-Diagram.png deleted file mode 100644 index 7daa2cde..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/hit-detection-with-lasers/Ray-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4bb5e0b78cfd36838c5bf8c7351c36c44b838aba01e2dda82b0ad02fdb80cdb -size 84611 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-collectablePage.png b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-collectablePage.png deleted file mode 100644 index 77e147fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-collectablePage.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5599372f72be868e78973c0912af0b8d7f174556619b4a44f4f111d3b8959e88 -size 9324 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-collectables.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-collectables.mp4 deleted file mode 100644 index 3ca8547c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-collectables.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2df347cbe7750e19ad6fca9b42c4d832bc3f0dcfb9d4ba83e87b66ae7e4991c5 -size 441619 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-createFeedbackSound.png b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-createFeedbackSound.png deleted file mode 100644 index 427bc51d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-createFeedbackSound.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9720c3b452cbaeceff3a574bfc49de9a08cb72fe84f15f80a0ed85a959bf18d4 -size 6676 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-looping.png b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-looping.png deleted file mode 100644 index 93caaf85..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-looping.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ba399645fbcde41ed00958a474a05c1cf65a5a8f95e0c2b2f8bba49b4b09447 -size 6101 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-rollOffDistance.png b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-rollOffDistance.png deleted file mode 100644 index b806d897..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-rollOffDistance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4297d944adee352b9fcab2c2d8aca1b77485c33c73cbe7ec4d2e3daeb0fce02e -size 4651 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-rollOffMode.png b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-rollOffMode.png deleted file mode 100644 index 1f961ffd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-rollOffMode.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:350175771408b3e96b019f68cffa13a4de30100e13551887bbcf39be3f26688d -size 5167 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-soundID.png b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-soundID.png deleted file mode 100644 index b1be7b41..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-soundID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fed308b0b382ed5f61c144a1e2b1286b417c4367391b58d3a7a6b1045cd8a8f3 -size 4836 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfall-web.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfall-web.mp4 deleted file mode 100644 index a9576dec..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfall-web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce8649f330091ace2fb55fa4b24be57bc8197e67b7310348d267ae4129647883 -size 8433429 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfallExample.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfallExample.jpg deleted file mode 100644 index 899d4030..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfallExample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74eff76213334f9a54ef86a2c2597476272950ce55d361dcdc184e3ce02f3699 -size 465501 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfallSound.png b/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfallSound.png deleted file mode 100644 index b512c9e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/in-game-sounds/ingameSounds-waterfallSound.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8d08ebf3625d62b2c9e4e742990d6ad5585395f1c23ead57bac9be401085dc0 -size 7577 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Handle-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Handle-Demo.mp4 deleted file mode 100644 index b9a5ab45..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Handle-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a2308cee0704e81c667a0884100297122b480ef286d4b907f2d91e1dee8e527 -size 2278985 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Interactive-UI-Final.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Interactive-UI-Final.mp4 deleted file mode 100644 index 81e95ef1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Interactive-UI-Final.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d868feebfb87c9798f9862da6154a11b3e9ba2124f00c6b7fda9c8d9af6b321 -size 8631576 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Intro.png deleted file mode 100644 index 6e1d8829..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2390d6b7c481cf136bf74aacebd1727e54edd102291a4458aedaa7b5b2312ea -size 225664 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Link-UIDragDetector-BoundingUI.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Link-UIDragDetector-BoundingUI.png deleted file mode 100644 index 7a08c9e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Link-UIDragDetector-BoundingUI.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8839d0cfab4477361194817e09014d3cd36a066e4b9c07aaefa50a7aceeca4d3 -size 94883 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/ReplicatedStorage-SliderController.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/ReplicatedStorage-SliderController.png deleted file mode 100644 index d73eb081..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/ReplicatedStorage-SliderController.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2aa86d779b8b774eafcf19fc8085b9e6b82e0790f17354142469f5a12f23419 -size 50588 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/ReplicatedStorage-StatefulObjectController.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/ReplicatedStorage-StatefulObjectController.png deleted file mode 100644 index ab9600ec..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/ReplicatedStorage-StatefulObjectController.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1730ad5890f9fb7e9b9d2ba5ca3dcd74c63b86b8935508962c2d25b95d2f4ebb -size 50039 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Components.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Components.png deleted file mode 100644 index 43a18538..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Components.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:821d4fadee3c1d5fb18c0366d303733983bed530f952637a6aaf68e19423c957 -size 240692 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Finalized.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Finalized.png deleted file mode 100644 index c99d9e9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Finalized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82240cfb8e90748438dd27611a6d449d94da9d083fb2fc1789f6aa084eb04de7 -size 235256 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Initial.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Initial.png deleted file mode 100644 index f77b14a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Button-Design-Initial.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b21d274d17c21ce85b4b98b08cd829d312ba0c6b84159a28faf952018ee3e1b -size 210251 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Handle.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Handle.png deleted file mode 100644 index 2f615b4d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Handle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32adfe5b7c0968906edbea7e0b7994810a68ec9a8b7bf3dfa6c7aeab0e1476a6 -size 188118 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Icon.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Icon.png deleted file mode 100644 index 7c62ea37..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6744c9792fcc0a22a8c8a7e3d73f0004bbe99c850141ee68a479b755f29ffced -size 182449 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Initial.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Initial.png deleted file mode 100644 index f2fa7c08..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Initial.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fd4abacef36739120d2267075aa0e886c6d3d86b9cf54e01f45c110d23417ac -size 190133 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Inner-Fill.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Inner-Fill.png deleted file mode 100644 index bb20eb7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Inner-Fill.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0c1f2a1e02cd0d0d19806ce4f999f963ed9c7b2e482ef29fa784cd03d61aa44c -size 187794 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Measurements.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Measurements.png deleted file mode 100644 index ab6b21f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-BackgroundVolumeSlider-Measurements.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce17da28ef6602e7d4cd6a551cd46b8f7b238845192a3afb5df8c646823eb185 -size 153674 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button-Finalized.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button-Finalized.png deleted file mode 100644 index 84a434e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button-Finalized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98f4968e1af0ec6b2b423139739f4a424dc291677cd7ecb76f38e6337b0b3200 -size 153565 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button-Initial.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button-Initial.png deleted file mode 100644 index f376c072..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button-Initial.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:661279a946dc933509d9cc6cd029c88e3cc75c1a3cc3664331895a36f23a0c79 -size 175451 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button.png deleted file mode 100644 index 076467dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Close-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ab091e6aa2f54cab6289ca9e4a2e086b450eb2efedec9759eb78b6a3d7e0e280 -size 152777 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Components.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Components.png deleted file mode 100644 index f33634eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Components.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86c734657d80b54e0ae663ba98bd7fb90dc8d07ea3d3dcd06ff3c81066e77fc4 -size 153164 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Parent-Frame-Finalized.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Parent-Frame-Finalized.png deleted file mode 100644 index ed8978c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Parent-Frame-Finalized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:571da30eda5990c63323097cdeb2b2bb2fc3664c8eb11cadb30d22284ee445df -size 157790 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Parent-Frame.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Parent-Frame.png deleted file mode 100644 index 15899dc1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Parent-Frame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ceb886421d6579ee396727f5554aee03af9e6f69148ee31b34cca94f9325e2c0 -size 157772 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Range-Frame-Measurements.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Range-Frame-Measurements.png deleted file mode 100644 index 3a2fe605..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Range-Frame-Measurements.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65e5430547670b797d393259a9b7169064469fdca3691cc950145d07a312c05f -size 155452 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Range-Frame-Outline.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Range-Frame-Outline.png deleted file mode 100644 index 143bed33..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Range-Frame-Outline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7948298753c55301dbbb63ec26bd5601e2caa7614b3db4b3feef6f437fce076a -size 180382 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Frame-Measurements.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Frame-Measurements.png deleted file mode 100644 index d0e49513..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Frame-Measurements.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a43981be2c4761e00feb28122a5f9dac0d5c1cd38b1b8aa8ff3be7d63d8d7db -size 156088 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Handle.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Handle.png deleted file mode 100644 index a9b0028a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Handle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6dbf57b6bd3402eaa1fce82dddc76da5cc0f2f553f46f819498d8e28ee289f23 -size 154630 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Icon-Finalized.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Icon-Finalized.png deleted file mode 100644 index f0232faa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Icon-Finalized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad6c5bb21367ee1d046118404319469e7f6d99f8e53c194ab0f3a83785ccd0c8 -size 192442 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Icon.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Icon.png deleted file mode 100644 index 32279e81..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d77cfb3add6b7ff2d9778455fb9f6b033e096ba9d5b2536312ad165223d6a7db -size 154212 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Inner-Fill-Finalized.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Inner-Fill-Finalized.png deleted file mode 100644 index 08373ba3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Inner-Fill-Finalized.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0198de3559e95b30257e15ad35b06238d019937f38a0b9224cbc22807e70bce3 -size 174278 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Inner-Fill.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Inner-Fill.png deleted file mode 100644 index 1f94b6e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Settings-Menu-Design-Slider-Inner-Fill.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:789918e38d6a146d2b1c46cb2c137071af7d29e5e3ce6fe0e817d86906fbd418 -size 154269 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Sliders-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Sliders-Demo.mp4 deleted file mode 100644 index 32ffc3aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/Sliders-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d67a8d2d5f64fd55902f5174bf3076fa5455cdbd0d93d306ca0376be91193d13 -size 3286447 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UIAspectRatioConstraint.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UIAspectRatioConstraint.png deleted file mode 100644 index c7949378..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UIAspectRatioConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:31019daa9fcb75dbf408f84316624920028f24b2144ba50673e3c260936b6643 -size 39839 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UISizeConstraint-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UISizeConstraint-Values.png deleted file mode 100644 index 3e98347e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UISizeConstraint-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ca15fc346dfe1970c2743099bd53cd8c6c10f855f72bd86576ebc51081e6bf8 -size 32712 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UISizeConstraint.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UISizeConstraint.png deleted file mode 100644 index 81ba1b95..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton-UISizeConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd90af6d37e6b5aaec9d2ac9bf9c46eb47722bb9acacce65fc871f45e640b59f -size 42243 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton.png deleted file mode 100644 index 13fec199..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsButton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af66e5bb775eb5c17704d60e339edef8c2aa97775b4741c9b327f4811dbdcc66 -size 34198 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-Icon-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-Icon-Values.png deleted file mode 100644 index 01f0d692..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-Icon-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4363c8eef11ceba73dc3d05af6fedebd341696da1934522fe61dcc1702201396 -size 28324 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-Icon.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-Icon.png deleted file mode 100644 index cf51db61..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0adbf2c210dc722ce7e655b7ce72458fea2b7edab34fa9c7acafd403fbe0ef33 -size 26880 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-Handle-UIStroke-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-Handle-UIStroke-Values.png deleted file mode 100644 index 9e56bb25..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-Handle-UIStroke-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:569bed0b9760a61f74b9a9b48bb832592907fe169f1c23e076b4e7cb4d15c43a -size 35691 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-Handle-UIStroke.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-Handle-UIStroke.png deleted file mode 100644 index d8bfda81..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-Handle-UIStroke.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a25edc6c13cf5773a36396f93edd1ade7861b1b7441c40911553b63c1a4fca0 -size 48987 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-InnerFill-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-InnerFill-Values.png deleted file mode 100644 index 7bfdfd21..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-InnerFill-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bbf97d252f7be2ae9ed6209f194aa67a616da9d55732e72459631203028fdbe -size 40397 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-InnerFill.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-InnerFill.png deleted file mode 100644 index 1072de61..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider-SliderFrame-InnerFill.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef7ac518d9b89bc37b04c66162ca30b1de3b2e96cd6d5ee2bd763d32190a7ab7 -size 49065 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider.png deleted file mode 100644 index d48ec1f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-BackgroundVolumeSlider.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5f3ea43ef870273b037f91b12e7964373cdd0dc1a4c3c2bc3affea0154831d3a -size 35481 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-CloseButton-UIAspectRatioConstraint.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-CloseButton-UIAspectRatioConstraint.png deleted file mode 100644 index 10f91b47..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-CloseButton-UIAspectRatioConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4aebb45392cd4e7517f6b8dff886d27a2b69799c7526771911aff98a9529c9fd -size 32104 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-CloseButton.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-CloseButton.png deleted file mode 100644 index 2f049f81..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-CloseButton.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c5f27a6c94ea8cdc4289b91560cebb4ed78c34dcb54bdb43510dae20ec79485 -size 57095 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Full.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Full.png deleted file mode 100644 index d8ea1b94..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Full.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a4e8eb4b7341c5c4ebf7e6ae424c9664a9a35915aaedede3e1582180dcf2328 -size 48566 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Icon-UIAspectRatioConstraint.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Icon-UIAspectRatioConstraint.png deleted file mode 100644 index 31d308a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Icon-UIAspectRatioConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57afd266089ee6fb1ccf2de1db8a24110008cc84494727269a002a92b2f9a3fa -size 45946 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Icon.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Icon.png deleted file mode 100644 index 5bcac5ac..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-Icon.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:39d20fa6cc80a2b65621016c127b8f0cfa042e2dd3badb106f8821f7df4b0671 -size 43987 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle-UIDragDetector-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle-UIDragDetector-Values.png deleted file mode 100644 index 732b0bbf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle-UIDragDetector-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef47e83ca87946e5d4406b3c406abeb9e9bb1e05f88a6178e9b08a17cef1cac3 -size 38411 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle-UIDragDetector.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle-UIDragDetector.png deleted file mode 100644 index 7f3fa2f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle-UIDragDetector.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3101fc259839770d50c0302d91b4277df92a56223aa4ae8d4ba2ec0ce6fb2506 -size 43818 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle.png deleted file mode 100644 index 61700cb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-Handle.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3950e7e799d1f66e93858594fae057c0ab278eb4ec45d298dbaeb00cc3fa1a6a -size 37486 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill-UICorner-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill-UICorner-Values.png deleted file mode 100644 index c7ed95ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill-UICorner-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2dd41f3e73d51813c690b338df2830f83d36b39470416dbeb5178da620c9b78 -size 27895 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill-UICorner.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill-UICorner.png deleted file mode 100644 index 22eba2b1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill-UICorner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:374e9aa8b51aa535d27449b05c8af97c9abce0be60daad36aa6118fcb990c739 -size 27803 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill.png deleted file mode 100644 index 10eb019e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame-InnerFill.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ea36f65299952d5bf0cd057790b5d493f9efc20a2a8b0571383291e0e9504ba -size 46477 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame.png deleted file mode 100644 index 6ebe869f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-SliderFrame.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a1fa038469dc8669ac38fa61c49a2abcf2267148e2a7226b5a15580ce9ec84f -size 44512 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-UIListLayout.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-UIListLayout.png deleted file mode 100644 index 12014687..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider-UIListLayout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce86ea7a327f00160f092701541716e2d553d9f93e3b8a31ff983f72d5c9a8b6 -size 44434 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider.png deleted file mode 100644 index 3e8ec707..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-EffectsVolumeSlider.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b09564e454d0dc8c7bf4b3845a650ad56170005c7205bcd49b16b39c0470715e -size 41940 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UIAspectRatioConstraint-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UIAspectRatioConstraint-Values.png deleted file mode 100644 index dd1bca60..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UIAspectRatioConstraint-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb6a957a2d817b21ebb257ad3bedd4c5712615854eabc057e0c06ad96e39d4c0 -size 36068 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UIAspectRatioConstraint.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UIAspectRatioConstraint.png deleted file mode 100644 index 038c1f63..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UIAspectRatioConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dadd9f5310290fb80f202f83e4617e85af1b8b4d64fc9226e5f5823bb6831b4f -size 43628 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UICorner-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UICorner-Values.png deleted file mode 100644 index 747b7eaa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UICorner-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01a06abb702bf198afff3231ea13363ff208e25bac13aea36b1b3595181b84a7 -size 30610 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UICorner.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UICorner.png deleted file mode 100644 index f63eaf89..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UICorner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b10143f329c8540681b36fd9d7f28869f5997506b70192fa76c133c59565e354 -size 41072 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UISizeConstraint-Values.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UISizeConstraint-Values.png deleted file mode 100644 index 248a4b5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UISizeConstraint-Values.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a73604307d72718a2cb8b66ea65a252f146e8e17b1ee40a92e927336a585181 -size 48523 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UISizeConstraint.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UISizeConstraint.png deleted file mode 100644 index c2be38e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu-UISizeConstraint.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:745ddbe36ab1176a89835576edc714002343ce8cb4dab0a83c6059c7803e6b8a -size 44515 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu.png deleted file mode 100644 index effe2a3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsMenu.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7ced231567632d2740b603d76286316b0810f39b987ca76bac0a5cbc949ac6e -size 37998 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsScript.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsScript.png deleted file mode 100644 index d9ef81c7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer-SettingsScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bb0f3d83dd5625b633d037238c61677a9b110e43b0d71958fcf9efdf0bb1e96 -size 46385 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer.png b/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer.png deleted file mode 100644 index 86ee67b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/interactive-ui/StarterGui-HUDContainer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca8f34cea0e5bb4959817212a9836bbea15842fd450bb3b29fbb537720db2775 -size 29897 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-saving-data/ServerScriptService-GoldManager.png b/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-saving-data/ServerScriptService-GoldManager.png deleted file mode 100644 index e710eab6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-saving-data/ServerScriptService-GoldManager.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e5c1722419d94c7ae5651c9245dffefabfe115c4905a76a8f5c8ae55030da10 -size 37508 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/alternatingPlatforms.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/alternatingPlatforms.mp4 deleted file mode 100644 index fdd5f6d0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/alternatingPlatforms.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e3ec3eb8b0114b6f39696ae85e5ca6d041ea45f605c09fe3b58d53b83af06b0 -size 63811 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/anchoredProperty.png b/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/anchoredProperty.png deleted file mode 100644 index f19554af..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/anchoredProperty.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4279605fe9fe7315c716ac6eff7694ebffd1f347c5ed41fb2b342be8be739807 -size 31879 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/canCollide.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/canCollide.mp4 deleted file mode 100644 index b842f62d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/canCollide.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91428789d247f2dadf808fce249bd0f745d3eb9066ac772584060237f03da136 -size 49446 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/finishedSinglePlatformShort.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/finishedSinglePlatformShort.mp4 deleted file mode 100644 index 8a46c6bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/finishedSinglePlatformShort.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:675ddd99e8fcb0983c0d6f4dc3c865bd75ac6bdd372e516140e22dc9340b754a -size 798287 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/partInPlace.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/partInPlace.jpg deleted file mode 100644 index 0db210e0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/partInPlace.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eaeadb1155afdf77c5b005a65c5dc8bf320f491f824fc3b743ef60ec4eeeb2ec -size 305667 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/scriptInPlace.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/scriptInPlace.jpg deleted file mode 100644 index e5eb5e7e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/scriptInPlace.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79ece68219cb6d27424db430d1073be278b090d7658ccc1cad1879622599c1b1 -size 56175 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/transparency.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/transparency.mp4 deleted file mode 100644 index 3fd26b8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/intro-to-scripting/transparency.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2b9a1de8a694e5b4ccef82c3c03d97474a6bec2f6e47b764e13b47f9fd6318e -size 446321 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Animation.png b/.cursor/rules/roblox/en-us/assets/tutorials/landing/Animation.png deleted file mode 100644 index dedfee79..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Animation.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4afabe31cb845cdbac0cd6bb3c8190ccadb3a24fa95bd64005ecf19666e7b50 -size 361024 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/AnimationThumbnail.png b/.cursor/rules/roblox/en-us/assets/tutorials/landing/AnimationThumbnail.png deleted file mode 100644 index 4e5e826d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/AnimationThumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:984d55f32eafc4237518e45b97fdda86c0a477fb76dfc74627e3e86b9a697d46 -size 597110 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/BuildingThumbnail.png b/.cursor/rules/roblox/en-us/assets/tutorials/landing/BuildingThumbnail.png deleted file mode 100644 index cba502f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/BuildingThumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f15727ed7b2573d1023cda6b7cb8b3a79858aec78e2d9dc611b496afa6582f7e -size 346465 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Camera.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/landing/Camera.jpg deleted file mode 100644 index ffb15ec2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Camera.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fc24d8a0548019950f156bffd41f26309fa1d9e46b84d422d2cc0737d4eddb4 -size 34840 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/CodingThumbnail.png b/.cursor/rules/roblox/en-us/assets/tutorials/landing/CodingThumbnail.png deleted file mode 100644 index 99d84076..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/CodingThumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2961042968f39538842a34f8ad3ef4f5648436e01737198c667f7f15573b1b0 -size 410233 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Effects.png b/.cursor/rules/roblox/en-us/assets/tutorials/landing/Effects.png deleted file mode 100644 index 9458d858..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Effects.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfa19767a7dc1a8d6b1eaebbfd132e40a7dcda60a0c3661bf41adb60f716ac4c -size 169225 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Physics.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/landing/Physics.jpg deleted file mode 100644 index a7dff062..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Physics.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ac6e8395ccc5986adea12f44ffa7e3d914970afcb5305f054d993e5ce0da11d -size 149809 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Physics.png b/.cursor/rules/roblox/en-us/assets/tutorials/landing/Physics.png deleted file mode 100644 index 468c2666..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Physics.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ded5703469d139cd6cf0b16ce480aa261cf623ea204c5b5e8a45abc873576d38 -size 1040766 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Scripting.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/landing/Scripting.jpg deleted file mode 100644 index 47fde9a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/Scripting.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7de48f541d91ee72b313c5485a6e5e5ec8d4aa5ec3e4f03bd87a11d0bfdf506 -size 162971 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/StudioThumbnail.png b/.cursor/rules/roblox/en-us/assets/tutorials/landing/StudioThumbnail.png deleted file mode 100644 index eaee7a90..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/StudioThumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12c1dcb4e306d2a5caabbf081448726dc13d552eeb8443afbb7fce6553e6f999 -size 292063 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/UI.png b/.cursor/rules/roblox/en-us/assets/tutorials/landing/UI.png deleted file mode 100644 index de78b2d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/UI.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6f6f4369322ad388bfd829c21706eb9e6887c0ae4f0717d6d4d1330819bee2e -size 148678 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/landing/VFXArtThumbnail.png b/.cursor/rules/roblox/en-us/assets/tutorials/landing/VFXArtThumbnail.png deleted file mode 100644 index a40abe50..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/landing/VFXArtThumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6cba92cf1524e299573eb1d20dab991e87e7298a3095c3a1238b4d9958f4794 -size 1335131 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-1.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-1.png deleted file mode 100644 index 5f5eb1b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6d4ead53f3b75f0c1f0785f04c36105da5e190234877a2b4136bbd30dbe9d46 -size 17349 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-2.jpg deleted file mode 100644 index 4df131d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:355e4c5cc19a0cef790934aaec2e43ac99303d8bee0bf6a19c8e93bf62740ce1 -size 234795 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-3.jpg deleted file mode 100644 index 4de34155..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e83cb80cfcd8ea4c0b14a42056b752e0583c205f5af191785985ab5535766a7 -size 229613 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-4.jpg deleted file mode 100644 index 2f0c0bb0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Attachments-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:916353577b107deb3274e223b8c440c44779ffd649f318a9aeca94ec5c920b0c -size 216320 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Beam-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Beam-2.jpg deleted file mode 100644 index baea36f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Beam-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c56daf7efc8ec872831bfa8313597d007ac8d2c90824be12b162f0da4f5299d -size 209825 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Beam-3.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Beam-3.mp4 deleted file mode 100644 index 49912e4e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Beam-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22f7630af2c7a496b41cf4090318968472fb64f351cbb49e1827a43bcab3fd6d -size 1742813 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-1.jpg deleted file mode 100644 index f71811a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05845a4766368cbc74b249105b06438d0a49b0abf973dc97f7563d2115a12e9b -size 209871 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-2.jpg deleted file mode 100644 index 23e521fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbc96c621a213c4d2513b0a47bc06b0b77f65cd62293c5d8d3ff3150dbae8d89 -size 211093 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-3.jpg deleted file mode 100644 index 5a1ce10f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/CollisionBox-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d82f759a356ca928a73c05bd3f3ac8df8bab914a5b3427488f5db79ad652c661 -size 213668 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/LaserBlasterAsset.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/LaserBlasterAsset.png deleted file mode 100644 index b00ff19d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/LaserBlasterAsset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0844cd0df809fbcffd943e8b02ac7db9d81104ab2f71588ba46efc13c0733d2f -size 1770913 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Script.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Script.mp4 deleted file mode 100644 index 73c004b4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/Script.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2433411bf2a44fbb1fbbf887296d4b1b4d3b7250ad6f24e0af25a72d9a123ddc -size 533450 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542021.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542021.png deleted file mode 100644 index b797a5d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542021.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac58349c0909184742ac688959b37491c1d29e43f7033f6b2b7a0d4effcd9f97 -size 24157 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542158.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542158.png deleted file mode 100644 index 071f31de..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542158.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fd31570cff7b5705006c8ce2679fbf0c462231089db5e726a2befb68f2df043 -size 16114 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542252.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542252.png deleted file mode 100644 index 78a78033..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/beam6060542252.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:50b0678b1ffccb93395af1b0da88f81d84c5cf4f7a7d58c07c5bda498f00f9ce -size 21231 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_beamExamples.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_beamExamples.mp4 deleted file mode 100644 index bad98e53..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_beamExamples.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9b6a2559838fa8b235857bc2897178180ae26a0510e8a8ca6922ee6f32b58ce -size 2144248 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_setAttachment0.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_setAttachment0.mp4 deleted file mode 100644 index af395ca9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_setAttachment0.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59b18b5b483df134d77a5efd13330fa92a1d3a1d8c3d827a10a58eb1691bd93c -size 99689 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_testFinalLaser.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_testFinalLaser.mp4 deleted file mode 100644 index cb316182..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/laserTrap_testFinalLaser.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6d13cdb2e9229cf68ced3967ae34cb39596d9dd36ddb43fb44d25b93734137a9 -size 342084 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_addBeamObject.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_addBeamObject.jpg deleted file mode 100644 index 21b1a086..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_addBeamObject.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbe6f6b1a1fc7ba9e29f1f21e40c9490c022447d2ff0f287770669d9d7508e12 -size 20511 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_anchorPart.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_anchorPart.png deleted file mode 100644 index 86c8782f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_anchorPart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68c866f229bead25b04df0f58e32e42cf230be2f623610e8961f159c21e332ef -size 4207 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamColor.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamColor.jpg deleted file mode 100644 index f3ffed7f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamColor.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e821c33e9286916635a737612d1a16e67086d68e265db0f20e65e5538f4949a -size 57066 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamDifferentAngles_left.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamDifferentAngles_left.jpg deleted file mode 100644 index 934043d1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamDifferentAngles_left.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4bb2057339eb04e8320aff60eaace5432b25b528c119b6f24dca66d29ab92646 -size 30975 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamDifferentAngles_top.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamDifferentAngles_top.jpg deleted file mode 100644 index 8cdb52b5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamDifferentAngles_top.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:886b856b12ef02ce278ab1be7b9172cd595ee3d97b9529997ae2de399d762619 -size 31365 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamWidthLarger.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamWidthLarger.jpg deleted file mode 100644 index df81e185..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_beamWidthLarger.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1081d444e499d177cdf6e39e58ac8dad16263760db3eeef84c6ff7c55e58e57 -size 53567 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_changeColor.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_changeColor.png deleted file mode 100644 index 4eb1c0a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_changeColor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:614b7bcbe2e00a59e293c9d9f48ff84ed7ef2d2edb8a3d726e83bb58e6af64a4 -size 6779 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_collisionBox.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_collisionBox.jpg deleted file mode 100644 index 366a84a2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_collisionBox.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5aa6956e58d6c771d69646e9b5c39dcf4ec0526d66ab3faf0167e2ee8267c09f -size 90974 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_constraintDetails.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_constraintDetails.png deleted file mode 100644 index 24f59aa3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_constraintDetails.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d64826252d9b410609d03ff46f11cab22544871e717e9f0c42919521cdc402c -size 5688 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_createCollisionBox.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_createCollisionBox.png deleted file mode 100644 index ca1dfdea..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_createCollisionBox.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79823727940152d1eb8c131dc0260f6ed3164d7876fda1356028a2ab5c75ead6 -size 5404 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_drawOnTop.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_drawOnTop.png deleted file mode 100644 index a6da8c73..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_drawOnTop.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:382f63bff962afcf24fac257e444616288d76b76aa04bc2e3dd75a76470db274 -size 5881 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_pasteTextureID.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_pasteTextureID.png deleted file mode 100644 index cd702025..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_pasteTextureID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e575de5c9d2571c454147c4a9275697b6bba84fad0bf3a46f237eff9ce481fbe -size 6786 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_setWidth.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_setWidth.png deleted file mode 100644 index e1913ba8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_setWidth.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38b630e1602167f34a91cd254728b99a9718f201920005dacc23bdb7229d5fd1 -size 3950 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showAttachments.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showAttachments.jpg deleted file mode 100644 index 83452313..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showAttachments.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb82bd5c364cecb1a1c023d342ed604599511c27731fd3f43d9f1de60a995147 -size 27665 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showAttachmentsSet.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showAttachmentsSet.png deleted file mode 100644 index 7d6f5bf0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showAttachmentsSet.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d128bc91dcb32966e7b7ef14da68d6f4f9c8a3a3ade95e83545f01c05d05730d -size 4798 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showBeamLightEmission.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showBeamLightEmission.jpg deleted file mode 100644 index dd82bed4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showBeamLightEmission.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a1853a199d597b9bd5291a28e570a565e677ac3f29e58e3c21ffc12abfa8292 -size 49569 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showBeamWithTexture.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showBeamWithTexture.jpg deleted file mode 100644 index 8bb80461..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showBeamWithTexture.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:607e18044f1b120a1326d646bfce9af75738943a4d56936d8895a73f679346b5 -size 48103 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showPartsCreated.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showPartsCreated.png deleted file mode 100644 index 025353ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showPartsCreated.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:020eddec8f494070154bc7ae6f7339bc23df77d6a1759765e2994a35f2773ca9 -size 5863 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showSetup_alt.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showSetup_alt.png deleted file mode 100644 index 13256826..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showSetup_alt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e11480a8c186d7b259d2afc1681cdf8fb3632cd4c0835a5cc515ab59e520034 -size 161573 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showTrapPart.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showTrapPart.jpg deleted file mode 100644 index 52c65178..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_showTrapPart.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a2e53ed30dfa6f69a567bc0d8aae83fee7b27aeb9ebe99bb2c5dd457c06e214 -size 57337 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_toggleFaceCamera.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_toggleFaceCamera.png deleted file mode 100644 index 2b269f15..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_toggleFaceCamera.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dfa2a7d19eea85c11f544ae74b20ba8b575967d6fe486d1a5ef5e171bc2b53e5 -size 4622 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_transparencyLightEmission.png b/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_transparencyLightEmission.png deleted file mode 100644 index 3ff31e5b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/laser-traps-with-beams/lasertrap_transparencyLightEmission.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:79bf67668092dbc5e057ae593114731ac2617f883e0be7e14bbd565c12f8cb38 -size 6180 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Billboard-Select-Model.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Billboard-Select-Model.jpg deleted file mode 100644 index 847a9816..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Billboard-Select-Model.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c57e02a42d76c2f96ad1a731c6b6c3c0c2c860e97664f3ed900d1ee7268dd6ca -size 209911 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Billboard-Select-SurfaceLight.png b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Billboard-Select-SurfaceLight.png deleted file mode 100644 index 347a0e91..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Billboard-Select-SurfaceLight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:99800f2ff757fbaa0f40015207eab281e439139b46df720bc07d2f51af77b33e -size 17958 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightCasing-Material-Property.png b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightCasing-Material-Property.png deleted file mode 100644 index 9b1ad1fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightCasing-Material-Property.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:471ce389f6104f0a597634b788c559b6e460655a2e7a364266f762d9a81af35b -size 23449 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightCasing-Material.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightCasing-Material.jpg deleted file mode 100644 index b2a28598..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightCasing-Material.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:899b26ad34a37f963526d8e07c4d96ebe6775c8369778d1446f06f4042aa1f6e -size 74848 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Add-Light.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Add-Light.jpg deleted file mode 100644 index 64022159..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Add-Light.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:21bd6e543420ce5af9f9d248d97413ca290ced5789409e25773ca89c4c537994 -size 82625 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Add-Light.png b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Add-Light.png deleted file mode 100644 index c595e0d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Add-Light.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb50a0333d80ceb6bceb163ffafa9f45bd3d8336e3ff2b2b874530fa4e348e9d -size 13047 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Select-LightCasing.png b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Select-LightCasing.png deleted file mode 100644 index 2b3d0aa0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Select-LightCasing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57bfbc5638961412a3e27b48cac804451e2216831b6ee8bd1ab97d84de83f1a6 -size 10346 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Select-Model.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Select-Model.jpg deleted file mode 100644 index 99a73cf9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/LightPole-Select-Model.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e3398f8e13f777c20d5d5e889b03e6301b63ac05989f6e84df91751a46e2ebe -size 126308 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Misty-Harbor-Banner.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Misty-Harbor-Banner.jpg deleted file mode 100644 index 6f12d221..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Misty-Harbor-Banner.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5a25888b081d2754d8cc5e09965e49e0ccb5e28ab7023ef2a09d39801a1d114b -size 175281 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Misty-Harbor-Edit-Place.png b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Misty-Harbor-Edit-Place.png deleted file mode 100644 index e9b18fdd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/Misty-Harbor-Edit-Place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:810e770af56a239c6da37c05ae684bc278a4c95b403d92eec820f5264561f2a5 -size 43953 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Brightness.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Brightness.jpg deleted file mode 100644 index 8c147562..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Brightness.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2df4c1ea7dbab16848dca198b068ff43f3f1a7a1627f77e6f4ea82dc35a6ea33 -size 93450 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Color.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Color.jpg deleted file mode 100644 index 07dabfbf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Color.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44199b1dc45db588333e4e7fa71f31c96deac0cd4e63c6afa52d0cd08bbec2b3 -size 97097 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Range-12.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Range-12.jpg deleted file mode 100644 index 6f85c48c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Range-12.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:787fb20bce23b720eb991aa57ce4edcdaf0acd678e6d81ad5a863a15b9dcd386 -size 94284 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Range-8.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Range-8.jpg deleted file mode 100644 index 04989073..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/PointLight-Range-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fd2717036957dc682ef7d2b004990eba84bc96fe3695931ee6ca4c1a554589fd -size 92779 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Angle-30.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Angle-30.jpg deleted file mode 100644 index f3aa98f8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Angle-30.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:789b4ec717a2185242f5eb37605051f8fcb99880420e77770cd0cdccc5afc881 -size 117995 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Angle-75.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Angle-75.jpg deleted file mode 100644 index 474c0d03..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Angle-75.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae07c393f7436e4782312ca12db34333d901e00ef6b76da671107c94017b4fb2 -size 137915 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Face-Bottom.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Face-Bottom.jpg deleted file mode 100644 index c355dcc3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Face-Bottom.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e26aec888d33ee60221e08a29fdecb50b234b3f28fddf141fa63265cff46ae90 -size 123644 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Face-Left.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Face-Left.jpg deleted file mode 100644 index 864e6dd1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SpotLight-Face-Left.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41f190045c7e639d51db2f60728ce493287f13b842b25591f313444295dc26ea -size 112842 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/StreetLight-Select-Model.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/StreetLight-Select-Model.jpg deleted file mode 100644 index 71669606..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/StreetLight-Select-Model.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbe5f0f62f04ac4b7a0a52197f862cba65b58e293626842f0b426df105238e6d -size 173039 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/StreetLight-Select-SpotLight.png b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/StreetLight-Select-SpotLight.png deleted file mode 100644 index a647f14c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/StreetLight-Select-SpotLight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:135e826b0290a6317ad67efb740aa131656423b901b01b35de649d2961efba9f -size 13597 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Angle-0.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Angle-0.jpg deleted file mode 100644 index 39bb7f06..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Angle-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:819af0255dea337366734dfc2aacbce51a23fa110293795685afe4beb8f8171a -size 133326 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Angle-60.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Angle-60.jpg deleted file mode 100644 index 120730fc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Angle-60.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4cd9bb15486aa1f9d17afb7a68a86a944dcd99d7a240d0641ae4921fb2c94dc5 -size 151285 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Face-Bottom.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Face-Bottom.jpg deleted file mode 100644 index 4a266416..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/lighting-with-props/SurfaceLight-Face-Bottom.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5cd6fb5c986e777a03d8e49e32784d0e5abb45c4f37389b329bdfa7f0da30a9e -size 133786 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/introToSound_bgMusic_web.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/introToSound_bgMusic_web.mp4 deleted file mode 100644 index 665f9518..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/introToSound_bgMusic_web.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:95e9aab17e84001832e1d2a90758074f893755cb2d1b57b3ca9c14d2c900183a -size 5539022 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_changeProperties_looped.png b/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_changeProperties_looped.png deleted file mode 100644 index 07f87239..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_changeProperties_looped.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b3b6aec02a5c138335eb4db7e2ec3670eb1aa7f259522b0a5b1b2b773ebfa9f5 -size 4626 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_changeProperties_volume.png b/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_changeProperties_volume.png deleted file mode 100644 index 0ae212cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_changeProperties_volume.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9f4b3be78dfed43c2ffe26dc073170f95a9526db7ba60d954c67c013a906848f -size 4708 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_createSoundInSoundService.png b/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_createSoundInSoundService.png deleted file mode 100644 index 573fc235..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_createSoundInSoundService.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b0e61731dc8369c669954281145400fdfa24e41cb618b099da61886233ac16af -size 7061 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_pressPreview.png b/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_pressPreview.png deleted file mode 100644 index 65f4917f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_pressPreview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9aeb7dc1e61642fcce3b3793346777956c462593bb347c6e5445d188f034e6e3 -size 4775 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_soundID.png b/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_soundID.png deleted file mode 100644 index fdf66612..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-background-music/playingBGMusic_soundID.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e05c461a7a808174bf6a01e45c62b1b07a28edf4cf3ad537c5eaa1fb19f91233 -size 4820 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Add-Animation-3.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Add-Animation-3.mp4 deleted file mode 100644 index 0a271263..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Add-Animation-3.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e4e2061104f23b86587a557cef9206d18e0b31cf7979e378a65dc506eb6897fb -size 1294657 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Custom-Walk-Animation.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Custom-Walk-Animation.mp4 deleted file mode 100644 index 616269eb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Custom-Walk-Animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae30d27b1096fc53406bd7ba7492ef3c799ce6215e03e4417182e62777969efc -size 1331339 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Climb-Animation.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Climb-Animation.mp4 deleted file mode 100644 index 0f4716e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Climb-Animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eb1389889ddbd27081c63c5d7170a29b9e1a93cf1e3c94b6a791dcb2fd63111 -size 749655 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Fall-Animation.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Fall-Animation.mp4 deleted file mode 100644 index 58dee261..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Fall-Animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10bb772180ba33ea85c82bd536f8c1e3a12822655ac7786213173578ff715783 -size 775889 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Swim-Animation.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Swim-Animation.mp4 deleted file mode 100644 index 2d42516c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Swim-Animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0de0f88f49092ba662867b35578d39ff03f5adf1f2b7b2d4df104c6ea14a2e9c -size 629866 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Walk-Animation.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Walk-Animation.mp4 deleted file mode 100644 index 1c45cc76..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Default-Walk-Animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eea28938da913b9fce3502c6eeec76f3b149948632d513b5d016d7e9e85379eb -size 1280775 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Insert-Volume-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Insert-Volume-3.jpg deleted file mode 100644 index 6ee59277..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Insert-Volume-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74ed015159a60968dfea8b141675e5ad5b4826b1428ec25bc7e5e4f396d32c48 -size 367626 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Pose-Example.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Pose-Example.mp4 deleted file mode 100644 index 4c991a3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Pose-Example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:566d4b45f1bcd22363619b0b2920fc132f153622bb44b3a29807072c72ed521a -size 1038921 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Replace-AssetID-2B.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Replace-AssetID-2B.mp4 deleted file mode 100644 index 20a19091..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Replace-AssetID-2B.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fca79b2faef8bc32a9e6bb50bfb4ecf74f167f839496f0b0a0da78944b3b8254 -size 5123072 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Volume-Example.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Volume-Example.jpg deleted file mode 100644 index f39a75fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/playing-character-animations/Volume-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ef2765bb947b2b34cac1f35380f05943c6970b57de3b28eb4985eded811bc46 -size 954164 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Dungeon-Delve-Edit-Place.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Dungeon-Delve-Edit-Place.png deleted file mode 100644 index b47cdd08..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Dungeon-Delve-Edit-Place.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c7c9e9d7819eca6824433005288227ac47c2838c2f23346aa7a72dbf60f826a0 -size 140233 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/HoldDuration.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/HoldDuration.mp4 deleted file mode 100644 index 11610fe9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/HoldDuration.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c69bc44a600ddfa649ebc3cba32a35aafbb41fffd46ea9ebd85ab908a99ba5db -size 551161 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/PromptsShowcase.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/PromptsShowcase.mp4 deleted file mode 100644 index 736df452..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/PromptsShowcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa338ed39ed53efafc4ac0e2b140d458e9e5cdd33b08045bb661abd41cf11d3e -size 3200944 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Insert-PromptAttachment.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Insert-PromptAttachment.png deleted file mode 100644 index 112e42a1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Insert-PromptAttachment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3090181b3b96d4a913e21cd837507be0ce87d5926267c6dd8b70f139a82ae726 -size 27898 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Insert-ProximityPrompt.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Insert-ProximityPrompt.png deleted file mode 100644 index d869e593..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Insert-ProximityPrompt.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:296604c73a6899d5f85a59b6263b731fa5c7c27004d0e750754db8f90c0820d4 -size 22907 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-MaxActivationDistance-View.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-MaxActivationDistance-View.jpg deleted file mode 100644 index 198516c8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-MaxActivationDistance-View.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f41cad8852d8526df6c6d5986a1eb267763463edec419938101d912a7be8c2a0 -size 228999 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptAttachment-Position.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptAttachment-Position.png deleted file mode 100644 index 1175bab7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptAttachment-Position.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa2a8860a3a2c83b0a5c0b2d472f679db3ff890054031ffd763368ff40643337 -size 11531 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptAttachment-View.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptAttachment-View.jpg deleted file mode 100644 index ae0a4a0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptAttachment-View.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:930fccaa803041dbbe6085605ba0d5af6fd972ac07bd5df0502e29991f8896a1 -size 116043 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptEvents-Script.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptEvents-Script.png deleted file mode 100644 index 6f7d588b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-PromptEvents-Script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3dd18d5da76565f99766353487a3d6d24335c2f3e264e40d4355a79935d166c9 -size 20662 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-Door-View.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-Door-View.jpg deleted file mode 100644 index c2ddd503..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-Door-View.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f5360a8f7fd74749e0a9e0e237edbf50f106e5fc1a6602e52c290606a0d6948 -size 157084 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-Door.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-Door.png deleted file mode 100644 index d0f3749e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-Door.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e8e48b1c16156c7e716bcbfac606c4534c6c788f95b4455a77debee1e2cfcd9f -size 15862 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-PrisonDoor.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-PrisonDoor.png deleted file mode 100644 index f00dc886..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/Proximity-Prompts-Select-PrisonDoor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2b638c1cf070739f12e4e202b86a4e6d8d86660a6525c813687d7ff477b0349 -size 44330 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-ActionText.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-ActionText.png deleted file mode 100644 index 2792b797..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-ActionText.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c3e209ad11cf14988b2d25055c30d5c3d1c2abbddc139a853f1b252bb217f26 -size 14460 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-Diagram.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-Diagram.png deleted file mode 100644 index 6786e0b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:714efd400a5782068b43432efb06ad27db73f01dafe7dba890d46404529b533d -size 12212 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-HoldDuration.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-HoldDuration.png deleted file mode 100644 index 40f227aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-HoldDuration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca6499cb5063f3e57ca39e8c3f10b5d221183afa76cc8e18e5e865264a360aa0 -size 16588 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-MaxActivationDistance.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-MaxActivationDistance.png deleted file mode 100644 index c9c6f6f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-MaxActivationDistance.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e62ed04c4bac470e7595600a86a436a2ad4848aa8edae06a0b17f72dd60c422f -size 16676 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-ObjectText.png b/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-ObjectText.png deleted file mode 100644 index d5a20da6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/proximity-prompts/ProximityPrompt-ObjectText.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1cf60c1c6f8400d083cd056d409f442b2570a25399b117e95bf354be0feffbc2 -size 16904 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/Insert-ModuleScript.png b/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/Insert-ModuleScript.png deleted file mode 100644 index c6557f83..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/Insert-ModuleScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c3e48ef39029c976743e8234e8d727136c7fdb323783fc476328fb21d4f44a3 -size 48175 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/ModuleScript-Renamed-Leaderboard.png b/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/ModuleScript-Renamed-Leaderboard.png deleted file mode 100644 index 1d5a79bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/ModuleScript-Renamed-Leaderboard.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a918a708daa05df0e69a33932d73f08d311f07f24810d57478fb29d74f094eb -size 21490 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/ModuleScript-Renamed-PlayerData.png b/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/ModuleScript-Renamed-PlayerData.png deleted file mode 100644 index 736a934e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/ModuleScript-Renamed-PlayerData.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8f019b3d76b1301d959d868df25e8f74db2a1814d18724ea8531b1418c1112e -size 21927 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/record-and-display-player-data-example.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/record-and-display-player-data-example.mp4 deleted file mode 100644 index 55650cde..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/record-and-display-player-data/record-and-display-player-data-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3eefc417adc337e899788ca9113b2b7599b7eec3232694b5834f927d18cdc264 -size 20015434 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/finishedScoringPointsSolo.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/finishedScoringPointsSolo.mp4 deleted file mode 100644 index 05fc69ed..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/finishedScoringPointsSolo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70ab50cd9ffa6c40c5123e2eacbe8f1a1911e51f8988fb30644b713546921d2c -size 1716720 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/leaderboard.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/leaderboard.jpg deleted file mode 100644 index 0e52db05..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/leaderboard.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01bacce232b42104bd991169806dfde0e75e8d6ee7211be5da3ee318f40ed1bc -size 23810 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/leaderboardCounting.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/leaderboardCounting.mp4 deleted file mode 100644 index 2b8bb509..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/leaderboardCounting.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:753d236634bfbd38354fb1fafb5a6d60f5b897794198849ef8da53e47e9ef95e -size 1419297 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/sceneInPlace.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/sceneInPlace.jpg deleted file mode 100644 index c44d2408..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/sceneInPlace.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a081c4c04f88d8a6d4798342f2794d32802db2717149ab6e0a9ccb2d37195666 -size 414753 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/setupPointsScript.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/setupPointsScript.jpg deleted file mode 100644 index 0bb69080..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scoring-points/setupPointsScript.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9278fe90f1c2d32ec1a2e985e29baf37191ef80cef1ab38d17bd40e3392fbe1b -size 54485 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-an-upgrade-button/Insert-RemoteFunction.png b/.cursor/rules/roblox/en-us/assets/tutorials/script-an-upgrade-button/Insert-RemoteFunction.png deleted file mode 100644 index 3593ad5d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-an-upgrade-button/Insert-RemoteFunction.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8999964fe3077596864fb4dda7cbc5bbc0f623612695c4dceeddfa7904f38295 -size 31315 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-an-upgrade-button/script-an-upgrade-button-example.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/script-an-upgrade-button/script-an-upgrade-button-example.mp4 deleted file mode 100644 index b62bb124..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-an-upgrade-button/script-an-upgrade-button-example.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c2797f058fccb6ddcb49341db7b65f246c8229be153bb0646fbbbbedbaaaf08 -size 8901733 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Duplicated-Coins.png b/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Duplicated-Coins.png deleted file mode 100644 index 5353d40f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Duplicated-Coins.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf870a007f4fa9b7231bd349e36b31696be1fcc98ba13e3592e3e0c60f9de4bf -size 28271 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Insert-Script.png b/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Insert-Script.png deleted file mode 100644 index 1cc33a69..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Insert-Script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6d5844b07efbe7d59f152e43abd078a5f0007f80bbb4e62f9f43e58f2cef0fa -size 47812 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Multiple-Coins-In-Level.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Multiple-Coins-In-Level.jpg deleted file mode 100644 index 2ce87920..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Multiple-Coins-In-Level.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5bb6d1faed3e6101fda015b3da4624bcf65fae7f4ac315240e34b251f9522b8 -size 189935 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/New-Single-Coin.png b/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/New-Single-Coin.png deleted file mode 100644 index 60581b79..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/New-Single-Coin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:48062b08eabedddfa97cb5e1e259202cf34fca992a7d8435821c7f25fae22474 -size 26711 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Output-Collect-Coin.png b/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Output-Collect-Coin.png deleted file mode 100644 index 3bf42e25..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Output-Collect-Coin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a222e401b2a0df91a1108303eae2de72fae0bccf2cd9fed33f7fd5b51e6b76d7 -size 18736 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Rename-New-Script.png b/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Rename-New-Script.png deleted file mode 100644 index 98b68bb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Rename-New-Script.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd368e5c4cb4970e843ea022b45bf691355306e7cad04d89607f9bc562e20835 -size 21452 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Single-Coin-In-Viewport.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Single-Coin-In-Viewport.jpg deleted file mode 100644 index cd00f389..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/Single-Coin-In-Viewport.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ef6ebbed64b202d27d90721732f288186063619896fc477a5344c0b3dbcfa6a -size 150090 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/script-game-behavior-coin-collection.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/script-game-behavior-coin-collection.mp4 deleted file mode 100644 index c240611e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/script-game-behavior/script-game-behavior-coin-collection.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db196348cafde174419e544b5b45ce5cfd0eabff140ff102755b5914373d0348 -size 36454818 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalDefaultRunExample.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalDefaultRunExample.mp4 deleted file mode 100644 index e5a78ed1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalDefaultRunExample.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5b64bcf4fd5dae6f9816ab55b9d6467af30de048a02e558f5eaed1af549caed4 -size 609795 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalEventAnimation.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalEventAnimation.mp4 deleted file mode 100644 index 9073f0fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalEventAnimation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05b5aac33e0e97b24571e101495adde1f58565faee5b181c6e413ef50a4aeccc -size 708305 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalExamples-default.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalExamples-default.jpg deleted file mode 100644 index 48402d70..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalExamples-default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8ce4193d3f4126631ae431d67a385602f3745da50866666822b3466204c11438 -size 110891 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalExamples-event.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalExamples-event.jpg deleted file mode 100644 index 29dc2e98..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-FinalExamples-event.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8770cb3823d07ae19bf9e8f6d5fe5268984fea233a891ec6ac75259d7742f8b6 -size 181487 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ServerScriptChangeDefault.png b/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ServerScriptChangeDefault.png deleted file mode 100644 index f9fd2d8e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ServerScriptChangeDefault.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7eff440e0346a2aed25c4c7561c82025bf663cc852727d6feda9ab7d66b546f7 -size 6387 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ShockButtonModel.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ShockButtonModel.jpg deleted file mode 100644 index 93fc54b2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ShockButtonModel.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec96214deeb4ea09049a8a8f3c320a6d20d24d91850b211533a50c3719f6c376 -size 150431 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ShockPlayerScript.png b/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ShockPlayerScript.png deleted file mode 100644 index 36825c0b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/scripting-avatar-animations/Using-Animations-ShockPlayerScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bfd8e0bc63bcdfc2ef8622dae95f067431d60670c68522cc2c2547de4444871 -size 6619 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/3D-Viewport.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/3D-Viewport.jpg deleted file mode 100644 index 6c0bb6e0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/3D-Viewport.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9a6855e4f41b47851158975beed7e709909e17cbdb63bdbde401a825a0781f4 -size 258209 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Explorer.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Explorer.jpg deleted file mode 100644 index 15887dee..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Explorer.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60e661a90cc02a391c0223f9ef1e05f2565e20f999cbfd262e12f54edf0956c0 -size 251731 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Mezzanine.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Mezzanine.jpg deleted file mode 100644 index d068071e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Mezzanine.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c11e4003c1eea5e0e6002e6d89fa982cf6c6e6d211bc0cf22fb058005f6441f7 -size 258545 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Properties.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Properties.jpg deleted file mode 100644 index 6bddf572..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Properties.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:70a73f383acb4a029ad7cb06393c9d3f57d7981f6818540173dc244d962abdc7 -size 253836 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Toolbar.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Toolbar.jpg deleted file mode 100644 index 1ee9012a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Toolbar.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d846076f66555cdb866b5d3a877748f1712780335b1cddc80c8774f028ce4682 -size 263321 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Toolbox.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Toolbox.jpg deleted file mode 100644 index e05dd348..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/studio-lesson/Toolbox.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:593eb2f4cd5031684043d818ad16ee9d9de0e26557f0565ed7a8c0f7330c130c -size 251583 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/BlasterFlow.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/BlasterFlow.png deleted file mode 100644 index d516e7ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/BlasterFlow.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:90ee89bd0ed61330f9d59959129da45282abafb0d2842e27ee1c3b617810ce99 -size 86282 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/BlasterInteractionOrder.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/BlasterInteractionOrder.png deleted file mode 100644 index eae08bf3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/BlasterInteractionOrder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b18ce4dd7d8e3e09e01181b37a1ea35561ce0b9d9c436638f7ae2eafc084c510 -size 182465 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/GreenLeft.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/GreenLeft.jpg deleted file mode 100644 index 5f8676df..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/GreenLeft.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fb259025694fccadedd68c24f73b4e6749edbf0bbe2ecb95b3a23679dedd2c73 -size 484612 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/Intro.jpg deleted file mode 100644 index 5e8aa9c5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25199aabfb6554d1dc9d4254ab65c99baac7b7ee058cebf04c74b56a945d03a4 -size 167372 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/ObjectivePromptPreview.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/ObjectivePromptPreview.png deleted file mode 100644 index 791b67c9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/ObjectivePromptPreview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0528ffe75da4f9833984976ca8b8cd1436817a4ffee8b28645f29231bbe43de -size 194823 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/PinkRight.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/PinkRight.jpg deleted file mode 100644 index 670611ab..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/PinkRight.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:59ef9711626a6f5bccd0f191c1f4af2efa8ff5bf5f2c85e2903f526308942a25 -size 316114 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/PlayerInfoPreview.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/PlayerInfoPreview.png deleted file mode 100644 index b0760a47..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/PlayerInfoPreview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9c284a18867ca555727d36890278105328f5102695cef3be4dca2ac52e8e0b1 -size 38673 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/RespawningPreview.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/RespawningPreview.png deleted file mode 100644 index 9f8b2d0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section1/RespawningPreview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1daf074ea64e4c70faee7a6efcf07e7416c96baa0f252a8c72dda1971b64601f -size 88878 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/MobileBlockIn.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/MobileBlockIn.png deleted file mode 100644 index 4c3a70d2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/MobileBlockIn.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a3036fa2ba4458746954beacb973e3b3f6abbb3345380c7f581812cf62605e2 -size 498602 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/PCBlockIn.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/PCBlockIn.png deleted file mode 100644 index 56e8dba4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/PCBlockIn.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae54b7461249fb99839f8903efe243eddbc4bf586196747e39a64c9fb3163695 -size 516384 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/UserFlowChart.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/UserFlowChart.jpg deleted file mode 100644 index cf573f02..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/UserFlowChart.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fee895421df7fc91d009c95ad7d7e0bc88b74bba8e595355ef4326749df53f9 -size 140588 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/VisualHierarchy.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/VisualHierarchy.png deleted file mode 100644 index 6e2ae0bf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section2/VisualHierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:defdbb958eaa7a49b670e2c27574aed6d77d63dd49278aead43755ee8becf4aa -size 110592 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-1A.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-1A.png deleted file mode 100644 index 32b11eb8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-1A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:00496264e422f0c6a5714728ef9a2688ca6c57d258f4130225c1a31b1d843734 -size 6093 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-1B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-1B.png deleted file mode 100644 index 3ec64a44..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-1B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a35f14c37c508bc918e5b56904cea24105d50e637afe458f52d9ab125cd7fcc7 -size 695733 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-2B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-2B.png deleted file mode 100644 index 90af392b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-2B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e897bb3602cfd8af4742cbe33f3c7a360ff304cb2d43b6b1e785a279ec75bbc -size 673274 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-3B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-3B.png deleted file mode 100644 index a9a86758..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-3B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:046614cd32df476de4f46bb24ead964875dc5336c22bd9864e15df77d5de7a23 -size 673731 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-3E.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-3E.png deleted file mode 100644 index 25f04724..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-3E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e33274e8e643a11c7b10f0de48e4a4a668246931a43fba38c95cfa57f33a675 -size 672342 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-4B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-4B.png deleted file mode 100644 index 606eff13..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-4B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d92b0b5449117c262c7cd336d1c55a061639549fa0cc354386e06041c244edb9 -size 608776 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-4C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-4C.png deleted file mode 100644 index 1e4743c2..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-4C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:af03c5efd75dd1aaa541b0777d758857d81fda54825f2559c46410cb8e9f158b -size 610703 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-5E.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-5E.png deleted file mode 100644 index ee78e9f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-5E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:935370a33f7326efb5623ff0e2682fc4cd48d941dae29c82a83eafd6e7cc97da -size 1169721 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7B.png deleted file mode 100644 index d4ab94cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:33426a41182871a70818fdd7c794e4d6fb360cd0b26f039e6df7d387eb8703e5 -size 611507 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7C.png deleted file mode 100644 index b9866098..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2d2fd58ddb48dd36c10e46907ca1520c14d4b22a13eaa94d6cf21094dcdca6ac -size 369372 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7E.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7E.png deleted file mode 100644 index c2ef9ec3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-7E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:85397f979b10ba853bcfce90b4e3b4f0d477925d6c9d29edb558ba98e4f14322 -size 613971 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-8C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-8C.png deleted file mode 100644 index 5dd1aab8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-8C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2371566c24a3b7849575e20391d3a25ee9d705f1dbe46022632e7303da25ea0d -size 613361 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9B.png deleted file mode 100644 index bba0410f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ed733078cfa8ff73b5beaad6163620abb9f06b7b89b0c433ebf4f963d4c68742 -size 383921 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9C.png deleted file mode 100644 index a9726aba..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:787a5689e1198f20087e1921d381dfed1cb91301cd18ae9b277358f6b322d1b8 -size 617183 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9E.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9E.png deleted file mode 100644 index 89f2e611..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-9E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2587685196fe1550e713775551dd8265e5323afd5ae50edb4f286ece5c4081c0 -size 639999 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-Intro.png deleted file mode 100644 index a55e7884..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BS-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdac054fe6b12cb89ee3e999f97c5ab845729b7a83b4e2c73c03981f51c8856f -size 544373 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonComponent.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonComponent.jpg deleted file mode 100644 index 9e3a569f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonComponent.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07b625fd25e59e5b219e84e5586111c3f84f33b93ad29578bb42197915f950be -size 4373 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonIcon-Default.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonIcon-Default.jpg deleted file mode 100644 index 96a13ffa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonIcon-Default.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be5bbc21bc08f6155896fa43bed57290e9c8547149aecc246b76f2e20c33ce4d -size 13923 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonIcon-Pressed.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonIcon-Pressed.jpg deleted file mode 100644 index 235ad4a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlastButtonIcon-Pressed.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ee8111249c68bd5db4f50b60a86d25a6acbe6b6e81f727ffddc2db0f7da2a0a1 -size 11599 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-1C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-1C.png deleted file mode 100644 index 38e24a3f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-1C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a26b5f2f04fdf2e67ba0fec376276b904a4344fd4a671cb2960e28797952ca80 -size 18574 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-Intro.jpg deleted file mode 100644 index 6d3259d7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a70cfdf634297574e7a3bdf38dd0527df4fb5f0f279e6c8369b14af2d65b5521 -size 573950 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-Intro.png deleted file mode 100644 index 37e719bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterButton-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4c320e7a07641916b1f27dfe89a470529f2d183ed68738ba64783de2f2d5ee56 -size 693270 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterUI-Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterUI-Intro.png deleted file mode 100644 index 37260e16..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/BlasterUI-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58e1fa391df0ee02ea3335fa4dfb2fb127ba79b9966d7a50dc57133246debf08 -size 105271 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Border-Fade.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Border-Fade.jpg deleted file mode 100644 index 3687672c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Border-Fade.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ef7731022bead41466bb9e978028a0ce623522b4e58d21df0219366eca7efdcb -size 1873 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-2D.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-2D.png deleted file mode 100644 index 635b722a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-2D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aba38a91cebb2d21bb1dd7ba8cfe10f4f9e5924e997783c99579400e7be0e6e4 -size 690288 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-3C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-3C.png deleted file mode 100644 index 9f9938f7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-3C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fb2549c9c7224544ab1115e43d2257ce09dba72c055a4ccc76f7de6c9ff395b -size 691701 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-4B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-4B.png deleted file mode 100644 index a6574031..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-4B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f450b9fdf6fa07728f39c555ab653f41323264109793a6af5a8662905a58a5b0 -size 692017 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-5B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-5B.png deleted file mode 100644 index b1e43916..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-5B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba9ebb2aeeca1204958919e462c991b96df73a0fea9187b3559c8f21d39ae446 -size 694157 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-9A.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-9A.png deleted file mode 100644 index 20797fb5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-9A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad895ffc767450cfd2d872b34e26f8b72773b08835b1d3ac08461f9a93454193 -size 9500 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-Intro.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-Intro.mp4 deleted file mode 100644 index 8b998af8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CooldownMeter-Intro.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd53e6c17a2199e8ec1454aa5a23f45365933d51975f45c9aac366a0ff51f1bc -size 1034922 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Crosshair-1C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Crosshair-1C.png deleted file mode 100644 index 5ac2d3b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Crosshair-1C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fbffc7189f05f034b644bb17d5c466cd94e3b24ffb497176c2f97b57faa9412b -size 6683 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Crosshair-2F.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Crosshair-2F.png deleted file mode 100644 index 24395c84..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Crosshair-2F.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e172ac27ab6e80bc5668e8c863b5c102d99dbde1964007e2c44fa0148793da2 -size 603801 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CrosshairIcon.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CrosshairIcon.jpg deleted file mode 100644 index eea9359f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/CrosshairIcon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5411c70fdb3dc3a6feea8f19938651b1830627f86ba456a861a74118436d7f44 -size 5667 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Device-Emulator-Preview.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Device-Emulator-Preview.png deleted file mode 100644 index 4303a472..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Device-Emulator-Preview.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a46fbb9e4747099a93d4aa5082b42ce4ea88454d4f8d484555204d33f8c909d8 -size 158005 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Device-Emulator-Setup.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Device-Emulator-Setup.png deleted file mode 100644 index 35e37727..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Device-Emulator-Setup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53c00cc48c6a321b90c43bbd30d44c1395879e3f01721191ea07843a4e1199ee -size 50589 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Fade.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Fade.jpg deleted file mode 100644 index 5a518459..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Fade.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1575fd9f87f4f8b352e2045067c63ec82a87630f27ebb85822ad9d484adf680 -size 5630 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/GreenTeamIcon.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/GreenTeamIcon.jpg deleted file mode 100644 index 368cc258..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/GreenTeamIcon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6840f697ef98b498e994f4c448b39ca37986b84d41bebc3cb554d97f4e7c9316 -size 1997 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hexagon.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hexagon.jpg deleted file mode 100644 index 71dd6d66..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hexagon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:325ccca0527eb764a968839140d413e55979c95e7fcd2319ba577fed3d69b28e -size 4992 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/HitMarker-Icon.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/HitMarker-Icon.jpg deleted file mode 100644 index 2a572c45..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/HitMarker-Icon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e14c9d75cb7f652f2c94ad6a0d8863002a2273cf42c32c17c1381967812feee7 -size 1813 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hitmarker-1C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hitmarker-1C.png deleted file mode 100644 index 398251a6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hitmarker-1C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:19f64d61a900ef4033ca2177f34586ef164bbad31817bf619b6136adbb40a2e9 -size 15722 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hitmarker-2F.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hitmarker-2F.png deleted file mode 100644 index 93ec0c05..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Hitmarker-2F.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:88fa5506b810a042476dc6a940b15ca79bf84f911142ce62cc1d7c8611287d13 -size 606600 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-1C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-1C.png deleted file mode 100644 index 76f24ca6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-1C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:835105f98851d33ee1cdc49b1d87d0b4d2410868a6ee11b78ec10766744bdfdb -size 18057 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-2E.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-2E.png deleted file mode 100644 index 7a7d1395..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-2E.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e50c137726d97c9b843f3e588ea62128f63a5f7ff391119736da129f88f2f946 -size 731975 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Ai.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Ai.png deleted file mode 100644 index 5678eae8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Ai.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:247a15cca71d07f8d4a3771a2a3ba00a3d95dcde4c85715e3e637546407b7024 -size 12935 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Av1.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Av1.png deleted file mode 100644 index 60470eed..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Av1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a71434189b610e7d2a715dc831a5b2f853c2a60d00ae6f5d14e28a17b39717c1 -size 15158 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Av2.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Av2.png deleted file mode 100644 index 52f7c872..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Av2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d8e8323defc0eb630ec013d5b55f052632f8ac45f49962a98eb1139dda50f7c8 -size 766942 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4B.png deleted file mode 100644 index 29f0d9fb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ddbd5371d0a4556cbe08c6793a4b4b32f3cf1890adb23e356893f05ed76e30c -size 766707 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Cii1.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Cii1.png deleted file mode 100644 index 91daf6e7..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Cii1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2f278dccc8a7da3fbaf94fd6325fd0a1618b9f7ecbd5111cc2221152664d143a -size 49920 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Cii2.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Cii2.png deleted file mode 100644 index a37f1fcf..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-4Cii2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5878c21d3c1fa218c7186db2dc80d68a366893ef14da2896b496113bc3a4e539 -size 771946 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-6A.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-6A.png deleted file mode 100644 index e6c35650..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-6A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:745d372933004250d70f602e38c8b12c5e3d5eb9bb1504048bb19c0ea1812b3f -size 899820 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-6C.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-6C.png deleted file mode 100644 index 316bf942..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-6C.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0883f15153d81958371f9388f56e1c72a49f78ab160307998b528bf669c4843c -size 39894 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-Complete.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-Complete.png deleted file mode 100644 index ef3df790..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Join-Complete.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76539fd173170c645040d76a5d153884ef00766237fa273d7be7c7915534eed9 -size 892958 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Multi-Directional-Fade.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Multi-Directional-Fade.jpg deleted file mode 100644 index 99b4d8bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Multi-Directional-Fade.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:956ba140d75d8bd5693739cbe1d706b6b5fdf808ee743669fe474233ea59ca9f -size 13540 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterConfiguration.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterConfiguration.png deleted file mode 100644 index 4d5b9202..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterConfiguration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bcbd6901603c49f170c4f032a918976da8e2e35b7b11a5e946a6ea8100379cc -size 66401 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterIcon.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterIcon.jpg deleted file mode 100644 index 470ac09a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterIcon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:87fbadd2eae4aa0b643c6512621c3d133d4b188e9fc03b94cb5fb70797dbc400 -size 4576 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterIcon2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterIcon2.jpg deleted file mode 100644 index 3f50b2dc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/MultiBlasterIcon2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a4f49f9cb610f9cc4fd121186c99747a844ff82a466b47d9a4d067b5056b619 -size 6067 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-1.jpg deleted file mode 100644 index 7fc49550..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89a23bcfbd698ef0cc4cb01c714629757200c9b5c4764745d0e90d14aa7bf5c0 -size 379053 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-2.jpg deleted file mode 100644 index 344b3b9a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dcb726e5376b0c63766bb24a340b280da4c1149dd66c62d42c8c788303fe04e9 -size 416183 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-3B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-3B.jpg deleted file mode 100644 index 9d5c342f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-3B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02ba46504b579e9d013e2dc252f9e057e96eb8919586e9178bfd52dc51c3cd69 -size 411973 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-3E.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-3E.jpg deleted file mode 100644 index 92b7f7d9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-3E.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e734a9e7f9e75b073582d2c86619735585ead48e10cd304b9dc71b48b6933bd -size 405479 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-4B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-4B.jpg deleted file mode 100644 index 8ae4ebb5..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-4B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbfaff26812e3a33b91dcfcea684ce0fc7e8c5c5de1596e095b2f8c3e96993d4 -size 414926 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-4E.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-4E.jpg deleted file mode 100644 index ed65e17e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-4E.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0898f18019d1c3125ac772ebbfd96a791cdb3577ae1837eaf9e33bda44d5e103 -size 420502 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-5.jpg deleted file mode 100644 index 034b8e53..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e519b3baafda4aa69815b252fc9979b2b9a3dd33c6aa2c5e7708711bac7ce5c -size 431033 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7B.jpg deleted file mode 100644 index d5453682..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f376a8e80c6b95e00257cc1d5645bdf5be34bcff798edd046fe5950b45847432 -size 428465 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7E.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7E.jpg deleted file mode 100644 index 8aacd079..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7E.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:413d01932cd979da28a617f717a3ed2844eceae447b41f8165c90fe042c16c55 -size 422340 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7F.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7F.jpg deleted file mode 100644 index 848dbef6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-7F.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6b4530b3eaab01dec2ad7dec92d672d6bc39316d69281afb69cd0613a59303d -size 424407 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-8.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-8.jpg deleted file mode 100644 index 8b59fe77..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-8.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f076e0e499822cb4847d1fbf45859ce08c7635066a8c186b37ab9eb241f86bd1 -size 425675 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-Intro.jpg deleted file mode 100644 index 27f04aba..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Objective-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d486ec2dbb07cb15d7dd0b1a2065d2ad7da4dfdeed157642ed535403b77b4265 -size 416733 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ObjectiveComponent.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ObjectiveComponent.jpg deleted file mode 100644 index 5ad50d3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ObjectiveComponent.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93303d25fb15141d802818e8b320f5d8c2495aa7f3eae14fb0085463c975a540 -size 11550 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ObjectiveUI-Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ObjectiveUI-Intro.png deleted file mode 100644 index 56069f85..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ObjectiveUI-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffbb4d2270f4d08d1bef271ed5b7008e55531fa624a1b345f3a408179359fcbd -size 104423 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-2.jpg deleted file mode 100644 index ae06eb11..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0279d959e7ff4f07e1d6d20593dc8eb5a08e718455c56c6b187f41521561a5d -size 421000 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-3.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-3.jpg deleted file mode 100644 index 14565327..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-3.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fcc4b67b3d0a8aec07aa7315ccecc0c637a40e018ab1f6d9c3650ccc2e729e22 -size 411048 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-4B.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-4B.jpg deleted file mode 100644 index 8c827b57..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-4B.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3eb852aadfb0ebf222fa1516dc613b44f101145c5207b4194be824f64839bc1a -size 410642 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-4D.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-4D.jpg deleted file mode 100644 index 918aca13..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-4D.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9b2f1f6b3fc7627733913b05a40c665deb964da883bcb4a13c78a99a02124371 -size 53824 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-5.jpg deleted file mode 100644 index 9a5dd42d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d3dc6fa138a7640e3c8870b80b608f707da574069604c1185785b1e9ad35a5c -size 56713 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6B1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6B1.jpg deleted file mode 100644 index c02ae9f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6B1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8d79e5f5675831bdbcbc4bd030965693fe2aa3e77d40ffcb68fa9e2a94e74c0c -size 398485 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6B2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6B2.jpg deleted file mode 100644 index 841636ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6B2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5600f624b6459d3a66c28c4f7e327f10fb6fbdb728f6dc6bb71236284d75c96b -size 405851 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6C.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6C.jpg deleted file mode 100644 index a8b88c39..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-6C.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f5e02ee79a771615b37c00e84fb6f2bdee8ea6686efa3f4057f9b2926ad19d1d -size 405246 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-Intro.jpg deleted file mode 100644 index 9b434edc..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PI-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1a51408d6aa34736740ed98d213f4ccc670783c94274fa11fcc28b000eb97aa -size 402251 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PickABlasterComponent.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PickABlasterComponent.jpg deleted file mode 100644 index 488ac4c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PickABlasterComponent.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4314f28a7b06e032158b92a084fc2dd20c898ac469e155e31b5b71a0e8a7ef05 -size 22994 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PinkTeamIcon.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PinkTeamIcon.jpg deleted file mode 100644 index 266d680b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PinkTeamIcon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7833a5f5a6ccee70059b9b3a6cfaaf9ce8e8d0a080962f05d1ecc9429f7e5244 -size 2031 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PlayerInfoComponent.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PlayerInfoComponent.jpg deleted file mode 100644 index d91d8486..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PlayerInfoComponent.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8a2959d2d60e028c20b98db19faf602e263fcdfaae828d4eb0b872e6ea61bb96 -size 11269 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PlayerUI-Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PlayerUI-Intro.png deleted file mode 100644 index a0f56c44..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/PlayerUI-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2b4ed188051c5f551fe5ca919458310ef074b3f516c245b48c0cd48320e315d -size 104981 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ResolutionDropdown.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ResolutionDropdown.jpg deleted file mode 100644 index bf925bef..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ResolutionDropdown.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7630deaf878c7767bf7b6ced9168c7f37eb6079bd54a12743eb311ab8f52dc8f -size 75237 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1A.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1A.png deleted file mode 100644 index f419c64f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e5d83090d47e05f7d5a44e38949fdcdb573defae7cb96904a54ba42db8543cb -size 21792 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1B.png deleted file mode 100644 index c84e882e..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e0e2639cf9bb7dbe1ac79332a53db3695fecc932df92df7002e552fc2125d4b -size 593197 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1F.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1F.png deleted file mode 100644 index 7827d939..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-1F.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:887a576e89fe49420c515e824f920ae682e2fd66b3a79595b0f335a02af176f1 -size 597783 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-2B.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-2B.png deleted file mode 100644 index aca33d7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-2B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1b421a7e4827046256bdfe57bf69c1343be4f2b5297b32686eb80b4cc58116bd -size 596654 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-2D.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-2D.png deleted file mode 100644 index ff8963e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-2D.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c77ada714ba59abfd0d0ff4edb34c48d82b30a6e423a7862033b1f4043216fe -size 601389 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-Complete.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-Complete.png deleted file mode 100644 index 0d3f653b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Respawn-Complete.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:becaaa22c00b3ff18294622bb46d0c020c71997420650f49cf78a308e051137d -size 408151 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ScreenGuiContainers.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ScreenGuiContainers.jpg deleted file mode 100644 index 4b38a42c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ScreenGuiContainers.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cdec6346f377b64c632ce842d41636fbaa124fc5d8ffc8345369ac95195b168e -size 10058 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ScreenGuiContainers.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ScreenGuiContainers.png deleted file mode 100644 index ce43bdb9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/ScreenGuiContainers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fbc67cbcc3b9834625de24894c6dcc64e0a459676d00bbffc85376b554dd0ed -size 18188 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SelectionArrowIcon.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SelectionArrowIcon.jpg deleted file mode 100644 index 5e65cf0f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SelectionArrowIcon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6f06667bfcb324801577a5b39323e382125a679d63ed59b321ab86624223d60b -size 1627 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SingleBlasterConfiguration.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SingleBlasterConfiguration.png deleted file mode 100644 index 5f0177df..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SingleBlasterConfiguration.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:58122f7ee76949953dde95345f8daea656edf67abc31b8859d15a703291d27d1 -size 66754 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SingleBlasterIcon.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SingleBlasterIcon.jpg deleted file mode 100644 index c07c6f94..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SingleBlasterIcon.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9245ab8be5649ba4da8e294c8973f00dddad24aad82b97e0484807284eb98b9 -size 5059 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SurfaceGuiContainers.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SurfaceGuiContainers.png deleted file mode 100644 index ab2b524b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/SurfaceGuiContainers.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c4a00584079f1ac342e937a191e5e704b8ababa84a9cd870ed6931b04d4683c1 -size 23783 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-1.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-1.jpg deleted file mode 100644 index 08ab719b..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:82fa701e0a0a291fb9ec1779218c76f8c116508817a6be9ab325cfff9fe2b765 -size 702838 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-2.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-2.jpg deleted file mode 100644 index 802f6ddd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-2.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:124c07018676d2b6b74f0b500d985dcec342f9e252a91ec4bd167da2993be18f -size 700756 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-4.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-4.jpg deleted file mode 100644 index 5d62d891..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-4.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86d83fdcb96c0123b47de957a58968f7c9cf322fe223647eeb75a79d28dd02a0 -size 698846 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-5.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-5.jpg deleted file mode 100644 index 197ace96..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-5.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d21873653470bd7d51a2ded51a9c284a79adcf0d455a57e67950eef0e3b0785c -size 698467 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-6.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-6.jpg deleted file mode 100644 index 0f62b841..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TI-6.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d6dc5a6c2abd627061892b7b7094e41ee2770ecfb701378196b2a50218d4162a -size 701102 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-1.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-1.png deleted file mode 100644 index 1421b8f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc654f8b3eae5ec07de66b508c631b33282c6c23d2179e17c4bf392631023f55 -size 1020099 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-2.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-2.png deleted file mode 100644 index ada48680..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:73e7f923a585dcd2980456faa653adf39b59d348abbcf3a38bd1c686047cc476 -size 1018743 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-4.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-4.png deleted file mode 100644 index f7a7dfbd..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:60d69b27534d65ad23d8a1e3c21f3addf812e7deec9f6878f0dc0191185393d8 -size 1021296 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-6.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-6.png deleted file mode 100644 index 48452e16..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-6.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba9912388ebf32ade4f9a14cb89aab9f67c0687c0aa3f2c7b8d47a055afb0e06 -size 1024882 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-Intro.png b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-Intro.png deleted file mode 100644 index 6af534aa..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/TOI-Intro.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a680652f5e4df7d3d8e6e2855100973f19584fca306f424e781747e491d2461 -size 712574 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Team-Indicator-Intro.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Team-Indicator-Intro.jpg deleted file mode 100644 index c9fa7a7a..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Team-Indicator-Intro.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae3a585bfda8eb834415d609ebd5f916ec2c645c9e6fc4c76cffc962cae7315e -size 413988 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Trapezoid-Reverse.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Trapezoid-Reverse.jpg deleted file mode 100644 index 680065b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Trapezoid-Reverse.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66d7766e4cd7ce953cd8fc6be9a2e7fbe84d6fdfcb3a47b110aa5633ca422344 -size 5669 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Trapezoid.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Trapezoid.jpg deleted file mode 100644 index b24f7854..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/user-interface-design/Section3/Trapezoid.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d67632008455f8ed770808fb6b6bfaa31e778838301d21b1c8168a6f1154b275 -size 2964 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_finalInContext.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_finalInContext.mp4 deleted file mode 100644 index 9d2ab718..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_finalInContext.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0165f78a6123ec4e6faf7b585a432a26f127fecd91fd0192324db9fb734130c0 -size 920611 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_genericFinal.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_genericFinal.mp4 deleted file mode 100644 index a35d09f1..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_genericFinal.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6a28ad4eb2e7964af043348e9867ddf8784e128c443decde14f532c9f5374b3 -size 356443 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_testParticleEmit.mp4 b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_testParticleEmit.mp4 deleted file mode 100644 index 5054438d..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticle_testParticleEmit.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eff4acd6c66f07bdb86e0f81824c5976cb07b0cea4014d66061e700cf1eba4cd -size 118474 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_colorSequence.png b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_colorSequence.png deleted file mode 100644 index 693a5e3f..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_colorSequence.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:699c5bc911ad4e786980de9e4552cbb7cb461651bd5472989923bf69b317ed17 -size 6529 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_confirmPluginInstall.png b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_confirmPluginInstall.png deleted file mode 100644 index 25f65444..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_confirmPluginInstall.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dd3740e1c66cf12c882a9aee8cdfa6c3edbc29d73b47aa87bf8d627d9f858a26 -size 8789 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_createExplosion.png b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_createExplosion.png deleted file mode 100644 index 86ffff76..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_createExplosion.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07dd9ead4d4ff765c2c1611e84de13c30d8732076f0d54867d1e4603747763cb -size 7536 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_enterEmitRate.png b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_enterEmitRate.png deleted file mode 100644 index bfefcf3c..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_enterEmitRate.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bf64eb654e6cca759fc73ed60438803c971058cb8a5ce03248b4ba5afb4bf662 -size 5614 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_explorerCreateScript.png b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_explorerCreateScript.png deleted file mode 100644 index 6b4b46cb..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_explorerCreateScript.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9779bc0ca6eabd4a10564f218ce97c8f0ed9415ae9816f0a7eeb9affe0199c88 -size 6272 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_partExample.png b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_partExample.png deleted file mode 100644 index a56c2b07..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_partExample.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78d8490b70bf5a44e8e727c178cdc2f21cded123dcfb08c37799bef22bc967fd -size 94669 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_pluginInstall.png b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_pluginInstall.png deleted file mode 100644 index 5bdc27e6..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_pluginInstall.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:dc0771e7985d54bb11592bce8252b9720a7fee10d7aad5ee8ee487f74d769855 -size 10127 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_toggleEnabled.png b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_toggleEnabled.png deleted file mode 100644 index f31dcde9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_toggleEnabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c48bb9e972f239a770c9b47bdd66ea7eec8443e898c7667adb1b6bbe2eb16cf3 -size 5758 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_transparencyGradient.png b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_transparencyGradient.png deleted file mode 100644 index 2f9e2e49..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_transparencyGradient.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:46fc20a758054b05889f3d0562f6d6c378df1d51979ba697770dd8b4057d3fca -size 20398 diff --git a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_transparencyGradientExample.jpg b/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_transparencyGradientExample.jpg deleted file mode 100644 index 67cb3ec9..00000000 --- a/.cursor/rules/roblox/en-us/assets/tutorials/using-particles-for-explosions/burstParticles_transparencyGradientExample.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4ae2f1d94da9200c92ac859cfa13c7d92a5490c77acf3f37fab5adc60de30cdc -size 77962 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Control-Point-Relativity.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Control-Point-Relativity.png deleted file mode 100644 index 1e48cf57..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Control-Point-Relativity.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4f822babbc8c1a61596ed808bf4409f3c5a356011231ee71ad9957d43056874 -size 64248 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Point-Between.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Point-Between.png deleted file mode 100644 index 91aa5914..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Point-Between.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ac14f62af1e18c23fb38ee989a10581a273e27144813f8ac29c433905298f65d -size 215442 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Point-From-End.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Point-From-End.png deleted file mode 100644 index b3e5e44c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Point-From-End.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40a9c82b8f5f18ca80db845c097d5014dca5f9c91ae38c478133b716fd65133f -size 230567 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Tangent.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Tangent.png deleted file mode 100644 index 61ecdbd3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Add-Tangent.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01c5fb837eafa27d0450b616fb27ed66e60c26b644431d8773f2b3bed6a71c0b -size 261330 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Adjust-Tangent.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Adjust-Tangent.png deleted file mode 100644 index 4bfcce55..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Adjust-Tangent.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:677070cb58881b96e844ae55fb6c424cc0eb287ec3ab2ba10d09d978ec5b4a9f -size 299302 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Break-Tangents.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Break-Tangents.png deleted file mode 100644 index d11d00f5..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Break-Tangents.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98688c60fa6df0ac40b514e702b2c2244b2a68c4a5a8357866c111d48908a0f2 -size 295293 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Clear-Tangents.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Clear-Tangents.png deleted file mode 100644 index df104964..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Clear-Tangents.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:74cde8690848946f27d717430827cd1c76bcf568139d6fefd54173847462adf9 -size 374754 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Create-Basic.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Create-Basic.png deleted file mode 100644 index 8832a8ee..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Create-Basic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2fb32beb62295dafce043ec82dbe78b25b38a829461ba18b233153abbdd648d5 -size 210321 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Delete-Point.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Delete-Point.png deleted file mode 100644 index 9331b576..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Delete-Point.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebb22fb9d5f930aefc0b01b9af8cd76c9eae5319bd9add5dc32b4d3be6754ac5 -size 265583 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Delete-Tangent.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Delete-Tangent.png deleted file mode 100644 index ba65e537..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Delete-Tangent.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7df18513ca2d1fc94fbf931f68b04852b56216fc16b7af854bcea66463bea389 -size 333373 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Move-Point.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Move-Point.png deleted file mode 100644 index 10b45ec1..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Move-Point.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c2e30c9c89b107ff60c4e49c4f7a6be757ea1f46c2835862d7580f1ed681694 -size 254880 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Thick-Red.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Thick-Red.png deleted file mode 100644 index 80b16268..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Thick-Red.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8afaa8fa74548957f44d98eb316a10b8f5e47ac27c4a123fa34461b89a1e27e -size 205134 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Thin-Grey.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Thin-Grey.png deleted file mode 100644 index d78578a3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-Thin-Grey.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9062783b49981db538fc08375fc5d5e046c0af80e17190a8caaed8e2e2821fb8 -size 203357 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-ZIndex-Layering.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-ZIndex-Layering.png deleted file mode 100644 index 241f651f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path-Example-ZIndex-Layering.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:09883b91208d28a47207f4d36c4024640f79146ef2f30d53370fcad80cb523ba -size 245185 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path2D.mp4 b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path2D.mp4 deleted file mode 100644 index 613e1ae9..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Path2D.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49d4109afdd79890f886c0ffedf0ffa4e16b269779e4e98db70a7ae90813ca69 -size 2651376 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Tangents.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Tangents.png deleted file mode 100644 index 8a0e5627..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Tangents.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:40577efba1193a86f71fc76b6b71ad0a690ef4419accab0637c30385554048f2 -size 354434 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Add-Point.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Add-Point.png deleted file mode 100644 index 507a3273..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Add-Point.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9be5a426466c8bd9760e115b028d8841ec71ae329c6cd75f3cf1723b9e5c7de6 -size 15524 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Add-Tangent.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Add-Tangent.png deleted file mode 100644 index 4f112461..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Add-Tangent.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6ecced5dd3e03ed112ed8ffd21bee8d6c5d1fba1684020bc29a5ae0cc304afc -size 15959 diff --git a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Select.png b/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Select.png deleted file mode 100644 index 46bef128..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/2D-paths/Widget-Select.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a3052cfdfff9310f729bb825f2289142ed2009f6f855275cfd225a17bff9177 -size 15449 diff --git a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Balance-Tower.mp4 b/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Balance-Tower.mp4 deleted file mode 100644 index 9fe64994..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Balance-Tower.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1e23ad33c24de4664c9687685fdb7ddea29e6d62e686233b4357d814187be683 -size 1525385 diff --git a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Color-Slider.mp4 b/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Color-Slider.mp4 deleted file mode 100644 index 18d514d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Color-Slider.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0dca122b27439d2fc05c40a8bd62f9af2859f3adeeec775a7224a42def010ec8 -size 1057918 diff --git a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Desk-Drawers.mp4 b/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Desk-Drawers.mp4 deleted file mode 100644 index 273d6b5f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Desk-Drawers.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e1e060060164da2e2c33c0bd9d7426be9fcb2214c52e65e83b1d16425d5293d -size 870877 diff --git a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Marionette.mp4 b/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Marionette.mp4 deleted file mode 100644 index 4722f477..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Marionette.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7c8d2f3713a53e89e2957949965cb96999eca03ecba566bdbcd10ddca043ae0 -size 1616974 diff --git a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Showcase.mp4 deleted file mode 100644 index 8422f49c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/3D-drag-detectors/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8adfd218a3bf252623d09ce37b55b235c28d7529b64b2a5b0c5eac6abada8a5e -size 3745419 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Comparison-With.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Comparison-With.png deleted file mode 100644 index b589d65e..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Comparison-With.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c418b6aa4a67452e4d65bf04a04cc1a64ae434a5c82310b6e5e5639cb89ea84 -size 76619 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Comparison-Without.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Comparison-Without.png deleted file mode 100644 index 41d69105..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Comparison-Without.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91ebdd03f6f0afca6cd27af204a427caf38380a7e0376708b57d84fea6980e5d -size 130803 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Concept-Diagram.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Concept-Diagram.png deleted file mode 100644 index 2a72b7af..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Concept-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a14ef3092e5827a65bec10fc28bdc4ca06bce3906e5d52456dd1b36ba0eb7558 -size 113815 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Editor-View.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Editor-View.png deleted file mode 100644 index 77918834..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Editor-View.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea38965da23d3cca4a1fd5cb91b9eef84a3700eabb628eccc6db1705df8b5f6f -size 99665 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-A-Editor.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-A-Editor.png deleted file mode 100644 index f2381048..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-A-Editor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aa7ec58b6674a807417bc1b172b70a95221a5fc9140d9f0a85ce8ec3c67d5dc7 -size 24469 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-A-ImageLabel.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-A-ImageLabel.png deleted file mode 100644 index ce2792e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-A-ImageLabel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:468e0a4ce555682733d5acec5fde8161a6023d01dc2e98c8f75861b636e9f3f4 -size 45000 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-B-Editor.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-B-Editor.png deleted file mode 100644 index 4dac6243..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-B-Editor.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:43b78eafe08c7e6d19bb059873e8fd2454f706d815c194ca04a87819a99cc9f0 -size 25492 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-B-ImageLabel.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-B-ImageLabel.png deleted file mode 100644 index 6ccf28e4..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Example-B-ImageLabel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:98c7ca8782b3168a32bf22b0f5be87395b55a3228e02dd7b453afa25d443f611 -size 52462 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Intro-Examples.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Intro-Examples.png deleted file mode 100644 index c7ed8da6..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Intro-Examples.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:27c67456a2cd9fefe0af6d26d428b24353f958f37803fe0e5b5a7c1e4d1b6f4a -size 25235 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Offset-Diagram.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Offset-Diagram.png deleted file mode 100644 index a55795bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Offset-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c8959fe299d997eaafc22da1cca98e5fe83c34d42feb51458f8687937a29aaae -size 96066 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-Image.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-Image.png deleted file mode 100644 index eeb90866..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-Image.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02bb10c3c7a52186e499f902327449b9976439c8e746ab63c268bc001e8fc137 -size 15103 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-ScaleType.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-ScaleType.png deleted file mode 100644 index d84471f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-ScaleType.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:30cde60944d91108fa396ceee6ae5b59d5bd73a09c06a1954f0baf8f31f91336 -size 11430 diff --git a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-SliceCenter.png b/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-SliceCenter.png deleted file mode 100644 index e5ec49a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/9-slice/9-Slice-Properties-SliceCenter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3541dc33a102d090491691e6613e607feb480dbf46d34369e810a67296a2c295 -size 27247 diff --git a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/Intro-Frame.mp4 b/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/Intro-Frame.mp4 deleted file mode 100644 index 9564ea3a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/Intro-Frame.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7374e9df44c84b2aa976c5528f144efc9b32838fee9718d59481e6740f4c8091 -size 2089888 diff --git a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-anchorpoint.mp4 b/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-anchorpoint.mp4 deleted file mode 100644 index 85118e8f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-anchorpoint.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7f9e7538965a6b7ea64f3220008d27bbe917c0f1e6ec8b18d75cbd69801202f1 -size 181639 diff --git a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-size-0.mp4 b/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-size-0.mp4 deleted file mode 100644 index 4fde0e1b..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-size-0.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bdb6d4126bc86498bfd967d08ae4c42f709e75aa290d33122fa7aca5bd73dea2 -size 37107 diff --git a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-size-100.mp4 b/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-size-100.mp4 deleted file mode 100644 index ebd9f15f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-size-100.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa8ad7f03c394e61f29c27b52caf203084c176f403bf1f980e38653583f653b1 -size 36276 diff --git a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-textwrapping.mp4 b/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-textwrapping.mp4 deleted file mode 100644 index 07534299..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/automatic-sizing/customizing-textwrapping.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a4e652db0d68cdef49e0b6e7ec65e9ed661b063ae4ab23e60dce6395ce1d1a1 -size 86946 diff --git a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-Screen-New.jpg b/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-Screen-New.jpg deleted file mode 100644 index 10e75f4b..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-Screen-New.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6131f73adf259653919e1b78eae3e6e8b083057851349c9888e4f8af616bed08 -size 143522 diff --git a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Hover.png b/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Hover.png deleted file mode 100644 index d1561715..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Hover.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7a3540e4c8f6d1cd52cf7d796f5c6fde9de41ea000d756f220b3bad7410300ab -size 27919 diff --git a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Normal.png b/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Normal.png deleted file mode 100644 index 42242daf..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Normal.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bbf87580ad6447848d12e0388a363a7bab47a0b9321c7a3f1196358f8ab4cbe7 -size 27113 diff --git a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Pressed.png b/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Pressed.png deleted file mode 100644 index a790b545..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-State-Pressed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f1817a875ef2d4216cc0191a40292023820f55b4f5596ffb30527dd7cd971d84 -size 27386 diff --git a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-SurfaceGui-New.jpg b/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-SurfaceGui-New.jpg deleted file mode 100644 index 48a607b9..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/ImageButton-SurfaceGui-New.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:52e8c3d8c02c90b59e5b8f5cd2910228b8a86e111f1f7ef1644e210af3ff3abf -size 139168 diff --git a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/Sprint-Button.png b/.cursor/rules/roblox/en-us/assets/ui/button-text-input/Sprint-Button.png deleted file mode 100644 index a0a62eb5..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/Sprint-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7454b4ecd23c6bd21d4b1eeb45d3612a33098351d22db14650a835db423ca146 -size 250048 diff --git a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/Sprint-Demo.mp4 b/.cursor/rules/roblox/en-us/assets/ui/button-text-input/Sprint-Demo.mp4 deleted file mode 100644 index 285bdab6..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/button-text-input/Sprint-Demo.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a88be8f78bfc85dcf3c0f37faab5524e88a2fd87e9fc214339937c7005a61d84 -size 12169498 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Adding-Highlight.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Adding-Highlight.jpg deleted file mode 100644 index 42dd4ac9..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Adding-Highlight.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5267babef88097b2b8f8921dd6ae4a6bf6d94aa42102dd7ef829ff1d027b4b41 -size 206704 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/DepthMode-AlwaysOnTop.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/DepthMode-AlwaysOnTop.jpg deleted file mode 100644 index cc8a5927..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/DepthMode-AlwaysOnTop.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fcb7d1c66b9a27d37bb39900a0d58a1d674c602432451c79d92bb9996bbd6937 -size 190849 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/DepthMode-Occluded.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/DepthMode-Occluded.jpg deleted file mode 100644 index 8ba62bdc..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/DepthMode-Occluded.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:976d34e6a9b6838d6e1d2dbb50099bf874370bb4c17cfa99548e5000b65b15d2 -size 187602 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Blue.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Blue.jpg deleted file mode 100644 index a9af97b8..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Blue.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:afc2e7b07b15ae14b7163dc39eddc7c8efd2cebfd1081ecfd510d402d11a5ae6 -size 80034 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Green.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Green.jpg deleted file mode 100644 index 1cb99920..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Green.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:df3acc764f48d8149778a43efeb437713239a16d9bf169839dca2393696e4164 -size 85850 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Red.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Red.jpg deleted file mode 100644 index 47c99d22..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillColor-Red.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc8479748d6a6b50d56e315e3e37652bd8825b156bbb667518933e32c731e4d4 -size 84785 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-0.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-0.jpg deleted file mode 100644 index f8cfdc2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02517ccc51fd0a5d803d4eb6bcd7e91defe053d6811c7e4d78ea4043192ecc7e -size 74918 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-1.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-1.jpg deleted file mode 100644 index 5ea9e0a4..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a277983bc2933d068860ff317c71456da00d6ce5d19b482b4516c628a6d56c9b -size 189908 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-Half.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-Half.jpg deleted file mode 100644 index af8a3ef3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/FillTransparency-Half.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77f10fb5c41eefdc74737ee489e8d3ef5bd149c71db9c22f35d529497efa08f8 -size 182132 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Blue.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Blue.jpg deleted file mode 100644 index d3ac2fea..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Blue.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:07ee9e2cec15c26676ab4ba3d0667b0a50d9dfeb4681f83a17f271007d93d94c -size 212447 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Green.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Green.jpg deleted file mode 100644 index badcd500..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Green.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf28694805bb70ab810c653e3182dd7faf3e6d9e8434a622ce181f08729efb99 -size 212759 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Red.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Red.jpg deleted file mode 100644 index e58c7b64..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineColor-Red.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0aace2cff6477a2fe394e237891e455173bc415a17eab8c885b53c6ca2661e0b -size 218646 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineTransparency-0.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineTransparency-0.jpg deleted file mode 100644 index 6471ca77..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineTransparency-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c060d8064eab4e3a47a1f478fd934410a026d2f2059f07bcc09b76d6b77016d -size 204149 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineTransparency-1.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineTransparency-1.jpg deleted file mode 100644 index 4a0ea336..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/OutlineTransparency-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5381f069ba6a6057bccf9baf4c8d846af3e9bbc7559b4b5524d4812fc6e7595b -size 188898 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Overview-Yellow-Interior.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Overview-Yellow-Interior.jpg deleted file mode 100644 index 5a4bb6bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Overview-Yellow-Interior.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff2c6eb4ab58791564ce93e6a3483d5099ccfb6ff106c58a54106a18bf04ceee -size 102417 diff --git a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Overview-Yellow-Outline.jpg b/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Overview-Yellow-Outline.jpg deleted file mode 100644 index 8571ee76..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/highlighting-objects/Overview-Yellow-Outline.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c66346c8baea06a57ecd4a1f55c7419c29760ed02e3792e63b0b9f6e40cdd9c9 -size 114094 diff --git a/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-Diagram.jpg b/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-Diagram.jpg deleted file mode 100644 index 778880fe..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-Diagram.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b304e5f3f38ba8d8a9afae1542cf338d74d5162f760ad5653a2c88c73726bdf8 -size 276027 diff --git a/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-LightInfluence-0.jpg b/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-LightInfluence-0.jpg deleted file mode 100644 index 4e363729..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-LightInfluence-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f109b60bb1db6f16a70423e98278557b1912c2c1430fb69499a23afdbe1b3835 -size 223582 diff --git a/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-LightInfluence-1.jpg b/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-LightInfluence-1.jpg deleted file mode 100644 index c9b0883c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-LightInfluence-1.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:81e154d53706911f18ff4f6c85cac164580bf7c8b155448aa05b52d71ddaa6d1 -size 219520 diff --git a/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-Sizing-Positioning.mp4 b/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-Sizing-Positioning.mp4 deleted file mode 100644 index db00d868..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/in-experience/BillboardGui-Sizing-Positioning.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:841be61c7b0bdc703aacae7bcbe699c74cb6fba1368c5daa7e7f3c6807290086 -size 7444255 diff --git a/.cursor/rules/roblox/en-us/assets/ui/in-experience/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/ui/in-experience/Showcase.mp4 deleted file mode 100644 index c29ad564..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/in-experience/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45c173911aab56aca26b3b7b8c59af04c2ae60f3501ff2d4d3b575e04170ead1 -size 10256715 diff --git a/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Brightness-0.jpg b/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Brightness-0.jpg deleted file mode 100644 index 70f9652b..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Brightness-0.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ff592c37fbba81ec0ef58faee83ca8347b3d2eae7aab11a7c701e75973b3132 -size 264120 diff --git a/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Brightness-10.jpg b/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Brightness-10.jpg deleted file mode 100644 index d27af98a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Brightness-10.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ccc248cc57c281d7a356ed5259c930936197646085af27d29ab5b18d5703acb5 -size 283985 diff --git a/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Diagram.jpg b/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Diagram.jpg deleted file mode 100644 index f69a7732..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Diagram.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:309c9e7aee332c50611fee43d2cbfd707a4d21c92ceaf52bda316c59a6b81cb7 -size 274200 diff --git a/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Sizing.mp4 b/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Sizing.mp4 deleted file mode 100644 index 8598e4be..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/in-experience/SurfaceGui-Sizing.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1a828486d40005fd50b04cf76c75b1ee97d0b81d5a507f0d95d256349532405a -size 2125497 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Anchor-Point-Scaling.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Anchor-Point-Scaling.png deleted file mode 100644 index fe27625e..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Anchor-Point-Scaling.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:db11e9425d9a4e55dcbc895e6fecf4145700cbfd1c47e4bbe7cf716cbec0dceb -size 12021 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Anchor-Points.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Anchor-Points.png deleted file mode 100644 index 71a25061..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Anchor-Points.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a2bec404630e10edbb7d81ea4f8e14ac950b2816b3c95a9976bbe86ea83b7d1 -size 11348 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Contextual-Button.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Contextual-Button.png deleted file mode 100644 index 3926b813..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Contextual-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:861f32cd60af61786fa5c5dd3eb898918fe32c1e2eaaf1ae6f98a98a4611117c -size 1120316 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/CoreGui-Elements.jpg b/.cursor/rules/roblox/en-us/assets/ui/misc/CoreGui-Elements.jpg deleted file mode 100644 index f5e76c75..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/CoreGui-Elements.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e311460865ea971c1a96a2dacbab71f804ab4257687435bae06acff91e79898e -size 322496 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Custom-Buttons-Near-Jump.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Custom-Buttons-Near-Jump.png deleted file mode 100644 index 1502603e..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Custom-Buttons-Near-Jump.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12212884cdcbf6bada82292bdf606ca2a6dade73fe6afc564a77a94bb65030af -size 1030535 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Loading-Animation.mp4 b/.cursor/rules/roblox/en-us/assets/ui/misc/Loading-Animation.mp4 deleted file mode 100644 index d08cca8c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Loading-Animation.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:22efbfc7e3c548f82acf23ddecc169dc75509aab03089df26edeffb76af2eb0f -size 359841 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Roblox-Menu-Button.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Roblox-Menu-Button.png deleted file mode 100644 index 292078a8..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Roblox-Menu-Button.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5aad5013f37c235865b209c1598375b74a05cb711eed43ce050fd2970fc159d7 -size 221326 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Scale-Offset-Positioning.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Scale-Offset-Positioning.png deleted file mode 100644 index 8317340f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Scale-Offset-Positioning.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c27f155f1d3a069c9ee046f3d7473e0ac77a3d2991826f527e6238f74c7d9d7a -size 274701 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Scale-Sizing.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Scale-Sizing.png deleted file mode 100644 index d04f6aa0..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Scale-Sizing.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3a3923c0db32f45e3686e1ad1f149f5e32f3c9bea36299dff3a6d52fa37cf395 -size 264860 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Phone-Non-Reachable.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Phone-Non-Reachable.png deleted file mode 100644 index c9213917..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Phone-Non-Reachable.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6975fd58c5f346e62789d739eb7c00da8e7cf80990ca4c369dceda2a5ebc10a -size 22780 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Phone-Reachable.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Phone-Reachable.png deleted file mode 100644 index f0a7e331..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Phone-Reachable.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3720383237fb365156d9e39e0505aae47c2bc40bac81031a1065d80dc2c8fc8a -size 23163 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Tablet-Non-Reachable.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Tablet-Non-Reachable.png deleted file mode 100644 index e179de4f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Tablet-Non-Reachable.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:202abf35cdd663944a388cba7a3678e2231bf6634f7677843bc2658bbbfa5a5f -size 29568 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Tablet-Reachable.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Tablet-Reachable.png deleted file mode 100644 index e9b692ef..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Thumb-Zones-Tablet-Reachable.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:876d239605912a41c41575bf4427821c9156987fd27ed2219b17516ccdd9fd5b -size 23932 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/Touch-Reserved-Zones.png b/.cursor/rules/roblox/en-us/assets/ui/misc/Touch-Reserved-Zones.png deleted file mode 100644 index 3f246875..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/Touch-Reserved-Zones.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c234efcd0421dc9ee387408df0f92d32835a71c8c3928fb6382adb0de681524 -size 954286 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/TouchGui-Elements.png b/.cursor/rules/roblox/en-us/assets/ui/misc/TouchGui-Elements.png deleted file mode 100644 index 7a492466..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/TouchGui-Elements.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68940b7358a1ddbe201630722a4b629fb72d70f6be4ccde347fa816f7e22192f -size 984297 diff --git a/.cursor/rules/roblox/en-us/assets/ui/misc/UDim2-Components.png b/.cursor/rules/roblox/en-us/assets/ui/misc/UDim2-Components.png deleted file mode 100644 index c3ba566c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/misc/UDim2-Components.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f775fd3a74455d6622701380d8eabdb0e5aa9e67e0c89e0fa00381fcdad57e81 -size 16898 diff --git a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-AlwaysShow.jpg b/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-AlwaysShow.jpg deleted file mode 100644 index 539edce7..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-AlwaysShow.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:458757affcfeddd50078273b35929d37c0d62d6a2c14a2aede88a9689a65538a -size 257376 diff --git a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-OneGlobally.jpg b/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-OneGlobally.jpg deleted file mode 100644 index 6e106cde..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-OneGlobally.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea49b99160d996420b4dcd6e8105e10c1d133e14c61624311700df1e818260d4 -size 250950 diff --git a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-OnePerButton.jpg b/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-OnePerButton.jpg deleted file mode 100644 index a17171f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Exclusivity-OnePerButton.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a40b7e0e73401a96b517a7120209c5b48ce57b09f89bd2c055bc8b06bd599425 -size 256595 diff --git a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/HoldDuration.mp4 b/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/HoldDuration.mp4 deleted file mode 100644 index 01e906a9..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/HoldDuration.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6890ada3d4fe4fee00b99d04a306d5d1be715efe5cd8c73b0e26949450aba17 -size 1469830 diff --git a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/MaxActivationDistance.jpg b/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/MaxActivationDistance.jpg deleted file mode 100644 index 5ebc13d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/MaxActivationDistance.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6e018e105c67d0063ebcf714dbd5b3594d28be3f8a9b284ec804b9a8051bfc3 -size 261634 diff --git a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Prompt-Diagram.png b/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Prompt-Diagram.png deleted file mode 100644 index 14cde1f6..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Prompt-Diagram.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c68171442b67ad82ca41854db24568eb65d15012870e8f3380d2b1f0768a2360 -size 229191 diff --git a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/ProximityPrompt-New.png b/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/ProximityPrompt-New.png deleted file mode 100644 index cff8402b..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/ProximityPrompt-New.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b06be8adb57d95237b83a18034730c9ee548c415ea61b3708871ed2db542c37b -size 19679 diff --git a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/RequiresLineOfSight.mp4 b/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/RequiresLineOfSight.mp4 deleted file mode 100644 index 20340553..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/RequiresLineOfSight.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:143803288a856bbb6676bef173f5660b4e211cf70c3cc82b1cf8cfec5c4c595d -size 4509201 diff --git a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Showcase.mp4 deleted file mode 100644 index 84a9b148..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/proximity-prompt/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a973a49e5cec6da05d8950d4f96f9b9f913a4833d79d4eb120a5ece4c06b41d1 -size 9065522 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Enable-Rich-Text.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Enable-Rich-Text.png deleted file mode 100644 index 83ae2c2a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Enable-Rich-Text.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c47271604d9b55aedb4d291a0f68b73d899574a35a59464f56c2cc1b555b20a7 -size 17409 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Bold.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Bold.png deleted file mode 100644 index 4fe5947d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Bold.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d7d319d7178e8c66a3ff8cefdff46cd0802b11a728b668cb3012ef23306bbe5 -size 4061 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Color.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Color.png deleted file mode 100644 index 086ac78e..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Color.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:25b31ad03b452b4497d5535a606a300d64aa75f11a35c2ed1be87248d0567582 -size 9018 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Comment.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Comment.png deleted file mode 100644 index 4e153351..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Comment.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24d1b1245ec36bf66bfca2455d3300e5203188fac9431585ef8ac344fbe2af1c -size 8495 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Font-Face.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Font-Face.png deleted file mode 100644 index 078b58c6..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Font-Face.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1c03a3753e08bf564172216ef50c5caa8d9fde4eada4b9c6353e54003fad88e7 -size 7124 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Highlighted.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Highlighted.png deleted file mode 100644 index f2d95007..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Highlighted.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:652bf501a3da94af91df4cdeef67cb1b246b570f83a6627c8c57dee01ed19b66 -size 14990 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Italic.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Italic.png deleted file mode 100644 index 0137e07f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Italic.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5d3fed0a1509ffecb1fba5f24dac5784a3490c0a01a209973b7c649f548b054e -size 6604 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Line-Break.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Line-Break.png deleted file mode 100644 index ce6a5570..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Line-Break.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f8e31302d09d851d6dee09b82c913f74c8b6ea9be368cab77d86700075c9d62b -size 11167 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Size.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Size.png deleted file mode 100644 index b160489f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Size.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1bba2fb19fc77458f7639d5a5019019865813fe7d59f8024af7bcd56c898e801 -size 6994 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Small-Caps.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Small-Caps.png deleted file mode 100644 index e29f8940..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Small-Caps.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:10e9d15084ebf2837fa267b38c43c94cdac5638f429e083b6f3c118eba05032e -size 9121 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Strikethrough.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Strikethrough.png deleted file mode 100644 index c3878bc1..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Strikethrough.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4996c671dcbb91691c9f96484a3dd63f0a54f7fd4c630226a7a3812b96b397d7 -size 7967 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Stroke.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Stroke.png deleted file mode 100644 index 12a2bb25..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Stroke.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:431acf43ef94842ce76d2bf30055dab53206167e0f2083857aacb8b87c231807 -size 11791 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Transparency.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Transparency.png deleted file mode 100644 index 6452a93c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Transparency.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8f042c38e3f76044e78a2b84fafc68d9eda593bb768731485d2cb2cdbc00969 -size 9854 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Underline.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Underline.png deleted file mode 100644 index 9ad4461f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Underline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12a234dfc1618211b22ce8827472c156c12f64d9ed2aac80c840fca9c2299882 -size 3893 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Uppercase.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Uppercase.png deleted file mode 100644 index 65dfb39f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Uppercase.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:421e9a443760f56289873696ee8614e72c394acafc02367c36c54ee52f26ac48 -size 10170 diff --git a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Weight.png b/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Weight.png deleted file mode 100644 index 3ea45ea2..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/rich-text/Example-Weight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53816b26892fc27cad0a3d4cff5bdc93e86ef329279ff8fcfb6fba5923a93e57 -size 7804 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-animation/Easing-Direction.mp4 b/.cursor/rules/roblox/en-us/assets/ui/ui-animation/Easing-Direction.mp4 deleted file mode 100644 index 15cfcd19..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-animation/Easing-Direction.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:196865e042bdfcac55e936cedfd733bdaaa2a6ef0ae0f9e3b3513e3bcdd22de9 -size 670931 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-animation/Easing-Style.mp4 b/.cursor/rules/roblox/en-us/assets/ui/ui-animation/Easing-Style.mp4 deleted file mode 100644 index 4262ca84..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-animation/Easing-Style.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3ecb363c83074f21916bad02c4ffc81c1a6eb58a22bc64386a2b1794e0a07a31 -size 769722 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-animation/ModuleScript-AnimateUI.png b/.cursor/rules/roblox/en-us/assets/ui/ui-animation/ModuleScript-AnimateUI.png deleted file mode 100644 index 387eaaa1..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-animation/ModuleScript-AnimateUI.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d17142ee558eefc3e3d65897640464354a7d75c21057d5631803eefb79d4f7e8 -size 29429 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-animation/Text-Typewriter.mp4 b/.cursor/rules/roblox/en-us/assets/ui/ui-animation/Text-Typewriter.mp4 deleted file mode 100644 index e653748e..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-animation/Text-Typewriter.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5b93e7549e55b32719a62832298a242ccf2008fe6b603cdb93487499afc1859 -size 3472056 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Grid-Drag.mp4 b/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Grid-Drag.mp4 deleted file mode 100644 index a85efcbc..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Grid-Drag.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d992479bec85a1f3130fdd51e303e827c57ce69637fb27c759cdfd39f0a8b63 -size 1411236 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/GridDrag.rbxm b/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/GridDrag.rbxm deleted file mode 100644 index e8ac2852..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/GridDrag.rbxm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d372e8ca85b14954c9ed8f7f3e7669207777624c2bd2085188375a756c7be963 -size 6595 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Hue-Rotator.mp4 b/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Hue-Rotator.mp4 deleted file mode 100644 index e666859a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Hue-Rotator.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12c248ae37c82c577177ec336c8b8390471921c84e7cd83c6109460551c97b0b -size 2024062 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/HueRotator.rbxm b/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/HueRotator.rbxm deleted file mode 100644 index ed898a1c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/HueRotator.rbxm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:448c62e7878e84e5ae727d4399c553bd99d81bee496a8d3b919f277df06e0171 -size 7893 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Showcase.mp4 b/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Showcase.mp4 deleted file mode 100644 index d28f7939..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Showcase.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a6e0fb06eafb46d3f1258f153636797deae6ba8247eed53ce297fc8d670ef735 -size 5346748 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Transparency-Slider.mp4 b/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Transparency-Slider.mp4 deleted file mode 100644 index 3a5b72e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/Transparency-Slider.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b7027ea4061018d755299fb71d86882b098564656ea7482432a05ebc164cfcc -size 1957486 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/TransparencySlider.rbxm b/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/TransparencySlider.rbxm deleted file mode 100644 index 052ef948..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-drag-detectors/TransparencySlider.rbxm +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b42c9c73443e97043a7989760e6e336a2aa12e1949e8b627ab3005eb7c6a98fc -size 8061 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/Frame-Example.jpg b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/Frame-Example.jpg deleted file mode 100644 index d192dcf4..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/Frame-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:91a8d000db2ed4a37ad59ca77aefa2687f87a923a7f629399de08c4987e49ae0 -size 404375 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScreenGui-Example.jpg b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScreenGui-Example.jpg deleted file mode 100644 index 3b627981..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScreenGui-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f9eedb4365f028c4ef5e119a60135fdcbccb390d9cedac6cefec25cd8976b71 -size 399856 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScreenGuis-Enabled.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScreenGuis-Enabled.png deleted file mode 100644 index 5d7c7e9f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScreenGuis-Enabled.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:094991874ae343bafd68833016857769a27ff5678e52c91846f2659c23e35ab3 -size 161136 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Canvas-Inset.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Canvas-Inset.png deleted file mode 100644 index fde5ce00..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Canvas-Inset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cb39546e8bbd6447933593e33dcfefa61ff5ece01714d1189ff79578b8059bef -size 480280 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Canvas-No-Inset.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Canvas-No-Inset.png deleted file mode 100644 index d935ce11..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Canvas-No-Inset.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:66a491d3e0f22ffe28780bd1200e803f314cc9c234c8615bba7cdf25f6f3a40a -size 481735 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Example.jpg b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Example.jpg deleted file mode 100644 index 5441ba7d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fa8eb2a6ac19f0f07f1faf4a80ddadd69fe1859a2a5d4ae8693851c1cf960c23 -size 406720 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Scroll-Bar-Elements.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Scroll-Bar-Elements.png deleted file mode 100644 index d321df57..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/ScrollingFrame-Scroll-Bar-Elements.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4f19fbfb2581b1491474883de1727c6f93719eee780e368108605b6a68d55d6 -size 374559 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/StarterGui-To-PlayerGui.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/StarterGui-To-PlayerGui.png deleted file mode 100644 index 2a87c7e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/StarterGui-To-PlayerGui.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9e5f857b48803264db11e06a3ba281f1f4c7946d56ba16f22cbfbc6c7851f3f -size 161547 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/TextBox-Example.jpg b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/TextBox-Example.jpg deleted file mode 100644 index 0d3adf4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/TextBox-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:16362c7c05cfc1f5caf564dcffa424d4caeff12b2163fb5afe7e0b74188a906c -size 381201 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-CornerRadius-Properties.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-CornerRadius-Properties.png deleted file mode 100644 index ea7b65ad..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-CornerRadius-Properties.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e49f27dba8630224116c720d0fe97ac5a376bfbd00d363c9e7c99d6c0c8c044 -size 11835 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Offset-32.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Offset-32.png deleted file mode 100644 index d474dcc3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Offset-32.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:aaf4e9a0e8b46a90f68817c017f40bc1c9972b638e2d34f483ef8126ff879dd3 -size 10010 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Offset-64.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Offset-64.png deleted file mode 100644 index b28f47e2..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Offset-64.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3c4a4f3bb960353df519fdc7511fc5fb5a131cd682fb66a85edca7f3c4ceb7fb -size 11755 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Scale-0.25.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Scale-0.25.png deleted file mode 100644 index cdccdc0d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Scale-0.25.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d7ddb35ac24db946d5215f33a77479c30e76299e17093719d6cff8a81f26494 -size 11985 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Scale-0.5.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Scale-0.5.png deleted file mode 100644 index f2fe4344..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UICorner-Scale-0.5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f433bd4c73d62bfffff6c7a01e52d616323cfd998534e63e7d84839796d83ae2 -size 14287 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIFlexItem-Example.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIFlexItem-Example.png deleted file mode 100644 index 0035872c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIFlexItem-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:456b9cd54b832f5091a05d8cd2e74f58901b895db7c395646ccb29e350ad1e9b -size 27718 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIFlexItem-Hierarchy.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIFlexItem-Hierarchy.png deleted file mode 100644 index c1eb81bb..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIFlexItem-Hierarchy.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3d108bba946a2cef2f789c1bfb2e6df7d22168b36b7f405a932e4bf8353d746f -size 58943 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Example.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Example.png deleted file mode 100644 index 42e0e01f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bc83c9de107a5bfc17c22c8f2d2edac7130968b21b6318f4b78ae576f8519e7 -size 427621 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-0.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-0.png deleted file mode 100644 index 47878328..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:242a662cb8d55de3ee76226eae55a21a89f0ac0859acfd4e29b8b50e1a3790a7 -size 108172 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-Neg-0.25.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-Neg-0.25.png deleted file mode 100644 index a12a82e1..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-Neg-0.25.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76b004c5236002d7ec7ed8db3bd783b66a5ff2bf322af4f2ce3fb49c876c6930 -size 79575 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-Pos-0.25.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-Pos-0.25.png deleted file mode 100644 index 84018254..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Offset-X-Pos-0.25.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7204f99fe6c9b9780c28b76bb556ae1e4908f16739a152b7980cf6b15454afca -size 85691 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-0.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-0.png deleted file mode 100644 index da53b3c0..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-0.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c40390cc58aa8dda813d6758e650df7b74f017b1c2cb2a7c5fd9c084ec254a00 -size 105244 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-Neg-90.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-Neg-90.png deleted file mode 100644 index e77dd828..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-Neg-90.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ad382f9af4ee55a370b2ea5bd5b3999ca9d6aeb87ecb70d146bfa2e6271960a -size 65445 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-Pos-45.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-Pos-45.png deleted file mode 100644 index 9fc66512..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGradient-Rotation-Pos-45.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:23f738259191142ffc3d420112cd8f22138e56e3e74f3c9368435c119266303a -size 116231 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGridLayout-Example.jpg b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGridLayout-Example.jpg deleted file mode 100644 index f639b762..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIGridLayout-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28a2d9426cf07c4382f7e9db57f730ac824439bca62cd63a49ad7e4e819caaaa -size 176425 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIListLayout-Example.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIListLayout-Example.png deleted file mode 100644 index 0756beab..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIListLayout-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:37b31bb88197d0b92e31ad48a3952ceb42c80ee3f0bcfc8a7c93128a6b7ae1b2 -size 177211 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Default.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Default.png deleted file mode 100644 index b1544ac5..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Default.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d3497a051dce56c1b21401055a0f43de90527ffd93388e41fe784bbd49f34de1 -size 4384 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Offset-Negative.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Offset-Negative.png deleted file mode 100644 index 2ddbf60f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Offset-Negative.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc5df1f56d04d37210fcd1614616406b73e30ac7003f59aff2162e64c6c812a1 -size 5390 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Offset-Positive.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Offset-Positive.png deleted file mode 100644 index 60474bc5..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIPadding-PaddingBottom-Offset-Positive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:556f543904f8dfd12f60cc06c10fc13f60f7a110bf90d81cadd52472c3489f26 -size 5295 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIScale-Example.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIScale-Example.png deleted file mode 100644 index 33db9492..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIScale-Example.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ec44a74534a3a09ae958172b503c9f72b431c0ab73ec464279cd37271a768fbb -size 35357 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-As-Border.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-As-Border.png deleted file mode 100644 index bcc3dc9e..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-As-Border.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e59528dce1a7392a429f53edf369e11d0065ec99d7c9241fb161184113b3adb8 -size 3817 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-As-Text-Outline.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-As-Text-Outline.png deleted file mode 100644 index 128b78e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-As-Text-Outline.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1c4709cab3a1a004ebce81c3141a973b4b317bb89d051e72ab20760965964d7 -size 25072 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderOffset-In.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderOffset-In.png deleted file mode 100644 index 8702d1f0..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderOffset-In.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a177f1ead2aecd779ccca55c1ca4d87e2982fb4f0321dd0953ad8e24632e747f -size 4498 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderOffset-Out.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderOffset-Out.png deleted file mode 100644 index b446a9f3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderOffset-Out.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49394ea3cab8e171f86a9a74652a9fe3b67b8ce6bfd1572baf4feecde2c658cf -size 7137 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Center.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Center.png deleted file mode 100644 index bac5e2d5..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Center.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20b2ab1c40279b86036d255ea22c1d9154835b813c2576a599c9159448ee74ce -size 4509 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Inner.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Inner.png deleted file mode 100644 index 7592833e..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Inner.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d34e87f7a0eb4cb4ef8e7010244862fddc9b31f333dbf06d21292d28fa3d8778 -size 3473 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Outer.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Outer.png deleted file mode 100644 index f51128e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-BorderStrokePosition-Outer.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fffb4cf5248035fc99270260052065f075ad39590ea5d061645fd2663d6d16bf -size 4659 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Color-Gradient.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Color-Gradient.png deleted file mode 100644 index b787026c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Color-Gradient.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c6f71cf1f4c561d695622cce375b087cf5093765fb99217301bc0a89bf3cfcac -size 33477 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Color-Solid.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Color-Solid.png deleted file mode 100644 index 15393e85..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Color-Solid.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ad33bab40d86de70f4997ed12b02e3ac043b18d62ed8ccc1e828741416af8d67 -size 20024 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Bevel.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Bevel.png deleted file mode 100644 index 52c30499..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Bevel.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:56bb70cbdb35dfcb56c8aec69e3a0e612da48e3306da4bc9845e29306c8c49e7 -size 12381 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Miter.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Miter.png deleted file mode 100644 index 2f638c92..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Miter.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03bff5ea0d1284ff81f8fbf80c89573640a3cbdbde7b9159c0a4dc56d3e476fe -size 10057 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Round.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Round.png deleted file mode 100644 index 7a8f8bae..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-LineJoinMode-Round.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69752127da51f91041834a21ed6fbb7edc9e39e3a5b310df64fcf7efef40fe4d -size 12770 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Stroke-Mode-Border.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Stroke-Mode-Border.png deleted file mode 100644 index 5c1db76a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Stroke-Mode-Border.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3597d00f7f10bcc8b51c30e02a52900eeb37b831efde61154be4640e13c78afe -size 14708 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Thickness-12.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Thickness-12.png deleted file mode 100644 index c073631d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Thickness-12.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:20832c122337330a28183134e8c4074aff32ff8d1263e948f38cb87aa478de6e -size 12730 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Thickness-4.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Thickness-4.png deleted file mode 100644 index 7837667e..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Thickness-4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:84c78f189ecd7597395fa61cb8edf35bef56987f20b545839bb0555d155f3a12 -size 6876 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Transparency-A.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Transparency-A.png deleted file mode 100644 index ddfcf262..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Transparency-A.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc8e065794138a181abf3fea28acb68a3e421a8ba1f9c87e6fb6b1e41de475ed -size 14556 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Transparency-B.png b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Transparency-B.png deleted file mode 100644 index 73dd7da7..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UIStroke-Transparency-B.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e5903b185046ae74bc2cc1df7686a3834c8ee790776037faf7bd4728e437f4b -size 13154 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UITableLayout-Example.jpg b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UITableLayout-Example.jpg deleted file mode 100644 index a1bb9167..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UITableLayout-Example.jpg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78d5ec47235e53a75b1dde82cff2d750311311363efe5332fe95417843482ebd -size 185644 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UITextSizeConstraint.mp4 b/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UITextSizeConstraint.mp4 deleted file mode 100644 index cd20029d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-objects/UITextSizeConstraint.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4465d4928faf5b61d6c0ad528a1437413918193e17afef724b6fd436430cd8e7 -size 2133116 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Configure.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Configure.png deleted file mode 100644 index 14251bfd..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Configure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a86c1b43528e2428e89e033311d5060a1c00ac0ace50512462725e063e641db0 -size 8695 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-New-Class.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-New-Class.png deleted file mode 100644 index 4d0930da..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-New-Class.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:02020776a1d64773a5b0dd7e81186f317631ea2a2e1117c4e43171623f49e514 -size 28607 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Result.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Result.png deleted file mode 100644 index 9c31fe4a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f083e3e905eb7ac7ab9cdc30fb7fb591923d70bed987f052afd876a1f8d03c87 -size 247172 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Tokens.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Tokens.png deleted file mode 100644 index 4f30cc39..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Class-Rule-Tokens.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c6e5c2847c46796300768fe293c22ad2d9ef1237aada1368c8974cf5a0b322e -size 15393 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Create-Design-Entry.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Create-Design-Entry.png deleted file mode 100644 index bfc25945..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Create-Design-Entry.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bcdcc581586217164df8cc4b027f4c98d44e09a57f8733c2af762dd416641c72 -size 23142 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Initial-Config.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Initial-Config.png deleted file mode 100644 index a615b403..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Initial-Config.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3750fcad26d6c96e46cbb3c9690bf2fe1aacadb129260da9393c9b2173cf4002 -size 36405 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Configure.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Configure.png deleted file mode 100644 index a39f644a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Configure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d1034811be8d4bb97b608bd6989e8d119c32ec794f18b392d3daa6cdfc5f40db -size 9365 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-New-Class.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-New-Class.png deleted file mode 100644 index ffda27e9..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-New-Class.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:65beb4ea85a4b69acd5a770ff21f5a8b21ab321d01d093f979a6817130ac7f55 -size 29860 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-Created.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-Created.png deleted file mode 100644 index 822f8c64..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-Created.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0195c0f79e219bf6a7cee330feab98f0f5bb72b5518c4f1459e3a6a211ef69c8 -size 16318 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-New.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-New.png deleted file mode 100644 index 99a386cc..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-New.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c758780c30f8ac1faf62c3c08dee648d1342842cda0fc351b51ebf1b744519c6 -size 65241 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-Tokens.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-Tokens.png deleted file mode 100644 index ee110b3d..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Pseudo-Instance-Tokens.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:05996337bb6c05c2937acd722daa88e63b8a639b2e46268d3adae0fe6f30adac -size 8542 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Result.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Result.png deleted file mode 100644 index 19c80cf9..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c34a4ede048f3be2b2751198493f51de504259cbda52938cc2be55c9647da43d -size 251463 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Tokens.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Tokens.png deleted file mode 100644 index c0a35db8..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Modifier-Rule-Tokens.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f4749d801105e6fc7b18c811a3b08cceb4975086994c17ebd62d300332890e6 -size 11637 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Created.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Created.png deleted file mode 100644 index 31417772..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Created.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:945c2090428b288d293f54b2a7c90af83f9a191331990b864741dd09cc46afcf -size 22092 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-New-Class.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-New-Class.png deleted file mode 100644 index 9c91623a..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-New-Class.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7809ee1a958160a20a224d6578c33372db2e9045af66e025214b9cf989b7bb74 -size 31922 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-New.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-New.png deleted file mode 100644 index a3fe51cf..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-New.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ffb543ae074a489eaea71ad845f907310e1aac5157e2ec4030f66923f29dade7 -size 48258 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Result.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Result.png deleted file mode 100644 index daf74014..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4574f1fbdde70d5c47984a46da5a91ba8b1ff6f5f1b50bb0b36a4a52c2ede945 -size 258964 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Tokens.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Tokens.png deleted file mode 100644 index 384a6537..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-State-Rule-Tokens.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9c3529f5b2c57d82837210ff3913bb8d28552052ad7d9090eb6f613040979b4f -size 6530 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Apply-Tag.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Apply-Tag.png deleted file mode 100644 index 67ec4ec6..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Apply-Tag.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:948d86bf222ff42b4bf09b3244dac023256faa2ed3021bf37f12bc22e79a1931 -size 45822 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Configure.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Configure.png deleted file mode 100644 index 2388a9b0..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Configure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:470a7168d1543646cac359109e647094b19a2f495d4011cbc642b018c01367bb -size 9659 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-New.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-New.png deleted file mode 100644 index 695c8732..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-New.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e79a1700b927373e45043c81351d1a06bdbf64299110fdcb9052327662125486 -size 50092 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Renamed.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Renamed.png deleted file mode 100644 index ddb38381..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Renamed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a47fafa388e51ceddb7d5606fed1608c4301333059e4cb68f5833dacd7cf313d -size 21953 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Result.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Result.png deleted file mode 100644 index 5bbc494f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42fc704f4e881b47e4cca5d8eeebfc0aac82e375dc0748f4e70b132cd498dc98 -size 249597 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Tokens.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Tokens.png deleted file mode 100644 index 3ed3e9ca..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Tag-Rule-Tokens.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be8855267ed601269e863ea2df054b1f5c8697c77c76b8266d9fadf540097e7f -size 14760 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Class-Tokens.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Class-Tokens.png deleted file mode 100644 index 86f325d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Class-Tokens.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c6bc8f6c6bf5dbe4b97d2dc2497e4bfae765e29ae1aa5f0b6a18c6482125384 -size 19244 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Duplicated-Theme.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Duplicated-Theme.png deleted file mode 100644 index 5efd4232..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Duplicated-Theme.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b8e9d9a42c06fa6e2e8a157325a43224debfdae7ace90c9dd10ff3b6c7bcfa8c -size 11731 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Class.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Class.png deleted file mode 100644 index 38b7b56b..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Class.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4ec5dfa12c5819dbf173376331251fae2cc06ee90cd135df980403148370dbd -size 30174 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Folder.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Folder.png deleted file mode 100644 index edbdb463..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Folder.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d962f4bfd2cc126266f089358d58857bce3f7a59e379524db36dd956ae07b9e -size 13201 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Theme.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Theme.png deleted file mode 100644 index a96a8613..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-New-Theme.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ece5467404edc77ddc907e994435eb002f52bcd02a05cd3f17110b0bcc536f6 -size 14966 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Swapping-ThemeA.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Swapping-ThemeA.png deleted file mode 100644 index bfc8732c..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Swapping-ThemeA.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2b98ac51aabe8b6cd8548d6a02138a6ef9e4b39e8bb8ca990538b7b22b25a28 -size 27449 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Swapping-ThemeB.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Swapping-ThemeB.png deleted file mode 100644 index 61979196..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Swapping-ThemeB.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e3cb050d9085225d2828a03503b512012cea731fc45e9ef7512fef5f47e85ba -size 27461 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Theme-Configure.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Theme-Configure.png deleted file mode 100644 index b5be7278..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-Theme-Configure.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d5769e745fd7938faa7487a9c074d5d8f03b35b76cc249bcda80b0b92d3bfcc -size 9514 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeA-Result.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeA-Result.png deleted file mode 100644 index 5bbc494f..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeA-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:42fc704f4e881b47e4cca5d8eeebfc0aac82e375dc0748f4e70b132cd498dc98 -size 249597 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeA-Tokens.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeA-Tokens.png deleted file mode 100644 index 092265e3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeA-Tokens.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7e532835f7fa87084dffb99ab296620dd38585c9f0a1aab89b93e63a4d7afc0 -size 14526 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeB-Result.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeB-Result.png deleted file mode 100644 index ecc582d3..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeB-Result.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1360707743c5f821c80f909dd2335523ae6b2d69a9b46d82ff193ec07d910007 -size 249174 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeB-Tokens.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeB-Tokens.png deleted file mode 100644 index 6b422cf8..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-Themes-ThemeB-Tokens.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f582835953661c302eb34af7d6057028a7f44f2e77472e5a57085af389af31af -size 15573 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-TokenSheet-New.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-TokenSheet-New.png deleted file mode 100644 index ca04e6d6..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-TokenSheet-New.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4fa0a850039be14ac3479b36edda661d217ed1486147069933f68998c51d3e5a -size 22146 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-TokenSheet-Tokens.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-TokenSheet-Tokens.png deleted file mode 100644 index d92c8917..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/SE-TokenSheet-Tokens.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:17701e427992c1dd81820547f80ad68ad56696987fc7388c39b91501454056b1 -size 26719 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Class.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Class.png deleted file mode 100644 index e8c03431..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Class.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:44ad34f991b7e6650b59863e190749d0cccf5ac4225700f977cbfef571c7ab52 -size 395156 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Modifier.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Modifier.png deleted file mode 100644 index 538aa4bc..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Modifier.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2e0627f836e57049581a4783191f3e9c7d140cc13395aab717247e0b877890d5 -size 416585 diff --git a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Tag.png b/.cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Tag.png deleted file mode 100644 index ae649e25..00000000 --- a/.cursor/rules/roblox/en-us/assets/ui/ui-styling/Styling-Flowchart-Tag.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7c1d3712b3304dc88bc1c83091f459992736f3e1b98db2cc1c61d63623441b8c -size 396860 diff --git a/.cursor/rules/roblox/en-us/assets/workspace/camera/Camera-Occlusion.mp4 b/.cursor/rules/roblox/en-us/assets/workspace/camera/Camera-Occlusion.mp4 deleted file mode 100644 index 5af0f482..00000000 --- a/.cursor/rules/roblox/en-us/assets/workspace/camera/Camera-Occlusion.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:481c9546515c5ccd4a7c066374fa54d17a11ca976552740384e2763186fe4c9f -size 14397391 diff --git a/.cursor/rules/roblox/en-us/assets/workspace/raycasting/Laser-Maze.mp4 b/.cursor/rules/roblox/en-us/assets/workspace/raycasting/Laser-Maze.mp4 deleted file mode 100644 index 12074bc0..00000000 --- a/.cursor/rules/roblox/en-us/assets/workspace/raycasting/Laser-Maze.mp4 +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca9193daddfe6ad8e7b752e8e0ef22348934ed85e7f6f1dae313b8eedf2df731 -size 5951504 diff --git a/.cursor/rules/roblox/en-us/assistant/guide.md b/.cursor/rules/roblox/en-us/assistant/guide.md deleted file mode 100644 index a1fb6c2a..00000000 --- a/.cursor/rules/roblox/en-us/assistant/guide.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Assistant for Studio -description: How to use Assistant to help build, grow, and monetize your creations in Studio. ---- - -import BetaAlert from '../includes/beta-features/beta-alert.md' - -**Assistant** is an AI helper that accelerates content creation by helping you get started, supplementing your skills, and assisting with ongoing development. It can do the following and much more: - -- Answer how to do things on Roblox -- Add and edit objects and scripts directly in your place's data model -- Insert objects from the Creator Store -- "Explain this code" by selecting parts of a script in the Script Editor -- Create materials to restyle your objects -- Generate 3D objects to populate your scene - -## Studio features - -In Studio, Assistant consists of a large language model (LLM) that generates code and a run-command module (similar to the existing [Command Bar](../studio/ui-overview.md#command-bar)) that runs code. As a result, Assistant can act directly on your data model, such as inserting and modifying objects, writing and inserting scripts, and automating repetitive tasks like modifying properties in bulk. - -For a more in-depth look at what Assistant can do and how to use it, see the [Prompt guide and examples](prompt-engineering.md) and the following Roblox Staff livestream for tips, tricks, and inspiration. - - - -### Insert and modify scripts - -Assistant can insert new scripts, modify existing ones, and perform these actions across multiple objects as necessary. For example, if you ask it to create a remote event, it can create a local script, a server script, and the event all at once. - -If you enter a script generation request like "Make the player's character jump when they touch this part," Assistant shows the script's contents and adds the new script instance to the currently selected object in the data model. If nothing is selected, Assistant decides where to place it based on your prompts. - -Requested script inserted into selected part. - -The generated script might not function flawlessly. In these cases, you can either make further edits in the [Script Editor](../studio/script-editor.md) or ask Assistant to edit the script it just created. It can even act on existing scripts that it didn't create if you need help with code that you've written yourself. - -### Insert and modify objects - -Assistant can create, edit, delete and iterate on instances in your data model, including inserting items from the Creator Store. - -Assistant adding objects through the Studio prompt. - -If you examine the code, you can see that Assistant calls `Class.InsertService:GetFreeModels()` to query the Creator Store for a wheelbarrow model and uses `Class.Model:PivotTo()` to place it near a tree. - -### Provide answers and suggestions - -If you need general knowledge or help while creating an experience, you can ask Assistant questions like how to make a team system, how to design a game loop, how to use specific Studio tools, and much more. It can even explain code that it generated or that you wrote yourself. - -Code explanation provided by Assistant in Studio. - -### Generate materials - -When given a request to generate a material, Assistant in Studio can quickly style existing parts through a lightweight implementation of the [Material Generator](../studio/material-generator.md). - -Material variations shown in Assistant for quick styling. - -### Generate 3D models - - - -The `/generate` command enables [mesh generation](https://corp.roblox.com/newsroom/2025/03/introducing-roblox-cube), powered by Roblox's Cube 3D model. - -1. In the Assistant chat window, type a command such as `/generate a red buggy with knobby tires`. -1. Assistant generates the corresponding object and adds it directly to your workspace for further customization. - -A generated green dragon provided by Assistant in Studio. - -## Access Assistant from Studio - -To access Assistant from Studio: - -1. Click **Assistant** on the right side of the mezzanine bar. - - Assistant button indicated on the right side of the mezzanine bar. - -2. Type a request into the field near the bottom of the window, using guidance from the [prompt guide](prompt-engineering.md) to generate improved responses. - - - Click thumbs up or thumbs down to rate the result and improve future results. - - Click the redo icon to process a new result. - - General user interface for Assistant in Studio. diff --git a/.cursor/rules/roblox/en-us/assistant/mcp.md b/.cursor/rules/roblox/en-us/assistant/mcp.md deleted file mode 100644 index 6cfc491e..00000000 --- a/.cursor/rules/roblox/en-us/assistant/mcp.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: MCP servers -description: Use both the built-in Studio MCP server and third-party MCP servers to give Assistant context from external tools. ---- - -Model Context Protocol (MCP) servers connect AI models to your local data, tools, and systems. They allow large language models (LLMs) to securely access files, databases, and APIs, providing additional context that helps generate more accurate and useful results. - -With [Roblox's open source Studio MCP server](https://github.com/Roblox/studio-rust-mcp-server), you can access and edit your experience directly from external AI coding tools. These AI agents can plan, write, test, and modify your code and data with little intervention and effort on your part. - -You can integrate and leverage models from the following LLMs into your workflow: - -- [Anthropic](https://platform.claude.com/settings/keys) -- [OpenAI](https://platform.openai.com/api-keys) -- [Google Gemini](https://ai.google.dev/gemini-api/docs/api-key) - -To connect and use an external LLM: - -1. Get an API key from the LLM you want to use. -2. In Studio, open Assistant. -3. Click **⋯** ⟩ **Manage API Keys**. -4. Select a provider and enter your API key. -5. In the **Model** drop-down, select the model you want to use. - -BYOK in Assistant Settings. diff --git a/.cursor/rules/roblox/en-us/assistant/overview.md b/.cursor/rules/roblox/en-us/assistant/overview.md deleted file mode 100644 index 18abf6c6..00000000 --- a/.cursor/rules/roblox/en-us/assistant/overview.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -title: Assistant -description: Overview of Assistant, Roblox's AI helper. -hideInPageNavigation: true ---- - -export const sections = [ - { - description: "Assistant is an AI helper that accelerates content creation by helping you get started, supplementing your skills, and assisting with ongoing development.", - content: [ - { - title: "Assistant for Studio", - description: "In Roblox Studio, Assistant can act directly on the data model to write scripts, insert and modify objects, and automate repetitive tasks so that you can focus on creation.", - image: "/assets/assistant/AssistantStudioExample.png", - buttons: [ - { text: "Assistant for Studio guide", href: "assistant/guide"} - ] - }, - { - title: "Assistant in the documentation", - description: "Assistant is available directly from the documentation. Ask it to clarify concepts, provide sample code for a use case, or compare and contrast approaches to a problem.", - image: "/assets/assistant/AssistantDocumentationSite.png" - }, - ] - } -]; - -{sections.map((section, index) => ( - -
    - {section.description && ( -

    {section.description}

    - )} -
    - {section.content.map((section, index) => ( - - -
    -

    {section.title}

    -

    {section.description}

    -
    - {section.buttons && section.buttons.map((button, btnIndex) => ( - - ))} -
    -
    -
    - - {section.title} - -
    - ))} -
    -))} diff --git a/.cursor/rules/roblox/en-us/assistant/prompt-engineering.md b/.cursor/rules/roblox/en-us/assistant/prompt-engineering.md deleted file mode 100644 index 5f10e455..00000000 --- a/.cursor/rules/roblox/en-us/assistant/prompt-engineering.md +++ /dev/null @@ -1,248 +0,0 @@ ---- -title: Assistant prompt guide and examples -description: Get tips and tricks on how best to prompt Roblox's AI Assistant to get the best results. ---- - - -[Share your prompts and experiences](https://devforum.roblox.com/t/check-out-the-generative-ai-stream-and-let-us-know-your-best-prompts/3215844) in the Roblox forum so that we can make Assistant better! - - -This document gives guidance on prompting Assistant and provides examples and inspiration on what Assistant can do. - -## Be specific - -If Assistant fails, add more details to your prompt and try again. Use instance names exactly as they're spelled, specify which function you want Assistant to use, and tell Assistant which type it's working with, such as a part or a model. - - - - - - - - - - - - - - - - - - -
    **Not specific****More specific**
    Place the trees in a circle.Place 10 copies of the "pine_tree" model in ReplicatedStorage in a 30 stud radius circle around the SpawnLocation.
    Make the part move.Add a script to make "my_part" move up and down 10 studs repeatedly using TweenService.
    How can I design a core loop?Help me design a fun core loop. I want to build a game where players can hunt treasure as pirates. They can also buy and upgrade pirate ships and battle each other.
    - -## Use your selection - -Selection is a great way of specifying an object or set of objects you want to refer to in your prompt. Select multiple objects and ask Assistant to modify them, make duplicates and place them somewhere, or continue a position pattern like maintaining placement in a line. - -## Edit time and run time - -Assistant sometimes confuses the difference between edit time and run time. If you ask Assistant to take an action, it will likely bias towards doing it at edit time. If you want the action to happen during run time, ask Assistant to insert a script that takes the action. For example, tell Assistant "add a script to make the time of day 8:00 AM" instead of "make the time of day 8:00 AM." - -## Keep trying - -Don't get discouraged if Assistant doesn't work exactly the way you want the first time. Often, making small tweaks and trying again can lead to better results. Many AI tools are non-deterministic, meaning they don't create the exact same output each time you ask them to do something. There's some variance, which you can tap into and control using tweaks to your prompt. - -AI in its current state requires work. It takes time to understand how to best speak to Assistant, what it can do, and how to get what you want out of it. - -## Multi-step prompts - -Consider using multi-step prompts to encourage Assistant to think. Instead of asking "Can you explain this script to me?" and pasting in the script, ask it to explain step-by-step by separating the question from the script with `###`. This separation helps Assistant deconstruct and organize the information to provide better answers. - - - -
    - -_Can you explain what this script is doing step by step?_ - -**\###** - -_local part = workspace.Part_ - -_local function onTouched(otherPart)_
    -    _print(part.Name .. " collided with " .. otherPart.Name)_
    -_end_ - -_part.Touched:Connect(onTouched)_ - -**\###** - -
    -
    - -
    - -_Certainly! This script is an example of how to handle collisions between two parts in Roblox. Let's break it down step by step:_ - -1. `local part = workspace.Part`: _This line of code creates a local variable named `part` and assigns it the value of the `Part` object located in the workspace. You can replace `Part` with the name of the specific part you want to detect collisions with._ -2. `local function onTouched(otherPart)`: _This line of code defines a function named `onTouched` that takes in a parameter `otherPart`. This function will be called whenever the part collides with another part._ -3. `print(part.Name .. " collided with " .. otherPart.Name)`: _This line of code prints a message to the output console, indicating that the `part` has collided with `otherPart`. The `part.Name` and `otherPart.Name` are concatenated using the `..` operator to form the message._ -4. `part.Touched:Connect(onTouched)`: _This line of code connects the `onTouched` function to the `Touched` event of `part`. Whenever the part collides with another part, the `onTouched` function will be called._ - -
    -
    -
    - -## Examples - -These examples demonstrate the vast variety of tasks that Assistant can help with today. Some of them might take a few tries for you to reproduce, but give them a try and see what you can come up with yourself. - -### Game mechanics - Shoot fireballs that explode - -**Prompt:** -Propel a fireball away from the player in the direction the player is facing when the player presses "e". -Make the fireball explode when it hits something. - -